)]}' {"version":3,"file":"TMSWeb_FNCKanbanBoard.js","sources":["E:/Delphi/TMS WEB Core/Core Source/RTL/rtl.js","E:/Delphi/TMS WEB Core/Core Source/RTL/system.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/rtlconsts.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/types.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/js.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/sysutils.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/classes.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/web.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/math.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/contnrs.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.Graphics.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.StdCtrls.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.Controls.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.Lang.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.ExtCtrls.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.WebTools.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.Dialogs.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.Forms.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/dateutils.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCTypes.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/typinfo.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCUtils.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCGraphicsTypes.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCBitmapContainer.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCHTMLEngine.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCGraphics.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCGraphics.General.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCGraphics.WEB.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCCustomComponent.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCStyles.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCCustomControl.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCScrollBar.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCCustomScrollControl.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCTreeViewBase.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCTreeViewData.pas","E:/Delphi/TMS FNC Core/WEBLib.TMSFNCPopup.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCImage.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCCustomTreeView.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCTreeView.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCCustomSelector.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCColorSelector.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCToolBarRes.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCToolBar.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCEdit.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCTableView.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCKanbanBoard.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/dbconst.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/db.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCKanbanBoardDatabaseAdapter.pas","E:/Delphi/TMS WEB Core/Core Source/RTL/jsondataset.pas","E:/Delphi/TMS WEB Core/Core Source/WEBLib.CDS.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCPanel.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCCustomPicker.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCColorPicker.pas","E:/Delphi/TMS FNC UI Pack/WEBLib.TMSFNCHTMLText.pas","E:/Delphi/TMS FNC UI Pack/Demo/Shared Code/Business Logic/Kanban Board/UBL.pas","E:/Delphi/TMS FNC UI Pack/Demo/Shared Code/Form Unit/Kanban Board/UDemo.pas","E:/Delphi/TMS FNC UI Pack/Demo/WEB/Kanban Board/TMSWeb_FNCKanbanBoard.dpr"],"sourcesContent":["var pas = {};\r\n\r\nvar rtl = {\r\n\r\n quiet: false,\r\n debug_load_units: false,\r\n debug_rtti: false,\r\n\r\n debug: function(){\r\n if (rtl.quiet || !console || !console.log) return;\r\n console.log(arguments);\r\n },\r\n\r\n error: function(s){\r\n rtl.debug('Error: ',s);\r\n throw s;\r\n },\r\n\r\n warn: function(s){\r\n rtl.debug('Warn: ',s);\r\n },\r\n\r\n hasString: function(s){\r\n return rtl.isString(s) && (s.length>0);\r\n },\r\n\r\n isArray: function(a) {\r\n return Array.isArray(a);\r\n },\r\n\r\n isFunction: function(f){\r\n return typeof(f)===\"function\";\r\n },\r\n\r\n isModule: function(m){\r\n return rtl.isObject(m) && rtl.hasString(m.$name) && (pas[m.$name]===m);\r\n },\r\n\r\n isImplementation: function(m){\r\n return rtl.isObject(m) && rtl.isModule(m.$module) && (m.$module.$impl===m);\r\n },\r\n\r\n isNumber: function(n){\r\n return typeof(n)===\"number\";\r\n },\r\n\r\n isObject: function(o){\r\n var s=typeof(o);\r\n return (typeof(o)===\"object\") && (o!=null);\r\n },\r\n\r\n isString: function(s){\r\n return typeof(s)===\"string\";\r\n },\r\n\r\n getNumber: function(n){\r\n return typeof(n)===\"number\"?n:NaN;\r\n },\r\n\r\n getChar: function(c){\r\n return ((typeof(c)===\"string\") && (c.length===1)) ? c : \"\";\r\n },\r\n\r\n getObject: function(o){\r\n return ((typeof(o)===\"object\") || (typeof(o)==='function')) ? o : null;\r\n },\r\n\r\n isPasClass: function(type){\r\n return (rtl.isObject(type) && type.hasOwnProperty('$classname') && rtl.isObject(type.$module));\r\n },\r\n\r\n isPasClassInstance: function(type){\r\n return (rtl.isObject(type) && rtl.isPasClass(type.$class));\r\n },\r\n\r\n hexStr: function(n,digits){\r\n return (\"000000000000000\"+n.toString(16).toUpperCase()).slice(-digits);\r\n },\r\n\r\n m_loading: 0,\r\n m_loading_intf: 1,\r\n m_intf_loaded: 2,\r\n m_loading_impl: 3, // loading all used unit\r\n m_initializing: 4, // running initialization\r\n m_initialized: 5,\r\n\r\n module: function(module_name, intfuseslist, intfcode, impluseslist, implcode){\r\n if (rtl.debug_load_units) rtl.debug('rtl.module name=\"'+module_name+'\" intfuses='+intfuseslist+' impluses='+impluseslist+' hasimplcode='+rtl.isFunction(implcode));\r\n if (!rtl.hasString(module_name)) rtl.error('invalid module name \"'+module_name+'\"');\r\n if (!rtl.isArray(intfuseslist)) rtl.error('invalid interface useslist of \"'+module_name+'\"');\r\n if (!rtl.isFunction(intfcode)) rtl.error('invalid interface code of \"'+module_name+'\"');\r\n if (!(impluseslist==undefined) && !rtl.isArray(impluseslist)) rtl.error('invalid implementation useslist of \"'+module_name+'\"');\r\n if (!(implcode==undefined) && !rtl.isFunction(implcode)) rtl.error('invalid implementation code of \"'+module_name+'\"');\r\n\r\n if (pas[module_name])\r\n rtl.error('module \"'+module_name+'\" is already registered');\r\n\r\n var module = pas[module_name] = {\r\n $name: module_name,\r\n $intfuseslist: intfuseslist,\r\n $impluseslist: impluseslist,\r\n $state: rtl.m_loading,\r\n $intfcode: intfcode,\r\n $implcode: implcode,\r\n $impl: null,\r\n $rtti: Object.create(rtl.tSectionRTTI)\r\n };\r\n module.$rtti.$module = module;\r\n if (implcode) module.$impl = {\r\n $module: module,\r\n $rtti: module.$rtti\r\n };\r\n },\r\n\r\n exitcode: 0,\r\n\r\n run: function(module_name){\r\n \r\n function doRun(){\r\n if (!rtl.hasString(module_name)) module_name='program';\r\n if (rtl.debug_load_units) rtl.debug('rtl.run module=\"'+module_name+'\"');\r\n rtl.initRTTI();\r\n var module = pas[module_name];\r\n if (!module) rtl.error('rtl.run module \"'+module_name+'\" missing');\r\n rtl.loadintf(module);\r\n rtl.loadimpl(module);\r\n if (module_name=='program'){\r\n if (rtl.debug_load_units) rtl.debug('running $main');\r\n var r = pas.program.$main();\r\n if (rtl.isNumber(r)) rtl.exitcode = r;\r\n }\r\n }\r\n \r\n if (rtl.showUncaughtExceptions) {\r\n try{\r\n doRun();\r\n } catch(re) {\r\n var errMsg = re.hasOwnProperty('$class') ? re.$class.$classname : '';\r\n\t errMsg += ((errMsg) ? ': ' : '') + (re.hasOwnProperty('fMessage') ? re.fMessage : re);\r\n alert('Uncaught Exception : '+errMsg);\r\n rtl.exitCode = 216;\r\n }\r\n } else {\r\n doRun();\r\n }\r\n return rtl.exitcode;\r\n },\r\n\r\n loadintf: function(module){\r\n if (module.$state>rtl.m_loading_intf) return; // already finished\r\n if (rtl.debug_load_units) rtl.debug('loadintf: \"'+module.$name+'\"');\r\n if (module.$state===rtl.m_loading_intf)\r\n rtl.error('unit cycle detected \"'+module.$name+'\"');\r\n module.$state=rtl.m_loading_intf;\r\n // load interfaces of interface useslist\r\n rtl.loaduseslist(module,module.$intfuseslist,rtl.loadintf);\r\n // run interface\r\n if (rtl.debug_load_units) rtl.debug('loadintf: run intf of \"'+module.$name+'\"');\r\n module.$intfcode(module.$intfuseslist);\r\n // success\r\n module.$state=rtl.m_intf_loaded;\r\n // Note: units only used in implementations are not yet loaded (not even their interfaces)\r\n },\r\n\r\n loaduseslist: function(module,useslist,f){\r\n if (useslist==undefined) return;\r\n for (var i in useslist){\r\n var unitname=useslist[i];\r\n if (rtl.debug_load_units) rtl.debug('loaduseslist of \"'+module.$name+'\" uses=\"'+unitname+'\"');\r\n if (pas[unitname]==undefined)\r\n rtl.error('module \"'+module.$name+'\" misses \"'+unitname+'\"');\r\n f(pas[unitname]);\r\n }\r\n },\r\n\r\n loadimpl: function(module){\r\n if (module.$state>=rtl.m_loading_impl) return; // already processing\r\n if (module.$state0){\r\n o = this[newinstancefnname](fnname,args);\r\n } else {\r\n o = Object.create(this);\r\n }\r\n o.$class = this; // Note: o.$class === Object.getPrototypeOf(o)\r\n o.$init();\r\n try{\r\n o[fnname].apply(o,args);\r\n if (o.AfterConstruction) o.AfterConstruction();\r\n } catch($e){\r\n o.$destroy;\r\n throw $e;\r\n }\r\n return o;\r\n };\r\n c.$destroy = function(fnname){\r\n if (this.BeforeDestruction) this.BeforeDestruction();\r\n this[fnname]();\r\n this.$final;\r\n };\r\n rtl.initClass(c,parent,name,initfn);\r\n },\r\n\r\n tObjectDestroy: \"Destroy\",\r\n\r\n free: function(obj,name){\r\n if (obj[name]==null) return;\r\n obj[name].$destroy(rtl.tObjectDestroy);\r\n obj[name]=null;\r\n },\r\n\r\n freeLoc: function(obj){\r\n if (obj==null) return;\r\n obj.$destroy(rtl.tObjectDestroy);\r\n return null;\r\n },\r\n\r\n is: function(instance,type){\r\n return type.isPrototypeOf(instance) || (instance===type);\r\n },\r\n\r\n isExt: function(instance,type,mode){\r\n // mode===1 means instance must be a Pascal class instance\r\n // mode===2 means instance must be a Pascal class\r\n // Notes:\r\n // isPrototypeOf and instanceof return false on equal\r\n // isPrototypeOf does not work for Date.isPrototypeOf(new Date())\r\n // so if isPrototypeOf is false test with instanceof\r\n // instanceof needs a function on right side\r\n if (instance == null) return false; // Note: ==null checks for undefined too\r\n if ((typeof(type) !== 'object') && (typeof(type) !== 'function')) return false;\r\n if (instance === type){\r\n if (mode===1) return false;\r\n if (mode===2) return rtl.isPasClass(instance);\r\n return true;\r\n }\r\n if (type.isPrototypeOf && type.isPrototypeOf(instance)){\r\n if (mode===1) return rtl.isPasClassInstance(instance);\r\n if (mode===2) return rtl.isPasClass(instance);\r\n return true;\r\n }\r\n if ((typeof type == 'function') && (instance instanceof type)) return true;\r\n return false;\r\n },\r\n\r\n Exception: null,\r\n EInvalidCast: null,\r\n EAbstractError: null,\r\n ERangeError: null,\r\n\r\n raiseE: function(typename){\r\n var t = rtl[typename];\r\n if (t==null){\r\n var mod = pas.SysUtils;\r\n if (!mod) mod = pas.sysutils;\r\n if (mod){\r\n t = mod[typename];\r\n if (!t) t = mod[typename.toLowerCase()];\r\n if (!t) t = mod['Exception'];\r\n if (!t) t = mod['exception'];\r\n }\r\n }\r\n if (t){\r\n if (t.Create){\r\n throw t.$create(\"Create\");\r\n } else if (t.create){\r\n throw t.$create(\"create\");\r\n }\r\n }\r\n if (typename === \"EInvalidCast\") throw \"invalid type cast\";\r\n if (typename === \"EAbstractError\") throw \"Abstract method called\";\r\n if (typename === \"ERangeError\") throw \"range error\";\r\n throw typename;\r\n },\r\n\r\n as: function(instance,type){\r\n if((instance === null) || rtl.is(instance,type)) return instance;\r\n rtl.raiseE(\"EInvalidCast\");\r\n },\r\n\r\n asExt: function(instance,type,mode){\r\n if((instance === null) || rtl.isExt(instance,type,mode)) return instance;\r\n rtl.raiseE(\"EInvalidCast\");\r\n },\r\n\r\n createInterface: function(module, name, guid, fnnames, ancestor, initfn){\r\n //console.log('createInterface name=\"'+name+'\" guid=\"'+guid+'\" names='+fnnames);\r\n var i = ancestor?Object.create(ancestor):{};\r\n module[name] = i;\r\n i.$module = module;\r\n i.$name = name;\r\n i.$fullname = module.$name+'.'+name;\r\n i.$guid = guid;\r\n i.$guidr = null;\r\n i.$names = fnnames?fnnames:[];\r\n if (rtl.isFunction(initfn)){\r\n // rtti\r\n if (rtl.debug_rtti) rtl.debug('createInterface '+i.$fullname);\r\n var t = i.$module.$rtti.$Interface(name,{ \"interface\": i, module: module });\r\n i.$rtti = t;\r\n if (ancestor) t.ancestor = ancestor.$rtti;\r\n if (!t.ancestor) t.ancestor = null;\r\n initfn.call(i);\r\n }\r\n return i;\r\n },\r\n\r\n strToGUIDR: function(s,g){\r\n var p = 0;\r\n function n(l){\r\n var h = s.substr(p,l);\r\n p+=l;\r\n return parseInt(h,16);\r\n }\r\n p+=1; // skip {\r\n g.D1 = n(8);\r\n p+=1; // skip -\r\n g.D2 = n(4);\r\n p+=1; // skip -\r\n g.D3 = n(4);\r\n p+=1; // skip -\r\n if (!g.D4) g.D4=[];\r\n g.D4[0] = n(2);\r\n g.D4[1] = n(2);\r\n p+=1; // skip -\r\n for(var i=2; i<8; i++) g.D4[i] = n(2);\r\n return g;\r\n },\r\n\r\n guidrToStr: function(g){\r\n if (g.$intf) return g.$intf.$guid;\r\n var h = rtl.hexStr;\r\n var s='{'+h(g.D1,8)+'-'+h(g.D2,4)+'-'+h(g.D3,4)+'-'+h(g.D4[0],2)+h(g.D4[1],2)+'-';\r\n for (var i=2; i<8; i++) s+=h(g.D4[i],2);\r\n s+='}';\r\n return s;\r\n },\r\n\r\n createTGUID: function(guid){\r\n var TGuid = (pas.System)?pas.System.TGuid:pas.system.tguid;\r\n var g = rtl.strToGUIDR(guid,new TGuid());\r\n return g;\r\n },\r\n\r\n getIntfGUIDR: function(intfTypeOrVar){\r\n if (!intfTypeOrVar) return null;\r\n if (!intfTypeOrVar.$guidr){\r\n var g = rtl.createTGUID(intfTypeOrVar.$guid);\r\n if (!intfTypeOrVar.hasOwnProperty('$guid')) intfTypeOrVar = Object.getPrototypeOf(intfTypeOrVar);\r\n g.$intf = intfTypeOrVar;\r\n intfTypeOrVar.$guidr = g;\r\n }\r\n return intfTypeOrVar.$guidr;\r\n },\r\n\r\n addIntf: function (aclass, intf, map){\r\n function jmp(fn){\r\n if (typeof(fn)===\"function\"){\r\n return function(){ return fn.apply(this.$o,arguments); };\r\n } else {\r\n return function(){ rtl.raiseE('EAbstractError'); };\r\n }\r\n }\r\n if(!map) map = {};\r\n var t = intf;\r\n var item = Object.create(t);\r\n aclass.$intfmaps[intf.$guid] = item;\r\n do{\r\n var names = t.$names;\r\n if (!names) break;\r\n for (var i=0; i=minval) && (i<=maxval)) return i;\r\n rtl.raiseE('ERangeError');\r\n },\r\n\r\n rcc: function(c,minval,maxval){\r\n // range check char\r\n if ((typeof(c)==='string') && (c.length===1)){\r\n var i = c.charCodeAt(0);\r\n if ((i>=minval) && (i<=maxval)) return c;\r\n }\r\n rtl.raiseE('ERangeError');\r\n },\r\n\r\n rcSetCharAt: function(s,index,c){\r\n // range check setCharAt\r\n if ((typeof(s)!=='string') || (index<0) || (index>=s.length)) rtl.raiseE('ERangeError');\r\n return rtl.setCharAt(s,index,c);\r\n },\r\n\r\n rcCharAt: function(s,index){\r\n // range check charAt\r\n if ((typeof(s)!=='string') || (index<0) || (index>=s.length)) rtl.raiseE('ERangeError');\r\n return s.charAt(index);\r\n },\r\n\r\n rcArrR: function(arr,index){\r\n // range check read array\r\n if (Array.isArray(arr) && (typeof(index)==='number') && (index>=0) && (index2){\r\n // arr,index1,index2,...\r\n arr=arr[index];\r\n for (var i=2; i=0) && (indexsrcarray.length) end = srcarray.length;\r\n if (index>=end) return [];\r\n if (type===0){\r\n return srcarray.slice(index,end);\r\n } else {\r\n var a = [];\r\n a.length = end-index;\r\n rtl.arrayClone(type,srcarray,index,end,a,0);\r\n return a;\r\n }\r\n },\r\n\r\n setCharAt: function(s,index,c){\r\n return s.substr(0,index)+c+s.substr(index+1);\r\n },\r\n\r\n getResStr: function(mod,name){\r\n var rs = mod.$resourcestrings[name];\r\n return rs.current?rs.current:rs.org;\r\n },\r\n\r\n createSet: function(){\r\n var s = {};\r\n for (var i=0; i newlen){\r\n return s.substring(0,newlen);\r\n } else if (s.repeat){\r\n // Note: repeat needs ECMAScript6!\r\n return s+' '.repeat(newlen-oldlen);\r\n } else {\r\n while (oldlen=width) return s;\r\n if (s.repeat){\r\n // Note: repeat needs ECMAScript6!\r\n return ' '.repeat(width-l) + s;\r\n } else {\r\n while (l2){\r\n return rtl.spaceLeft(d.toFixed(p),w);\r\n } else {\r\n\t // exponent width\r\n\t var pad = \"\";\r\n\t var ad = Math.abs(d);\r\n\t if (ad<1.0e+10) {\r\n\t\tpad='00';\r\n\t } else if (ad<1.0e+100) {\r\n\t\tpad='0';\r\n } \t\r\n\t if (arguments.length<2) {\r\n\t w=9;\t\t\r\n } else if (w<9) {\r\n\t\tw=9;\r\n }\t\t \r\n var p = w-8;\r\n var s=(d>0 ? \" \" : \"\" ) + d.toExponential(p);\r\n s=s.replace(/e(.)/,'E$1'+pad);\r\n return rtl.spaceLeft(s,w);\r\n }\r\n },\r\n\r\n initRTTI: function(){\r\n if (rtl.debug_rtti) rtl.debug('initRTTI');\r\n\r\n // base types\r\n rtl.tTypeInfo = { name: \"tTypeInfo\" };\r\n function newBaseTI(name,kind,ancestor){\r\n if (!ancestor) ancestor = rtl.tTypeInfo;\r\n if (rtl.debug_rtti) rtl.debug('initRTTI.newBaseTI \"'+name+'\" '+kind+' (\"'+ancestor.name+'\")');\r\n var t = Object.create(ancestor);\r\n t.name = name;\r\n t.kind = kind;\r\n rtl[name] = t;\r\n return t;\r\n };\r\n function newBaseInt(name,minvalue,maxvalue,ordtype){\r\n var t = newBaseTI(name,1 /* tkInteger */,rtl.tTypeInfoInteger);\r\n t.minvalue = minvalue;\r\n t.maxvalue = maxvalue;\r\n t.ordtype = ordtype;\r\n return t;\r\n };\r\n newBaseTI(\"tTypeInfoInteger\",1 /* tkInteger */);\r\n newBaseInt(\"shortint\",-0x80,0x7f,0);\r\n newBaseInt(\"byte\",0,0xff,1);\r\n newBaseInt(\"smallint\",-0x8000,0x7fff,2);\r\n newBaseInt(\"word\",0,0xffff,3);\r\n newBaseInt(\"longint\",-0x80000000,0x7fffffff,4);\r\n newBaseInt(\"longword\",0,0xffffffff,5);\r\n newBaseInt(\"nativeint\",-0x10000000000000,0xfffffffffffff,6);\r\n newBaseInt(\"nativeuint\",0,0xfffffffffffff,7);\r\n newBaseTI(\"char\",2 /* tkChar */);\r\n newBaseTI(\"string\",3 /* tkString */);\r\n newBaseTI(\"tTypeInfoEnum\",4 /* tkEnumeration */,rtl.tTypeInfoInteger);\r\n newBaseTI(\"tTypeInfoSet\",5 /* tkSet */);\r\n newBaseTI(\"double\",6 /* tkDouble */);\r\n newBaseTI(\"boolean\",7 /* tkBool */);\r\n newBaseTI(\"tTypeInfoProcVar\",8 /* tkProcVar */);\r\n newBaseTI(\"tTypeInfoMethodVar\",9 /* tkMethod */,rtl.tTypeInfoProcVar);\r\n newBaseTI(\"tTypeInfoArray\",10 /* tkArray */);\r\n newBaseTI(\"tTypeInfoDynArray\",11 /* tkDynArray */);\r\n newBaseTI(\"tTypeInfoPointer\",15 /* tkPointer */);\r\n var t = newBaseTI(\"pointer\",15 /* tkPointer */,rtl.tTypeInfoPointer);\r\n t.reftype = null;\r\n newBaseTI(\"jsvalue\",16 /* tkJSValue */);\r\n newBaseTI(\"tTypeInfoRefToProcVar\",17 /* tkRefToProcVar */,rtl.tTypeInfoProcVar);\r\n\r\n // member kinds\r\n rtl.tTypeMember = {};\r\n function newMember(name,kind){\r\n var m = Object.create(rtl.tTypeMember);\r\n m.name = name;\r\n m.kind = kind;\r\n rtl[name] = m;\r\n };\r\n newMember(\"tTypeMemberField\",1); // tmkField\r\n newMember(\"tTypeMemberMethod\",2); // tmkMethod\r\n newMember(\"tTypeMemberProperty\",3); // tmkProperty\r\n\r\n // base object for storing members: a simple object\r\n rtl.tTypeMembers = {};\r\n\r\n // tTypeInfoStruct - base object for tTypeInfoClass, tTypeInfoRecord, tTypeInfoInterface\r\n var tis = newBaseTI(\"tTypeInfoStruct\",0);\r\n tis.$addMember = function(name,ancestor,options){\r\n if (rtl.debug_rtti){\r\n if (!rtl.hasString(name) || (name.charAt()==='$')) throw 'invalid member \"'+name+'\", this=\"'+this.name+'\"';\r\n if (!rtl.is(ancestor,rtl.tTypeMember)) throw 'invalid ancestor \"'+ancestor+':'+ancestor.name+'\", \"'+this.name+'.'+name+'\"';\r\n if ((options!=undefined) && (typeof(options)!='object')) throw 'invalid options \"'+options+'\", \"'+this.name+'.'+name+'\"';\r\n };\r\n var t = Object.create(ancestor);\r\n t.name = name;\r\n this.members[name] = t;\r\n this.names.push(name);\r\n if (rtl.isObject(options)){\r\n for (var key in options) if (options.hasOwnProperty(key)) t[key] = options[key];\r\n };\r\n return t;\r\n };\r\n tis.addField = function(name,type,options){\r\n var t = this.$addMember(name,rtl.tTypeMemberField,options);\r\n if (rtl.debug_rtti){\r\n if (!rtl.is(type,rtl.tTypeInfo)) throw 'invalid type \"'+type+'\", \"'+this.name+'.'+name+'\"';\r\n };\r\n t.typeinfo = type;\r\n this.fields.push(name);\r\n return t;\r\n };\r\n tis.addFields = function(){\r\n var i=0;\r\n while(i0) ? S.substring(Index-1,Index+Size-1) : \"\";\r\nend;\r\n\r\nfunction Copy(const S: string; Index: Integer): String; assembler;\r\nasm\r\n if (Index<1) Index = 1;\r\n return S.substr(Index-1);\r\nend;\r\n\r\nprocedure Delete(var S: String; Index, Size: Integer);\r\nvar\r\n h: String;\r\nbegin\r\n if (Index<1) or (Index>length(S)) or (Size<=0) then exit;\r\n h:=S;\r\n S:=copy(h,1,Index-1)+copy(h,Index+Size);\r\nend;\r\n\r\nfunction Pos(const Search, InString: String): Integer; assembler;\r\nasm\r\n return InString.indexOf(Search)+1;\r\nend;\r\n\r\n//function Pos(const Search, InString: String; StartAt : Integer): Integer; assembler; overload;\r\n//\r\n//asm\r\n// return InString.indexOf(Search,StartAt-1)+1;\r\n//end;\r\n\r\n\r\n\r\nprocedure Insert(const Insertion: String; var Target: String; Index: Integer);\r\nvar\r\n t: String;\r\nbegin\r\n if Insertion='' then exit;\r\n t:=Target;\r\n if Index<1 then\r\n Target:=Insertion+t\r\n else if Index>length(t) then\r\n Target:=t+Insertion\r\n else\r\n Target:=copy(t,1,Index-1)+Insertion+copy(t,Index,length(t));\r\nend;\r\n\r\nvar\r\n WriteBuf: String;\r\n JSArguments: array of JSValue; external name 'arguments';\r\n WriteCallBack : TConsoleHandler;\r\n\r\nFunction SetWriteCallBack(H : TConsoleHandler) : TConsoleHandler;\r\n\r\nbegin\r\n Result:=WriteCallBack;\r\n WriteCallBack:=H;\r\nend;\r\n\r\nprocedure Write;\r\nvar\r\n i: Integer;\r\nbegin\r\n for i:=0 to length(JSArguments)-1 do\r\n if Assigned(WriteCallBack) then\r\n WriteCallBack(JSArguments[i],False)\r\n else\r\n WriteBuf:=WriteBuf+String(JSArguments[i]);\r\nend;\r\n\r\nprocedure Writeln;\r\n\r\nvar\r\n i,l: Integer;\r\n s: String;\r\n\r\nbegin\r\n L:=length(JSArguments)-1;\r\n if Assigned(WriteCallBack) then\r\n begin\r\n for i:=0 to L do\r\n WriteCallBack(JSArguments[i],I=L);\r\n end\r\n else\r\n begin\r\n s:=WriteBuf;\r\n for i:=0 to L do\r\n s:=s+String(JSArguments[i]);\r\n asm\r\n console.log(s);\r\n end;\r\n WriteBuf:='';\r\n end;\r\nend;\r\n\r\nfunction Int(const A: Double): double;\r\n\r\n function FTrunc(const A: Double): double; overload; external name 'Math.trunc';\r\n\r\nbegin\r\n Result:=FTrunc(A);\r\nend;\r\n\r\nfunction Number(S: String): Double; external name 'Number';\r\n\r\nprocedure val(const S: String; out NI : NativeInt; out Code: Integer);\r\n\r\nvar\r\n x : double;\r\n\r\nbegin\r\n Code:=0;\r\n x:=Number(S);\r\n if isNaN(x) or (X<>Int(X)) then\r\n Code:=1\r\n else\r\n NI:=Trunc(x);\r\nend;\r\n\r\nprocedure val(const S: String; out SI : ShortInt; out Code: Integer);\r\n\r\nvar\r\n X:Double;\r\nbegin\r\n Code:=0;\r\n x:=Number(S);\r\n if isNaN(x) or (X<>Int(X)) then\r\n Code:=1\r\n else if (xMaxShortInt) then\r\n Code:=2\r\n else\r\n SI:=Trunc(x);\r\nend;\r\n\r\nprocedure val(const S: String; out SI: smallint; out Code: Integer);\r\n\r\nvar\r\n x: double;\r\nbegin\r\n Code:=0;\r\n x:=Number(S);\r\n if isNaN(x) or (X<>Int(X)) then\r\n Code:=1\r\n else if (xMaxSmallint) then\r\n Code:=2\r\n else\r\n SI:=Trunc(x);\r\nend;\r\n\r\nprocedure val(const S: String; out C: Cardinal; out Code: Integer);\r\n\r\nvar\r\n x: double;\r\nbegin\r\n Code:=0;\r\n x:=Number(S);\r\n if isNaN(x) or (X<>Int(X)) then\r\n Code:=1\r\n else if (x<0) or (x>MaxCardinal) then\r\n Code:=2\r\n else\r\n C:=trunc(x);\r\nend;\r\n\r\nprocedure val(const S: String; out B: Byte; out Code: Integer);\r\n\r\nvar\r\n x: double;\r\nbegin\r\n Code:=0;\r\n x:=Number(S);\r\n if isNaN(x) or (X<>Int(X)) then\r\n Code:=1\r\n else if (x<0) or (x>MaxByte) then\r\n Code:=2\r\n else\r\n B:=Trunc(x);\r\nend;\r\n\r\n\r\nprocedure val(const S: String; out W: word; out Code: Integer);\r\n\r\nvar\r\n x: double;\r\nbegin\r\n Code:=0;\r\n x:=Number(S);\r\n if isNaN(x) then\r\n Code:=1\r\n else if (x<0) or (x>MaxWord) then\r\n Code:=2\r\n else\r\n W:=Trunc(x);\r\nend;\r\n\r\nprocedure val(const S : String; out I : integer; out Code : Integer);\r\nvar\r\n x: double;\r\nbegin\r\n Code:=0;\r\n x:=Number(S);\r\n if isNaN(x) then\r\n Code:=1\r\n else if x>MaxInt then\r\n Code:=2\r\n else\r\n I:=Trunc(x);\r\nend;\r\n\r\nprocedure val(const S : String; out d : double; out Code : Integer);\r\n\r\nVar\r\n x: double;\r\nbegin\r\n x:=Number(S);\r\n if isNaN(x) then\r\n Code:=1\r\n else\r\n begin\r\n Code:=0;\r\n d:=x;\r\n end;\r\nend;\r\n\r\nfunction upcase(c : char) : char; assembler;\r\n\r\nasm\r\n return c.toUpperCase();\r\nend;\r\n\r\nfunction StringOfChar(c: Char; l: NativeInt): String;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result:='';\r\n for i:=1 to l do Result:=Result+c;\r\nend;\r\n\r\nfunction Assigned(const V: JSValue): boolean; assembler;\r\nasm\r\n return (V!=undefined) && (V!=null) && (!rtl.isArray(V) || (V.length > 0));\r\nend;\r\n\r\nfunction StrictEqual(const A: JSValue; const B): boolean; assembler;\r\nasm\r\n return A === B;\r\nend;\r\n\r\nfunction StrictInequal(const A: JSValue; const B): boolean; assembler;\r\nasm\r\n return A !== B;\r\nend;\r\n\r\n{ TContainedObject }\r\n\r\nfunction TContainedObject.QueryInterface(const iid: TGuid; out obj): Integer;\r\nbegin\r\n if GetInterface(iid,obj) then\r\n Result:=S_OK\r\n else\r\n Result:=Integer(E_NOINTERFACE);\r\nend;\r\n\r\n{ TAggregatedObject }\r\n\r\nfunction TAggregatedObject.GetController: IUnknown;\r\nbegin\r\n Result := IUnknown(fController);\r\nend;\r\n\r\nfunction TAggregatedObject.QueryInterface(const iid: TGuid; out obj): Integer;\r\nbegin\r\n Result := IUnknown(fController).QueryInterface(iid, obj);\r\nend;\r\n\r\nfunction TAggregatedObject._AddRef: Integer;\r\nbegin\r\n Result := IUnknown(fController)._AddRef;\r\nend;\r\n\r\nfunction TAggregatedObject._Release: Integer;\r\nbegin\r\n Result := IUnknown(fController)._Release;\r\nend;\r\n\r\nconstructor TAggregatedObject.Create(const aController: IUnknown);\r\nbegin\r\n inherited Create;\r\n { do not keep a counted reference to the controller! }\r\n fController := Pointer(aController);\r\nend;\r\n\r\n{ TInterfacedObject }\r\n\r\nfunction TInterfacedObject.QueryInterface(const iid: TGuid; out obj): Integer;\r\nbegin\r\n if GetInterface(iid,obj) then\r\n Result:=S_OK\r\n else\r\n Result:=Integer(E_NOINTERFACE);\r\nend;\r\n\r\nfunction TInterfacedObject._AddRef: Integer;\r\nbegin\r\n inc(fRefCount);\r\n Result:=fRefCount;\r\nend;\r\n\r\nfunction TInterfacedObject._Release: Integer;\r\nbegin\r\n dec(fRefCount);\r\n Result:=fRefCount;\r\n if fRefCount=0 then\r\n Destroy;\r\nend;\r\n\r\nprocedure TInterfacedObject.BeforeDestruction;\r\nbegin\r\n if fRefCount<>0 then\r\n asm\r\n rtl.raiseE('EHeapMemoryError');\r\n end;\r\nend;\r\n\r\n{ TObject }\r\n\r\nconstructor TObject.Create;\r\nbegin\r\n\r\nend;\r\n\r\ndestructor TObject.Destroy;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TObject.Free;\r\nbegin\r\n Destroy;\r\nend;\r\n\r\nclass function TObject.ClassType: TClass; assembler;\r\nasm\r\n return this;\r\nend;\r\n\r\nclass function TObject.ClassNameIs(const Name: string): boolean;\r\nbegin\r\n Result:=SameText(Name,ClassName);\r\nend;\r\n\r\nclass function TObject.InheritsFrom(aClass: TClass): boolean; assembler;\r\nasm\r\n return (aClass!=null) && ((this==aClass) || aClass.isPrototypeOf(this));\r\nend;\r\n\r\nprocedure TObject.AfterConstruction;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TObject.BeforeDestruction;\r\nbegin\r\n\r\nend;\r\n\r\nfunction TObject.GetInterface(const iid: TGuid; out obj): boolean;\r\nbegin\r\n asm\r\n var i = iid.$intf;\r\n if (i){\r\n i = rtl.getIntfG(this,i.$guid,2);\r\n if (i){\r\n obj.set(i);\r\n return true;\r\n }\r\n }\r\n end;\r\n Result := GetInterfaceByStr(GUIDToString(iid),obj);\r\nend;\r\n\r\nfunction TObject.GetInterface(const iidstr: String; out obj): boolean;\r\nbegin\r\n Result := GetInterfaceByStr(iidstr,obj);\r\nend;\r\n\r\nfunction TObject.GetInterfaceByStr(const iidstr: String; out obj): boolean;\r\nbegin\r\n if (iidstr = IObjectInstance) then\r\n begin\r\n obj:=Self;\r\n exit(true);\r\n end;\r\n asm\r\n var i = rtl.getIntfG(this,iidstr,2);\r\n obj.set(i);\r\n return i!==null;\r\n end;\r\n Result:=false;\r\nend;\r\n\r\nfunction TObject.GetInterfaceWeak(const iid: TGuid; out obj): boolean;\r\nbegin\r\n Result:=GetInterface(iid,obj);\r\n asm\r\n if (Result){\r\n var o = obj.get();\r\n if (o.$kind==='com'){\r\n o._Release();\r\n }\r\n }\r\n end;\r\nend;\r\n\r\nfunction TObject.Equals(Obj: TObject): boolean;\r\nbegin\r\n Result:=Obj=Self;\r\nend;\r\n\r\nfunction TObject.ToString: String;\r\nbegin\r\n Result:=ClassName;\r\nend;\r\n\r\n\r\ninitialization\r\n ExitCode:=0; // set it here, so that WPO does not remove it\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit RTLConsts;\r\n\r\ninterface\r\n\r\nconst\r\n SArgumentMissing = 'Missing argument in format \"%s\"';\r\n SInvalidFormat = 'Invalid format specifier : \"%s\"';\r\n SInvalidArgIndex = 'Invalid argument index in format: \"%s\"';\r\n SListCapacityError = 'List capacity (%s) exceeded.';\r\n SListCountError = 'List count (%s) out of bounds.';\r\n SListIndexError = 'List index (%s) out of bounds';\r\n SSortedListError = 'Operation not allowed on sorted list';\r\n SDuplicateString = 'String list does not allow duplicates'; \r\n SErrFindNeedsSortedList = 'Cannot use find on unsorted list';\r\n\r\n SInvalidName = 'Invalid component name: \"%s\"';\r\n SInvalidBoolean = '\"%s\" is not a valid boolean.';\r\n SDuplicateName = 'Duplicate component name: \"%s\"';\r\n\r\n SErrInvalidDate = 'Invalid date: \"%s\"';\r\n SErrInvalidTimeFormat = 'Invalid time format: \"%s\"';\r\n SInvalidDateFormat = 'Invalid date format: \"%s\"';\r\n\r\n SCantReadPropertyS = 'Cannot read property \"%s\"';\r\n SCantWritePropertyS = 'Cannot write property \"%s\"';\r\n SErrPropertyNotFound = 'Unknown property: \"%s\"';\r\n SIndexedPropertyNeedsParams = 'Indexed property \"%s\" needs parameters';\r\n\r\n SErrInvalidInteger = 'Invalid integer value: \"%s\"';\r\n SErrInvalidFloat = 'Invalid floating-point value: \"%s\"';\r\n SInvalidDateTime = 'Invalid date-time value: %s';\r\n SInvalidCurrency = 'Invalid currency value: %s';\r\n SErrInvalidDayOfWeek = '%d is not a valid day of the week';\r\n SErrInvalidTimeStamp = 'Invalid date/timestamp : \"%s\"';\r\n SErrInvalidDateWeek = '%d %d %d is not a valid dateweek';\r\n SErrInvalidDayOfYear = 'Year %d does not have a day number %d';\r\n SErrInvalidDateMonthWeek = 'Year %d, month %d, Week %d and day %d is not a valid date.';\r\n SErrInvalidDayOfWeekInMonth = 'Year %d Month %d NDow %d DOW %d is not a valid date';\r\n SInvalidJulianDate = '%f Julian cannot be represented as a DateTime';\r\n SErrInvalidHourMinuteSecMsec = '%d:%d:%d.%d is not a valid time specification';\r\n\r\n SInvalidGUID = '\"%s\" is not a valid GUID value';\r\n\r\nimplementation\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2018 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit Types;\r\n\r\n{$mode objfpc}\r\n\r\ninterface\r\n\r\ntype\r\n TDirection = (FromBeginning, FromEnd);\r\n\r\n TBooleanDynArray = array of Boolean;\r\n TIntegerDynArray = array of Integer;\r\n TStringDynArray = array of String;\r\n TDoubleDynArray = array of Double;\r\n TJSValueDynArray = array of JSValue;\r\n\r\n TDuplicates = (dupIgnore, dupAccept, dupError);\r\n\r\n TListCallback = procedure(data, arg: JSValue) of object;\r\n TListStaticCallback = procedure(data, arg: JSValue);\r\n\r\n TSize = record\r\n cx, cy: integer;\r\n end;\r\n\r\n TPoint = record\r\n x, y: integer;\r\n end;\r\n\r\n TRect = record\r\n Left, Top, Right, Bottom: Integer;\r\n end;\r\n\r\nfunction EqualRect(const r1,r2 : TRect) : Boolean;\r\nfunction Rect(Left, Top, Right, Bottom : Integer) : TRect;\r\nfunction Bounds(ALeft, ATop, AWidth, AHeight : Integer) : TRect;\r\nfunction Point(x,y : Integer): TPoint; {$IFDEF Has_Inline}inline;{$ENDIF}\r\nfunction PtInRect(const aRect: TRect; const p: TPoint) : Boolean;\r\nfunction IntersectRect(out aRect: TRect; const R1,R2: TRect) : Boolean;\r\nfunction UnionRect(out aRect: TRect; const R1,R2: TRect) : Boolean;\r\nfunction IsRectEmpty(const aRect: TRect) : Boolean;\r\nfunction OffsetRect(var aRect: TRect; DX, DY: Integer) : Boolean;\r\nfunction CenterPoint(const aRect: TRect): TPoint;\r\nfunction InflateRect(var aRect: TRect; dx, dy: Integer): Boolean;\r\nfunction Size(AWidth, AHeight: Integer): TSize;\r\nfunction Size(const aRect: TRect): TSize;\r\n\r\nimplementation\r\n\r\nfunction EqualRect(const r1, r2: TRect): Boolean;\r\nbegin\r\n Result:=(r1.left=r2.left) and (r1.right=r2.right) and (r1.top=r2.top) and (r1.bottom=r2.bottom);\r\nend;\r\n\r\nfunction Rect(Left, Top, Right, Bottom: Integer): TRect;\r\nbegin\r\n Result.Left:=Left;\r\n Result.Top:=Top;\r\n Result.Right:=Right;\r\n Result.Bottom:=Bottom;\r\nend;\r\n\r\nfunction Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;\r\nbegin\r\n Result.Left:=ALeft;\r\n Result.Top:=ATop;\r\n Result.Right:=ALeft+AWidth;\r\n Result.Bottom:=ATop+AHeight;\r\nend;\r\n\r\nfunction Point(x, y: Integer): TPoint;\r\nbegin\r\n Result.x:=x;\r\n Result.y:=y;\r\nend;\r\n\r\nfunction PtInRect(const aRect: TRect; const p: TPoint): Boolean;\r\nbegin\r\n Result:=(p.y>=aRect.Top) and\r\n (p.y=aRect.Left) and\r\n (p.x R1.Left then\r\n lRect.Left := R2.Left;\r\n if R2.Top > R1.Top then\r\n lRect.Top := R2.Top;\r\n if R2.Right < R1.Right then\r\n lRect.Right := R2.Right;\r\n if R2.Bottom < R1.Bottom then\r\n lRect.Bottom := R2.Bottom;\r\n\r\n // The var parameter is only assigned in the end to avoid problems\r\n // when passing the same rectangle in the var and const parameters.\r\n if IsRectEmpty(lRect) then\r\n begin\r\n aRect:=Rect(0,0,0,0);\r\n Result:=false;\r\n end\r\n else\r\n begin\r\n Result:=true;\r\n aRect := lRect;\r\n end;\r\nend;\r\n\r\nfunction UnionRect(out aRect: TRect; const R1, R2: TRect): Boolean;\r\nvar\r\n lRect: TRect;\r\nbegin\r\n lRect:=R1;\r\n if R2.LeftR1.Right then\r\n lRect.Right:=R2.Right;\r\n if R2.Bottom>R1.Bottom then\r\n lRect.Bottom:=R2.Bottom;\r\n\r\n if IsRectEmpty(lRect) then\r\n begin\r\n aRect:=Rect(0,0,0,0);\r\n Result:=false;\r\n end\r\n else\r\n begin\r\n aRect:=lRect;\r\n Result:=true;\r\n end;\r\nend;\r\n\r\nfunction IsRectEmpty(const aRect: TRect): Boolean;\r\nbegin\r\n Result:=(aRect.Right<=aRect.Left) or (aRect.Bottom<=aRect.Top);\r\nend;\r\n\r\nfunction OffsetRect(var aRect: TRect; DX, DY: Integer): Boolean;\r\nbegin\r\n with aRect do\r\n begin\r\n inc(Left,dx);\r\n inc(Top,dy);\r\n inc(Right,dx);\r\n inc(Bottom,dy);\r\n end;\r\n Result:=true;\r\nend;\r\n\r\nfunction CenterPoint(const aRect: TRect): TPoint;\r\n\r\n function Avg(a, b: Longint): Longint;\r\n begin\r\n if a < b then\r\n Result := a + ((b - a) shr 1)\r\n else\r\n Result := b + ((a - b) shr 1);\r\n end;\r\n\r\nbegin\r\n with aRect do\r\n begin\r\n Result.X := Avg(Left, Right);\r\n Result.Y := Avg(Top, Bottom);\r\n end;\r\nend;\r\n\r\nfunction InflateRect(var aRect: TRect; dx, dy: Integer): Boolean;\r\nbegin\r\n with aRect do\r\n begin\r\n dec(Left, dx);\r\n dec(Top, dy);\r\n inc(Right, dx);\r\n inc(Bottom, dy);\r\n end;\r\n Result := True;\r\nend;\r\n\r\nfunction Size(AWidth, AHeight: Integer): TSize;\r\nbegin\r\n Result.cx := AWidth;\r\n Result.cy := AHeight;\r\nend;\r\n\r\nfunction Size(const aRect: TRect): TSize;\r\nbegin\r\n Result.cx := aRect.Right - aRect.Left;\r\n Result.cy := aRect.Bottom - aRect.Top;\r\nend;\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit JS;\r\n\r\n{$mode objfpc}\r\n{$modeswitch externalclass}\r\n\r\n{$HINTS OFF}\r\n\r\ninterface\r\n\r\nuses\r\n Types;\r\n\r\ntype\r\n // We cannot use EConvertError or Exception, this would result in a circular dependency.\r\n\r\n { EJS }\r\n\r\n EJS = class(TObject)\r\n private\r\n FMessage: string;\r\n Public\r\n constructor Create(const Msg: String); reintroduce;\r\n property Message : string Read FMessage Write FMessage;\r\n end;\r\n\r\n TJSObjectPropertyDescriptor = JSValue;\r\n Float32 = Double;\r\n Float64 = Double;\r\n\r\n { TJSObject }\r\n\r\n TJSObject = class external name 'Object'\r\n private\r\n function GetProperties(Name: String): JSValue; external name '[]';\r\n procedure SetProperties(Name: String; const AValue: JSValue); external name '[]';\r\n public\r\n constructor new;\r\n class function create(const proto: TJSObject): TJSObject;\r\n class function create(const proto, propertiesObject: TJSObject): TJSObject;\r\n class function assign(const Target, Source1: TJSObject): TJSObject; varargs;\r\n class procedure defineProperty(const obj: TJSObject; propname: String; const descriptor: TJSObjectPropertyDescriptor);\r\n //class procedure defineProperties\r\n class function freeze(const obj: TJSObject): TJSObject;\r\n class function getOwnPropertyDescriptor(const obj: TJSObject; propname: String): TJSObjectPropertyDescriptor;\r\n //class function getOwnPropertyDescriptors\r\n class function getOwnPropertyNames(const obj: TJSObject): TStringDynArray;\r\n {$IFDEF FIREFOX}\r\n class function getOwnPropertySymbols(const obj: TJSObject): TJSValueDynArray;\r\n {$ENDIF}\r\n class function getPrototypeOf(const obj: TJSObject): TJSObject;\r\n {$IFDEF FIREFOX}\r\n class function _is(const value1, value2: JSValue): boolean;\r\n {$ENDIF}\r\n class function isExtensible(const obj: TJSObject): boolean;\r\n class function isFrozen(const obj: TJSObject): boolean;\r\n class function isSealed(const obj: TJSObject): boolean;\r\n class function keys(const obj: TJSObject): TStringDynArray;\r\n class function preventExtensions(const obj: TJSObject): TJSObject;\r\n class function seal(const obj: TJSObject): TJSObject;\r\n class function setPrototypeOf(const obj, prototype: TJSObject): TJSObject;\r\n function hasOwnProperty(prop: String): boolean;\r\n function isPrototypeOf(const obj: TJSObject): boolean;\r\n function propertyIsEnumerable(propname: String): boolean;\r\n function toLocaleString: String;\r\n function toString: String;\r\n function valueOf: JSValue;\r\n property Properties[Name: String]: JSValue read GetProperties write SetProperties; default;\r\n end;\r\n\r\n TJSObjectDynArray = Array of TJSObject;\r\n TJSObjectDynArrayArray = Array of TJSObjectDynArray;\r\n TJSStringDynArray = Array of String;\r\n\r\n { TJSFunction }\r\n\r\n TJSFunction = class external name 'Function'(TJSObject)\r\n private\r\n Flength: NativeInt external name 'length';\r\n Fprototyp: TJSFunction external name 'prototyp';\r\n public\r\n name: String;\r\n property prototyp: TJSFunction read Fprototyp;\r\n property length: NativeInt read Flength;\r\n function apply(thisArg: TJSObject; const ArgArray: TJSValueDynArray): JSValue; varargs;\r\n function bind(thisArg: TJSObject): JSValue; varargs;\r\n function call(thisArg: TJSObject): JSValue; varargs;\r\n end;\r\n\r\n { TJSDate - wrapper for JavaScript Date }\r\n\r\n TJSDate = class external name 'Date'(TJSFunction)\r\n private\r\n function getDate: NativeInt;\r\n function getFullYear: NativeInt;\r\n function getHours: NativeInt;\r\n function getMilliseconds: NativeInt;\r\n function getMinutes: NativeInt;\r\n function getMonth: NativeInt;\r\n function getSeconds: NativeInt;\r\n function getYear: NativeInt;\r\n function getTime: NativeInt;\r\n function getUTCDate: NativeInt;\r\n function getUTCFullYear: NativeInt;\r\n function getUTCHours: NativeInt;\r\n function getUTCMilliseconds: NativeInt;\r\n function getUTCMinutes: NativeInt;\r\n function getUTCMonth: NativeInt;\r\n function getUTCSeconds: NativeInt;\r\n procedure setDate(const AValue: NativeInt);\r\n procedure setFullYear(const AValue: NativeInt);\r\n procedure setHours(const AValue: NativeInt);\r\n procedure setMilliseconds(const AValue: NativeInt);\r\n procedure setMinutes(const AValue: NativeInt);\r\n procedure setMonth(const AValue: NativeInt);\r\n procedure setSeconds(const AValue: NativeInt);\r\n procedure setYear(const AValue: NativeInt);\r\n procedure setTime(const AValue: NativeInt);\r\n procedure setUTCDate(const AValue: NativeInt);\r\n procedure setUTCFullYear(const AValue: NativeInt);\r\n procedure setUTCHours(const AValue: NativeInt);\r\n procedure setUTCMilliseconds(const AValue: NativeInt);\r\n procedure setUTCMinutes(const AValue: NativeInt);\r\n procedure setUTCMonth(const AValue: NativeInt);\r\n procedure setUTCSeconds(const AValue: NativeInt);\r\n public\r\n constructor New; reintroduce;\r\n constructor New(const MilliSecsSince1970: NativeInt); // milliseconds since 1 January 1970 00:00:00 UTC, with leap seconds ignored\r\n constructor New(const aDateString: String); // RFC 2822, ISO8601\r\n constructor New(aYear: NativeInt; aMonth: NativeInt; aDayOfMonth: NativeInt = 1;\r\n TheHours: NativeInt = 0; TheMinutes: NativeInt = 0; TheSeconds: NativeInt = 0;\r\n TheMilliseconds: NativeInt = 0);\r\n class function now: NativeInt; // current date and time in milliseconds since 1 January 1970 00:00:00 UTC, with leap seconds ignored\r\n class function parse(const aDateString: string): NativeInt; // format depends on browser\r\n class function UTC(aYear: NativeInt; aMonth: NativeInt = 0; aDayOfMonth: NativeInt = 1;\r\n TheHours: NativeInt = 0; TheMinutes: NativeInt = 0; TheSeconds: NativeInt = 0;\r\n TheMilliseconds: NativeInt = 0): NativeInt;\r\n function getDay: NativeInt;\r\n function getTimezoneOffset: NativeInt;\r\n function getUTCDay: NativeInt; // day of the week\r\n function toDateString: string; // human readable date, without time\r\n function toISOString: string; // ISO 8601 Extended Format\r\n function toJSON: string;\r\n function toGMTString: string; // in GMT timezone\r\n function toLocaleDateString: string; // date in locale timezone, no time\r\n function toLocaleString: string; reintroduce; // date and time in locale timezone\r\n function toLocaleTimeString: string; // time in locale timezone, no date\r\n function toTimeString: string; // time human readable, no date\r\n function toUTCString: string; // date and time using UTC timezone\r\n property Year: NativeInt read getYear write setYear;\r\n property Time: NativeInt read getTime write setTime; // milliseconds since 1 January 1970 00:00:00 UTC, with leap seconds ignored\r\n property FullYear: NativeInt read getFullYear write setFullYear;\r\n property UTCDate: NativeInt read getUTCDate write setUTCDate; // day of month\r\n property UTCFullYear: NativeInt read getUTCFullYear write setUTCFullYear;\r\n property UTCHours: NativeInt read getUTCHours write setUTCHours;\r\n property UTCMilliseconds: NativeInt read getUTCMilliseconds write setUTCMilliseconds;\r\n property UTCMinutes: NativeInt read getUTCMinutes write setUTCMinutes;\r\n property UTCMonth: NativeInt read getUTCMonth write setUTCMonth;\r\n property UTCSeconds: NativeInt read getUTCSeconds write setUTCSeconds;\r\n property Month: NativeInt read getMonth write setMonth;\r\n property Date: NativeInt read getDate write setDate; // day of the month, starting at 1\r\n property Hours: NativeInt read getHours write setHours;\r\n property Minutes: NativeInt read getMinutes write setMinutes;\r\n property Seconds: NativeInt read getSeconds write setSeconds;\r\n property Milliseconds: NativeInt read getMilliseconds write setMilliseconds;\r\n end;\r\n\r\n TLocaleCompareOptions = record\r\n localematched : string;\r\n usage: string;\r\n sensitivity : string;\r\n ignorePunctuation : Boolean;\r\n numeric : boolean;\r\n caseFirst : string;\r\n end;\r\n\r\n TJSRegexp = class external name 'RegExp'\r\n private\r\n {$IFDEF FIREFOX}\r\n // not on all browsers:\r\n FFlags : string; external name 'flags';\r\n FSticky : boolean; external name 'sticky';\r\n {$endif}\r\n fglobal: boolean; external name 'global';\r\n fignoreCase : boolean; external name 'ignoreCase';\r\n fmultiline : boolean; external name 'multiline';\r\n fsource : string; external name 'source';\r\n funicode : boolean; external name 'unicode';\r\n public\r\n Constructor New(Pattern : string);\r\n Constructor New(Pattern, Flags : string);\r\n lastIndex: NativeInt;\r\n function exec(aString : string): TStringDynArray;\r\n function test(aString : string) : boolean;\r\n function toString : String;\r\n property Global : boolean read fglobal;\r\n property IgnoreCase : Boolean read FIgnoreCase;\r\n property Multiline : Boolean Read FMultiLine;\r\n Property Source : string Read FSource;\r\n Property Unicode : boolean Read FUnicode;\r\n {$IFDEF FIREFOX}\r\n // not on all browsers:\r\n property Flags : string read FFlags;\r\n property Sticky : boolean read FSticky;\r\n {$endif}\r\n end;\r\n\r\n\r\n TReplaceCallBack = Function () : string; varargs;\r\n\r\n TJSString = class external name 'String'\r\n private\r\n flength : NativeInt; external name 'length';\r\n public \r\n constructor New(Const S : String);\r\n constructor New(Const I : NativeInt);\r\n constructor New(Const D : double);\r\n property length : NativeInt read flength; \r\n class function fromCharCode() : string; varargs;\r\n class function fromCodePoint() : string; varargs;\r\n function anchor(const aName : string) : string;\r\n function charAt(aIndex : NativeInt) : string;\r\n function charCodeAt(aIndex : NativeInt) : NativeInt;\r\n function codePointAt(aIndex : NativeInt) : NativeInt;\r\n function concat(s : string) : string; varargs;\r\n function endsWith(aSearchString : string; Pos : NativeInt = 0) : boolean;\r\n function includes(aSearchString : string; Pos : NativeInt = 0) : boolean;\r\n function indexOf(aSearchString : String; Pos : NativeInt = 0) : Integer;\r\n function lastIndexOf(aSearchString : String) : NativeInt;overload;\r\n function lastIndexOf(aSearchString : String; Pos : NativeInt) : Integer;overload;\r\n function link(aUrl : string) : String;\r\n function localeCompare(aCompareString : string) : NativeInt; overload;\r\n function localeCompare(aCompareString : string; aLocales: string) : integer; overload;\r\n function localeCompare(compareString : string; locales: string; Options : TlocaleCompareOptions) : integer; overload;\r\n function match(aRegexp : TJSRegexp) : TStringDynArray; overload;\r\n function match(aRegexp : String) : TStringDynArray;overload;\r\n {$IFDEF ECMAScript6}\r\n function normalize(aForm : string) : string;\r\n {$ENDIF}\r\n function _repeat(aCount : NativeInt) : Integer; external name 'repeat';\r\n function replace(aRegexp : String; NewString : String) : String; overload;\r\n function replace(aRegexp : TJSRegexp; NewString : String) : String; overload;\r\n function replace(Regexp : String; aCallback : TReplaceCallBack) : String; overload;\r\n function replace(Regexp : TJSRegexp; aCallback : TReplaceCallBack) : String; overload;\r\n function search(Regexp : TJSRegexp) : NativeInt; overload;\r\n function search(Regexp : JSValue) : NativeInt; overload;\r\n function slice(aBeginIndex : NativeInt) : String; overload;\r\n function slice(aBeginIndex, aEndIndex : NativeInt) : String; overload;\r\n function split : TStringDynArray; overload;\r\n function split(aSeparator : string) : TStringDynArray; overload;\r\n function split(aSeparator : string; aLimit : NativeInt) : TStringDynArray; overload;\r\n function startsWith(aSearchString : String) : Boolean; overload;\r\n function startsWith(aSearchString : String; aPosition : NativeInt) : Boolean; overload;\r\n function substr(aStartIndex : NativeInt) : String; overload;\r\n function substr(aStartIndex,aLength : NativeInt) : String; overload;\r\n function subString(aStartIndex : NativeInt) : String; overload;\r\n function subString(aStartIndex,aEndIndex : NativeInt) : String; overload;\r\n function toLocaleLowerCase : String;\r\n function toLocaleUpperCase : String;\r\n function toLowerCase : String;\r\n function toString : string;\r\n function toUpperCase : String;\r\n function trim : string;\r\n function valueOf : string;\r\n end;\r\n\r\n TJSArray = Class;\r\n \r\n TJSArrayEvent = reference to function (element : JSValue; index: NativeInt; anArray : TJSArray) : Boolean;\r\n TJSArrayMapEvent = reference to function (element : JSValue; index: NativeInt; anArray : TJSArray) : JSValue;\r\n TJSArrayReduceEvent = reference to function (accumulator, currentValue : JSValue; currentIndex : NativeInt; anArray : TJSArray) : JSValue;\r\n TJSArrayCompareEvent = reference to function (a,b : JSValue) : NativeInt;\r\n TJSArrayCallback = TJSArrayEvent;\r\n TJSArrayMapCallback = TJSArrayMapEvent;\r\n TJSArrayReduceCallBack = TJSArrayReduceEvent;\r\n TJSArrayCompareCallBack = TJSArrayCompareEvent;\r\n\r\n { TJSArray }\r\n\r\n TJSArray = Class external name 'Array'\r\n private\r\n function GetElements(Index: NativeInt): JSValue; external name '[]';\r\n procedure SetElements(Index: NativeInt; const AValue: JSValue); external name '[]';\r\n public\r\n flength : integer; external name 'length';\r\n constructor new; overload;\r\n constructor new(aLength : NativeInt); overload;\r\n constructor new(aElement1 : JSValue); varargs; overload;\r\n class function _of() : TJSArray; varargs; external name 'of'; \r\n class function isArray(a: JSValue) : Boolean;\r\n{$IFDEF JAVASCRIPT2015} \r\n class function from(a : JSValue) : TJSArray;\r\n{$ENDIF} \r\n function concat(el : JSValue) : TJSArray; varargs;\r\n function copyWithin(aTarget : NativeInt) : TJSarray;overload; // not in IE\r\n function copyWithin(aTarget, aStart : NativeInt) : TJSarray;overload; // not in IE\r\n function copyWithin(aTarget, aStart, aEnd : NativeInt) : TJSarray;overload; // not in IE\r\n Function every(const aCallback : TJSArrayCallBack) : boolean;overload;\r\n Function every(const aCallback : TJSArrayEvent; aThis : TObject) : boolean;overload;\r\n Function filter(const aCallBack : TJSArrayCallBack) : TJSArray; overload;\r\n Function filter(const aCallBack : TJSArrayEvent; aThis : TObject) : TJSArray;overload;\r\n Function fill(aValue : JSValue) : TJSArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex : NativeInt) : TJSArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex,aEndIndex : NativeInt) : TJSArray; overload;\r\n Function find(const aCallBack : TJSArrayCallBack) : JSValue; overload;\r\n Function find(const aCallBack : TJSArrayEvent; aThis : TObject) : JSValue; overload;\r\n Function findIndex(const aCallBack : TJSArrayCallBack) : NativeInt; overload;\r\n Function findIndex(const aCallBack : TJSArrayEvent; aThis : TObject) : NativeInt; overload;\r\n procedure forEach(const aCallBack : TJSArrayEvent); overload;\r\n procedure forEach(const aCallBack : TJSArrayEvent; aThis : TObject); overload;\r\n function includes(aElement : JSValue) : Boolean; overload;\r\n function includes(aElement : JSValue; FromIndex : NativeInt) : Boolean; overload;\r\n function indexOf(aElement : JSValue) : NativeInt; overload;\r\n function indexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n function join : String; overload;\r\n function join (aSeparator : string) : String; overload;\r\n function lastIndexOf(aElement : JSValue) : NativeInt; overload;\r\n function lastIndexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n Function map(const aCallBack : TJSArrayMapCallBack) : TJSArray; overload;\r\n Function map(const aCallBack : TJSArrayMapEvent; aThis : TObject) : TJSArray; overload;\r\n function pop : JSValue; \r\n function push(aElement : JSValue) : NativeInt; varargs;\r\n function reduce(const aCallBack : TJSArrayReduceCallBack) : JSValue; overload;\r\n function reduce(const aCallBack : TJSArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSArrayReduceCallBack) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n Function reverse : TJSArray;\r\n Function shift : JSValue;\r\n Function slice : TJSArray; overload;\r\n function slice(aBegin : NativeInt) : TJSArray; overload;\r\n function slice(aBegin,aEnd : NativeInt) : TJSArray; overload;\r\n Function some(const aCallback : TJSArrayCallBack) : boolean; overload;\r\n Function some(const aCallback : TJSArrayEvent; aThis : TObject) : boolean; overload;\r\n Function sort(const aCallback : TJSArrayCompareCallBack) : TJSArray; overload;\r\n Function sort() : TJSArray; overload;\r\n function splice(aStart : NativeInt) : TJSArray; overload;\r\n function splice(aStart,aDeleteCount : NativeInt) : TJSArray; varargs; overload;\r\n function toLocaleString: String; overload;\r\n function toLocaleString(locales : string) : String; overload;\r\n function toLocaleString(locales : string; const Options : TLocaleCompareOptions) : String; overload;\r\n function toString : String;\r\n function unshift : NativeInt; varargs; \r\n Property Length : Integer Read FLength Write FLength;\r\n property Elements[Index: NativeInt]: JSValue read GetElements write SetElements; default;\r\n end;\r\n\r\n TJSArrayBuffer = Class external name 'ArrayBuffer'\r\n private\r\n fLength : NativeInt; external name 'byteLength';\r\n public\r\n constructor new(aByteLength : NativeInt);\r\n class function isView(aValue : JSValue) : Boolean; \r\n function slice(aBegin : NativeInt) : TJSArrayBuffer; overload;\r\n function slice(aBegin,aEnd : NativeInt) : TJSArrayBuffer; overload;\r\n Property byteLength : NativeInt Read fLength;\r\n end;\r\n\r\n TJSBufferSource = class external name 'BufferSource'\r\n end;\r\n\r\n { TJSTypedArray }\r\n TJSTypedArray = Class;\r\n\r\n TJSTypedArrayCallBack = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : Boolean;\r\n TJSTypedArrayEvent = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : Boolean of object;\r\n TJSTypedArrayMapCallBack = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : JSValue;\r\n TJSTypedArrayMapEvent = function (element : JSValue; index: NativeInt; anArray : TJSTypedArray) : JSValue of object;\r\n TJSTypedArrayReduceCallBack = function (accumulator, currentValue : JSValue; currentIndex : NativeInt; anArray : TJSTypedArray) : JSValue;\r\n TJSTypedArrayCompareCallBack = function (a,b : JSValue) : NativeInt;\r\n\r\n TJSTypedArray = class external name 'TypedArray' (TJSBufferSource)\r\n Private\r\n FBuffer: TJSArrayBuffer; external name 'buffer';\r\n FByteLength: NativeInt; external name 'byteLength';\r\n FLength: NativeInt; external name 'length';\r\n FByteOffset: NativeInt; external name 'byteOffset';\r\n function getValue(Index : NativeInt) : JSValue; external name '[]';\r\n procedure setValue(Index : NativeInt;AValue : JSValue); external name '[]';\r\n Public\r\n class var BYTES_PER_ELEMENT : NativeInt;\r\n class var name : string;\r\n class function from(aValue : jsValue) : TJSTypedArray;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSTypedArray;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSTypedArray;\r\n class function _of(aValue : jsValue) : TJSTypedArray; varargs; external name 'of';\r\n function copyWithin(aTarget : NativeInt) : TJSTypedArray;overload;\r\n function copyWithin(aTarget, aStart : NativeInt) : TJSTypedArray;overload;\r\n function copyWithin(aTarget, aStart, aEnd : NativeInt) : TJSTypedArray;overload;\r\n Function every(const aCallback : TJSTypedArrayCallBack) : boolean;overload;\r\n Function every(const aCallback : TJSTypedArrayEvent; aThis : TObject) : boolean;overload;\r\n Function fill(aValue : JSValue) : TJSTypedArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex : NativeInt) : TJSTypedArray; overload;\r\n Function fill(aValue : JSValue; aStartIndex,aEndIndex : NativeInt) : TJSTypedArray; overload;\r\n Function filter(const aCallBack : TJSTypedArrayCallBack) : TJSTypedArray; overload;\r\n Function filter(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : TJSTypedArray;overload;\r\n Function find(const aCallBack : TJSTypedArrayCallBack) : JSValue; overload;\r\n Function find(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : JSValue; overload;\r\n Function findIndex(const aCallBack : TJSTypedArrayCallBack) : NativeInt; overload;\r\n Function findIndex(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : NativeInt; overload;\r\n procedure forEach(const aCallBack : TJSTypedArrayCallBack); overload;\r\n procedure forEach(const aCallBack : TJSTypedArrayEvent; aThis : TObject); overload;\r\n function includes(aElement : JSValue) : Boolean; overload;\r\n function includes(aElement : JSValue; FromIndex : NativeInt) : Boolean; overload;\r\n function indexOf(aElement : JSValue) : NativeInt; overload;\r\n function indexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n function join : String; overload;\r\n function join (aSeparator : string) : String; overload;\r\n function lastIndexOf(aElement : JSValue) : NativeInt; overload;\r\n function lastIndexOf(aElement : JSValue; FromIndex : NativeInt) : NativeInt; overload;\r\n Function map(const aCallBack : TJSTypedArrayCallBack) : TJSTypedArray; overload;\r\n Function map(const aCallBack : TJSTypedArrayEvent; aThis : TObject) : TJSTypedArray; overload;\r\n function reduce(const aCallBack : TJSTypedArrayReduceCallBack) : JSValue; overload;\r\n function reduce(const aCallBack : TJSTypedArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSTypedArrayReduceCallBack) : JSValue; overload;\r\n function reduceRight(const aCallBack : TJSTypedArrayReduceCallBack; initialValue : JSValue) : JSValue; overload;\r\n Function reverse : TJSTypedArray;\r\n procedure _set(anArray : TJSArray); external name 'set';\r\n procedure _set(anArray : TJSArray; anOffset : NativeInt); external name 'set';\r\n procedure _set(anArray : TJSTypedArray); external name 'set';\r\n procedure _set(anArray : TJSTypedArray; anOffset : NativeInt); external name 'set';\r\n Function slice : TJSTypedArray; overload;\r\n function slice(aBegin : NativeInt) : TJSTypedArray; overload;\r\n function slice(aBegin,aEnd : NativeInt) : TJSTypedArray; overload;\r\n Function some(const aCallback : TJSTypedArrayCallBack) : boolean; overload;\r\n Function some(const aCallback : TJSTypedArrayEvent; aThis : TObject) : boolean; overload;\r\n Function sort(const aCallback : TJSTypedArrayCompareCallBack) : TJSTypedArray; overload;\r\n Function sort() : TJSTypedArray; overload;\r\n function splice(aStart : NativeInt) : TJSTypedArray; overload;\r\n function splice(aStart,aDeleteCount : NativeInt) : TJSTypedArray; varargs; overload;\r\n function toLocaleString: String; overload;\r\n function toLocaleString(locales : string) : String; overload;\r\n function toLocaleString(locales : string; const Options : TLocaleCompareOptions) : String; overload;\r\n function toString : String;\r\n function unshift : NativeInt; varargs;\r\n property buffer : TJSArrayBuffer read FBuffer;\r\n property byteLength : NativeInt Read FByteLength;\r\n property byteOffset : NativeInt Read FByteOffset;\r\n property length : NativeInt Read FLength;\r\n Property values[Index : NativeInt] : JSValue Read getValue Write SetValue; default;\r\n end;\r\n\r\n { TJSInt8Array }\r\n\r\n TJSInt8Array = class external name 'Int8Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): Shortint; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: Shortint);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSInt8Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSInt8Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSInt8Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSInt8Array; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of ShortInt); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of ShortInt; anOffset : NativeInt); external name 'set';\r\n Property values[Index : Integer] : Shortint Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint8Array = class external name 'Uint8Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): Byte; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: Byte);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt8Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt8Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt8Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSUInt8Array; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of Byte); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Byte; anOffset : NativeInt); external name 'set';\r\n Property values[Index : Integer] : Byte Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint8ClampedArray = class external name 'Uint8ClampedArray' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): Byte; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: Byte);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt8ClampedArray; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt8ClampedArray; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt8ClampedArray; reintroduce;\r\n class function _of(aValue : jsValue) : TJSUInt8ClampedArray; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of Byte); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Byte; anOffset : NativeInt); external name 'set';\r\n Property values[Index : Integer] : Byte Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSInt16Array = class external name 'Int16Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): smallint; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: Smallint);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSInt16Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSInt16Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSInt16Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSInt16Array; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of SmallInt); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of SmallInt; anOffset : NativeInt); external name 'set';\r\n Property values[Index : Integer] : SmallInt Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint16Array = class external name 'Uint16Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): Word; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: Word);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt16Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt16Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt16Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSUInt16Array; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of Word); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Word; anOffset : NativeInt); external name 'set';\r\n Property values[Index : Integer] : Word Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSInt32Array = class external name 'Int32Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): longint; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: longint);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSInt32Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSInt32Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSInt32Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSInt32Array; varargs;external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of LongInt); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of LongInt; anOffset : NativeInt); external name 'set';\r\n Property values[Index : Integer] : longint Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSUint32Array = class external name 'Uint32Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): LongWord; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: LongWord);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSUInt32Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSUInt32Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSUInt32Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSUInt32Array; varargs; external name 'of'; reintroduce;\r\n procedure _set(anArray : Array of Cardinal); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Cardinal; anOffset : NativeInt); external name 'set';\r\n Property values[Index : Integer] : LongWord Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSFloat32Array = class external name 'Float32Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): Float32; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: Float32);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSFloat32Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSFloat32Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSFloat32Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSFloat32Array; varargs; reintroduce;\r\n procedure _set(anArray : Array of Double); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Double; anOffset : NativeInt); external name 'set'; reintroduce;\r\n Property values[Index : Integer] : Float32 Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSFloat64Array = class external name 'Float64Array' (TJSTypedArray)\r\n private\r\n function getTypedValue(Index : Integer): Float64; external name '[]';\r\n procedure setTypedValue(Index : Integer; AValue: Float64);external name '[]';\r\n public\r\n constructor new (length : Integer);\r\n constructor new (atypedArray : TJSTypedArray);\r\n constructor new (aObject : TJSObject);\r\n constructor new (buffer : TJSArrayBuffer);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset: NativeInt);\r\n constructor new (buffer : TJSArrayBuffer; aByteOffset, aLength: NativeInt);\r\n class function from(aValue : jsValue) : TJSFloat64Array; reintroduce;\r\n class function from(aValue : jsValue; Map : TJSTypedArrayMapCallBack) : TJSFloat64Array; reintroduce;\r\n class function from(aValue : jsValue; aMap : TJSTypedArrayMapEvent) : TJSFloat64Array; reintroduce;\r\n class function _of(aValue : jsValue) : TJSFloat64Array; varargs; reintroduce;\r\n procedure _set(anArray : Array of Double); external name 'set'; reintroduce;\r\n procedure _set(anArray : Array of Double; anOffset : NativeInt); external name 'set'; reintroduce;\r\n Property values[Index : Integer] : Float64 Read getTypedValue Write setTypedValue; default;\r\n end;\r\n\r\n TJSDataView = Class external name 'DataView' (TJSBufferSource)\r\n private\r\n fBuffer : TJSArrayBuffer; external name 'buffer';\r\n fLength : NativeInt; external name 'byteLength';\r\n fOffset : NativeInt; external name 'byteOffset';\r\n public\r\n constructor new(aBuffer : TJSArrayBuffer); overload;\r\n constructor new(aBuffer : TJSArrayBuffer; aOffset : NativeInt); overload;\r\n constructor new(aBuffer : TJSArrayBuffer; aOffset,aByteLength : NativeInt); overload;\r\n function getFloat32(aByteOffset : NativeInt) : double; overload;\r\n function getFloat32(aByteOffset : NativeInt; aLittleEndian: Boolean) : double; overload;\r\n function getFloat64(aByteOffset : NativeInt) : double; overload;\r\n function getFloat64(aByteOffset : NativeInt; aLittleEndian: Boolean) : double; overload;\r\n function getInt8(aByteOffset : NativeInt) : ShortInt; \r\n function getInt16(aByteOffset : NativeInt) : SmallInt; overload;\r\n function getInt16(aByteOffset : NativeInt; aLittleEndian : Boolean) : SmallInt; overload;\r\n function getInt32(aByteOffset : NativeInt) : Longint; overload;\r\n function getInt32(aByteOffset : NativeInt; aLittleEndian : Boolean) : Longint; overload;\r\n function getUint8(aByteOffset : NativeInt) : Byte; overload;\r\n function getUint16(aByteOffset : NativeInt) : Word; overload;\r\n function getUint16(aByteOffset : NativeInt; aLittleEndian : Boolean) : Word; overload;\r\n function getUint32(aByteOffset : NativeInt) : LongWord; overload;\r\n function getUint32(aByteOffset : NativeInt; aLittleEndian : Boolean) : LongWord; overload;\r\n\r\n procedure setFloat32(aByteOffset : NativeInt; aValue : double); overload;\r\n procedure setFloat32(aByteOffset : NativeInt; aValue : double; aLittleEndian: Boolean); overload;\r\n procedure setFloat64(aByteOffset : NativeInt; aValue : double); overload;\r\n procedure setFloat64(aByteOffset : NativeInt; aValue : double; aLittleEndian: Boolean); overload;\r\n procedure setInt8(aByteOffset : NativeInt; aValue : ShortInt); \r\n procedure setInt16(aByteOffset : NativeInt; aValue : SmallInt); overload;\r\n procedure setInt16(aByteOffset : NativeInt; aValue : SmallInt; aLittleEndian : Boolean); overload;\r\n procedure setInt32(aByteOffset : NativeInt; aValue : Longint); overload;\r\n procedure setInt32(aByteOffset : NativeInt; aValue : Longint; aLittleEndian : Boolean); overload;\r\n procedure setUint8(aByteOffset : NativeInt; aValue : Byte); overload;\r\n procedure setUint16(aByteOffset : NativeInt; aValue : Word); overload;\r\n procedure setUint16(aByteOffset : NativeInt; aValue : Word; aLittleEndian : Boolean); overload;\r\n procedure setUint32(aByteOffset : NativeInt; aValue : LongWord); overload;\r\n procedure setUint32(aByteOffset : NativeInt; aValue: LongWord; aLittleEndian : Boolean); overload;\r\n \r\n Property byteLength : NativeInt Read fLength;\r\n Property byteOffset : NativeInt read fOffset;\r\n property buffer : TJSArrayBuffer Read fBuffer;\r\n end;\r\n\r\n TJSJSON = class external name 'JSON' (TJSObject)\r\n Public\r\n class function parse(aJSON : String) : JSValue;\r\n // Use this only when you are sure you will get an object, no checking is done.\r\n class function parseObject(aJSON : String) : TJSObject; external name 'parse';\r\n class function stringify(aValue : JSValue) : string;\r\n class function stringify(aValue,aReplacer : JSValue) : string;\r\n class function stringify(aValue,aReplacer : JSValue; space: NativeInt) : string;\r\n class function stringify(aValue,aReplacer : JSValue; space: String) : string;\r\n end;\r\n\r\n { TJSError }\r\n\r\n TJSError = CLass external name 'Error'\r\n private\r\n FMessage: String; external name 'message';\r\n Public\r\n Constructor new;\r\n Constructor new(Const aMessage : string);\r\n Constructor new(Const aMessage,aFileName : string);\r\n Constructor new(Const aMessage,aFileName : string; aLineNumber : NativeInt);\r\n Property Message : String Read FMessage;\r\n end;\r\n\r\n\r\n TJSPromiseResolver = reference to function (aValue : JSValue) : JSValue;\r\n TJSPromiseExecutor = reference to procedure (resolve,reject : TJSPromiseResolver);\r\n TJSPromiseFinallyHandler = reference to procedure;\r\n TJSPromise = Class;\r\n TJSPromiseArray = array of TJSPromise;\r\n\r\n TJSPromise = class external name 'Promise'\r\n constructor new(Executor : TJSPromiseExecutor);\r\n class function all(arg : Array of JSValue) : TJSPromise; overload;\r\n class function all(arg : JSValue) : TJSPromise; overload;\r\n class function all(arg : TJSPromiseArray) : TJSPromise; overload;\r\n class function race(arg : Array of JSValue) : TJSPromise; overload;\r\n class function race(arg : JSValue) : TJSPromise; overload;\r\n class function race(arg : TJSPromiseArray) : TJSPromise; overload;\r\n class function reject(reason : JSValue) : TJSPromise;\r\n class function resolve(value : JSValue): TJSPromise; overload;\r\n class function resolve : TJSPromise; overload;\r\n function _then (onAccepted : TJSPromiseResolver) : TJSPromise; external name 'then';\r\n function catch (onRejected : TJSPromiseResolver) : TJSPromise;\r\n function _finally(value : TJSPromiseFinallyHandler): TJSPromise;\r\n end;\r\n\r\n\r\nvar\r\n // This can be used in procedures/functions to provide access to the 'arguments' array.\r\n JSArguments: TJSValueDynArray; external name 'arguments';\r\n // This can be used in all code to access the javascript 'this' object.\r\n JSThis: TJSObject; external name 'this';\r\n // This can be used in catch blocks to access the JS throw value\r\n JSExceptValue: JSValue; external name '$e';\r\n\r\nFunction new(aElements: TJSValueDynArray) : TJSObject; overload;\r\n\r\nfunction decodeURIComponent(encodedURI : String) : String; external name 'decodeURIComponent';\r\nfunction encodeURIComponent(str : String) : String; external name 'encodeURIComponent';\r\n\r\nfunction parseInt(s: String; Radix: NativeInt): NativeInt; overload; external name 'parseInt'; // may result NaN\r\nfunction parseInt(s: String): NativeInt; overload; external name 'parseInt'; // may result NaN\r\nfunction parseFloat(s: String): double; overload; external name 'parseFloat'; // may result NaN\r\n\r\nfunction hasString(const v: JSValue): boolean; external name 'rtl.hasString';// isString(v) and v<>''\r\nfunction hasValue(const v: JSValue): boolean; assembler; // returns the JS definition of if(v): v is not false, undefined, null, 0, NaN, or the empty string. Note: JS if(new Boolean(false)) returns true.\r\nfunction isArray(const v: JSValue): boolean; external name 'rtl.isArray';\r\nfunction isBoolean(const v: JSValue): boolean; assembler;\r\nfunction isCallback(const v: JSValue): boolean; assembler;\r\nfunction isChar(const v: JSValue): boolean; assembler;\r\nfunction isClass(const v: JSValue): boolean; assembler; // is a Pascal class, e.g. a TClass\r\nfunction isClassInstance(const v: JSValue): boolean; assembler;// is a Pascal class instance, e.g. a TObject\r\nfunction isFunction(const v: JSValue): boolean; external name 'rtl.isFunction';\r\nfunction isInteger(const v: JSValue): boolean; assembler;\r\nfunction isModule(const v: JSValue): boolean; external name 'rtl.isModule';\r\nfunction isNull(const v: JSValue): boolean; assembler;\r\nfunction isNumber(const v: JSValue): boolean; external name 'rtl.isNumber';\r\nfunction isObject(const v: JSValue): boolean; external name 'rtl.isObject'; // true if not null and a JS Object\r\nfunction isRecord(const v: JSValue): boolean; assembler;\r\nfunction isString(const v: JSValue): boolean; external name 'rtl.isString';\r\nfunction isUndefined(const v: JSValue): boolean; assembler;\r\nfunction isDefined(const v: JSValue): boolean; assembler;\r\nfunction isUTF16Char(const v: JSValue): boolean; assembler;\r\nfunction isExt(const InstanceOrClass, aClass: JSValue): boolean; external name 'rtl.isExt'; // aClass can be a JS object or function\r\nfunction jsInstanceOf(const aFunction, aFunctionWithPrototype: JSValue): String; assembler;\r\nfunction jsTypeOf(const v: JSValue): String; external name 'typeof';\r\nfunction jsIsNaN(const v: JSValue): boolean; external name 'isNaN';// true if value cannot be converted to a number. e.g. True on NaN, undefined, {}, '123'. False on true, null, '', ' ', '1A'\r\nfunction toNumber(const v: JSValue): double; assembler; // if not possible, returns NaN\r\nfunction toInteger(const v: JSValue): NativeInt; // if v is not an integer, returns 0\r\nfunction toObject(Value: JSValue): TJSObject; // If Value is not a Javascript object, returns Nil\r\nfunction toArray(Value: JSValue): TJSArray; // If Value is not a Javascript array, returns Nil\r\nfunction toBoolean(Value: JSValue): Boolean; // If Value is not a Boolean, returns False\r\nfunction toString(Value: JSValue): String; // If Value is not a string, returns ''\r\n\r\nType\r\n TJSValueType = (jvtNull,jvtBoolean,jvtInteger,jvtFloat,jvtString,jvtObject,jvtArray);\r\n\r\nFunction GetValueType(JS : JSValue) : TJSValueType;\r\nfunction URLToArrayOfString(URL: string): TJSStringDynArray;\r\n\r\nVar\r\n Null : JSValue; external name 'null';\r\n Undefined : JSValue; external name 'undefined';\r\n\r\nimplementation\r\n\r\nFunction new(aElements: TJSValueDynArray) : TJSObject;\r\n\r\n function toString(I : Integer): string; external name 'String';\r\n\r\nVar\r\n L,I : integer;\r\n S : String;\r\n\r\nbegin\r\n L:=length(aElements);\r\n if (L mod 2)=1 then\r\n raise EJS.Create('Number of arguments must be even');\r\n I:=0;\r\n // Check all arguments;\r\n While (i2)) return false;\r\n var code = v.charCodeAt(0);\r\n if (code < 0xD800){\r\n if (v.length == 1) return true;\r\n } else if (code <= 0xDBFF){\r\n if (v.length==2){\r\n code = v.charCodeAt(1);\r\n if (code >= 0xDC00 && code <= 0xDFFF) return true;\r\n };\r\n };\r\n return false;\r\nend;\r\n\r\nfunction jsInstanceOf(const aFunction, aFunctionWithPrototype: JSValue\r\n ): String; assembler;\r\nasm\r\n return aFunction instanceof aFunctionWithPrototype;\r\nend;\r\n\r\nfunction toNumber(const v: JSValue): double; assembler;\r\nasm\r\n return v-0;\r\nend;\r\n\r\nfunction toInteger(const v: JSValue): NativeInt;\r\nbegin\r\n if IsInteger(v) then\r\n Result:=NativeInt(v)\r\n else\r\n Result:=0;\r\nend;\r\n\r\nfunction toObject(Value: JSValue): TJSObject;\r\n\r\nbegin\r\n if IsObject(Value) then\r\n Result:=TJSObject(Value)\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\nfunction toArray(Value: JSValue): TJSArray; // If not possible, returns Nil\r\n\r\nbegin\r\n if IsArray(Value) then\r\n Result:=TJSArray(Value)\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\nfunction toBoolean(Value: JSValue): Boolean; // If not possible, returns False\r\n\r\nbegin\r\n if isBoolean(Value) then\r\n Result:=Boolean(Value)\r\n else\r\n Result:=False;\r\nend;\r\n\r\nfunction toString(Value: JSValue): String; // If not possible, returns ''\r\n\r\nbegin\r\n if IsString(Value) then\r\n Result:=String(Value)\r\n else\r\n Result:='';\r\nend;\r\n\r\n{ EJS }\r\n\r\nconstructor EJS.Create(const Msg: String);\r\nbegin\r\n FMessage:=Msg;\r\nend;\r\n\r\nfunction URLToArrayOfString(URL: string): TJSStringDynArray;\r\nvar\r\n a: TJSStringDynArray;\r\n cors_api_url: string;\r\nbegin\r\n cors_api_url := '';//'https://cors-anywhere.herokuapp.com/';\r\n asm\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", cors_api_url + URL, false);\r\n xhr.send();\r\n\r\n if (xhr.status==200)\r\n {\r\n var obj = xhr.responseText.split(/\\r\\n|\\n/);\r\n for (var i = 0; i < obj.length; i++) {\r\n a.push(obj[i]);\r\n }\r\n }\r\n end;\r\n\r\n Result := a;\r\nend;\r\n\r\nFunction GetValueType(JS : JSValue) : TJSValueType;\r\n\r\nVar\r\n t : string;\r\n\r\nbegin\r\n if isNull(js) then // null reported as object\r\n result:=jvtNull\r\n else\r\n begin\r\n t:=jsTypeOf(js);\r\n if (t='string') then\r\n Result:=jvtString\r\n else if (t='boolean') then\r\n Result:=jvtBoolean\r\n else if (t='object') then\r\n begin\r\n if IsArray(JS) then\r\n Result:=jvtArray\r\n else\r\n Result:=jvtObject;\r\n end\r\n else if (t='number') then\r\n if isInteger(JS) then\r\n result:=jvtInteger\r\n else\r\n result:=jvtFloat\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit SysUtils;\r\n\r\n{$mode objfpc}\r\n\r\ninterface\r\n\r\nuses\r\n RTLConsts, js;\r\n\r\nprocedure FreeAndNil(var Obj);\r\n\r\ntype\r\n TProcedure = procedure;\r\n\r\n {*****************************************************************************\r\n Various types\r\n *****************************************************************************}\r\n\r\ntype\r\n { TFloatRec }\r\n TFloatRec = Record\r\n Exponent: Integer;\r\n Negative: Boolean;\r\n Digits: Array Of Char;\r\n End;\r\n TEndian = (Little,Big);\r\n TFileName = String;\r\n TByteArray = array [0..32767] of Byte;\r\n TWordArray = array [0..16383] of Word;\r\n TBytes = Array of byte;\r\n TStringArray = array of string;\r\n\r\n TMonthNameArray = array [1..12] of string;\r\n TDayTable = array [1..12] of Word;\r\n TWeekNameArray = array [1..7] of string;\r\n TMonthNames = TMonthNameArray;\r\n TDayNames = array[1..7] of string;\r\n Currency = Double;\r\n\r\n{*****************************************************************************\r\n Exception handling\r\n*****************************************************************************}\r\n\r\n { Exception }\r\n\r\n Exception = class(TObject)\r\n private\r\n fMessage: String;\r\n fHelpContext: Integer;\r\n public\r\n constructor Create(const Msg: String); reintroduce;\r\n constructor CreateFmt(const Msg: string; const Args: array of jsvalue);\r\n constructor CreateHelp(const Msg: String; AHelpContext: Integer);\r\n constructor CreateFmtHelp(const Msg: string; const Args: array of jsvalue; AHelpContext: Integer);\r\n function ToString: String; override;\r\n property HelpContext: Integer read fHelpContext write fHelpContext;\r\n property Message: String read fMessage write fMessage;\r\n end;\r\n\r\n ExceptClass = class of Exception;\r\n\r\n EExternal = class(Exception);\r\n\r\n { General math errors }\r\n EMathError = class(EExternal);\r\n EInvalidOp = class(EMathError);\r\n EZeroDivide = class(EMathError);\r\n EOverflow = class(EMathError);\r\n EUnderflow = class(EMathError);\r\n\r\n EAbort = class(Exception);\r\n EInvalidCast = class(Exception);\r\n EAssertionFailed = class(Exception);\r\n EObjectCheck = class(Exception);\r\n\r\n { String conversion errors }\r\n EConvertError = class(Exception);\r\n EFormatError = class(Exception);\r\n\r\n\r\n { integer math exceptions }\r\n EIntError = Class(EExternal);\r\n EDivByZero = Class(EIntError);\r\n ERangeError = Class(EIntError);\r\n EIntOverflow = Class(EIntError);\r\n\r\n { General math errors }\r\n\r\n { Run-time and I/O Errors }\r\n EInOutError = class(Exception)\r\n public\r\n ErrorCode : Integer;\r\n end;\r\n\r\n EHeapMemoryError = class(Exception);\r\n EHeapException = EHeapMemoryError;\r\n\r\n EExternalException = class(EExternal);\r\n EInvalidPointer = Class(EHeapMemoryError);\r\n EOutOfMemory = Class(EHeapMemoryError);\r\n\r\n { EVariantError }\r\n\r\n EVariantError = Class(Exception)\r\n ErrCode : longint;\r\n Constructor CreateCode(Code : Longint);\r\n end;\r\n\r\n EAccessViolation = Class(EExternal);\r\n EBusError = Class(EAccessViolation);\r\n EPrivilege = class(EExternal);\r\n EStackOverflow = class(EExternal);\r\n EControlC = class(EExternal);\r\n\r\n { String conversion errors }\r\n\r\n { Other errors }\r\n EAbstractError = Class(Exception);\r\n\r\n EPropReadOnly = class(Exception);\r\n EPropWriteOnly = class(Exception);\r\n\r\n EIntfCastError = class(Exception);\r\n EInvalidContainer = class(Exception);\r\n EInvalidInsert = class(Exception);\r\n\r\n EPackageError = class(Exception);\r\n\r\n EOSError = class(Exception)\r\n public\r\n ErrorCode: Longint;\r\n end;\r\n\r\n ESafecallException = class(Exception);\r\n ENoThreadSupport = Class(Exception);\r\n ENoWideStringSupport = Class(Exception);\r\n ENotImplemented = class(Exception);\r\n\r\n EArgumentException = class(Exception);\r\n EArgumentOutOfRangeException = class(EArgumentException);\r\n EArgumentNilException = class(EArgumentException);\r\n\r\n EPathTooLongException = class(Exception);\r\n ENotSupportedException = class(Exception);\r\n EDirectoryNotFoundException = class(Exception);\r\n EFileNotFoundException = class(Exception);\r\n EPathNotFoundException = class(Exception);\r\n\r\n ENoConstructException = class(Exception);\r\n\r\n\r\n//function GetTickCount: Integer;\r\n\r\n\r\n{*****************************************************************************\r\n String function\r\n*****************************************************************************}\r\n\r\nConst\r\n EmptyStr = '';\r\n EmptyWideStr = ''; // No difference here.\r\n HexDisplayPrefix: string = '$';\r\n LeadBytes = [] unimplemented;\r\n\r\nFunction CharInSet(Ch: Char;Const CSet : array of char) : Boolean;\r\n\r\nfunction LeftStr(const S: string; Count: Integer): String; assembler;\r\nfunction RightStr(const S: string; Count: Integer): String; assembler;\r\n\r\nfunction Trim(const S: String): String; assembler;\r\nfunction TrimLeft(const S: String): String; assembler;\r\nfunction TrimRight(const S: String): String; assembler;\r\n\r\nfunction UpperCase(const s: String): String; assembler; overload;\r\nfunction LowerCase(const s: String): String; assembler; overload;\r\n\r\nfunction CompareStr(const s1, s2: String): Integer; assembler;\r\nfunction SameStr(const s1, s2: String): Boolean; assembler;\r\nfunction CompareText(const s1, s2: String): Integer; assembler;\r\nfunction SameText(const s1, s2: String): Boolean; assembler;\r\nfunction AnsiCompareText(const s1, s2: String): Integer; assembler;\r\nfunction AnsiSameText(const s1, s2: String): Boolean; assembler;\r\nfunction AnsiCompareStr(const s1, s2: String): Integer;\r\nprocedure AppendStr(var Dest: String; const S: string);\r\n\r\nfunction Format(const Fmt: String; const Args: array of JSValue): String;\r\n\r\n// JavaScript built-in functions\r\nfunction LocaleCompare(const s1, s2, locales: String): Boolean; assembler; overload;\r\nfunction NormalizeStr(const S: String; const Norm: String = 'NFC'): String; assembler; overload; // not in IE\r\n\r\nfunction IsValidIdent(const Ident: string; AllowDots: Boolean = False; StrictDots: Boolean = False): Boolean;\r\n\r\nType\r\n TStringReplaceFlag = (rfReplaceAll, rfIgnoreCase);\r\n TReplaceFlag = TStringReplaceFlag;\r\n TStringReplaceFlags = set of TStringReplaceFlag;\r\n TReplaceFlags = TStringReplaceFlags;\r\n\r\nfunction StringReplace(aOriginal, aSearch, aReplace : string; Flags : TStringReplaceFlags) : String;\r\nfunction QuoteString(aOriginal : String; AQuote : Char) : String;\r\nfunction IsDelimiter(const Delimiters, S: string; Index: Integer): Boolean;\r\nfunction AdjustLineBreaks(const S: string): string;\r\nfunction AdjustLineBreaks(const S: string; Style: TTextLineBreakStyle): string;\r\nfunction WrapText(const Line, BreakStr: string; const BreakChars: Array of char; MaxCol: Integer): string;\r\nfunction WrapText(const Line: string; MaxCol: Integer): string;\r\n\r\n{ *****************************************************************************\r\n Integer conversions\r\n *****************************************************************************}\r\n\r\nfunction IntToStr(const Value: Integer): string;\r\nFunction TryStrToInt(const S : String; Out res : Integer) : Boolean;\r\nFunction TryStrToInt(const S : String; Out res : NativeInt) : Boolean;\r\nFunction StrToIntDef(const S : String; Const aDef : Integer) : Integer;\r\nFunction StrToIntDef(const S : String; Const aDef : NativeInt) : NativeInt;\r\nFunction StrToInt(const S : String) : Integer;\r\nFunction StrToNativeInt(const S : String) : NativeInt;\r\n// For compatibility\r\nFunction StrToInt64(const S : String) : NativeLargeInt;\r\nFunction StrToInt64Def(const S : String; ADefault : NativeLargeInt) : NativeLargeInt;\r\nFunction TryStrToInt64(const S : String; Out res : NativeLargeInt) : Boolean;\r\nFunction StrToQWord(const S : String) : NativeLargeUInt;\r\nFunction StrToQWordDef(const S : String; ADefault : NativeLargeUInt) : NativeLargeUInt;\r\nFunction TryStrToQWord(const S : String; Out res : NativeLargeUInt) : Boolean;\r\nFunction StrToUInt64(const S : String) : NativeLargeUInt;\r\nFunction StrToUInt64Def(const S : String; ADefault : NativeLargeUInt) : NativeLargeUInt;\r\nFunction TryStrToUInt64(const S : String; Out res : NativeLargeUInt) : Boolean;\r\nFunction StrToDWord(const S : String) : DWord;\r\nFunction StrToDWordDef(const S : String; ADefault : DWord) : DWord;\r\nFunction TryStrToDWord(const S : String; Out res : DWord) : Boolean;\r\n\r\nfunction IntToHex(Value: NativeInt; Digits: integer): string;\r\n\r\n{ *****************************************************************************\r\n Float conversions\r\n *****************************************************************************}\r\n\r\nconst\r\n // Note: Currency is internally a double, multiplied by 10000 and truncated.\r\n // The below values are the safe limits, within every step exists.\r\n // Since currency is a double it can take much larger values, but the result\r\n // may differ from Delphi/FPC\r\n MaxCurrency: Currency = 450359962737.0495; // fpc: 922337203685477.5807;\r\n MinCurrency: Currency = -450359962737.0496; // fpc: -922337203685477.5808;\r\n\r\nType\r\n TFloatFormat = (ffFixed,ffGeneral,ffExponent,ffNumber,ffCurrency);\r\n\r\nFunction FloatToDecimal(Value : double; Precision, Decimals : integer) : TFloatRec;\r\nFunction FloatToStr(Value: Double): String;\r\nFunction FloatToStrF(const Value : double; format: TFloatFormat; Precision, Digits: Integer): String;\r\nFunction TryStrToFloat(const S : String; Out res : Double) : Boolean;\r\nFunction StrToFloatDef(const S : String; Const aDef : Double) : Double;\r\nFunction StrToFloat(const S : String) : Double;\r\nFunction FormatFloat (Fmt : String; aValue : Double) : String;\r\n\r\n{ *****************************************************************************\r\n Boolean conversions\r\n *****************************************************************************}\r\n\r\nVar\r\n TrueBoolStrs, FalseBoolStrs : Array of String;\r\n\r\nfunction StrToBool(const S: String): Boolean;\r\nfunction BoolToStr(B: Boolean; UseBoolStrs:Boolean=False): string;\r\nfunction BoolToStr(B: Boolean; const TrueS, FalseS: String): string;\r\nfunction StrToBoolDef(const S: String; Default: Boolean): Boolean;\r\nfunction TryStrToBool(const S: String; out Value: Boolean): Boolean;\r\n\r\n\r\n{*****************************************************************************\r\n OS/Environment\r\n*****************************************************************************}\r\n\r\nConst\r\n ConfigExtension : String = '.cfg';\r\n SysConfigDir : String = '';\r\n\r\ntype\r\n TOnGetEnvironmentVariable = function(Const EnvVar: String): String;\r\n TOnGetEnvironmentString = function(Index: Integer): String;\r\n TOnGetEnvironmentVariableCount = function: Integer;\r\nvar\r\n OnGetEnvironmentVariable: TOnGetEnvironmentVariable;\r\n OnGetEnvironmentString: TOnGetEnvironmentString;\r\n OnGetEnvironmentVariableCount: TOnGetEnvironmentVariableCount;\r\n\r\nfunction GetEnvironmentVariable(Const EnvVar: String): String;\r\nfunction GetEnvironmentVariableCount: Integer;\r\nfunction GetEnvironmentString(Index: Integer): String;\r\n\r\nprocedure ShowException(ExceptObject: TObject; ExceptAddr: Pointer);\r\nProcedure Abort;\r\n\r\n{*****************************************************************************\r\n Events\r\n*****************************************************************************}\r\nType\r\n TEventType = (etCustom,etInfo,etWarning,etError,etDebug);\r\n TEventTypes = Set of TEventType;\r\n\r\n{*****************************************************************************\r\n Date and time\r\n*****************************************************************************}\r\ntype\r\n TDateTime = double;\r\n\r\n TTime = TDateTime;\r\n TDate = TDateTime;\r\n\r\n TSystemTime = record\r\n Year, Month, Day, DayOfWeek: word;\r\n Hour, Minute, Second, MilliSecond: word;\r\n end ;\r\n TTimeStamp = record\r\n Time: longint; { Number of milliseconds since midnight }\r\n Date: longint; { One plus number of days since 1/1/0001 }\r\n end ;\r\n\r\nvar\r\n TimeSeparator : char;\r\n DateSeparator : char;\r\n ShortDateFormat : string;\r\n LongDateFormat : string;\r\n ShortTimeFormat : string;\r\n LongTimeFormat : string;\r\n DecimalSeparator : string;\r\n ThousandSeparator : string;\r\n TimeAMString : string;\r\n TimePMString : string;\r\n\r\nconst\r\n\r\n HoursPerDay = 24;\r\n MinsPerHour = 60;\r\n SecsPerMin = 60;\r\n MSecsPerSec = 1000;\r\n MinsPerDay = HoursPerDay * MinsPerHour;\r\n SecsPerDay = MinsPerDay * SecsPerMin;\r\n MSecsPerDay = SecsPerDay * MSecsPerSec;\r\n MaxDateTime: TDateTime = 2958465.99999999;\r\n MinDateTime: TDateTime = -693593.99999999;\r\n\r\n JulianEpoch = TDateTime(-2415018.5);\r\n UnixEpoch = JulianEpoch + TDateTime(2440587.5);\r\n\r\n DateDelta = 693594; // Days between 1/1/0001 and 12/31/1899\r\n UnixDateDelta = 25569;\r\n\r\n { True=Leapyear }\r\n\r\nvar\r\n MonthDays : array [Boolean] of TDayTable;\r\n ShortMonthNames : TMonthNames;\r\n LongMonthNames : TMonthNames;\r\n ShortDayNames : TDayNames;\r\n LongDayNames : TDayNames;\r\n\r\ntype\r\n // Stub, for easier porting of FPC/Delphi code.\r\n // Reading/Writing the properties will actually set the global variables\r\n\r\n { TFormatSettings }\r\n\r\n TFormatSettings = class(TObject)\r\n private\r\n function GetCurrencyDecimals: Byte;\r\n function GetCurrencyFormat: Byte;\r\n function GetCurrencyString: String;\r\n function GetDateSeparator: char;\r\n function GetDecimalSeparator: string;\r\n function GetLongDateFormat: string;\r\n function GetLongDayNames: TDayNames;\r\n function GetLongMonthNames: TMonthNames;\r\n function GetLongTimeFormat: string;\r\n function GetNegCurrFormat: Byte;\r\n function GetShortDateFormat: string;\r\n function GetShortDayNames: TDayNames;\r\n function GetShortMonthNames: TMonthNames;\r\n function GetShortTimeFormat: string;\r\n function GetThousandSeparator: string;\r\n function GetTimeAMString: string;\r\n function GetTimePMString: string;\r\n function GetTimeSeparator: char;\r\n procedure SetCurrencyFormat(AValue: Byte);\r\n procedure SetCurrencyString(AValue: String);\r\n procedure SetDateSeparator(const Value: char);\r\n procedure SetDecimalSeparator(const Value: string);\r\n procedure SetLongDateFormat(const Value: string);\r\n procedure SetLongDayNames(AValue: TDayNames);\r\n procedure SetLongMonthNames(AValue: TMonthNames);\r\n procedure SetLongTimeFormat(const Value: string);\r\n procedure SetNegCurrFormat(AValue: Byte);\r\n procedure SetShortDateFormat(const Value: string);\r\n procedure SetShortDayNames(AValue: TDayNames);\r\n procedure SetShortMonthNames(AValue: TMonthNames);\r\n procedure SetShortTimeFormat(const Value: string);\r\n procedure SetCurrencyDecimals(AValue: Byte);\r\n procedure SetThousandSeparator(const Value: string);\r\n procedure SetTimeAMString(const Value: string);\r\n procedure SetTimePMString(const Value: string);\r\n procedure SetTimeSeparator(const Value: char);\r\n public\r\n Property ShortMonthNames : TMonthNames Read GetShortMonthNames Write SetShortMonthNames;\r\n Property LongMonthNames : TMonthNames Read GetLongMonthNames Write SetLongMonthNames;\r\n Property ShortDayNames : TDayNames Read GetShortDayNames Write SetShortDayNames;\r\n Property LongDayNames : TDayNames Read GetLongDayNames Write SetLongDayNames;\r\n property TimeSeparator : char read GetTimeSeparator write SetTimeSeparator;\r\n property DateSeparator : char read GetDateSeparator write SetDateSeparator;\r\n property ShortDateFormat : string read GetShortDateFormat write SetShortDateFormat;\r\n property LongDateFormat : string read GetLongDateFormat write SetLongDateFormat;\r\n property ShortTimeFormat : string read GetShortTimeFormat write SetShortTimeFormat;\r\n property LongTimeFormat : string read GetLongTimeFormat write SetLongTimeFormat;\r\n property DecimalSeparator : string read GetDecimalSeparator write SetDecimalSeparator;\r\n property ThousandSeparator : string read GetThousandSeparator write SetThousandSeparator;\r\n property TimeAMString : string read GetTimeAMString write SetTimeAMString;\r\n property TimePMString : string read GetTimePMString write SetTimePMString;\r\n Property CurrencyFormat : Byte read GetCurrencyFormat Write SetCurrencyFormat;\r\n Property NegCurrFormat : Byte read GetNegCurrFormat Write SetNegCurrFormat;\r\n Property CurrencyDecimals : Byte Read GetCurrencyDecimals Write SetCurrencyDecimals;\r\n Property CurrencyString : String Read GetCurrencyString Write SetCurrencyString;\r\n end;\r\n\r\nvar\r\n FormatSettings: TFormatSettings;\r\n\r\n TwoDigitYearCenturyWindow : word ;\r\n { Threshold to be subtracted from year before age-detection.}\r\n\r\n\r\nfunction DateTimeToJSDate(aDateTime : TDateTime) : TJSDate;\r\nfunction JSDateToDateTime(aDate : TJSDate) : TDateTime;\r\n\r\nfunction DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;\r\nfunction TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;\r\nfunction MSecsToTimeStamp(MSecs: NativeInt): TTimeStamp;\r\nfunction TimeStampToMSecs(const TimeStamp: TTimeStamp): NativeInt;\r\nfunction TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;\r\nfunction TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean;\r\nfunction EncodeDate(Year, Month, Day :word): TDateTime;\r\nfunction EncodeTime(Hour, Minute, Second, MilliSecond:word): TDateTime;\r\nfunction ComposeDateTime(Date,Time : TDateTime) : TDateTime;\r\nprocedure DecodeDate(Date: TDateTime; out Year, Month, Day: word);\r\nfunction DecodeDateFully(const DateTime: TDateTime; out Year, Month, Day, DOW: Word): Boolean;\r\nprocedure DecodeTime(Time: TDateTime; out Hour, Minute, Second, MilliSecond: word);\r\nprocedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);\r\nfunction SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;\r\nfunction DayOfWeek(DateTime: TDateTime): integer;\r\nfunction Date: TDateTime;\r\nfunction Time: TDateTime;\r\nfunction Now: TDateTime;\r\nfunction IncMonth(const DateTime: TDateTime; NumberOfMonths: integer = 1 ): TDateTime;\r\nprocedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);\r\nfunction IsLeapYear(Year: Word): boolean;\r\nfunction DateToStr(Date: TDateTime): string;\r\n// function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings): string;\r\nfunction TimeToStr(Time: TDateTime): string;\r\n// function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings): string;\r\nfunction DateTimeToStr(DateTime: TDateTime; ForceTimeIfZero : Boolean = False): string;\r\n// function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings; ForceTimeIfZero : Boolean = False): string;\r\nfunction StrToDate(const S: String): TDateTime;\r\nfunction StrToDate(const S: String; separator : char): TDateTime;\r\nfunction StrToDate(const S: String; const useformat : string; separator : char): TDateTime;\r\n//function StrToDate(const S: string; FormatSettings : TFormatSettings): TDateTime;\r\nfunction StrToTime(const S: String): TDateTime;\r\nfunction StrToTime(const S: String; separator : char): TDateTime;\r\n// function StrToTime(const S: string; FormatSettings : TFormatSettings): TDateTime;\r\nfunction StrToDateTime(const S: String): TDateTime;\r\n//function StrToDateTime(const s: ShortString; const FormatSettings : TFormatSettings): TDateTime;\r\nfunction FormatDateTime(const FormatStr: string; const DateTime: TDateTime): string;\r\n// function FormatDateTime(const FormatStr: string; DateTime: TDateTime; const FormatSettings: TFormatSettings; Options : TFormatDateTimeOptions = []): string;\r\nfunction TryStrToDate(const S: String; out Value: TDateTime): Boolean;\r\nfunction TryStrToDate(const S: String; out Value: TDateTime; separator : char): Boolean;\r\nfunction TryStrToDate(const S: String; out Value: TDateTime; const useformat : string; separator : char): Boolean;\r\n// function TryStrToDate(const S: string; out Value: TDateTime; const FormatSettings: TFormatSettings): Boolean;\r\nfunction TryStrToTime(const S: String; out Value: TDateTime): Boolean;\r\nfunction TryStrToTime(const S: String; out Value: TDateTime; separator : char): Boolean;\r\nfunction TryStrToDateTime(const S: String; out Value: TDateTime): Boolean;\r\n// function TryStrToTime(const S: string; out Value: TDateTime; const FormatSettings: TFormatSettings): Boolean;\r\n// function TryStrToDateTime(const S: string; out Value: TDateTime; const FormatSettings: TFormatSettings): Boolean;\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nfunction StrToDateTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nfunction CurrentYear:Word;\r\nprocedure ReplaceTime(var dati: TDateTime; NewTime : TDateTime);\r\nprocedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);\r\nFunction FloatToDateTime (Const Value : Extended) : TDateTime;\r\n\r\n{ *****************************************************************************\r\n Currency support\r\n *****************************************************************************}\r\n\r\nVar\r\n CurrencyFormat : Byte = 0;\r\n NegCurrFormat : Byte = 0;\r\n CurrencyDecimals : Byte = 2;\r\n CurrencyString : String = '$';\r\n\r\nFunction FloattoCurr (Const Value : Extended) : Currency;\r\nfunction TryFloatToCurr(const Value: Extended; var AResult: Currency): Boolean;\r\nFunction CurrToStr(Value: Currency): string;\r\n//Function CurrToStr(Value: Currency; Const FormatSettings: TFormatSettings): string;\r\nfunction StrToCurr(const S: string): Currency;\r\n//function StrToCurr(const S: string; Const FormatSettings: TFormatSettings): Currency;\r\nfunction TryStrToCurr(const S: string;Out Value : Currency): Boolean;\r\n//function TryStrToCurr(const S: string;Out Value : Currency; Const FormatSettings: TFormatSettings): Boolean;\r\nfunction StrToCurrDef(const S: string; Default : Currency): Currency;\r\n//function StrToCurrDef(const S: string; Default : Currency; Const FormatSettings: TFormatSettings): Currency;\r\n\r\n{*****************************************************************************\r\n File Paths\r\n*****************************************************************************}\r\ntype\r\n PathStr = String;\r\n//function ExtractFilePath(const FileName: PathStr): PathStr;\r\n\r\n{*****************************************************************************\r\n Interfaces\r\n*****************************************************************************}\r\n\r\nconst\r\n GUID_NULL: TGuid = '{00000000-0000-0000-0000-000000000000}';\r\n\r\nfunction Supports(const Instance: IInterface; const AClass: TClass; out Obj): Boolean; overload;\r\nfunction Supports(const Instance: IInterface; const IID: TGuid; out Intf): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuid; out Intf): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuidString; out Intf): Boolean; overload;\r\n\r\nfunction Supports(const Instance: IInterface; const AClass: TClass): Boolean; overload;\r\nfunction Supports(const Instance: IInterface; const IID: TGuid): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuid): Boolean; overload;\r\nfunction Supports(const Instance: TObject; const IID: TGuidString): Boolean; overload;\r\n\r\nfunction Supports(const AClass: TClass; const IID: TGuid): Boolean; overload;\r\nfunction Supports(const AClass: TClass; const IID: TGuidString): Boolean; overload;\r\n\r\nfunction TryStringToGUID(const s: string; out Guid: TGuid): Boolean;\r\nfunction StringToGUID(const S: string): TGuid;\r\nfunction GUIDToString(const guid: TGuid): string; reintroduce;\r\nfunction IsEqualGUID(const guid1, guid2: TGuid): Boolean;\r\nfunction GuidCase(const guid: TGuid; const List: array of TGuid): Integer;\r\n\r\nimplementation\r\n\r\nprocedure ShowException(ExceptObject: TObject; ExceptAddr: Pointer);\r\n\r\nVar\r\n S : String;\r\n\r\nbegin\r\n S:='Application raised an exception '+ExceptObject.ClassName;\r\n if ExceptObject is Exception then\r\n S:=S+' : '+Exception(ExceptObject).Message;\r\n{$IFDEF BROWSER}\r\n asm\r\n window.alert(S);\r\n end;\r\n{$ENDIF}\r\n{$IFDEF NODEJS}\r\n Writeln(S);\r\n{$ENDIF}\r\n if ExceptAddr=nil then;\r\nend;\r\n\r\nConst\r\n SAbortError = 'Operation aborted';\r\n\r\nprocedure Abort;\r\nbegin\r\n Raise EAbort.Create(SAbortError);\r\nend;\r\n\r\n\r\nFunction CharInSet(Ch: Char;Const CSet : array of char) : Boolean;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n Result:=False;\r\n I:=Length(CSet)-1;\r\n While (Not Result) and (I>=0) do\r\n begin\r\n Result:=(Ch=CSet[i]);\r\n Dec(I);\r\n end;\r\nend;\r\n\r\nfunction LeftStr(const S: string; Count: Integer): String; assembler;\r\nasm\r\n return (Count>0) ? S.substr(0,Count) : \"\";\r\nend;\r\n\r\nfunction RightStr(const S: string; Count: Integer): String; assembler;\r\nasm\r\n var l = S.length;\r\n return (Count<1) ? \"\" : ( Count>=l ? S : S.substr(l-Count));\r\nend;\r\n\r\nfunction Trim(const S: String): String; assembler;\r\nasm\r\n return S.trim();\r\nend;\r\n\r\nfunction TrimLeft(const S: String): String; assembler;\r\nasm\r\n return S.replace(/^[\\s\\uFEFF\\xA0\\x00-\\x1f]+/,'');\r\nend;\r\n\r\nfunction TrimRight(const S: String): String; assembler;\r\nasm\r\n return S.replace(/[\\s\\uFEFF\\xA0\\x00-\\x1f]+$/,'');\r\nend;\r\n\r\nfunction IntToStr(const Value: Integer): string;\r\nbegin\r\n Result:=str(Value);\r\nend;\r\n\r\nFunction FloatToDecimal(Value : double; Precision, Decimals : integer) : TFloatRec;\r\n\r\nConst\r\n Rounds = '234567890';\r\n\r\nvar\r\n Buffer: String; //Though str func returns only 25 chars, this might change in the future\r\n InfNan: string;\r\n Error, N, L, Start, C: Integer;\r\n GotNonZeroBeforeDot, BeforeDot : boolean;\r\n\r\nbegin\r\n if Value=0 then ;\r\n SetLength(Result.Digits,19);\r\n asm\r\n Buffer=Value.toPrecision(21); // Double precision\r\n end;\r\n N := 1;\r\n L := Length(Buffer);\r\n while Buffer[N]=' ' do\r\n Inc(N);\r\n Result.Negative := (Buffer[N] = '-');\r\n if Result.Negative then\r\n Inc(N)\r\n else if (Buffer[N] = '+') then\r\n inc(N);\r\n { special cases for Inf and Nan }\r\n if (L>=N+2) then\r\n begin\r\n InfNan:=copy(Buffer,N,3);\r\n if (InfNan='Inf') then\r\n begin\r\n Result.Digits[0]:=#0;\r\n Result.Exponent:=32767;\r\n exit\r\n end;\r\n if (InfNan='Nan') then\r\n begin\r\n Result.Digits[0]:=#0;\r\n Result.Exponent:=-32768;\r\n exit\r\n end;\r\n end;\r\n Start := N; //Start of digits\r\n Result.Exponent := 0; BeforeDot := true;\r\n GotNonZeroBeforeDot := false;\r\n while (L>=N) and (Buffer[N]<>'E') do\r\n begin\r\n if Buffer[N]='.' then\r\n BeforeDot := false\r\n else\r\n begin\r\n if BeforeDot then\r\n begin // Currently this is always 1 char\r\n Inc(Result.Exponent);\r\n Result.Digits[N-Start] := Buffer[N];\r\n if Buffer[N] <> '0' then\r\n GotNonZeroBeforeDot := true;\r\n end\r\n else\r\n Result.Digits[N-Start-1] := Buffer[N]\r\n end;\r\n Inc(N);\r\n end;\r\n Inc(N); // Pass through 'E'\r\n if N<=L then\r\n begin\r\n Val(Copy(Buffer, N, L-N+1), C, Error); // Get exponent after 'E'\r\n Inc(Result.Exponent, C);\r\n end;\r\n // Calculate number of digits we have from str\r\n if BeforeDot then\r\n N := N - Start - 1\r\n else\r\n N := N - Start - 2;\r\n L := Length(Result.Digits);\r\n if N= L Then\r\n N := L-1;\r\n if N = 0 Then\r\n begin\r\n if Result.Digits[0] >= '5' Then\r\n begin\r\n Result.Digits[0] := '1';\r\n Result.Digits[1] := #0;\r\n Inc(Result.Exponent);\r\n end\r\n Else\r\n Result.Digits[0] := #0;\r\n end //N=0\r\n Else if N > 0 Then\r\n begin\r\n if Result.Digits[N] >= '5' Then\r\n begin\r\n Repeat\r\n Result.Digits[N] := #0;\r\n Dec(N);\r\n // Writeln(N,': ',Result.Digits[N],', Rounding to : ',Rounds[StrToInt(Result.Digits[N])]);\r\n Result.Digits[N]:=Rounds[StrToInt(Result.Digits[N])];\r\n Until (N = 0) Or (Result.Digits[N] < ':');\r\n If Result.Digits[0] = ':' Then\r\n begin\r\n Result.Digits[0] := '1';\r\n Inc(Result.Exponent);\r\n end;\r\n end\r\n Else\r\n begin\r\n Result.Digits[N] := '0';\r\n While (N > -1) And (Result.Digits[N] = '0') Do\r\n begin\r\n Result.Digits[N] := #0;\r\n Dec(N);\r\n end;\r\n end;\r\n end //N>0\r\n Else\r\n Result.Digits[0] := #0;\r\n if (Result.Digits[0] = #0) and\r\n not GotNonZeroBeforeDot then\r\n begin\r\n Result.Exponent := 0;\r\n Result.Negative := False;\r\n end;\r\nend;\r\n\r\n\r\nfunction FloatToStr(Value: Double): String;\r\nbegin\r\n Result:=FloatToStrF(Value,ffGeneral,15,0);\r\nend;\r\n\r\nFunction TryStrToFloat(const S : String; Out res : Double) : Boolean;\r\n\r\nVar\r\n J : JSValue;\r\n N : String;\r\n\r\nbegin\r\n N:=S;\r\n // Delocalize\r\n if (ThousandSeparator <>'') then\r\n N:=StringReplace(N,ThousandSeparator,'',[rfReplaceAll]);\r\n if (DecimalSeparator<>'.') then\r\n N:=StringReplace(N,DecimalSeparator,'.',[]);\r\n J:=parseFloat(N);\r\n Result:=Not jsIsNaN(J);\r\n if Result then\r\n Res:=Double(J);\r\nend;\r\n\r\nFunction StrToFloatDef(const S : String; Const aDef : Double) : Double;\r\n\r\nbegin\r\n if not TryStrToFloat(S,Result) then\r\n Result:=aDef;\r\nend;\r\n\r\nFunction StrToFloat(const S : String) : Double;\r\nbegin\r\n if not TryStrToFloat(S,Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidFloat,[S]);\r\nend;\r\n\r\nfunction FormatFloat(Fmt: String; aValue: Double): String;\r\n\r\nType\r\n TPosArray = Array of Integer;\r\n\r\nconst\r\n MaxPrecision = 18; // Extended precision\r\n\r\nvar\r\n // Input in usable format\r\n E : Extended; // Value as extended.\r\n FV: TFloatRec; // Value as floatrec.\r\n Section : String; // Format can contain 3 sections, semicolon separated: Pos;Neg;Zero. This is the one to use.\r\n SectionLength : Integer; // Length of section.\r\n // Calculated based on section. Static during output\r\n ThousandSep: Boolean; // Thousands separator detected in format ?\r\n IsScientific: Boolean; // Use Scientific notation ? (E detected in format)\r\n DecimalPos: Integer; // Position of decimal point in pattern.\r\n FirstDigit: Integer; // First actual digit in input (# or 0), relative to decimal point\r\n LastDigit: Integer; // Last required (0) digit, relative to decimal point\r\n RequestedDigits: Integer; // Number of requested digits, # and 0 alike\r\n ExpSize : Integer; // Number of digits in exponent\r\n Available: Integer; // Available digits in FV.\r\n // These change during output loop\r\n Current: Integer; // Current digit in available digits\r\n PadZeroes: Integer; // Difference in requested digits before comma and exponent, needs to be padded with zeroes.\r\n DistToDecimal: Integer; // Place of current digit, relative to decimal point taking in account PadZeroes!\r\n\r\n Procedure InitVars;\r\n\r\n begin\r\n E:=aValue;\r\n Section:='';\r\n SectionLength:=0;\r\n ThousandSep:=false;\r\n IsScientific:=false;\r\n DecimalPos:=0;\r\n FirstDigit:=MaxInt;\r\n LastDigit:=0;\r\n RequestedDigits:=0;\r\n ExpSize:=0;\r\n Available:=-1;\r\n end;\r\n\r\n procedure ToResult(const AChar: Char);\r\n begin\r\n Result:=Result+AChar;\r\n end;\r\n\r\n procedure AddToResult(const AStr: String);\r\n\r\n begin\r\n Result:=Result+AStr;\r\n end;\r\n\r\n procedure WriteDigit(ADigit: Char);\r\n\r\n // Write a digit to result, prepend with decimalseparator or append with 1000 separator\r\n\r\n begin\r\n if ADigit=#0 then exit;\r\n // Writeln('WriteDigit: ',ADigit,', DistToDecimal: ',DistToDecimal);\r\n Dec(DistToDecimal);\r\n // -1 -> we've arrived behind the decimal\r\n if (DistToDecimal=-1) then\r\n begin\r\n AddToResult(DecimalSeparator);\r\n ToResult(ADigit);\r\n end\r\n else\r\n begin\r\n // We're still before the decimal.\r\n ToResult(ADigit);\r\n if ThousandSep and ((DistToDecimal mod 3)=0) and (DistToDecimal>1) then\r\n AddToResult(ThousandSeparator);\r\n end;\r\n end;\r\n\r\n Function GetDigit : Char;\r\n\r\n // Return next digit from available digits.\r\n // May return #0 if none available.\r\n // Will return '0' if applicable.\r\n\r\n begin\r\n // Writeln(' DistToDecimal <= LastDigit : ',DistToDecimal,' < ',LastDigit,' have digit: ',Current<=Available, '(',Current,')');\r\n Result:=#0;\r\n if (Current<=Available) then\r\n begin\r\n Result:=FV.Digits[Current];\r\n Inc(Current);\r\n end\r\n else if (DistToDecimal <= LastDigit) then\r\n Dec(DistToDecimal)\r\n else\r\n Result:='0';\r\n // Writeln('GetDigit ->: ',Result);\r\n end;\r\n\r\n procedure CopyDigit;\r\n\r\n // Copy a digit (#, 0) to the output with the correct value\r\n\r\n begin\r\n // Writeln('CopyDigit ');\r\n if (PadZeroes=0) then\r\n WriteDigit(GetDigit) // No shift needed, just copy what is available.\r\n else if (PadZeroes<0) then\r\n begin\r\n // We must prepend zeroes\r\n Inc(PadZeroes);\r\n if (DistToDecimal<=FirstDigit) then\r\n WriteDigit('0')\r\n else\r\n Dec(DistToDecimal);\r\n end\r\n else\r\n begin\r\n // We must append zeroes\r\n while PadZeroes > 0 do\r\n begin\r\n WriteDigit(GetDigit);\r\n Dec(PadZeroes);\r\n end;\r\n WriteDigit(GetDigit);\r\n end;\r\n end;\r\n\r\n Function GetSections(Var SP : TPosArray) : Integer;\r\n\r\n var\r\n FL : Integer;\r\n i : Integer;\r\n C,Q : Char;\r\n inQuote : Boolean;\r\n\r\n begin\r\n Result:=1;\r\n SP[1]:=-1;\r\n SP[2]:=-1;\r\n SP[3]:=-1;\r\n inQuote:=False;\r\n Q:=#0;\r\n I:=1;\r\n FL:=Length(Fmt);\r\n while (I<=FL) do\r\n begin\r\n C:=Fmt[I];\r\n case C of\r\n ';':\r\n begin\r\n if not InQuote then\r\n begin\r\n if Result>3 then\r\n Raise Exception.Create('Invalid float format');\r\n SP[Result]:=I+1;\r\n Inc(Result);\r\n end;\r\n end;\r\n '\"','''':\r\n begin\r\n if InQuote then\r\n InQuote:=C<>Q\r\n else\r\n begin\r\n InQuote:=True;\r\n Q:=C;\r\n end;\r\n end;\r\n end;\r\n Inc(I);\r\n end;\r\n if SP[Result]=-1 then\r\n SP[Result]:=FL+1;\r\n end;\r\n\r\n Procedure AnalyzeFormat;\r\n\r\n var\r\n I,Len: Integer;\r\n Q,C: Char;\r\n InQuote : Boolean;\r\n\r\n begin\r\n Len:=Length(Section);\r\n I:=1;\r\n InQuote:=False;\r\n Q:=#0;\r\n while (I<=Len) do\r\n begin\r\n C:=Section[i];\r\n if C in ['\"',''''] then\r\n begin\r\n if InQuote then\r\n InQuote:=C<>Q\r\n else\r\n begin\r\n InQuote:=True;\r\n Q:=C;\r\n end;\r\n end\r\n else if not InQuote then\r\n case C of\r\n '.':\r\n if (DecimalPos=0) then\r\n DecimalPos:=RequestedDigits+1;\r\n ',':\r\n ThousandSep:=ThousandSeparator<>#0;\r\n 'e', 'E':\r\n begin\r\n Inc(I);\r\n if (I4 then\r\n ExpSize:=4;\r\n end;\r\n end;\r\n '#':\r\n Inc(RequestedDigits);\r\n '0':\r\n begin\r\n if RequestedDigits0 then\r\n LastDigit:=0;\r\n // Writeln('FirstDigit: ',DecimalPos,'-',FirstDigit);\r\n FirstDigit:=DecimalPos-FirstDigit;\r\n if FirstDigit<0 then\r\n FirstDigit:=0;\r\n end;\r\n\r\n Function ValueOutSideScope : Boolean;\r\n begin\r\n With FV do\r\n Result:=((Exponent >= 18) and (not IsScientific)) or (Exponent = $7FF) or (Exponent = $800)\r\n end;\r\n\r\n Procedure CalcRunVars;\r\n\r\n Var\r\n D,P: Integer;\r\n\r\n begin\r\n if IsScientific then\r\n begin\r\n P:=RequestedDigits;\r\n D:=9999;\r\n end\r\n else\r\n begin\r\n P:=MaxPrecision;\r\n D:=RequestedDigits-DecimalPos+1;\r\n end;\r\n FV:=FloatToDecimal(aValue,P,D);\r\n DistToDecimal:=DecimalPos-1;\r\n if IsScientific then\r\n PadZeroes:=0 // No padding.\r\n else\r\n begin\r\n PadZeroes:=FV.Exponent-(DecimalPos-1);\r\n if (PadZeroes>=0) then\r\n DistToDecimal:=FV.Exponent\r\n end;\r\n // Writeln('PadZeroes : ',PadZeroes, ', DistToDecimal : ',DistToDecimal);\r\n Available:=-1;\r\n while (Available#0) do\r\n Inc(Available);\r\n // Writeln('Available: ',Available);\r\n end;\r\n\r\n Function FormatExponent(ASign: Char; aExponent: Integer) : String;\r\n\r\n begin\r\n Result:=IntToStr(aExponent);\r\n Result:=StringOfChar('0',ExpSize-Length(Result))+Result;\r\n if (aExponent<0) then\r\n Result:='-'+Result\r\n else if (aExponent>0) and (aSign='+') then\r\n Result:=aSign+Result;\r\n end;\r\n\r\nvar\r\n I,S : Integer;\r\n C,Q : Char;\r\n PA : TPosArray;\r\n InLiteral : Boolean;\r\n\r\nbegin\r\n SetLength(PA,4);\r\n Result:='';\r\n Initvars;\r\n // What section to use ?\r\n if (E>0) then\r\n S:=1\r\n else if (E<0) then\r\n S:=2\r\n else\r\n S:=3;\r\n PA[0]:=0;\r\n I:=GetSections(PA);\r\n if (IQ\r\n else\r\n begin\r\n inLiteral:=True;\r\n Q:=C;\r\n end;\r\n end\r\n else if InLiteral then\r\n ToResult(C)\r\n else\r\n case C of\r\n '0', '#':\r\n CopyDigit;\r\n '.', ',':\r\n ; // Do nothing, handled by CopyDigit\r\n 'e', 'E':\r\n begin\r\n ToResult(C); // Always needed\r\n Inc(I);\r\n if I<=Length(Section) then\r\n begin\r\n C:=Section[I];\r\n if (C in ['+','-']) then\r\n begin\r\n AddToResult(FormatExponent(C,FV.Exponent-DecimalPos+1));\r\n // Skip rest\r\n while (I0.0)\r\n else\r\n begin\r\n CheckBoolStrs;\r\n for I:=low(TrueBoolStrs) to High(TrueBoolStrs) do\r\n if Temp=uppercase(TrueBoolStrs[I]) then\r\n begin\r\n Value:=true;\r\n exit;\r\n end;\r\n for I:=low(FalseBoolStrs) to High(FalseBoolStrs) do\r\n if Temp=uppercase(FalseBoolStrs[I]) then\r\n begin\r\n Value:=false;\r\n exit;\r\n end;\r\n Result:=false;\r\n end;\r\nend;\r\n\r\nfunction UpperCase(const s: String): String; assembler;\r\nasm\r\n return s.toUpperCase();\r\nend;\r\n\r\nfunction LowerCase(const s: String): String; assembler;\r\nasm\r\n return s.toLowerCase();\r\nend;\r\n\r\nfunction CompareStr(const s1, s2: String): Integer; assembler;\r\nasm\r\n var l1 = s1.length;\r\n var l2 = s2.length;\r\n if (l1<=l2){\r\n var s = s2.substr(0,l1);\r\n if (s1s){ return 1;\r\n } else { return l1l2){ return 1;\r\n } else if (l10 then\r\n Result:=Copy(S,1,P-1)+DS+Copy(S,P+1,Length(S)-P)\r\n else\r\n Result:=S;\r\nend;\r\n\r\nfunction FormatGeneralFloat(Value : double; Precision : Integer; DS : String) : string;\r\n\r\nVar\r\n P, PE, Q, Exponent: Integer;\r\n\r\nBegin\r\n If (Precision = -1) Or (Precision > maxdigits) Then\r\n Precision := maxdigits;\r\n { First convert to scientific format, with correct precision }\r\n Str(Value:precision+7, Result);\r\n { Delete leading spaces }\r\n Result:=TrimLeft(Result);\r\n P:=Pos('.',Result);\r\n if P=0 then\r\n exit;\r\n { Consider removing exponent }\r\n PE:=Pos('E',Result);\r\n if PE=0 then\r\n begin\r\n Result:=ReplaceDecimalSep(Result,DS);\r\n exit;\r\n end;\r\n { Read exponent }\r\n Q:=PE+2;\r\n Exponent := 0;\r\n while (Q <= Length(Result)) do\r\n begin\r\n Exponent := Exponent*10 + Ord(Result[Q])-Ord('0');\r\n Inc(Q);\r\n end;\r\n if Result[PE+1] = '-' then\r\n Exponent := -Exponent;\r\n if (P+Exponent < PE) and (Exponent > -6) then\r\n begin\r\n { OK to remove exponent }\r\n SetLength(Result,PE-1); { Trim exponent }\r\n if Exponent >= 0 then\r\n begin\r\n { Shift point to right }\r\n for Q := 0 to Exponent-1 do\r\n begin\r\n Result[P] := Result[P+1];\r\n Inc(P);\r\n end;\r\n Result[P] := '.';\r\n P := 1;\r\n if Result[P] = '-' then\r\n Inc(P);\r\n while (Result[P] = '0') and (P < Length(Result)) and (Copy(Result,P+1,Length(DS))<>DS) do\r\n { Trim leading zeros; conversion above should not give any, but occasionally does\r\n because of rounding }\r\n System.Delete(Result,P,1);\r\n end\r\n else\r\n begin\r\n { Add zeros at start }\r\n Insert(Copy('00000',1,-Exponent),Result,P-1);\r\n Result[P-Exponent] := Result[P-Exponent-1]; { Copy leading digit }\r\n Result[P] := '.';\r\n if Exponent <> -1 then\r\n Result[P-Exponent-1] := '0';\r\n end;\r\n { Remove trailing zeros }\r\n Q := Length(Result);\r\n while (Q > 0) and (Result[Q] = '0') do\r\n Dec(Q);\r\n if Result[Q] = '.' then\r\n Dec(Q); { Remove trailing decimal point }\r\n if (Q = 0) or ((Q=1) and (Result[1] = '-')) then\r\n Result := '0'\r\n else\r\n SetLength(Result,Q);\r\n end\r\n else\r\n begin\r\n { Need exponent, but remove superfluous characters }\r\n { Delete trailing zeros }\r\n while Result[PE-1] = '0' do\r\n begin\r\n System.Delete(Result,PE-1,1);\r\n Dec(PE);\r\n end;\r\n { If number ends in decimal point, remove it }\r\n if Result[PE-1] = DS then\r\n begin\r\n System.Delete(Result,PE-1,1);\r\n Dec(PE);\r\n end;\r\n { delete superfluous + in exponent }\r\n if Result[PE+1]='+' then\r\n System.Delete(Result,PE+1,1)\r\n else\r\n Inc(PE);\r\n while Result[PE+1] = '0' do\r\n { Delete leading zeros in exponent }\r\n System.Delete(Result,PE+1,1)\r\n end;\r\n Result:=ReplaceDecimalSep(Result,DS)\r\nend;\r\n\r\nfunction FormatExponentFloat(Value : double; Precision,Digits : Integer;DS : String) : string;\r\n\r\nVar\r\n P: Integer;\r\nBegin\r\n DS:=DecimalSeparator;\r\n If (Precision = -1) Or (Precision > maxdigits) Then\r\n Precision := maxdigits;\r\n Str(Value:Precision+7, Result);\r\n { Delete leading spaces }\r\n while Result[1] = ' ' do\r\n System.Delete(Result, 1, 1);\r\n P:=Pos('E',Result);\r\n if P=0 then\r\n begin\r\n Result:=ReplaceDecimalSep(Result,DS);\r\n exit;\r\n end;\r\n Inc(P, 2);\r\n if Digits > 4 then\r\n Digits:=4;\r\n Digits:=Length(Result) - P - Digits + 1;\r\n if Digits < 0 then\r\n insert(copy('0000',1,-Digits),Result,P)\r\n else\r\n while (Digits > 0) and (Result[P] = '0') do\r\n begin\r\n System.Delete(Result, P, 1);\r\n if P > Length(Result) then\r\n begin\r\n System.Delete(Result, P - 2, 2);\r\n break;\r\n end;\r\n Dec(Digits);\r\n end;\r\n Result:=ReplaceDecimalSep(Result,DS);\r\nEnd;\r\n\r\nfunction FormatFixedFloat(Value : double; Digits : Integer; DS : String) : string;\r\n\r\nBegin\r\n If Digits = -1 Then\r\n Digits := 2\r\n Else If Digits > 18 Then\r\n Digits := 18;\r\n Str(Value:0:Digits, Result);\r\n if (Result<>'') and (Result[1]=' ') then\r\n Delete(Result,1,1);\r\n Result:=ReplaceDecimalSep(Result,DS);\r\nend;\r\n\r\n\r\nfunction FormatNumberFloat(Value : double; Digits : Integer; DS,TS : String) : string;\r\n\r\nVar\r\n P : integer;\r\n\r\nBegin\r\n If Digits = -1 Then\r\n Digits := 2\r\n else If Digits > maxdigits Then\r\n Digits := maxdigits;\r\n Str(Value:0:Digits, Result);\r\n if (Result<>'') and (Result[1]=' ') then\r\n Delete(Result,1,1);\r\n P:=Pos('.',Result);\r\n Result:=ReplaceDecimalSep(Result,DS);\r\n Dec(P,3);\r\n if (TS<>'') and (TS<>#0) then\r\n While (P>1) Do\r\n Begin\r\n If (Result[P-1] <> '-') Then\r\n Insert(TS, Result, P);\r\n Dec(P, 3);\r\n End;\r\nEnd;\r\n\r\nfunction RemoveLeadingNegativeSign(var AValue: String; DS : String): Boolean;\r\n\r\n// removes negative sign in case when result is zero eg. -0.00\r\n\r\nvar\r\n i: PtrInt;\r\n TS: String;\r\n StartPos: PtrInt;\r\n\r\nbegin\r\n Result:=False;\r\n StartPos := 2;\r\n TS := ThousandSeparator;\r\n for i :=StartPos to length(AValue) do\r\n begin\r\n Result := (AValue[i] in ['0', DS, 'E', '+']) or (aValue=TS);\r\n if not Result then\r\n break;\r\n end;\r\n if (Result) then\r\n Delete(AValue, 1, 1);\r\nend;\r\n\r\nFunction FormatNumberCurrency(const Value : Currency; Digits : Integer; DS,TS : String) : string;\r\n\r\nVar\r\n Negative: Boolean;\r\n P : Integer;\r\n\r\nBegin\r\n If Digits = -1 Then\r\n Digits := CurrencyDecimals\r\n Else If Digits > 18 Then\r\n Digits := 18;\r\n Str(Value:0:Digits, Result);\r\n Negative:=Result[1] = '-';\r\n if Negative then\r\n System.Delete(Result, 1, 1);\r\n P := Pos('.', Result);\r\n If P <> 0 Then\r\n Result:=ReplaceDecimalSep(Result,DS)\r\n else\r\n P := Length(Result)+1;\r\n Dec(P, 3);\r\n While (P > 1) Do\r\n Begin\r\n If ThousandSeparator<>#0 Then\r\n Insert(FormatSettings.ThousandSeparator, Result, P);\r\n Dec(P, 3);\r\n End;\r\n if (length(Result) > 1) and Negative then\r\n Negative := not RemoveLeadingNegativeSign(Result,DS);\r\n If Not Negative Then\r\n Case CurrencyFormat Of\r\n 0: Result := CurrencyString + Result;\r\n 1: Result := Result + CurrencyString;\r\n 2: Result := CurrencyString + ' ' + Result;\r\n 3: Result := Result + ' ' + CurrencyString;\r\n end\r\n else\r\n Case NegCurrFormat Of\r\n 0: Result := '(' + CurrencyString + Result + ')';\r\n 1: Result := '-' + CurrencyString + Result;\r\n 2: Result := CurrencyString + '-' + Result;\r\n 3: Result := CurrencyString + Result + '-';\r\n 4: Result := '(' + Result + CurrencyString + ')';\r\n 5: Result := '-' + Result + CurrencyString;\r\n 6: Result := Result + '-' + CurrencyString;\r\n 7: Result := Result + CurrencyString + '-';\r\n 8: Result := '-' + Result + ' ' + CurrencyString;\r\n 9: Result := '-' + CurrencyString + ' ' + Result;\r\n 10: Result := Result + ' ' + CurrencyString + '-';\r\n 11: Result := CurrencyString + ' ' + Result + '-';\r\n 12: Result := CurrencyString + ' ' + '-' + Result;\r\n 13: Result := Result + '-' + ' ' + CurrencyString;\r\n 14: Result := '(' + CurrencyString + ' ' + Result + ')';\r\n 15: Result := '(' + Result + ' ' + CurrencyString + ')';\r\n end;\r\n if TS='' then ;\r\nend;\r\n\r\nFunction FloatToStrF(const Value : double; format: TFloatFormat; Precision, Digits: Integer): String;\r\n\r\nVar\r\n DS: string;\r\n\r\nBegin\r\n DS:=DecimalSeparator;\r\n Case format Of\r\n ffGeneral:\r\n Result:=FormatGeneralFloat(Value,Precision,DS);\r\n ffExponent:\r\n Result:=FormatExponentFloat(Value,Precision,Digits,DS);\r\n ffFixed:\r\n Result:=FormatFixedFloat(Value,Digits,DS);\r\n ffNumber:\r\n Result:=FormatNumberFloat(Value,Digits,DS,ThousandSeparator);\r\n ffCurrency:\r\n Result:=FormatNumberCurrency(Value,Digits,DS,ThousandSeparator);\r\n end;\r\n if (Format<>ffCurrency) and (length(Result)>1) and (Result[1]='-') then\r\n RemoveLeadingNegativeSign(Result,DS);\r\nend;\r\n\r\nfunction Format (const Fmt: String; const Args: array of jsvalue): String;\r\n\r\nVar ChPos,OldPos,ArgPos,DoArg,Len : SizeInt;\r\n Hs,ToAdd : String;\r\n Index : SizeInt;\r\n Width,Prec : Longint;\r\n Left : Boolean;\r\n Fchar : char;\r\n vq : nativeint;\r\n\r\n {\r\n ReadFormat reads the format string. It returns the type character in\r\n uppercase, and sets index, Width, Prec to their correct values,\r\n or -1 if not set. It sets Left to true if left alignment was requested.\r\n In case of an error, DoFormatError is called.\r\n }\r\n\r\n Function ReadFormat : Char;\r\n\r\n Var Value : NativeInt;\r\n\r\n Procedure ReadInteger;\r\n\r\n var\r\n Code: integer;\r\n ArgN: SizeInt;\r\n begin\r\n If Value<>-1 then exit; // Was already read.\r\n OldPos:=ChPos;\r\n While (ChPos<=Len) and\r\n (Fmt[ChPos]<='9') and (Fmt[ChPos]>='0') do inc(ChPos);\r\n If ChPos>len then\r\n DoFormatError(feInvalidFormat,Fmt);\r\n If Fmt[ChPos]='*' then\r\n begin\r\n\r\n if Index=-1 then\r\n ArgN:=Argpos\r\n else\r\n begin\r\n ArgN:=Index;\r\n Inc(Index);\r\n end;\r\n\r\n If (ChPos>OldPos) or (ArgN>High(Args)) then\r\n DoFormatError(feInvalidFormat,Fmt);\r\n\r\n ArgPos:=ArgN+1;\r\n\r\n if IsNumber(Args[ArgN]) and IsInteger(Args[ArgN]) then\r\n Value:=Integer(Args[ArgN])\r\n else\r\n DoFormatError(feInvalidFormat,Fmt);\r\n Inc(ChPos);\r\n end\r\n else\r\n begin\r\n If (OldPos0 then DoFormatError (feInvalidFormat,Fmt);\r\n end\r\n else\r\n Value:=-1;\r\n end;\r\n end;\r\n\r\n Procedure ReadIndex;\r\n\r\n begin\r\n If Fmt[ChPos]<>':' then\r\n ReadInteger\r\n else\r\n value:=0; // Delphi undocumented behaviour, assume 0, #11099\r\n If Fmt[ChPos]=':' then\r\n begin\r\n If Value=-1 then DoFormatError(feMissingArgument,Fmt);\r\n Index:=Value;\r\n Value:=-1;\r\n Inc(ChPos);\r\n end;\r\n end;\r\n\r\n Procedure ReadLeft;\r\n\r\n begin\r\n If Fmt[ChPos]='-' then\r\n begin\r\n left:=True;\r\n Inc(ChPos);\r\n end\r\n else\r\n Left:=False;\r\n end;\r\n\r\n Procedure ReadWidth;\r\n\r\n begin\r\n ReadInteger;\r\n If Value<>-1 then\r\n begin\r\n Width:=Value;\r\n Value:=-1;\r\n end;\r\n end;\r\n\r\n Procedure ReadPrec;\r\n\r\n begin\r\n If Fmt[ChPos]='.' then\r\n begin\r\n inc(ChPos);\r\n ReadInteger;\r\n If Value=-1 then\r\n Value:=0;\r\n prec:=Value;\r\n end;\r\n end;\r\n\r\n\r\n begin\r\n Index:=-1;\r\n Width:=-1;\r\n Prec:=-1;\r\n Value:=-1;\r\n inc(ChPos);\r\n If Fmt[ChPos]='%' then\r\n begin\r\n Result:='%';\r\n exit; // VP fix\r\n end;\r\n ReadIndex;\r\n ReadLeft;\r\n ReadWidth;\r\n ReadPrec;\r\n Result:=Upcase(Fmt[ChPos]);\r\n end;\r\n\r\n\r\n function Checkarg (AT : TJSValueType; err:boolean):boolean;\r\n {\r\n Check if argument INDEX is of correct type (AT)\r\n If Index=-1, ArgPos is used, and argpos is augmented with 1\r\n DoArg is set to the argument that must be used.\r\n }\r\n begin\r\n result:=false;\r\n if Index=-1 then\r\n DoArg:=Argpos\r\n else\r\n DoArg:=Index;\r\n ArgPos:=DoArg+1;\r\n If (Doarg>High(Args)) or (GetValueTYpe(Args[Doarg])<>AT) then\r\n begin\r\n if err then\r\n DoFormatError(feInvalidArgindex,Fmt);\r\n dec(ArgPos);\r\n exit;\r\n end;\r\n result:=true;\r\n end;\r\n\r\nbegin\r\n Result:='';\r\n Len:=Length(Fmt);\r\n ChPos:=1;\r\n OldPos:=1;\r\n ArgPos:=0;\r\n While ChPos<=len do\r\n begin\r\n While (ChPos<=Len) and (Fmt[ChPos]<>'%') do\r\n inc(ChPos);\r\n If ChPos>OldPos Then\r\n Result:=Result+Copy(Fmt,OldPos,ChPos-Oldpos);\r\n If ChPos'-' then\r\n ToAdd:=StringOfChar('0',Index)+ToAdd\r\n else\r\n // + 1 to accomodate for - sign in length !!\r\n Insert(StringOfChar('0',Index+1),toadd,2);\r\n end;\r\n 'U' : begin\r\n Checkarg(jvtinteger,True);\r\n if NativeInt(Args[Doarg])<0 then\r\n DoFormatError(feInvalidArgindex,Fmt);\r\n Toadd:=IntToStr(NativeInt(Args[Doarg]));\r\n Width:=Abs(width);\r\n Index:=Prec-Length(ToAdd);\r\n ToAdd:=StringOfChar('0',Index)+ToAdd\r\n end;\r\n 'E' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffFixed,9999,Prec);\r\n end;\r\n 'F' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffFixed,9999,Prec);\r\n end;\r\n 'G' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffGeneral,Prec,3);\r\n end;\r\n 'N' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffNumber,9999,Prec);\r\n end;\r\n 'M' : begin\r\n if CheckArg(jvtFloat,false) or CheckArg(jvtInteger,True) then\r\n ToAdd:=FloatToStrF(Double(Args[doarg]),ffCurrency,9999,Prec);\r\n end;\r\n 'S' : begin\r\n CheckArg(jvtString,true);\r\n hs:=String(Args[doarg]);\r\n Index:=Length(hs);\r\n If (Prec<>-1) and (Index>Prec) then\r\n Index:=Prec;\r\n ToAdd:=Copy(hs,1,Index);\r\n end;\r\n 'P' : Begin\r\n CheckArg(jvtInteger,true);\r\n ToAdd:=IntToHex(NativeInt(Args[DoArg]),31);\r\n end;\r\n 'X' : begin\r\n Checkarg(jvtinteger,true);\r\n vq:=nativeInt(Args[Doarg]);\r\n index:=31; // May need to adjust to NativeInt\r\n If Prec>index then\r\n ToAdd:=IntToHex(vq,index)\r\n else\r\n begin\r\n // determine minimum needed number of hex digits.\r\n Index:=1;\r\n While (NativeInt(1) shl (Index*4)<=vq) and (index<16) do\r\n inc(Index);\r\n If Index>Prec then\r\n Prec:=Index;\r\n ToAdd:=IntToHex(vq,Prec);\r\n end;\r\n end;\r\n '%': ToAdd:='%';\r\n end;\r\n If Width<>-1 then\r\n If Length(ToAdd)= Len then exit;\r\n First := True;\r\n end;\r\n end\r\n else\r\n if not (Ident[I] in AlphaNum) then exit;\r\n I:=I+1;\r\n end;\r\n Result:=true;\r\nend;\r\n\r\nprocedure FreeAndNil(var Obj);\r\nvar\r\n o: TObject;\r\nbegin\r\n o:=TObject(Obj);\r\n if o=nil then exit;\r\n TObject(Obj):=nil;\r\n o.Destroy;\r\nend;\r\n\r\n{ EVariantError }\r\n\r\nconstructor EVariantError.CreateCode(Code: Longint);\r\nbegin\r\n ErrCode:=Code;\r\nend;\r\n\r\n{ Exception }\r\n\r\nconstructor Exception.Create(const Msg: String);\r\nbegin\r\n fMessage:=Msg;\r\nend;\r\n\r\nconstructor Exception.CreateFmt(const Msg: string; const Args: array of JSValue);\r\nbegin\r\n //writeln('Exception.CreateFmt START ',ClassName,' \"',Msg,'\" Args=',Args);\r\n fMessage:=Format(Msg,Args);\r\n //writeln('Exception.CreateFmt END ',ClassName,' \"',Msg,'\" fMessage=',fMessage);\r\nend;\r\n\r\nconstructor Exception.CreateHelp(const Msg: String; AHelpContext: Integer);\r\nbegin\r\n fMessage:=Msg;\r\n fHelpContext:=AHelpContext;\r\nend;\r\n\r\nconstructor Exception.CreateFmtHelp(const Msg: string;\r\n const Args: array of JSValue; AHelpContext: Integer);\r\nbegin\r\n fMessage:=Format(Msg,Args);\r\n fHelpContext:=AHelpContext;\r\nend;\r\n\r\nfunction Exception.ToString: String;\r\nbegin\r\n Result:=ClassName+': '+Message;\r\nend;\r\n\r\nConst\r\n RESpecials = '([\\[\\]\\(\\)\\\\\\.\\*])';\r\n\r\nFunction StringReplace(aOriginal, aSearch, aReplace : string; Flags : TStringReplaceFlags) : String;\r\n\r\nVar\r\n REFlags : String;\r\n REString : String;\r\n\r\nbegin\r\n REFlags:='';\r\n if rfReplaceAll in flags then\r\n ReFlags:='g';\r\n if rfIgnoreCase in flags then\r\n ReFlags:=ReFlags+'i';\r\n REString:=TJSString(aSearch).replace(TJSRegexp.new(RESpecials,'g'),'\\$1');\r\n Result:=TJSString(aOriginal).replace(TJSRegexp.new(REString,REFlags),aReplace);\r\nend;\r\n\r\nFunction QuoteString(aOriginal : String; AQuote : Char) : String;\r\n\r\nVar\r\n REString : String;\r\n\r\nbegin\r\n REString:=TJSString(aQuote).replace(TJSRegexp.new(aOriginal,'g'),'\\\\$1');\r\n Result:=AQuote+TJSString(aOriginal).replace(TJSRegexp.new(REString,'g'),'$1\\$1')+AQuote;\r\nend;\r\n\r\nfunction IsDelimiter(const Delimiters, S: string; Index: Integer): Boolean;\r\nbegin\r\n Result:=False;\r\n if (Index>0) and (Index<=Length(S)) then\r\n Result:=Pos(S[Index],Delimiters)<>0; // Note we don't do MBCS yet\r\nend;\r\n\r\nfunction AdjustLineBreaks(const S: string): string;\r\n\r\nbegin\r\n Result:=AdjustLineBreaks(S,DefaultTextLineBreakStyle);\r\nend;\r\n\r\nfunction AdjustLineBreaks(const S: string; Style: TTextLineBreakStyle): string;\r\n\r\nvar\r\n I,L: Longint;\r\n Res : String;\r\n\r\n Procedure Add(C : Char);\r\n begin\r\n Res:=Res+C;\r\n end;\r\n\r\nbegin\r\n I:=0;\r\n L:=Length(S);\r\n Result:='';\r\n While (I<=L) do\r\n case S[I] of\r\n #10: begin\r\n if Style in [tlbsCRLF,tlbsCR] then\r\n Add(#13);\r\n if Style=tlbsCRLF then\r\n Add(#10);\r\n Inc(I);\r\n end;\r\n #13: begin\r\n if Style=tlbsCRLF then\r\n Add(#13);\r\n Add(#10);\r\n Inc(I);\r\n if S[I]=#10 then\r\n Inc(I);\r\n end;\r\n else\r\n Add(S[i]);\r\n Inc(I);\r\n end;\r\n Result:=Res;\r\nend;\r\n\r\nfunction WrapText(const Line, BreakStr: string; const BreakChars: Array of char; MaxCol: Integer): string;\r\n\r\nconst\r\n Quotes = ['''', '\"'];\r\n\r\nVar\r\n L : String;\r\n C,LQ,BC : Char;\r\n P,BLen,Len : Integer;\r\n HB,IBC : Boolean;\r\n\r\nbegin\r\n Result:='';\r\n L:=Line;\r\n Blen:=Length(BreakStr);\r\n If (BLen>0) then\r\n BC:=BreakStr[1]\r\n else\r\n BC:=#0;\r\n Len:=Length(L);\r\n While (Len>0) do\r\n begin\r\n P:=1;\r\n LQ:=#0;\r\n HB:=False;\r\n IBC:=False;\r\n While ((P<=Len) and ((P<=MaxCol) or not IBC)) and ((LQ<>#0) or Not HB) do\r\n begin\r\n C:=L[P];\r\n If (C=LQ) then\r\n LQ:=#0\r\n else If (C in Quotes) then\r\n LQ:=C;\r\n If (LQ<>#0) then\r\n Inc(P)\r\n else\r\n begin\r\n HB:=((C=BC) and (BreakStr=Copy(L,P,BLen)));\r\n If HB then\r\n Inc(P,Blen)\r\n else\r\n begin\r\n If (P>=MaxCol) then\r\n IBC:=CharInSet(C,BreakChars);\r\n Inc(P);\r\n end;\r\n end;\r\n// Writeln('\"',C,'\" : IBC : ',IBC,' HB : ',HB,' LQ : ',LQ,' P>MaxCol : ',P>MaxCol);\r\n end;\r\n Result:=Result+Copy(L,1,P-1);\r\n Delete(L,1,P-1);\r\n Len:=Length(L);\r\n If (Len>0) and Not HB then\r\n Result:=Result+BreakStr;\r\n end;\r\nend;\r\n\r\nfunction WrapText(const Line: string; MaxCol: Integer): string;\r\n\r\nbegin\r\n Result:=WrapText(Line,sLineBreak, [' ', '-', #9], MaxCol);\r\nend;\r\n\r\n\r\nfunction GetEnvironmentVariable(const EnvVar: String): String;\r\nbegin\r\n if Assigned(OnGetEnvironmentVariable) then\r\n Result:=OnGetEnvironmentVariable(EnvVar)\r\n else\r\n Result:='';\r\nend;\r\n\r\nfunction GetEnvironmentVariableCount: Integer;\r\nbegin\r\n if Assigned(OnGetEnvironmentVariableCount) then\r\n Result:=OnGetEnvironmentVariableCount()\r\n else\r\n Result:=0;\r\nend;\r\n\r\nfunction GetEnvironmentString(Index: Integer): String;\r\nbegin\r\n if Assigned(OnGetEnvironmentString) then\r\n Result:=OnGetEnvironmentString(Index)\r\n else\r\n Result:='';\r\nend;\r\n\r\n{ Date/Time routines}\r\n\r\nFunction DoEncodeDate(Year, Month, Day: Word): longint;\r\n\r\nVar\r\n D : TDateTime;\r\n\r\nbegin\r\n If TryEncodeDate(Year,Month,Day,D) then\r\n Result:=Trunc(D)\r\n else\r\n Result:=0;\r\nend;\r\n\r\nfunction DoEncodeTime(Hour, Minute, Second, MilliSecond: word): TDateTime;\r\n\r\nbegin\r\n If not TryEncodeTime(Hour,Minute,Second,MilliSecond,Result) then\r\n Result:=0;\r\nend;\r\n\r\nFunction DateTimeToJSDate(aDateTime : TDateTime) : TJSDate;\r\n\r\nVar\r\n Y,M,D,h,n,s,z : Word;\r\n\r\nbegin\r\n DecodeDate(Trunc(aDateTime),Y,M,D);\r\n DecodeTime(Frac(aDateTime),H,N,S,Z);\r\n Result:=TJSDate.New(Y,M,D,h,n,s,z);\r\nend;\r\n\r\nFunction JSDatetoDateTime(ADate: TJSDate) : TDateTime;\r\n\r\nbegin\r\n Result:=EncodeDate(ADate.FullYear,ADate.Month+1,ADate.Date) +\r\n EncodeTime(ADate.Hours,ADate.Minutes,ADate.Seconds,ADate.Milliseconds);\r\nend;\r\n\r\n\r\n{ ComposeDateTime converts a Date and a Time into one TDateTime }\r\nfunction ComposeDateTime(Date,Time : TDateTime) : TDateTime;\r\n\r\nbegin\r\n if Date < 0 then\r\n Result := trunc(Date) - Abs(frac(Time))\r\n else\r\n Result := trunc(Date) + Abs(frac(Time));\r\nend;\r\n\r\nFunction TryEncodeDate(Year,Month,Day : Word; Out Date : TDateTime) : Boolean;\r\n\r\nvar\r\n c, ya: LongWord;\r\nbegin\r\n Result:=(Year>0) and (Year<10000) and\r\n (Month >= 1) and (Month<=12) and\r\n (Day>0) and (Day<=MonthDays[IsleapYear(Year),Month]);\r\n If Result then\r\n begin\r\n if month > 2 then\r\n Dec(Month,3)\r\n else\r\n begin\r\n Inc(Month,9);\r\n Dec(Year);\r\n end;\r\n c:= Year DIV 100;\r\n ya:= Year - 100*c;\r\n Date := (146097*c) SHR 2 + (1461*ya) SHR 2 + (153*LongWord(Month)+2) DIV 5 + LongWord(Day);\r\n // Note that this line can't be part of the line above, since TDateTime is\r\n // signed and c and ya are not\r\n Date := Date - 693900;\r\n end\r\nend;\r\n\r\nfunction TryEncodeTime(Hour, Min, Sec, MSec:word; Out Time : TDateTime) : boolean;\r\n\r\nbegin\r\n Result:=(Hour<24) and (Min<60) and (Sec<60) and (MSec<1000);\r\n If Result then\r\n Time:=TDateTime(LongWord(Hour)*3600000+LongWord(Min)*60000+LongWord(Sec)*1000+MSec)/MSecsPerDay;\r\nend;\r\n\r\n{ EncodeDate packs three variables Year, Month and Day into a\r\n TDateTime value the result is the number of days since 12/30/1899 }\r\n\r\nfunction EncodeDate(Year, Month, Day: word): TDateTime;\r\n\r\nbegin\r\n If Not TryEncodeDate(Year,Month,Day,Result) then\r\n Raise EConvertError.CreateFmt('%s-%s-%s is not a valid date specification',\r\n [IntToStr(Year),IntToStr(Month),IntToStr(Day)]);\r\nend;\r\n\r\n{ EncodeTime packs four variables Hour, Minute, Second and MilliSecond into\r\n a TDateTime value }\r\n\r\nfunction EncodeTime(Hour, Minute, Second, MilliSecond:word):TDateTime;\r\n\r\nbegin\r\n If not TryEncodeTime(Hour,Minute,Second,MilliSecond,Result) then\r\n Raise EConvertError.CreateFmt('%s:%s:%s.%s is not a valid time specification',\r\n [IntToStr(Hour),IntToStr(Minute),IntToStr(Second),IntToStr(MilliSecond)]);\r\nend;\r\n\r\n\r\n{ DecodeDate unpacks the value Date into three values:\r\n Year, Month and Day }\r\n\r\nprocedure DecodeDate(Date: TDateTime; out Year, Month, Day: word);\r\nvar\r\n ly,ld,lm,j : LongWord;\r\nbegin\r\n if Date <= -datedelta then // If Date is before 1-1-1 then return 0-0-0\r\n begin\r\n Year := 0;\r\n Month := 0;\r\n Day := 0;\r\n end\r\n else\r\n begin\r\n if Date>0 then\r\n Date:=(Date+(1/(msecsperday*2)))\r\n else\r\n Date:=Date-(1/(msecsperday*2));\r\n if Date>MaxDateTime then\r\n Date:=MaxDateTime;\r\n// Raise EConvertError.CreateFmt('%f is not a valid TDatetime encoding, maximum value is %f.',[Date,MaxDateTime]);\r\n j := ((Trunc(Date) + 693900) SHL 2)-1;\r\n ly:= j DIV 146097;\r\n j:= j - 146097 * LongWord(ly);\r\n ld := j SHR 2;\r\n j:=(ld SHL 2 + 3) DIV 1461;\r\n ld:= ((ld SHL 2) + 7 - 1461*j) SHR 2;\r\n lm:=(5 * ld-3) DIV 153;\r\n ld:= (5 * ld +2 - 153*lm) DIV 5;\r\n ly:= 100 * LongWord(ly) + j;\r\n if lm < 10 then\r\n inc(lm,3)\r\n else\r\n begin\r\n dec(lm,9);\r\n inc(ly);\r\n end;\r\n year:=ly;\r\n month:=lm;\r\n day:=ld;\r\n end;\r\nend;\r\n\r\n\r\nfunction DecodeDateFully(const DateTime: TDateTime; out Year, Month, Day, DOW: Word): Boolean;\r\nbegin\r\n DecodeDate(DateTime,Year,Month,Day);\r\n DOW:=DayOfWeek(DateTime);\r\n Result:=IsLeapYear(Year);\r\nend;\r\n { DateTimeToTimeStamp converts DateTime to a TTimeStamp }\r\n\r\nfunction DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;\r\n\r\nVar\r\n D : Double;\r\nbegin\r\n D:=DateTime * Double(MSecsPerDay);\r\n if D<0 then\r\n D:=D-0.5\r\n else\r\n D:=D+0.5;\r\n result.Time := Trunc(Abs(Trunc(D)) Mod MSecsPerDay);\r\n result.Date := DateDelta + (Trunc(D) div MSecsPerDay);\r\nend;\r\n\r\n{ TimeStampToDateTime converts TimeStamp to a TDateTime value }\r\n\r\nfunction TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;\r\nbegin\r\n Result := ComposeDateTime(TimeStamp.Date - DateDelta,TimeStamp.Time/MSecsPerDay)\r\nend;\r\n\r\n{ MSecsToTimeStamp }\r\n\r\nfunction MSecsToTimeStamp(MSecs: NativeInt): TTimeStamp;\r\nbegin\r\n result.Date := Trunc(msecs/msecsperday);\r\n msecs:= msecs-NativeInt(result.date)*msecsperday;\r\n result.Time := Round(MSecs);\r\nend;\r\n\r\nfunction TimeStampToMSecs(const TimeStamp: TTimeStamp): NativeInt;\r\nbegin\r\n result := TimeStamp.Time + (timestamp.date*msecsperday);\r\nend ;\r\n\r\n\r\n\r\n{ DecodeTime unpacks Time into four values:\r\n Hour, Minute, Second and MilliSecond }\r\n\r\nprocedure DecodeTime(Time: TDateTime; out Hour, Minute, Second, MilliSecond: word);\r\nVar\r\n l : LongWord;\r\nbegin\r\n l := DateTimeToTimeStamp(Time).Time;\r\n Hour := l div 3600000;\r\n l := l mod 3600000;\r\n Minute := l div 60000;\r\n l := l mod 60000;\r\n Second := l div 1000;\r\n l := l mod 1000;\r\n MilliSecond := l;\r\nend;\r\n\r\n{ DateTimeToSystemTime converts DateTime value to SystemTime }\r\n\r\nprocedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);\r\nbegin\r\n DecodeDateFully(DateTime, SystemTime.Year, SystemTime.Month, SystemTime.Day,SystemTime.DayOfWeek);\r\n DecodeTime(DateTime, SystemTime.Hour, SystemTime.Minute, SystemTime.Second, SystemTime.MilliSecond);\r\n Dec(SystemTime.DayOfWeek);\r\nend ;\r\n\r\n{ SystemTimeToDateTime converts SystemTime to a TDateTime value }\r\n\r\nfunction SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime;\r\nbegin\r\n result := ComposeDateTime(DoEncodeDate(SystemTime.Year, SystemTime.Month, SystemTime.Day),\r\n DoEncodeTime(SystemTime.Hour, SystemTime.Minute, SystemTime.Second, SystemTime.MilliSecond));\r\nend ;\r\n\r\nfunction DayOfWeek(DateTime: TDateTime): integer;\r\nbegin\r\n Result := 1 + ((Trunc(DateTime) - 1) mod 7);\r\n If (Result<=0) then\r\n Inc(Result,7);\r\nend;\r\n\r\n\r\n\r\nfunction Now: TDateTime;\r\nbegin\r\n Result:=JSDateToDateTime(TJSDate.New());\r\nend;\r\n\r\nfunction Date: TDateTime;\r\n\r\nbegin\r\n Result:=Trunc(Now);\r\nend;\r\n\r\nfunction Time: TDateTime;\r\nbegin\r\n Result:=Now-Date;\r\nend ;\r\n\r\n{ IncMonth increments DateTime with NumberOfMonths months,\r\n NumberOfMonths can be less than zero }\r\n\r\nfunction IncMonth(const DateTime: TDateTime; NumberOfMonths: integer = 1 ): TDateTime;\r\nvar\r\n Year, Month, Day : word;\r\nbegin\r\n DecodeDate(DateTime, Year, Month, Day);\r\n IncAMonth(Year, Month, Day, NumberOfMonths);\r\n result := ComposeDateTime(DoEncodeDate(Year, Month, Day), DateTime);\r\nend ;\r\n\r\n{ IncAMonth is the same as IncMonth, but operates on decoded date }\r\n\r\nprocedure IncAMonth(var Year, Month, Day: Word; NumberOfMonths: Integer = 1);\r\nvar\r\n TempMonth, S: Integer;\r\nbegin\r\n If NumberOfMonths>=0 then\r\n s:=1\r\n else\r\n s:=-1;\r\n inc(Year,(NumberOfMonths div 12));\r\n TempMonth:=Month+(NumberOfMonths mod 12)-1;\r\n if (TempMonth>11) or\r\n (TempMonth<0) then\r\n begin\r\n Dec(TempMonth, S*12);\r\n Inc(Year, S);\r\n end;\r\n Month:=TempMonth+1; { Months from 1 to 12 }\r\n If (Day>MonthDays[IsLeapYear(Year)][Month]) then\r\n Day:=MonthDays[IsLeapYear(Year)][Month];\r\nend;\r\n\r\n{ IsLeapYear returns true if Year is a leap year }\r\n\r\nfunction IsLeapYear(Year: Word): boolean;\r\nbegin\r\n Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));\r\nend;\r\n\r\n{ DateToStr returns a string representation of Date using ShortDateFormat }\r\n\r\nfunction DateToStr(Date: TDateTime): string;\r\nbegin\r\n Result:=FormatDateTime('ddddd', Date);\r\nend ;\r\n\r\n{ TimeToStr returns a string representation of Time using LongTimeFormat }\r\n\r\nfunction TimeToStr(Time: TDateTime): string;\r\nbegin\r\n Result:=FormatDateTime('tt',Time);\r\nend ;\r\n\r\n{ DateTimeToStr returns a string representation of DateTime using LongDateTimeFormat }\r\n\r\nVar\r\n DateTimeToStrFormat : Array[Boolean] of string = ('c','f');\r\n\r\nfunction DateTimeToStr(DateTime: TDateTime; ForceTimeIfZero : Boolean = False): string;\r\nbegin\r\n Result:=FormatDateTime(DateTimeToStrFormat[ForceTimeIfZero], DateTime)\r\nend ;\r\n\r\n\r\n{ StrToDate converts the string S to a TDateTime value\r\n if S does not represent a valid date value\r\n an EConvertError will be raised }\r\n\r\nfunction IntStrToDate(Out ErrorMsg : String; const S: String; const useformat : string; separator : char): TDateTime;\r\n\r\nConst\r\n WhiteSpace = ' '#8#9#10#12#13;\r\n Digits = '0123456789';\r\n\r\n procedure FixErrorMsg(const errmarg : String);\r\n\r\n begin\r\n ErrorMsg:=Format(SInvalidDateFormat,[errmarg]);\r\n end;\r\n\r\nvar\r\n df:string;\r\n d,m,y,ly,ld,lm:word;\r\n n,i,len:longint;\r\n c: integer;\r\n dp,mp,yp,which : Byte;\r\n s1:string;\r\n values: array of integer;\r\n YearMoreThenTwoDigits : boolean;\r\n\r\nbegin\r\n SetLength(values,4);\r\n Result:=0;\r\n Len:=Length(S);\r\n ErrorMsg:='';\r\n While (Len>0) and (Pos(S[Len],WhiteSpace)>0) do\r\n Dec(len);\r\n if (Len=0) then\r\n begin\r\n FixErrorMsg(S);\r\n exit;\r\n end;\r\n YearMoreThenTwoDigits := False;\r\n if separator = #0 then\r\n if (DateSeparator<>#0) then\r\n separator := DateSeparator\r\n else\r\n separator:='-';\r\n // Writeln('Separator: ',Separator);\r\n df := UpperCase(useFormat);\r\n { Determine order of D,M,Y }\r\n yp:=0;\r\n mp:=0;\r\n dp:=0;\r\n Which:=0;\r\n i:=0;\r\n while (i0 then\r\n s1 := s1 + s[i];\r\n { space can be part of the shortdateformat, and is defaultly in slovak\r\n windows, therefor it shouldn't be taken as separator (unless so specified)\r\n and ignored }\r\n if (Separator <> ' ') and (s[i] = ' ') then\r\n Continue;\r\n if (s[i] = separator) or ((i = len) and (Pos(s[i],Digits)>0)) then\r\n begin\r\n inc(n);\r\n if n>3 then\r\n begin\r\n// Writeln('More than 3 separators');\r\n FixErrorMsg(S);\r\n exit;\r\n end;\r\n // Check if the year has more then two digits (if n=yp, then we are evaluating the year.)\r\n if (n=yp) and (length(s1)>2) then YearMoreThenTwoDigits := True;\r\n val(s1, values[n], c);\r\n if c<>0 then\r\n begin\r\n// Writeln('S1 not a number ',S1);\r\n FixErrorMsg(s);\r\n Exit;\r\n end;\r\n s1 := '';\r\n end\r\n else if (Pos(s[i],Digits)=0) then\r\n begin\r\n// Writeln('Not a number at pos ',I,' ',S[i]);\r\n FixErrorMsg(s);\r\n Exit;\r\n end;\r\n end ;\r\n// Writeln('Which : ',Which,' N : ',N);\r\n if (Which<3) and (N>Which) then\r\n begin\r\n FixErrorMsg(s);\r\n Exit;\r\n end;\r\n // Fill in values.\r\n DecodeDate(Date,Ly,LM,LD);\r\n If N=3 then\r\n begin\r\n y:=values[yp];\r\n m:=values[mp];\r\n d:=values[dp];\r\n end\r\n Else\r\n begin\r\n Y:=ly;\r\n If n<2 then\r\n begin\r\n d:=values[1];\r\n m := LM;\r\n end\r\n else\r\n If dp= 0) and (y < 100) and not YearMoreThenTwoDigits then\r\n begin\r\n ly := ly - TwoDigitYearCenturyWindow;\r\n Inc(Y, ly div 100 * 100);\r\n if (TwoDigitYearCenturyWindow > 0) and (Y < ly) then\r\n Inc(Y, 100);\r\n end;\r\n if not TryEncodeDate(y, m, d, result) then\r\n errormsg:=SErrInvalidDate;\r\nend;\r\n\r\nfunction StrToDate(const S: String; const useformat : string; separator : char): TDateTime;\r\nVar\r\n MSg : String;\r\nbegin\r\n Result:=IntStrToDate(Msg,S,useFormat,Separator);\r\n If (Msg<>'') then\r\n Raise EConvertError.Create(Msg);\r\nend;\r\n\r\nfunction StrToDate(const S: String; separator : char): TDateTime;\r\nbegin\r\n result := StrToDate(S,ShortDateFormat,separator)\r\nend;\r\n\r\nfunction StrToDate(const S: String): TDateTime;\r\nbegin\r\n result := StrToDate(S,ShortDateFormat,#0);\r\nend;\r\n\r\n{ StrToTime converts the string S to a TDateTime value\r\n if S does not represent a valid time value an\r\n EConvertError will be raised }\r\n\r\n\r\nfunction IntStrToTime(Out ErrorMsg : String; const S: String; Len : integer; separator : char): TDateTime;\r\n\r\nconst\r\n AMPM_None = 0;\r\n AMPM_AM = 1;\r\n AMPM_PM = 2;\r\n tiHour = 0;\r\n tiMin = 1;\r\n tiSec = 2;\r\n tiMSec = 3;\r\n\r\ntype\r\n TTimeValues = array of Word;\r\n\r\nvar\r\n AmPm: integer;\r\n TimeValues: TTimeValues;\r\n\r\n\r\n function SplitElements(out TimeValues: TTimeValues; out AmPm: Integer): Boolean;\r\n //Strict version. It does not allow #32 as Separator, it will treat it as whitespace always\r\n const\r\n Digits = '0123456789';\r\n var\r\n Cur, Offset, ElemLen, Err, TimeIndex, FirstSignificantDigit: Integer;\r\n Value: Integer;\r\n DigitPending, MSecPending: Boolean;\r\n AmPmStr: String;\r\n CurChar: Char;\r\n I : Integer;\r\n allowedchars : string;\r\n\r\n begin\r\n Result := False;\r\n AmPm := AMPM_None; //No Am or PM in string found yet\r\n MSecPending := False;\r\n TimeIndex := 0; //indicating which TTimeValue must be filled next\r\n For I:=tiHour to tiMSec do\r\n TimeValues[i]:=0;\r\n Cur := 1;\r\n //skip leading blanks\r\n While (Cur < Len) and (S[Cur] =#32) do Inc(Cur);\r\n Offset := Cur;\r\n //First non-blank cannot be Separator or DecimalSeparator\r\n if (Cur > Len - 1) or (S[Cur] = Separator) or (S[Cur] = Decimalseparator) then\r\n begin\r\n // Writeln('Error in sep S[Cur]',S[Cur],' ',separator,' ',GetDecimalSeparator);\r\n Exit;\r\n end;\r\n DigitPending := (Pos(S[Cur],Digits)>0);\r\n While (Cur <= Len) do\r\n begin\r\n //writeln;\r\n // writeln('Main While loop: Cur = ',Cur,' S[Cur] = \"',S[Cur],'\" Len = ',Len,' separator : ',Separator);\r\n CurChar := S[Cur];\r\n if Pos(CurChar,Digits)>0 then\r\n begin//Digits\r\n //HH, MM, SS, or Msec?\r\n // writeln('Digit: ', CurChar);\r\n //Digits are only allowed after starting Am/PM or at beginning of string or after Separator\r\n //and TimeIndex must be <= tiMSec\r\n //Uncomment \"or (#32 = Separator)\" and it will allllow #32 as separator\r\n if (not (DigitPending {or (#32 = Separator)})) or (TimeIndex > tiMSec) then\r\n begin\r\n // Writeln('DigitPending',ElemLen);\r\n Exit;\r\n end;\r\n OffSet := Cur;\r\n if (CurChar <> '0') then FirstSignificantDigit := OffSet else FirstSignificantDigit := -1;\r\n while (Cur < Len) and (Pos(S[Cur + 1],Digits)>0) do\r\n begin\r\n //Mark first Digit that is not '0'\r\n if (FirstSignificantDigit = -1) and (S[Cur] <> '0') then FirstSignificantDigit := Cur;\r\n Inc(Cur);\r\n end;\r\n if (FirstSignificantDigit = -1) then FirstSignificantDigit := Cur;\r\n ElemLen := 1+ Cur - FirstSignificantDigit;\r\n // writeln(' S[FirstSignificantDigit] = ',S[FirstSignificantDigit], ' S[Cur] = ',S[Cur],' ElemLen = ',ElemLen,' -> ', S[Offset], ElemLen);\r\n // writeln(' Cur = ',Cur);\r\n //this way we know that Val() will never overflow Value !\r\n if (ElemLen <= 2) or ((ElemLen <= 3) and (TimeIndex = tiMSec) ) then\r\n begin\r\n Val(Copy(S,FirstSignificantDigit, ElemLen), Value, Err);\r\n // writeln(' Value = ',Value,' HH = ',TimeValues[0],' MM = ',TimeValues[1],' SS = ',TimeValues[2],' MSec = ',Timevalues[3]);\r\n //This is safe now, because we know Value < High(Word)\r\n TimeValues[TimeIndex] := Value;\r\n Inc(TimeIndex);\r\n DigitPending := False;\r\n end\r\n else\r\n begin\r\n // Writeln('Wrong elemlen: ',ElemLen, ' timeIndex: ',timeindex);\r\n Exit; //Value to big, so it must be a wrong timestring\r\n end;\r\n end//Digits\r\n else if (CurChar = #32) then\r\n begin\r\n //writeln('#32');\r\n //just skip, but we must adress this, or it will be parsed by either AM/PM or Separator\r\n end\r\n else if (CurChar = Separator) then\r\n begin\r\n // writeln('Separator ',Separator);\r\n if DigitPending or (TimeIndex > tiSec) then\r\n begin\r\n // Writeln ('DigitPending ',DigitPending,' or (TimeIndex',Timeindex,' > tiSec,', tiSec,')');\r\n Exit;\r\n end;\r\n DigitPending := True;\r\n MSecPending := False;\r\n end\r\n else if (CurChar = DecimalSeparator) then\r\n begin\r\n //writeln('DecimalSeparator');\r\n if DigitPending or MSecPending or (TimeIndex <> tiMSec) then\r\n begin\r\n // Writeln('DigitPending ',DigitPending,' or MSecPending ',MSecPending,' (',TimeIndex,',Timeindex, >', tiMSec,' tiSec)');\r\n Exit;\r\n end;\r\n DigitPending := True;\r\n MSecPending := True;\r\n end\r\n else\r\n begin//AM/PM?\r\n //None of the above, so this char _must_ be the start of AM/PM string\r\n //If we already have found AM/PM or we expect a digit then then timestring must be wrong at this point\r\n //writeln('AM/PM?');\r\n if (AmPm <> AMPM_None) or DigitPending then\r\n begin\r\n // Writeln('AmPm <> AMPM_None) or DigitPending');\r\n Exit;\r\n end;\r\n OffSet := Cur;\r\n allowedchars:=DecimalSeparator+' ';\r\n if Separator<>#0 then\r\n allowedchars:=allowedchars+Separator;\r\n while (Cur < Len -1) and (Pos(S[Cur + 1],AllowedChars)=0)\r\n and (Pos(S[Cur + 1],Digits)=0) do Inc(Cur);\r\n ElemLen := 1 + Cur - OffSet;\r\n // writeln(' S[Offset] = ',S[1+Offset], ' S[Cur] = ',S[Cur],' ElemLen = ',ElemLen,' -> ', S[1+Offset], ElemLen);\r\n // writeln(' Cur = ',Cur, 'S =',S);\r\n AmPmStr := Copy(S,1+OffSet, ElemLen);\r\n\r\n // writeln('AmPmStr = ',ampmstr,' (',length(ampmstr),')');\r\n //We must compare to TimeAMString before hardcoded 'AM' for delphi compatibility\r\n //Also it is perfectly legal, though insane to have TimeAMString = 'PM' and vice versa\r\n if (CompareText(AmPmStr, TimeAMString) = 0) then AmPm := AMPM_AM\r\n else if (CompareText(AmPmStr, TimePMString) = 0) then AmPm := AMPM_PM\r\n else if (CompareText(AmPmStr, 'AM') = 0) then AmPm := AMPM_AM\r\n else if (CompareText(AmPmStr, 'PM') = 0) then AmPm := AMPM_PM\r\n else\r\n begin\r\n // Writeln('No timestring ',AmPmStr);\r\n Exit; //If text does not match any of these, timestring must be wrong;\r\n end;\r\n //if AM/PM is at beginning of string, then a digit is mandatory after it\r\n if (TimeIndex = tiHour) then\r\n begin\r\n DigitPending := True;\r\n end\r\n //otherwise, no more TimeValues allowed after this\r\n else\r\n begin\r\n TimeIndex := tiMSec + 1;\r\n DigitPending := False;\r\n end;\r\n end;//AM/PM\r\n Inc(Cur)\r\n end;//while\r\n\r\n //If we arrive here, parsing the elements has been successfull\r\n //if not at least Hours specified then input is not valid\r\n //when am/pm is specified Hour must be <= 12 and not 0\r\n if (TimeIndex = tiHour) or ((AmPm <> AMPM_None) and ((TimeValues[tiHour] > 12) or (TimeValues[tiHour] = 0))) or DigitPending then\r\n Exit;\r\n Result := True;\r\n end;\r\n\r\nbegin\r\n setlength(timevalues,4);\r\n if separator = #0 then\r\n if (TimeSeparator<>#0) then\r\n separator := TimeSeparator\r\n else\r\n separator:=':';\r\n AmPm := AMPM_None;\r\n if not SplitElements(TimeValues, AmPm) then\r\n begin\r\n ErrorMsg:=Format(SErrInvalidTimeFormat,[S]);\r\n Exit;\r\n end;\r\n if (AmPm=AMPM_PM) and (TimeValues[tiHour]<>12) then Inc(TimeValues[tiHour], 12)\r\n else if (AmPm=AMPM_AM) and (TimeValues[tiHour]=12) then TimeValues[tiHour]:=0;\r\n // Writeln( TimeValues[tiHour], TimeValues[tiMin], TimeValues[tiSec], TimeValues[tiMSec]);\r\n if not TryEncodeTime(TimeValues[tiHour], TimeValues[tiMin], TimeValues[tiSec], TimeValues[tiMSec], result) Then\r\n\r\n ErrorMsg:=Format(SErrInvalidTimeFormat,[S]);\r\nend ;\r\n\r\nfunction StrToTime(const s: String; separator : char): TDateTime;\r\n\r\nVar\r\n Msg : String;\r\n\r\nbegin\r\n Result:=IntStrToTime(Msg,S,Length(S),Separator);\r\n If (Msg<>'') then\r\n Raise EConvertError.Create(Msg);\r\nend;\r\n\r\nfunction StrToTime(const s: String): TDateTime;\r\nbegin\r\n result:= StrToTime(s, TimeSeparator);\r\nend;\r\n\r\n{ StrToDateTime converts the string S to a TDateTime value\r\n if S does not represent a valid date and/or time value\r\n an EConvertError will be raised }\r\n\r\nfunction SplitDateTimeStr(DateTimeStr: String; out DateStr, TimeStr: String): Integer;\r\n\r\n{ Helper function for StrToDateTime\r\n Pre-condition\r\n Date is before Time\r\n If either Date or Time is omitted then see what fits best, a time or a date (issue #0020522)\r\n Date and Time are separated by whitespace (space Tab, Linefeed or carriage return)\r\n FS.DateSeparator can be the same as FS.TimeSeparator (issue #0020522)\r\n If they are both #32 and TrimWhite(DateTimeStr) contains a #32 a date is assumed.\r\n Post-condition\r\n DateStr holds date as string or is empty\r\n TimeStr holds time as string or is empty\r\n Result = number of strings returned, 0 = error\r\n}\r\nconst\r\n WhiteSpace = #9#10#13#32;\r\n\r\nvar\r\n p: Integer;\r\n DummyDT: TDateTime;\r\nbegin\r\n Result := 0;\r\n DateStr := '';\r\n TimeStr := '';\r\n DateTimeStr := Trim(DateTimeStr);\r\n if Length(DateTimeStr) = 0 then exit;\r\n if (DateSeparator = #32) and (TimeSeparator = #32) and (Pos(#32, DateTimeStr) > 0) then\r\n begin\r\n DateStr:=DateTimeStr;\r\n {\r\n Assume a date: dd [mm [yy]].\r\n Really fancy would be counting the number of whitespace occurrences and decide\r\n and split accordingly\r\n }\r\n Exit(1);\r\n end;\r\n p:=1;\r\n //find separator\r\n if (DateSeparator<>#32) then\r\n begin\r\n while (p0)) do\r\n Inc(p);\r\n end\r\n else\r\n begin\r\n p:=Pos(TimeSeparator, DateTimeStr);\r\n if (p<>0) then\r\n repeat\r\n Dec(p);\r\n until (p=0) or (Pos(DateTimeStr[p],WhiteSpace)>0);\r\n end;\r\n //Always fill DateStr, it eases the algorithm later\r\n if (p=0) then\r\n p:=Length(DateTimeStr);\r\n DateStr:=Copy(DateTimeStr,1,p);\r\n TimeStr:=Trim(Copy(DateTimeStr,p+1,100));\r\n if (Length(TimeStr)<>0) then\r\n Result:=2\r\n else\r\n begin\r\n Result:=1; //found 1 string\r\n // 2 cases when DateTimeStr only contains a time:\r\n // Date/time separator differ, and string contains a timeseparator\r\n // Date/time separators are equal, but transformation to date fails.\r\n if ((DateSeparator<>TimeSeparator) and (Pos(TimeSeparator,DateStr) > 0))\r\n or ((DateSeparator=TimeSeparator) and (not TryStrToDate(DateStr, DummyDT))) then\r\n begin\r\n TimeStr := DateStr;\r\n DateStr := '';\r\n end;\r\n end;\r\nend;\r\n\r\nfunction StrToDateTime(const s: String): TDateTime;\r\n\r\nvar\r\n TimeStr, DateStr: String;\r\n PartsFound: Integer;\r\nbegin\r\n PartsFound := SplitDateTimeStr(S, DateStr, TimeStr);\r\n case PartsFound of\r\n 0: Result:=StrToDate('');\r\n 1: if (Length(DateStr) > 0) then\r\n Result := StrToDate(DateStr,ShortDateFormat,DateSeparator)\r\n else\r\n Result := StrToTime(TimeStr);\r\n 2: Result := ComposeDateTime(StrTodate(DateStr,ShortDateFormat,DateSeparator),\r\n StrToTime(TimeStr));\r\n end;\r\nend;\r\n\r\nFunction FormatDateTime(const FormatStr: string; const DateTime: TDateTime) : String;\r\n\r\n procedure StoreStr(APos,Len: Integer);\r\n begin\r\n// Writeln('StoreStr: ',Result,'+',Copy(FormatStr,APos,Len));\r\n Result:=Result+Copy(FormatStr,APos,Len);\r\n end;\r\n\r\n procedure StoreString(const AStr: string);\r\n\r\n begin\r\n// Writeln('StoreString: ',Result,'+',AStr);\r\n Result:=Result+AStr;\r\n end;\r\n\r\n procedure StoreInt(Value, Digits: Integer);\r\n var\r\n S: string;\r\n\r\n begin\r\n S:=IntToStr(Value);\r\n While (Length(S) 1 then // 0 is original string, 1 is included FormatString\r\n Exit;\r\n FormatCurrent := 1;\r\n FormatEnd := Length(FormatStr);\r\n Clock12 := false;\r\n isInterval := false;\r\n // look for unquoted 12-hour clock token\r\n P:=1;\r\n while P<=FormatEnd do\r\n begin\r\n Token := FormatStr[P];\r\n case Token of\r\n '''', '\"':\r\n begin\r\n Inc(P);\r\n while (P < FormatEnd) and (FormatStr[P]<>Token) do\r\n Inc(P);\r\n end;\r\n 'A', 'a':\r\n begin\r\n if (CompareText(Copy(FormatStr,P,3),'A/P')=0) or\r\n (CompareText(Copy(FormatStr,P,4),'AMPM')=0) or\r\n (CompareText(Copy(FormatStr,P,5),'AM/PM')=0) then\r\n begin\r\n Clock12 := true;\r\n break;\r\n end;\r\n end;\r\n end; // case\r\n Inc(P);\r\n end ;\r\n token := #255;\r\n lastformattoken := ' ';\r\n prevlasttoken := 'H';\r\n while FormatCurrent <= FormatEnd do\r\n begin\r\n Token := UpperCase(FormatStr[FormatCurrent])[1];\r\n // Writeln('Treating token at pos ',FormatCurrent,', : ',Token,' (',FormatStr,')');\r\n Count := 1;\r\n P := FormatCurrent + 1;\r\n case Token of\r\n '''', '\"':\r\n begin\r\n while (P < FormatEnd) and (FormatStr[P]<>Token) do\r\n Inc(P);\r\n Inc(P);\r\n Count := P - FormatCurrent;\r\n StoreStr(FormatCurrent + 1, Count - 2);\r\n end ;\r\n 'A':\r\n begin\r\n if CompareText(Copy(FormatStr,FormatCurrent,4), 'AMPM') = 0 then\r\n begin\r\n Count := 4;\r\n if Hour < 12 then\r\n StoreString(TimeAMString)\r\n else\r\n StoreString(TimePMString);\r\n end\r\n else if CompareText(Copy(FormatStr,FormatCurrent,5), 'AM/PM') = 0 then\r\n begin\r\n Count := 5;\r\n if Hour < 12 then StoreStr(FormatCurrent, 2)\r\n else StoreStr(FormatCurrent+3, 2);\r\n end\r\n else if CompareText(Copy(FormatStr,FormatCurrent,3), 'A/P') = 0 then\r\n begin\r\n Count := 3;\r\n if Hour < 12 then StoreStr(FormatCurrent, 1)\r\n else StoreStr(FormatCurrent+2, 1);\r\n end\r\n else\r\n raise EConvertError.Create('Illegal character in format string');\r\n end ;\r\n '/':\r\n begin\r\n // Writeln('Detected date separator');\r\n StoreString(DateSeparator);\r\n end;\r\n ':': StoreString(TimeSeparator);\r\n ' ', 'C', 'D', 'H', 'M', 'N', 'S', 'T', 'Y', 'Z', 'F' :\r\n begin\r\n // Writeln(FormatCurrent,' Special Token: ',Token,', Count: ',Count,', P: ',P);\r\n while (P <= FormatEnd) and (UpperCase(FormatStr[P]) = Token) do\r\n Inc(P);\r\n Count := P - FormatCurrent;\r\n // Writeln(FormatCurrent,' Special Token: ',Token,', Count: ',Count,', P: ',P);\r\n case Token of\r\n ' ': StoreStr(FormatCurrent, Count);\r\n 'Y': begin\r\n if Count > 2 then\r\n StoreInt(Year, 4)\r\n else\r\n StoreInt(Year mod 100, 2);\r\n end;\r\n 'M': begin\r\n\t if isInterval and ((prevlasttoken = 'H') or TimeFlag) then\r\n\t StoreInt(Minute + (Hour + trunc(abs(DateTime))*24)*60, 0)\r\n\t else\r\n if (lastformattoken = 'H') or TimeFlag then\r\n begin\r\n if Count = 1 then\r\n StoreInt(Minute, 0)\r\n else\r\n StoreInt(Minute, 2);\r\n end\r\n else\r\n begin\r\n case Count of\r\n 1: StoreInt(Month, 0);\r\n 2: StoreInt(Month, 2);\r\n 3: StoreString(ShortMonthNames[Month]);\r\n else\r\n StoreString(LongMonthNames[Month]);\r\n end;\r\n end;\r\n end;\r\n 'D': begin\r\n case Count of\r\n 1: StoreInt(Day, 0);\r\n 2: StoreInt(Day, 2);\r\n 3: StoreString(ShortDayNames[DayOfWeek]);\r\n 4: StoreString(LongDayNames[DayOfWeek]);\r\n 5: StoreFormat(ShortDateFormat, Nesting+1, False);\r\n else\r\n StoreFormat(LongDateFormat, Nesting+1, False);\r\n end ;\r\n end ;\r\n 'H':\r\n\t if isInterval then\r\n\t StoreInt(Hour + trunc(abs(DateTime))*24, 0)\r\n\t else\r\n\t if Clock12 then\r\n begin\r\n tmp := hour mod 12;\r\n if tmp=0 then tmp:=12;\r\n if Count = 1 then\r\n StoreInt(tmp, 0)\r\n else\r\n StoreInt(tmp, 2);\r\n end\r\n else begin\r\n if Count = 1 then\r\n\t\t StoreInt(Hour, 0)\r\n else\r\n StoreInt(Hour, 2);\r\n end;\r\n 'N': if isInterval then\r\n\t StoreInt(Minute + (Hour + trunc(abs(DateTime))*24)*60, 0)\r\n\t\t else\r\n\t\t if Count = 1 then\r\n StoreInt(Minute, 0)\r\n else\r\n StoreInt(Minute, 2);\r\n 'S': if isInterval then\r\n\t StoreInt(Second + (Minute + (Hour + trunc(abs(DateTime))*24)*60)*60, 0)\r\n\t else\r\n\t if Count = 1 then\r\n StoreInt(Second, 0)\r\n else\r\n StoreInt(Second, 2);\r\n 'Z': if Count = 1 then\r\n StoreInt(MilliSecond, 0)\r\n else\r\n\t\t StoreInt(MilliSecond, 3);\r\n 'T': if Count = 1 then\r\n\t\t StoreFormat(ShortTimeFormat, Nesting+1, True)\r\n else\r\n\t StoreFormat(LongTimeFormat, Nesting+1, True);\r\n 'C': begin\r\n StoreFormat(ShortDateFormat, Nesting+1, False);\r\n if (Hour<>0) or (Minute<>0) or (Second<>0) then\r\n begin\r\n StoreString(' ');\r\n StoreFormat(LongTimeFormat, Nesting+1, True);\r\n end;\r\n end;\r\n 'F': begin\r\n StoreFormat(ShortDateFormat, Nesting+1, False);\r\n StoreString(' ');\r\n StoreFormat(LongTimeFormat, Nesting+1, True);\r\n end;\r\n end;\r\n\t prevlasttoken := lastformattoken;\r\n lastformattoken := token;\r\n end;\r\n else\r\n StoreString(Token);\r\n end ;\r\n Inc(FormatCurrent, Count);\r\n end;\r\n end;\r\n\r\nbegin\r\n DecodeDateFully(DateTime, Year, Month, Day, DayOfWeek);\r\n DecodeTime(DateTime, Hour, Minute, Second, MilliSecond);\r\n // Writeln(DateTime,'->',Year,',', Month, ',',Day, ',',DayOfWeek,',',Hour, ',',Minute, ',',Second, ',',MilliSecond);\r\n if FormatStr <> '' then\r\n StoreFormat(FormatStr, 0, False)\r\n else\r\n StoreFormat('C', 0, False);\r\nend ;\r\n\r\n\r\n\r\nfunction CurrentYear: Word;\r\n\r\nbegin\r\n Result:=TJSDate.New().FullYear;\r\nend;\r\n\r\nfunction TryStrToDate(const S: String; out Value: TDateTime): Boolean;\r\nbegin\r\n Result:=TryStrToDate(S,Value,ShortDateFormat,#0);\r\nend;\r\n\r\nfunction TryStrToDate(const S: String; out Value: TDateTime; separator : char): Boolean;\r\n\r\nbegin\r\n Result:=TryStrToDate(S,Value,ShortDateFormat,Separator);\r\nend;\r\n\r\nfunction TryStrToDate(const S: String; out Value: TDateTime;\r\n const useformat : string; separator : char = #0): Boolean;\r\n\r\nVar\r\n Msg : String;\r\n\r\nbegin\r\n Result:=Length(S)<>0;\r\n If Result then\r\n begin\r\n Value:=IntStrToDate(Msg,S,useformat,Separator);\r\n Result:=(Msg='');\r\n end;\r\nend;\r\n\r\n\r\n\r\n\r\nfunction TryStrToTime(const S: String; out Value: TDateTime; separator : char): Boolean;\r\nVar\r\n Msg : String;\r\nbegin\r\n Result:=Length(S)<>0;\r\n If Result then\r\n begin\r\n Value:=IntStrToTime(Msg,S,Length(S),Separator);\r\n Result:=(Msg='');\r\n end;\r\nend;\r\n\r\nfunction TryStrToTime(const S: String; out Value: TDateTime): Boolean;\r\nbegin\r\n result:=TryStrToTime(S,Value,#0);\r\nend;\r\n\r\nfunction TryStrToDateTime(const S: String; out Value: TDateTime): Boolean;\r\n\r\nvar\r\n I: integer;\r\n dtdate, dttime :TDateTime;\r\nbegin\r\n result:=false;\r\n I:=Pos(TimeSeparator,S);\r\n If (I>0) then\r\n begin\r\n While (I>0) and (S[I]<>' ') do\r\n Dec(I);\r\n If I>0 then\r\n begin\r\n if not TryStrToDate(Copy(S,1,I-1),dtdate) then\r\n exit;\r\n if not TryStrToTime(Copy(S,i+1, Length(S)-i),dttime) then\r\n exit;\r\n Value:=ComposeDateTime(dtdate,dttime);\r\n result:=true;\r\n end\r\n else\r\n result:=TryStrToTime(s,Value);\r\n end\r\n else\r\n result:=TryStrToDate(s,Value);\r\nend;\r\n\r\n\r\n\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nbegin\r\n result := StrToDateDef(S,DefValue,#0);\r\nend;\r\n\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nbegin\r\n result := StrToTimeDef(S,DefValue,#0);\r\nend;\r\n\r\nfunction StrToDateTimeDef(const S: String; const Defvalue : TDateTime): TDateTime;\r\nbegin\r\n if not TryStrToDateTime(s,Result) Then\r\n result:=defvalue;\r\nend;\r\n\r\nfunction StrToDateDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nbegin\r\n if not TryStrToDate(s,Result, separator) Then\r\n result:=defvalue;\r\nend;\r\n\r\nfunction StrToTimeDef(const S: String; const Defvalue : TDateTime; separator : char): TDateTime;\r\nbegin\r\n if not TryStrToTime(s,Result, separator) Then\r\n result:=defvalue;\r\nend;\r\n\r\nprocedure ReplaceTime(var dati:TDateTime; NewTime : TDateTime);\r\nbegin\r\n dati:= ComposeDateTime(dati, newtime);\r\nend;\r\n\r\nprocedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);\r\nvar\r\n tmp : TDateTime;\r\nbegin\r\n tmp:=NewDate;\r\n ReplaceTime(tmp,DateTime);\r\n DateTime:=tmp;\r\nend;\r\n\r\nFunction FloatToDateTime (Const Value : Extended) : TDateTime;\r\nbegin\r\n If (ValueMaxDateTime) then\r\n Raise EConvertError.CreateFmt (SInvalidDateTime,[FloatToStr(Value)]);\r\n Result:=Value;\r\nend;\r\n\r\nfunction FloattoCurr(const Value: Extended): Currency;\r\nbegin\r\n if not TryFloatToCurr(Value, Result) then\r\n Raise EConvertError.CreateFmt(SInvalidCurrency, [FloatToStr(Value)]);\r\nend;\r\n\r\nfunction TryFloatToCurr(const Value: Extended; var AResult: Currency): Boolean;\r\nbegin\r\n Result:=(Value>=MinCurrency) and (Value<=MaxCurrency);\r\n if Result then\r\n AResult := Value;\r\nend;\r\n\r\nfunction CurrToStr(Value: Currency): string;\r\nbegin\r\n Result:=FloatToStrF(Value,ffGeneral,-1,0);\r\nend;\r\n\r\n(*\r\nfunction CurrToStr(Value: Currency; const FormatSettings: TFormatSettings): string;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\nfunction StrToCurr(const S: string): Currency;\r\n\r\nbegin\r\n if not TryStrToCurr(S,Result) then\r\n Raise EConvertError.createfmt(SInvalidCurrency,[S]);\r\nend;\r\n\r\n(*\r\nfunction StrToCurr(const S: string; const FormatSettings: TFormatSettings): Currency;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\nfunction TryStrToCurr(const S: string; out Value: Currency): Boolean;\r\n\r\nVar\r\n D : Double;\r\n\r\nbegin\r\n Result:=TryStrToFloat(S,D);\r\n if Result then\r\n Value:=D;\r\nend;\r\n\r\n(*\r\nfunction TryStrToCurr(const S: string; out Value: Currency; const FormatSettings: TFormatSettings): Boolean;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\nfunction StrToCurrDef(const S: string; Default: Currency): Currency;\r\n\r\nVar\r\n R : Currency;\r\n\r\nbegin\r\n if TryStrToCurr(S,R) then\r\n Result:=R\r\n else\r\n Result:=Default;\r\nend;\r\n\r\n(*\r\nfunction StrToCurrDef(const S: string; Default: Currency; const FormatSettings: TFormatSettings): Currency;\r\nbegin\r\n\r\nend;\r\n*)\r\n\r\n{ ---------------------------------------------------------------------\r\n Interface related\r\n ---------------------------------------------------------------------}\r\nfunction Supports(const Instance: IInterface; const AClass: TClass; out Obj\r\n ): Boolean;\r\nbegin\r\n Result := (Instance<>nil) and (Instance.QueryInterface(IObjectInstance,Obj)=S_OK)\r\n and (TObject(Obj).InheritsFrom(AClass));\r\nend;\r\n\r\nfunction Supports(const Instance: IInterface; const IID: TGUID; out Intf\r\n ): Boolean;\r\nbegin\r\n Result:=(Instance<>nil) and (Instance.QueryInterface(IID,Intf)=S_OK);\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGUID; out Intf\r\n ): Boolean;\r\nbegin\r\n Result:=(Instance<>nil) and Instance.GetInterface(IID,Intf);\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGuidString; out Intf\r\n ): Boolean;\r\nbegin\r\n Result:=(Instance<>nil) and Instance.GetInterfaceByStr(IID,Intf);\r\nend;\r\n\r\nfunction Supports(const Instance: IInterface; const AClass: TClass): Boolean;\r\nvar\r\n Temp: TObject;\r\nbegin\r\n Result:=Supports(Instance,AClass,Temp);\r\nend;\r\n\r\nfunction Supports(const Instance: IInterface; const IID: TGUID): Boolean;\r\nvar\r\n Temp: IInterface;\r\nbegin\r\n Result:=Supports(Instance,IID,Temp);\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGUID): Boolean;\r\nvar\r\n Temp: TJSObject;\r\nbegin\r\n Result:=Supports(Instance,IID,Temp);\r\n asm\r\n if (Temp && Temp.$kind==='com') Temp._Release();\r\n end;\r\nend;\r\n\r\nfunction Supports(const Instance: TObject; const IID: TGuidString): Boolean;\r\nvar\r\n Temp: TJSObject;\r\nbegin\r\n Result:=Supports(Instance,IID,Temp);\r\n asm\r\n if (Temp && Temp.$kind==='com') Temp._Release();\r\n end;\r\nend;\r\n\r\nfunction Supports(const AClass: TClass; const IID: TGUID): Boolean;\r\nvar\r\n maps: JSValue;\r\nbegin\r\n if AClass=nil then exit(false);\r\n maps := TJSObject(AClass)['$intfmaps'];\r\n if not maps then exit(false);\r\n if TJSObject(maps)[GUIDToString(IID)] then exit(true);\r\n Result:=false;\r\nend;\r\n\r\nfunction Supports(const AClass: TClass; const IID: TGuidString): Boolean;\r\nvar\r\n maps: JSValue;\r\nbegin\r\n if AClass=nil then exit(false);\r\n maps := TJSObject(AClass)['$intfmaps'];\r\n if not maps then exit(false);\r\n if TJSObject(maps)[uppercase(IID)] then exit(true);\r\n Result:=false;\r\nend;\r\n\r\nfunction TryStringToGUID(const s: string; out Guid: TGUID): Boolean;\r\nvar\r\n re: TJSRegexp;\r\nbegin\r\n if Length(s)<>38 then Exit(False);\r\n re:=TJSRegexp.new('^\\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\}$');\r\n Result:=re.test(s);\r\n if not Result then\r\n begin\r\n Guid.D1:=0;\r\n exit;\r\n end;\r\n asm\r\n rtl.strToGUIDR(s,Guid.get());\r\n end;\r\n Result:=true;\r\nend;\r\n\r\nfunction StringToGUID(const S: string): TGUID;\r\nbegin\r\n if not TryStringToGUID(S, Result) then\r\n raise EConvertError.CreateFmt(SInvalidGUID, [S]);\r\nend;\r\n\r\nfunction GUIDToString(const guid: TGUID): string;\r\nbegin\r\n Result:=System.GUIDToString(guid);\r\nend;\r\n\r\nfunction IsEqualGUID(const guid1, guid2: TGUID): Boolean;\r\nvar\r\n i: integer;\r\nbegin\r\n if (guid1.D1<>guid2.D1) or (guid1.D2<>guid2.D2) or (guid1.D3<>guid2.D3) then\r\n exit(false);\r\n for i:=0 to 7 do if guid1.D4[i]<>guid2.D4[i] then exit(false);\r\n Result:=true;\r\nend;\r\n\r\nfunction GuidCase(const guid: TGUID; const List: array of TGuid): Integer;\r\nbegin\r\n for Result := High(List) downto 0 do\r\n if IsEqualGUID(guid, List[Result]) then\r\n Exit;\r\n Result := -1;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Integer/Ordinal related\r\n ---------------------------------------------------------------------}\r\n\r\nFunction TryStrToInt(const S : String; Out res : Integer) : Boolean;\r\n\r\nVar\r\n NI : NativeInt;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,NI);\r\n if Result then\r\n res:=NI;\r\nend;\r\n\r\nFunction TryStrToInt(const S : String; Out res : NativeInt) : Boolean;\r\n\r\nVar\r\n Radix : Integer = 10;\r\n F,N : String;\r\n J : JSValue;\r\n\r\nbegin\r\n N:=S;\r\n F:=Copy(N,1,1);\r\n if (F='$') then\r\n Radix:=16\r\n else if (F='&') then\r\n Radix:=8\r\n else if (F='%') then\r\n Radix:=2;\r\n If Radix<>10 then\r\n Delete(N,1,1);\r\n J:=parseInt(N,Radix);\r\n Result:=Not jsIsNan(j);\r\n if Result then\r\n res:=NativeInt(J);\r\nend;\r\n\r\nFunction StrToIntDef(const S : String; Const aDef : Integer) : Integer;\r\n\r\nVar\r\n R : NativeInt;\r\n\r\nbegin\r\n if TryStrToInt(S,R) then\r\n Result:=R\r\n else\r\n Result:=aDef;\r\nend;\r\n\r\nFunction StrToIntDef(const S : String; Const aDef : NativeInt) : NativeInt;\r\n\r\nVar\r\n R : NativeInt;\r\n\r\nbegin\r\n if TryStrToInt(S,R) then\r\n Result:=R\r\n else\r\n Result:=aDef;\r\nend;\r\n\r\nFunction StrToInt(const S : String) : Integer;\r\n\r\nVar\r\n R : NativeInt;\r\n\r\nbegin\r\n if not TryStrToInt(S,R) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=R;\r\nend;\r\n\r\nFunction StrToNativeInt(const S : String) : NativeInt;\r\n\r\nbegin\r\n if not TryStrToInt(S,Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\nend;\r\n\r\nFunction StrToInt64(const S : String) : NativeLargeInt;\r\n\r\nVar\r\n N : NativeInt;\r\n\r\nbegin\r\n if not TryStrToInt(S,N) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=N;\r\nend;\r\n\r\nFunction TryStrToInt64(const S : String; Out res : NativeLargeInt) : Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R);\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nFunction StrToInt64Def(const S : String; ADefault : NativeLargeInt) : NativeLargeInt;\r\n\r\n\r\nbegin\r\n if TryStrToInt64(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\nFunction StrToQWord(const S : String) : NativeLargeUInt;\r\n\r\nVar\r\n N : NativeInt;\r\n\r\nbegin\r\n if (not TryStrToInt(S,N)) or (N<0) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=N;\r\nend;\r\n\r\nFunction TryStrToQWord(const S : String; Out res : NativeLargeUInt) : Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R) and (R>=0);\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nFunction StrToQWordDef(const S : String; ADefault : NativeLargeUInt) : NativeLargeUInt;\r\n\r\nbegin\r\n if Not TryStrToQword(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\n\r\nFunction StrToUInt64(const S : String) : NativeLargeUInt;\r\n\r\nVar\r\n N : NativeInt;\r\n\r\nbegin\r\n if (not TryStrToInt(S,N)) or (N<0) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\n Result:=N;\r\nend;\r\n\r\nFunction TryStrToUInt64(const S : String; Out res : NativeLargeUInt) : Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R) and (R>=0);\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nFunction StrToUInt64Def(const S : String; ADefault : NativeLargeUInt) : NativeLargeUInt;\r\n\r\n\r\nbegin\r\n if Not TryStrToUInt64(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\nFunction TryStrToDWord(const S : String; Out res : DWord) : Boolean;\r\n\r\nVar\r\n R : nativeint;\r\n\r\nbegin\r\n Result:=TryStrToInt(S,R) and (R>=0) and (R<=DWord($FFFFFFFF));\r\n If Result then\r\n Res:=R;\r\nend;\r\n\r\nFunction StrToDWord(const S : String) : DWord;\r\n\r\nbegin\r\n if not TryStrToDWord(S,Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidInteger,[S]);\r\nend;\r\n\r\n\r\nFunction StrToDWordDef(const S : String; ADefault : DWord) : DWord;\r\n\r\nbegin\r\n if Not TryStrToDWord(S,Result) then\r\n Result:=ADefault;\r\nend;\r\n\r\n\r\nfunction IntToHex(Value: NativeInt; Digits: integer): string;\r\nconst\r\n HexDigits = '0123456789ABCDEF';\r\nbegin\r\n If Digits=0 then\r\n Digits:=1;\r\n Result:='';\r\n While Value>0 do\r\n begin\r\n result:=HexDigits[(value and 15)+1]+Result;\r\n value := value shr 4;\r\n end ;\r\n while (Length(Result)nil) then\r\n GetOwner.GetInterface(IInterface, FOwnerInterface);\r\nend;\r\n\r\n{ TComponentEnumerator }\r\n\r\nconstructor TComponentEnumerator.Create(AComponent: TComponent);\r\nbegin\r\n inherited Create;\r\n FComponent := AComponent;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TComponentEnumerator.GetCurrent: TComponent;\r\nbegin\r\n Result := FComponent.Components[FPosition];\r\nend;\r\n\r\nfunction TComponentEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FComponent.ComponentCount;\r\nend;\r\n\r\n{ TListEnumerator }\r\n\r\nconstructor TListEnumerator.Create(AList: TList);\r\nbegin\r\n inherited Create;\r\n FList := AList;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TListEnumerator.GetCurrent: JSValue;\r\nbegin\r\n Result := FList[FPosition];\r\nend;\r\n\r\nfunction TListEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FList.Count;\r\nend;\r\n\r\n{ TFPListEnumerator }\r\n\r\nconstructor TFPListEnumerator.Create(AList: TFPList);\r\nbegin\r\n inherited Create;\r\n FList := AList;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TFPListEnumerator.GetCurrent: JSValue;\r\nbegin\r\n Result := FList[FPosition];\r\nend;\r\n\r\nfunction TFPListEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FList.Count;\r\nend;\r\n\r\n{ TFPList }\r\n\r\nprocedure TFPList.CopyMove(aList: TFPList);\r\nvar r : integer;\r\nbegin\r\n Clear;\r\n for r := 0 to aList.count-1 do\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TFPList.MergeMove(aList: TFPList);\r\nvar r : integer;\r\nbegin\r\n For r := 0 to aList.count-1 do\r\n if IndexOf(aList[r]) < 0 then\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TFPList.DoCopy(ListA, ListB: TFPList);\r\nbegin\r\n if Assigned(ListB) then\r\n CopyMove(ListB)\r\n else\r\n CopyMove(ListA);\r\nend;\r\n\r\nprocedure TFPList.DoSrcUnique(ListA, ListB: TFPList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TFPList.DoAnd(ListA, ListB: TFPList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.count-1 do\r\n if ListB.IndexOf(ListA[r]) >= 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) < 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TFPList.DoDestUnique(ListA, ListB: TFPList);\r\n\r\n procedure MoveElements(Src, Dest: TFPList);\r\n var r : integer;\r\n begin\r\n Clear;\r\n for r := 0 to Src.count-1 do\r\n if Dest.IndexOf(Src[r]) < 0 then\r\n self.Add(Src[r]);\r\n end;\r\n\r\nvar Dest : TFPList;\r\nbegin\r\n if Assigned(ListB) then\r\n MoveElements(ListB, ListA)\r\n else\r\n Dest := TFPList.Create;\r\n try\r\n Dest.CopyMove(Self);\r\n MoveElements(ListA, Dest)\r\n finally\r\n Dest.Destroy;\r\n end;\r\nend;\r\n\r\nprocedure TFPList.DoOr(ListA, ListB: TFPList);\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n CopyMove(ListA);\r\n MergeMove(ListB);\r\n end\r\n else\r\n MergeMove(ListA);\r\nend;\r\n\r\nprocedure TFPList.DoXOr(ListA, ListB: TFPList);\r\nvar\r\n r : integer;\r\n l : TFPList;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n for r := 0 to ListB.Count-1 do\r\n if ListA.IndexOf(ListB[r]) < 0 then\r\n Add(ListB[r]);\r\n end\r\n else\r\n begin\r\n l := TFPList.Create;\r\n try\r\n l.CopyMove(Self);\r\n for r := Count-1 downto 0 do\r\n if listA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n for r := 0 to ListA.Count-1 do\r\n if l.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n finally\r\n l.Destroy;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TFPList.Get(Index: Integer): JSValue;\r\nbegin\r\n If (Index < 0) or (Index >= FCount) then\r\n RaiseIndexError(Index);\r\n Result:=FList[Index];\r\nend;\r\n\r\nprocedure TFPList.Put(Index: Integer; Item: JSValue);\r\nbegin\r\n if (Index < 0) or (Index >= FCount) then\r\n RaiseIndexError(Index);\r\n FList[Index] := Item;\r\nend;\r\n\r\nprocedure TFPList.SetCapacity(NewCapacity: Integer);\r\nbegin\r\n If (NewCapacity < FCount) then\r\n Error (SListCapacityError, str(NewCapacity));\r\n if NewCapacity = FCapacity then\r\n exit;\r\n SetLength(FList,NewCapacity);\r\n FCapacity := NewCapacity;\r\nend;\r\n\r\nprocedure TFPList.SetCount(NewCount: Integer);\r\nbegin\r\n if (NewCount < 0) then\r\n Error(SListCountError, str(NewCount));\r\n If NewCount > FCount then\r\n begin\r\n If NewCount > FCapacity then\r\n SetCapacity(NewCount);\r\n end;\r\n FCount := NewCount;\r\nend;\r\n\r\nprocedure TFPList.RaiseIndexError(Index: Integer);\r\nbegin\r\n Error(SListIndexError, str(Index));\r\nend;\r\n\r\ndestructor TFPList.Destroy;\r\nbegin\r\n Clear;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TFPList.AddList(AList: TFPList);\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n If (Capacity=FCount) then\r\n Error (SListIndexError, str(Index));\r\n FCount := FCount-1;\r\n System.Delete(FList,Index,1);\r\n Dec(FCapacity);\r\nend;\r\n\r\nclass procedure TFPList.Error(const Msg: string; const Data: String);\r\nbegin\r\n Raise EListError.CreateFmt(Msg,[Data]);\r\nend;\r\n\r\nprocedure TFPList.Exchange(Index1, Index2: Integer);\r\nvar\r\n Temp : JSValue;\r\nbegin\r\n If (Index1 >= FCount) or (Index1 < 0) then\r\n Error(SListIndexError, str(Index1));\r\n If (Index2 >= FCount) or (Index2 < 0) then\r\n Error(SListIndexError, str(Index2));\r\n Temp := FList[Index1];\r\n FList[Index1] := FList[Index2];\r\n FList[Index2] := Temp;\r\nend;\r\n\r\nfunction TFPList.Expand: TFPList;\r\nvar\r\n IncSize : Integer;\r\nbegin\r\n if FCount < FCapacity then exit(self);\r\n IncSize := 4;\r\n if FCapacity > 3 then IncSize := IncSize + 4;\r\n if FCapacity > 8 then IncSize := IncSize+8;\r\n if FCapacity > 127 then Inc(IncSize, FCapacity shr 2);\r\n SetCapacity(FCapacity + IncSize);\r\n Result := Self;\r\nend;\r\n\r\nfunction TFPList.Extract(Item: JSValue): JSValue;\r\nvar\r\n i : Integer;\r\nbegin\r\n i := IndexOf(Item);\r\n if i >= 0 then\r\n begin\r\n Result := Item;\r\n Delete(i);\r\n end\r\n else\r\n Result := nil;\r\nend;\r\n\r\nfunction TFPList.First: JSValue;\r\nbegin\r\n If FCount = 0 then\r\n Result := Nil\r\n else\r\n Result := Items[0];\r\nend;\r\n\r\nfunction TFPList.GetEnumerator: TFPListEnumerator;\r\nbegin\r\n Result:=TFPListEnumerator.Create(Self);\r\nend;\r\n\r\nfunction TFPList.IndexOf(Item: JSValue): Integer;\r\n\r\nVar\r\n C : Integer;\r\n\r\nbegin\r\n Result:=0;\r\n C:=Count;\r\n while (ResultItem) do\r\n Inc(Result);\r\n If Result>=C then\r\n Result:=-1;\r\n\r\nend;\r\n\r\nfunction TFPList.IndexOfItem(Item: JSValue; Direction: TDirection): Integer;\r\n\r\nbegin\r\n if Direction=fromBeginning then\r\n Result:=IndexOf(Item)\r\n else\r\n begin\r\n Result:=Count-1;\r\n while (Result >=0) and (Flist[Result]<>Item) do\r\n Result:=Result - 1;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TFPList.Insert(Index: Integer; Item: JSValue);\r\nbegin\r\n if (Index < 0) or (Index > FCount )then\r\n Error(SlistIndexError, str(Index));\r\n TJSArray(FList).splice(Index, 0, Item);\r\n inc(FCapacity);\r\n inc(FCount);\r\nend;\r\n\r\nfunction TFPList.Last: JSValue;\r\nbegin\r\n If FCount = 0 then\r\n Result := nil\r\n else\r\n Result := Items[FCount - 1];\r\nend;\r\n\r\nprocedure TFPList.Move(CurIndex, NewIndex: Integer);\r\nvar\r\n Temp: JSValue;\r\nbegin\r\n if (CurIndex < 0) or (CurIndex > Count - 1) then\r\n Error(SListIndexError, str(CurIndex));\r\n if (NewIndex < 0) or (NewIndex > Count -1) then\r\n Error(SlistIndexError, str(NewIndex));\r\n if CurIndex=NewIndex then exit;\r\n Temp:=FList[CurIndex];\r\n // ToDo: use TJSArray.copyWithin if available\r\n TJSArray(FList).splice(CurIndex,1);\r\n TJSArray(FList).splice(NewIndex,0,Temp);\r\nend;\r\n\r\nprocedure TFPList.Assign(ListA: TFPList; AOperator: TListAssignOp;\r\n ListB: TFPList);\r\nbegin\r\n case AOperator of\r\n laCopy : DoCopy (ListA, ListB); // replace dest with src\r\n laSrcUnique : DoSrcUnique (ListA, ListB); // replace dest with src that are not in dest\r\n laAnd : DoAnd (ListA, ListB); // remove from dest that are not in src\r\n laDestUnique: DoDestUnique (ListA, ListB);// remove from dest that are in src\r\n laOr : DoOr (ListA, ListB); // add to dest from src and not in dest\r\n laXOr : DoXOr (ListA, ListB); // add to dest from src and not in dest, remove from dest that are in src\r\n end;\r\nend;\r\n\r\nfunction TFPList.Remove(Item: JSValue): Integer;\r\nbegin\r\n Result := IndexOf(Item);\r\n If Result <> -1 then\r\n Delete(Result);\r\nend;\r\n\r\nprocedure TFPList.Pack;\r\nvar\r\n Dst, i: Integer;\r\n V: JSValue;\r\nbegin\r\n Dst:=0;\r\n for i:=0 to Count-1 do\r\n begin\r\n V:=FList[i];\r\n if not Assigned(V) then continue;\r\n FList[Dst]:=V;\r\n inc(Dst);\r\n end;\r\nend;\r\n\r\n// Needed by Sort method.\r\n\r\nProcedure QuickSort(aList: TJSValueDynArray; L, R : Longint;\r\n const Compare: TListSortCompare);\r\nvar\r\n I, J : Longint;\r\n P, Q : JSValue;\r\nbegin\r\n repeat\r\n I := L;\r\n J := R;\r\n P := aList[ (L + R) div 2 ];\r\n repeat\r\n while Compare(P, aList[i]) > 0 do\r\n I := I + 1;\r\n while Compare(P, aList[J]) < 0 do\r\n J := J - 1;\r\n If I <= J then\r\n begin\r\n Q := aList[I];\r\n aList[I] := aList[J];\r\n aList[J] := Q;\r\n I := I + 1;\r\n J := J - 1;\r\n end;\r\n until I > J;\r\n // sort the smaller range recursively\r\n // sort the bigger range via the loop\r\n // Reasons: memory usage is O(log(n)) instead of O(n) and loop is faster than recursion\r\n if J - L < R - I then\r\n begin\r\n if L < J then\r\n QuickSort(aList, L, J, Compare);\r\n L := I;\r\n end\r\n else\r\n begin\r\n if I < R then\r\n QuickSort(aList, I, R, Compare);\r\n R := J;\r\n end;\r\n until L >= R;\r\nend;\r\n\r\nprocedure TFPList.Sort(const Compare: TListSortCompare);\r\nbegin\r\n if Not Assigned(FList) or (FCount < 2) then exit;\r\n QuickSort(Flist, 0, FCount-1, Compare);\r\nend;\r\n\r\nprocedure TFPList.ForEachCall(const proc2call: TListCallback; const arg: JSValue\r\n );\r\nvar\r\n i : integer;\r\n v : JSValue;\r\nbegin\r\n For I:=0 To Count-1 Do\r\n begin\r\n v:=FList[i];\r\n if Assigned(v) then\r\n proc2call(v,arg);\r\n end;\r\nend;\r\n\r\nprocedure TFPList.ForEachCall(const proc2call: TListStaticCallback;\r\n const arg: JSValue);\r\nvar\r\n i : integer;\r\n v : JSValue;\r\nbegin\r\n For I:=0 To Count-1 Do\r\n begin\r\n v:=FList[i];\r\n if Assigned(v) then\r\n proc2call(v,arg);\r\n end;\r\nend;\r\n\r\n{ TList }\r\n\r\nprocedure TList.CopyMove(aList: TList);\r\nvar\r\n r : integer;\r\nbegin\r\n Clear;\r\n for r := 0 to aList.count-1 do\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TList.MergeMove(aList: TList);\r\nvar r : integer;\r\nbegin\r\n For r := 0 to aList.count-1 do\r\n if IndexOf(aList[r]) < 0 then\r\n Add(aList[r]);\r\nend;\r\n\r\nprocedure TList.DoCopy(ListA, ListB: TList);\r\nbegin\r\n if Assigned(ListB) then\r\n CopyMove(ListB)\r\n else\r\n CopyMove(ListA);\r\nend;\r\n\r\nprocedure TList.DoSrcUnique(ListA, ListB: TList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TList.DoAnd(ListA, ListB: TList);\r\nvar r : integer;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) >= 0 then\r\n Add(ListA[r]);\r\n end\r\n else\r\n begin\r\n for r := Count-1 downto 0 do\r\n if ListA.IndexOf(Self[r]) < 0 then\r\n Delete(r);\r\n end;\r\nend;\r\n\r\nprocedure TList.DoDestUnique(ListA, ListB: TList);\r\n\r\n procedure MoveElements(Src, Dest : TList);\r\n var r : integer;\r\n begin\r\n Clear;\r\n for r := 0 to Src.Count-1 do\r\n if Dest.IndexOf(Src[r]) < 0 then\r\n Add(Src[r]);\r\n end;\r\n\r\nvar Dest : TList;\r\nbegin\r\n if Assigned(ListB) then\r\n MoveElements(ListB, ListA)\r\n else\r\n try\r\n Dest := TList.Create;\r\n Dest.CopyMove(Self);\r\n MoveElements(ListA, Dest)\r\n finally\r\n Dest.Destroy;\r\n end;\r\nend;\r\n\r\nprocedure TList.DoOr(ListA, ListB: TList);\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n CopyMove(ListA);\r\n MergeMove(ListB);\r\n end\r\n else\r\n MergeMove(ListA);\r\nend;\r\n\r\nprocedure TList.DoXOr(ListA, ListB: TList);\r\nvar\r\n r : integer;\r\n l : TList;\r\nbegin\r\n if Assigned(ListB) then\r\n begin\r\n Clear;\r\n for r := 0 to ListA.Count-1 do\r\n if ListB.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n for r := 0 to ListB.Count-1 do\r\n if ListA.IndexOf(ListB[r]) < 0 then\r\n Add(ListB[r]);\r\n end\r\n else\r\n try\r\n l := TList.Create;\r\n l.CopyMove (Self);\r\n for r := Count-1 downto 0 do\r\n if listA.IndexOf(Self[r]) >= 0 then\r\n Delete(r);\r\n for r := 0 to ListA.Count-1 do\r\n if l.IndexOf(ListA[r]) < 0 then\r\n Add(ListA[r]);\r\n finally\r\n l.Destroy;\r\n end;\r\nend;\r\n\r\nfunction TList.Get(Index: Integer): JSValue;\r\nbegin\r\n Result := FList.Get(Index);\r\nend;\r\n\r\nprocedure TList.Put(Index: Integer; Item: JSValue);\r\nvar V : JSValue;\r\nbegin\r\n V := Get(Index);\r\n FList.Put(Index, Item);\r\n if Assigned(V) then\r\n Notify(V, lnDeleted);\r\n if Assigned(Item) then\r\n Notify(Item, lnAdded);\r\nend;\r\n\r\nprocedure TList.Notify(aValue: JSValue; Action: TListNotification);\r\nbegin\r\n if Assigned(aValue) then ;\r\n if Action=lnExtracted then ;\r\nend;\r\n\r\nprocedure TList.SetCapacity(NewCapacity: Integer);\r\nbegin\r\n FList.SetCapacity(NewCapacity);\r\nend;\r\n\r\nfunction TList.GetCapacity: integer;\r\nbegin\r\n Result := FList.Capacity;\r\nend;\r\n\r\nprocedure TList.SetCount(NewCount: Integer);\r\nbegin\r\n if NewCount < FList.Count then\r\n while FList.Count > NewCount do\r\n Delete(FList.Count - 1)\r\n else\r\n FList.SetCount(NewCount);\r\nend;\r\n\r\nfunction TList.GetCount: integer;\r\nbegin\r\n Result := FList.Count;\r\nend;\r\n\r\nfunction TList.GetList: TJSValueDynArray;\r\nbegin\r\n Result := FList.List;\r\nend;\r\n\r\nconstructor TList.Create;\r\nbegin\r\n inherited Create;\r\n FList := TFPList.Create;\r\nend;\r\n\r\ndestructor TList.Destroy;\r\nbegin\r\n if Assigned(FList) then\r\n Clear;\r\n FreeAndNil(FList);\r\nend;\r\n\r\nprocedure TList.AddList(AList: TList);\r\nvar\r\n I: Integer;\r\nbegin\r\n { this only does FList.AddList(AList.FList), avoiding notifications }\r\n FList.AddList(AList.FList);\r\n\r\n { make lnAdded notifications }\r\n for I := 0 to AList.Count - 1 do\r\n if Assigned(AList[I]) then\r\n Notify(AList[I], lnAdded);\r\nend;\r\n\r\nfunction TList.Add(Item: JSValue): Integer;\r\nbegin\r\n Result := FList.Add(Item);\r\n if Assigned(Item) then\r\n Notify(Item, lnAdded);\r\nend;\r\n\r\nprocedure TList.Clear;\r\nbegin\r\n While (FList.Count>0) do\r\n Delete(Count-1);\r\nend;\r\n\r\nprocedure TList.Delete(Index: Integer);\r\n\r\nvar V : JSValue;\r\n\r\nbegin\r\n V:=FList.Get(Index);\r\n FList.Delete(Index);\r\n if assigned(V) then\r\n Notify(V, lnDeleted);\r\nend;\r\n\r\nclass procedure TList.Error(const Msg: string; Data: String);\r\nbegin\r\n Raise EListError.CreateFmt(Msg,[Data]);\r\nend;\r\n\r\nprocedure TList.Exchange(Index1, Index2: Integer);\r\nbegin\r\n FList.Exchange(Index1, Index2);\r\nend;\r\n\r\nfunction TList.Expand: TList;\r\nbegin\r\n FList.Expand;\r\n Result:=Self;\r\nend;\r\n\r\nfunction TList.Extract(Item: JSValue): JSValue;\r\nvar c : integer;\r\nbegin\r\n c := FList.Count;\r\n Result := FList.Extract(Item);\r\n if c <> FList.Count then\r\n Notify (Result, lnExtracted);\r\nend;\r\n\r\nfunction TList.First: JSValue;\r\nbegin\r\n Result := FList.First;\r\nend;\r\n\r\nfunction TList.GetEnumerator: TListEnumerator;\r\nbegin\r\n Result:=TListEnumerator.Create(Self);\r\nend;\r\n\r\nfunction TList.IndexOf(Item: JSValue): Integer;\r\nbegin\r\n Result := FList.IndexOf(Item);\r\nend;\r\n\r\nprocedure TList.Insert(Index: Integer; Item: JSValue);\r\nbegin\r\n FList.Insert(Index, Item);\r\n if Assigned(Item) then\r\n Notify(Item,lnAdded);\r\nend;\r\n\r\nfunction TList.Last: JSValue;\r\nbegin\r\n Result := FList.Last;\r\nend;\r\n\r\nprocedure TList.Move(CurIndex, NewIndex: Integer);\r\nbegin\r\n FList.Move(CurIndex, NewIndex);\r\nend;\r\n\r\nprocedure TList.Assign(ListA: TList; AOperator: TListAssignOp; ListB: TList);\r\nbegin\r\n case AOperator of\r\n laCopy : DoCopy (ListA, ListB); // replace dest with src\r\n laSrcUnique : DoSrcUnique (ListA, ListB); // replace dest with src that are not in dest\r\n laAnd : DoAnd (ListA, ListB); // remove from dest that are not in src\r\n laDestUnique: DoDestUnique (ListA, ListB);// remove from dest that are in src\r\n laOr : DoOr (ListA, ListB); // add to dest from src and not in dest\r\n laXOr : DoXOr (ListA, ListB); // add to dest from src and not in dest, remove from dest that are in src\r\n end;\r\nend;\r\n\r\nfunction TList.Remove(Item: JSValue): Integer;\r\nbegin\r\n Result := IndexOf(Item);\r\n if Result <> -1 then\r\n Self.Delete(Result);\r\nend;\r\n\r\nprocedure TList.Pack;\r\nbegin\r\n FList.Pack;\r\nend;\r\n\r\nprocedure TList.Sort(const Compare: TListSortCompare);\r\nbegin\r\n FList.Sort(Compare);\r\nend;\r\n\r\n{ TPersistent }\r\n\r\nprocedure TPersistent.AssignError(Source: TPersistent);\r\nvar\r\n SourceName: String;\r\nbegin\r\n if Source<>Nil then\r\n SourceName:=Source.ClassName\r\n else\r\n SourceName:='Nil';\r\n raise EConvertError.Create('Cannot assign a '+SourceName+' to a '+ClassName+'.');\r\nend;\r\n\r\nprocedure TPersistent.AssignTo(Dest: TPersistent);\r\nbegin\r\n Dest.AssignError(Self);\r\nend;\r\n\r\nfunction TPersistent.GetOwner: TPersistent;\r\nbegin\r\n Result:=nil;\r\nend;\r\n\r\nprocedure TPersistent.Assign(Source: TPersistent);\r\nbegin\r\n If Source<>Nil then\r\n Source.AssignTo(Self)\r\n else\r\n AssignError(Nil);\r\nend;\r\n\r\nfunction TPersistent.GetNamePath: string;\r\nvar\r\n OwnerName: String;\r\n TheOwner: TPersistent;\r\nbegin\r\n Result:=ClassName;\r\n TheOwner:=GetOwner;\r\n if TheOwner<>Nil then\r\n begin\r\n OwnerName:=TheOwner.GetNamePath;\r\n if OwnerName<>'' then Result:=OwnerName+'.'+Result;\r\n end;\r\nend;\r\n\r\n{\r\n This file is part of the Free Component Library (FCL)\r\n Copyright (c) 1999-2000 by the Free Pascal development team\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\n{****************************************************************************}\r\n{* TStringsEnumerator *}\r\n{****************************************************************************}\r\n\r\nconstructor TStringsEnumerator.Create(AStrings: TStrings);\r\nbegin\r\n inherited Create;\r\n FStrings := AStrings;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TStringsEnumerator.GetCurrent: String;\r\nbegin\r\n Result := FStrings[FPosition];\r\nend;\r\n\r\nfunction TStringsEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FStrings.Count;\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TStrings *}\r\n{****************************************************************************}\r\n\r\n// Function to quote text. Should move maybe to sysutils !!\r\n// Also, it is not clear at this point what exactly should be done.\r\n\r\n{ //!! is used to mark unsupported things. }\r\n\r\n(*\r\nFunction QuoteString (Const S : String; Const Quote : String) : String;\r\nVar\r\n I,J : Integer;\r\nbegin\r\n J:=0;\r\n Result:=S;\r\n for i:=1 to length(s) do\r\n begin\r\n inc(j);\r\n if S[i]=Quote then\r\n begin\r\n Insert(Quote,Result,J);\r\n inc(j);\r\n end;\r\n end;\r\n Result:=Quote+Result+Quote;\r\nend;\r\n*)\r\n\r\n{\r\n For compatibility we can't add a Constructor to TSTrings to initialize\r\n the special characters. Therefore we add a routine which is called whenever\r\n the special chars are needed.\r\n}\r\n\r\nProcedure Tstrings.CheckSpecialChars;\r\n\r\nbegin\r\n If Not FSpecialCharsInited then\r\n begin\r\n FQuoteChar:='\"';\r\n FDelimiter:=',';\r\n FNameValueSeparator:='=';\r\n FLBS:=DefaultTextLineBreakStyle;\r\n FSpecialCharsInited:=true;\r\n FLineBreak:=sLineBreak;\r\n end;\r\nend;\r\n\r\nFunction TStrings.GetSkipLastLineBreak : Boolean;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FSkipLastLineBreak;\r\nend;\r\n\r\nprocedure TStrings.SetSkipLastLineBreak(const AValue : Boolean);\r\n\r\nbegin\r\n CheckSpecialChars;\r\n FSkipLastLineBreak:=AValue;\r\nend;\r\n\r\nFunction TStrings.GetLBS : TTextLineBreakStyle;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FLBS;\r\nend;\r\n\r\nProcedure TStrings.SetLBS (AValue : TTextLineBreakStyle);\r\nbegin\r\n CheckSpecialChars;\r\n FLBS:=AValue;\r\nend;\r\n\r\nprocedure TStrings.SetDelimiter(c:Char);\r\nbegin\r\n CheckSpecialChars;\r\n FDelimiter:=c;\r\nend;\r\n\r\nFunction TStrings.GetDelimiter : Char;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FDelimiter;\r\nend;\r\n\r\nprocedure TStrings.SetLineBreak(Const S : String);\r\nbegin\r\n CheckSpecialChars;\r\n FLineBreak:=S;\r\nend;\r\n\r\nFunction TStrings.GetLineBreak : String;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FLineBreak;\r\nend;\r\n\r\n\r\nprocedure TStrings.SetQuoteChar(c:Char);\r\nbegin\r\n CheckSpecialChars;\r\n FQuoteChar:=c;\r\nend;\r\n\r\nFunction TStrings.GetQuoteChar :Char;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FQuoteChar;\r\nend;\r\n\r\nprocedure TStrings.SetNameValueSeparator(c:Char);\r\nbegin\r\n CheckSpecialChars;\r\n FNameValueSeparator:=c;\r\nend;\r\n\r\nFunction TStrings.GetNameValueSeparator :Char;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=FNameValueSeparator;\r\nend;\r\n\r\n\r\nfunction TStrings.GetCommaText: string;\r\n\r\nVar\r\n C1,C2 : Char;\r\n FSD : Boolean;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n FSD:=StrictDelimiter;\r\n C1:=Delimiter;\r\n C2:=QuoteChar;\r\n Delimiter:=',';\r\n QuoteChar:='\"';\r\n StrictDelimiter:=False;\r\n Try\r\n Result:=GetDelimitedText;\r\n Finally\r\n Delimiter:=C1;\r\n QuoteChar:=C2;\r\n StrictDelimiter:=FSD;\r\n end;\r\nend;\r\n\r\n\r\nFunction TStrings.GetDelimitedText: string;\r\n\r\nVar\r\n I: integer;\r\n RE : string;\r\n S : String;\r\n doQuote : Boolean;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n result:='';\r\n RE:=QuoteChar+'|'+Delimiter;\r\n if not StrictDelimiter then\r\n RE:=' |'+RE;\r\n RE:='/'+RE+'/';\r\n // Check for break characters and quote if required.\r\n For i:=0 to count-1 do\r\n begin\r\n S:=Strings[i];\r\n doQuote:=FAlwaysQuote or (TJSString(s).search(RE)=-1);\r\n if DoQuote then\r\n Result:=Result+QuoteString(S,QuoteChar)\r\n else\r\n Result:=Result+S;\r\n if I0 then\r\n begin\r\n AName:=Copy(AValue,1,L-1);\r\n // System.Delete(AValue,1,L);\r\n AValue:=Copy(AValue,L+1,length(AValue)-L);\r\n end\r\n else\r\n AName:='';\r\nend;\r\n\r\nfunction TStrings.ExtractName(const s:String):String;\r\nvar\r\n L: Longint;\r\nbegin\r\n CheckSpecialChars;\r\n L:=Pos(FNameValueSeparator,S);\r\n If L<>0 then\r\n Result:=Copy(S,1,L-1)\r\n else\r\n Result:='';\r\nend;\r\n\r\nfunction TStrings.GetName(Index: Integer): string;\r\n\r\nVar\r\n V : String;\r\n\r\nbegin\r\n GetNameValue(Index,Result,V);\r\nend;\r\n\r\nFunction TStrings.GetValue(const Name: string): string;\r\n\r\nVar\r\n L : longint;\r\n N : String;\r\n\r\nbegin\r\n Result:='';\r\n L:=IndexOfName(Name);\r\n If L<>-1 then\r\n GetNameValue(L,N,Result);\r\nend;\r\n\r\nFunction TStrings.GetValueFromIndex(Index: Integer): string;\r\n\r\nVar\r\n N : String;\r\n\r\nbegin\r\n GetNameValue(Index,N,Result);\r\nend;\r\n\r\nProcedure TStrings.SetValueFromIndex(Index: Integer; const Value: string);\r\n\r\nbegin\r\n If (Value='') then\r\n Delete(Index)\r\n else\r\n begin\r\n If (Index<0) then\r\n Index:=Add('');\r\n CheckSpecialChars;\r\n Strings[Index]:=GetName(Index)+FNameValueSeparator+Value;\r\n end;\r\nend;\r\n\r\nProcedure TStrings.SetDelimitedText(const AValue: string);\r\nvar i,j:integer;\r\n aNotFirst:boolean;\r\nbegin\r\n CheckSpecialChars;\r\n BeginUpdate;\r\n\r\n i:=1;\r\n j:=1;\r\n aNotFirst:=false;\r\n\r\n { Paraphrased from Delphi XE2 help:\r\n Strings must be separated by Delimiter characters or spaces.\r\n They may be enclosed in QuoteChars.\r\n QuoteChars in the string must be repeated to distinguish them from the QuoteChars enclosing the string.\r\n }\r\n try\r\n Clear;\r\n If StrictDelimiter then\r\n begin\r\n while i<=length(AValue) do begin\r\n // skip delimiter\r\n if aNotFirst and (i<=length(AValue)) and (AValue[i]=FDelimiter) then inc(i);\r\n\r\n // read next string\r\n if i<=length(AValue) then begin\r\n if AValue[i]=FQuoteChar then begin\r\n // next string is quoted\r\n j:=i+1;\r\n while (j<=length(AValue)) and\r\n ( (AValue[j]<>FQuoteChar) or\r\n ( (j+1<=length(AValue)) and (AValue[j+1]=FQuoteChar) ) ) do begin\r\n if (j<=length(AValue)) and (AValue[j]=FQuoteChar) then inc(j,2)\r\n else inc(j);\r\n end;\r\n // j is position of closing quote\r\n Add( StringReplace (Copy(AValue,i+1,j-i-1),\r\n FQuoteChar+FQuoteChar,FQuoteChar, [rfReplaceAll]));\r\n i:=j+1;\r\n end else begin\r\n // next string is not quoted; read until delimiter\r\n j:=i;\r\n while (j<=length(AValue)) and\r\n (AValue[j]<>FDelimiter) do inc(j);\r\n Add( Copy(AValue,i,j-i));\r\n i:=j;\r\n end;\r\n end else begin\r\n if aNotFirst then Add('');\r\n end;\r\n\r\n aNotFirst:=true;\r\n end;\r\n end\r\n else\r\n begin\r\n while i<=length(AValue) do begin\r\n // skip delimiter\r\n if aNotFirst and (i<=length(AValue)) and (AValue[i]=FDelimiter) then inc(i);\r\n\r\n // skip spaces\r\n while (i<=length(AValue)) and (Ord(AValue[i])<=Ord(' ')) do inc(i);\r\n\r\n // read next string\r\n if i<=length(AValue) then begin\r\n if AValue[i]=FQuoteChar then begin\r\n // next string is quoted\r\n j:=i+1;\r\n while (j<=length(AValue)) and\r\n ( (AValue[j]<>FQuoteChar) or\r\n ( (j+1<=length(AValue)) and (AValue[j+1]=FQuoteChar) ) ) do begin\r\n if (j<=length(AValue)) and (AValue[j]=FQuoteChar) then inc(j,2)\r\n else inc(j);\r\n end;\r\n // j is position of closing quote\r\n Add( StringReplace (Copy(AValue,i+1,j-i-1),\r\n FQuoteChar+FQuoteChar,FQuoteChar, [rfReplaceAll]));\r\n i:=j+1;\r\n end else begin\r\n // next string is not quoted; read until control character/space/delimiter\r\n j:=i;\r\n while (j<=length(AValue)) and\r\n (Ord(AValue[j])>Ord(' ')) and\r\n (AValue[j]<>FDelimiter) do inc(j);\r\n Add( Copy(AValue,i,j-i));\r\n i:=j;\r\n end;\r\n end else begin\r\n if aNotFirst then Add('');\r\n end;\r\n\r\n // skip spaces\r\n while (i<=length(AValue)) and (Ord(AValue[i])<=Ord(' ')) do inc(i);\r\n\r\n aNotFirst:=true;\r\n end;\r\n end;\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nProcedure TStrings.SetCommaText(const Value: string);\r\n\r\nVar\r\n C1,C2 : Char;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n C1:=Delimiter;\r\n C2:=QuoteChar;\r\n Delimiter:=',';\r\n QuoteChar:='\"';\r\n Try\r\n SetDelimitedText(Value);\r\n Finally\r\n Delimiter:=C1;\r\n QuoteChar:=C2;\r\n end;\r\nend;\r\n\r\nProcedure TStrings.SetValue(const Name, Value: string);\r\n\r\nVar L : longint;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n L:=IndexOfName(Name);\r\n if L=-1 then\r\n Add (Name+FNameValueSeparator+Value)\r\n else\r\n Strings[L]:=Name+FNameValueSeparator+value;\r\nend;\r\n\r\n\r\nProcedure TStrings.Error(const Msg: string; Data: Integer);\r\nbegin\r\n Raise EStringListError.CreateFmt(Msg,[IntToStr(Data)]);\r\nend;\r\n\r\nFunction TStrings.GetCapacity: Integer;\r\n\r\nbegin\r\n Result:=Count;\r\nend;\r\n\r\n\r\n\r\nFunction TStrings.GetObject(Index: Integer): TObject;\r\n\r\nbegin\r\n if Index=0 then ;\r\n Result:=Nil;\r\nend;\r\n\r\nFunction TStrings.GetTextStr: string;\r\n\r\nVar\r\n I : Longint;\r\n S,NL : String;\r\n\r\nbegin\r\n CheckSpecialChars;\r\n // Determine needed place\r\n if FLineBreak<>sLineBreak then\r\n NL:=FLineBreak\r\n else\r\n Case FLBS of\r\n tlbsLF : NL:=#10;\r\n tlbsCRLF : NL:=#13#10;\r\n tlbsCR : NL:=#13;\r\n end;\r\n Result:='';\r\n For i:=0 To count-1 do\r\n begin\r\n S:=Strings[I];\r\n Result:=Result+S;\r\n if (I Capacity then\r\n Capacity := Count + High(TheStrings)+1;\r\n For Runner:=Low(TheStrings) to High(TheStrings) do\r\n self.Add(Thestrings[Runner]);\r\nend;\r\n\r\n\r\nProcedure TStrings.AddStrings(const TheStrings: array of string; ClearFirst : Boolean);\r\n\r\nbegin\r\n beginupdate;\r\n try\r\n if ClearFirst then\r\n Clear;\r\n AddStrings(TheStrings);\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n\r\nfunction TStrings.AddPair(const AName, AValue: string): TStrings;\r\n\r\nbegin\r\n Result:=AddPair(AName,AValue,Nil);\r\nend;\r\n\r\nfunction TStrings.AddPair(const AName, AValue: string; AObject: TObject): TStrings;\r\n\r\nbegin\r\n Result := Self;\r\n AddObject(AName+NameValueSeparator+AValue, AObject);\r\nend;\r\n\r\n\r\nProcedure TStrings.Assign(Source: TPersistent);\r\n\r\nVar\r\n S : TStrings;\r\n\r\nbegin\r\n If Source is TStrings then\r\n begin\r\n S:=TStrings(Source);\r\n BeginUpdate;\r\n Try\r\n clear;\r\n FSpecialCharsInited:=S.FSpecialCharsInited;\r\n FQuoteChar:=S.FQuoteChar;\r\n FDelimiter:=S.FDelimiter;\r\n FNameValueSeparator:=S.FNameValueSeparator;\r\n FLBS:=S.FLBS;\r\n FLineBreak:=S.FLineBreak;\r\n AddStrings(S);\r\n finally\r\n EndUpdate;\r\n end;\r\n end\r\n else\r\n Inherited Assign(Source);\r\nend;\r\n\r\n\r\n\r\nProcedure TStrings.BeginUpdate;\r\n\r\nbegin\r\n if FUpdateCount = 0 then SetUpdateState(true);\r\n inc(FUpdateCount);\r\nend;\r\n\r\n\r\n\r\nProcedure TStrings.EndUpdate;\r\n\r\nbegin\r\n If FUpdateCount>0 then\r\n Dec(FUpdateCount);\r\n if FUpdateCount=0 then\r\n SetUpdateState(False);\r\nend;\r\n\r\n\r\n\r\nFunction TStrings.Equals(Obj: TObject): Boolean;\r\n\r\nbegin\r\n if Obj is TStrings then\r\n Result := Equals(TStrings(Obj))\r\n else\r\n Result := inherited Equals(Obj);\r\nend;\r\n\r\n\r\n\r\nFunction TStrings.Equals(TheStrings: TStrings): Boolean;\r\n\r\nVar Runner,Nr : Longint;\r\n\r\nbegin\r\n Result:=False;\r\n Nr:=Self.Count;\r\n if Nr<>TheStrings.Count then exit;\r\n For Runner:=0 to Nr-1 do\r\n If Strings[Runner]<>TheStrings[Runner] then exit;\r\n Result:=True;\r\nend;\r\n\r\n\r\n\r\nProcedure TStrings.Exchange(Index1, Index2: Integer);\r\n\r\nVar\r\n Obj : TObject;\r\n Str : String;\r\n\r\nbegin\r\n beginUpdate;\r\n Try\r\n Obj:=Objects[Index1];\r\n Str:=Strings[Index1];\r\n Objects[Index1]:=Objects[Index2];\r\n Strings[Index1]:=Strings[Index2];\r\n Objects[Index2]:=Obj;\r\n Strings[Index2]:=Str;\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n\r\nfunction TStrings.GetEnumerator: TStringsEnumerator;\r\nbegin\r\n Result:=TStringsEnumerator.Create(Self);\r\nend;\r\n\r\n\r\nFunction TStrings.DoCompareText(const s1,s2 : string) : PtrInt;\r\nbegin\r\n result:=CompareText(s1,s2);\r\nend;\r\n\r\n\r\nFunction TStrings.IndexOf(const S: string): Integer;\r\nbegin\r\n Result:=0;\r\n While (Result0) do Result:=Result+1;\r\n if Result=Count then Result:=-1;\r\nend;\r\n\r\n\r\nFunction TStrings.IndexOfName(const Name: string): Integer;\r\nVar\r\n len : longint;\r\n S : String;\r\nbegin\r\n CheckSpecialChars;\r\n Result:=0;\r\n while (Result=0) and (DoCompareText(Name,Copy(S,1,Len))=0) then\r\n exit;\r\n inc(result);\r\n end;\r\n result:=-1;\r\nend;\r\n\r\n\r\nFunction TStrings.IndexOfObject(AObject: TObject): Integer;\r\nbegin\r\n Result:=0;\r\n While (ResultAObject) do Result:=Result+1;\r\n If Result=Count then Result:=-1;\r\nend;\r\n\r\n\r\nProcedure TStrings.InsertObject(Index: Integer; const S: string;\r\n AObject: TObject);\r\n\r\nbegin\r\n Insert (Index,S);\r\n Objects[Index]:=AObject;\r\nend;\r\n\r\nprocedure TStrings.LoadFromFile(const FileName: string);\r\nvar\r\n a: TJSStringDynArray;\r\nbegin\r\n a := URLToArrayOfString(FileName);\r\n AddStrings(a, True);\r\nend;\r\n\r\nProcedure TStrings.Move(CurIndex, NewIndex: Integer);\r\nVar\r\n Obj : TObject;\r\n Str : String;\r\nbegin\r\n BeginUpdate;\r\n Try\r\n Obj:=Objects[CurIndex];\r\n Str:=Strings[CurIndex];\r\n Objects[CurIndex]:=Nil; // Prevent Delete from freeing.\r\n Delete(Curindex);\r\n InsertObject(NewIndex,Str,Obj);\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n\r\n{****************************************************************************}\r\n{* TStringList *}\r\n{****************************************************************************}\r\n\r\n\r\nprocedure TStringList.ExchangeItemsInt(Index1, Index2: Integer);\r\n\r\nVar\r\n S : String;\r\n O : TObject;\r\n\r\nbegin\r\n S:=Flist[Index1].FString;\r\n O:=Flist[Index1].FObject;\r\n Flist[Index1].Fstring:=Flist[Index2].Fstring;\r\n Flist[Index1].FObject:=Flist[Index2].FObject;\r\n Flist[Index2].Fstring:=S;\r\n Flist[Index2].FObject:=O;\r\nend;\r\n\r\nfunction TStringList.GetSorted: Boolean;\r\nbegin\r\n Result:=FSortStyle in [sslUser,sslAuto];\r\nend;\r\n\r\n\r\nprocedure TStringList.ExchangeItems(Index1, Index2: Integer);\r\nbegin\r\n ExchangeItemsInt(Index1, Index2);\r\nend;\r\n\r\n\r\nprocedure TStringList.Grow;\r\n\r\nVar\r\n NC : Integer;\r\n\r\nbegin\r\n NC:=Capacity;\r\n If NC>=256 then\r\n NC:=NC+(NC Div 4)\r\n else if NC=0 then\r\n NC:=4\r\n else\r\n NC:=NC*4;\r\n SetCapacity(NC);\r\nend;\r\n\r\nprocedure TStringList.InternalClear(FromIndex: Integer; ClearOnly: Boolean);\r\n\r\nVar\r\n I: Integer;\r\n\r\nbegin\r\n if FromIndex < FCount then\r\n begin\r\n if FOwnsObjects then\r\n begin\r\n For I:=FromIndex to FCount-1 do\r\n begin\r\n Flist[I].FString:='';\r\n freeandnil(Flist[i].FObject);\r\n end;\r\n end\r\n else\r\n begin\r\n For I:=FromIndex to FCount-1 do\r\n Flist[I].FString:='';\r\n end;\r\n FCount:=FromIndex;\r\n end;\r\n if Not ClearOnly then\r\n SetCapacity(0);\r\nend;\r\n\r\n\r\nprocedure TStringList.QuickSort(L, R: Integer; CompareFn: TStringListSortCompare\r\n );\r\n\r\n\r\nvar\r\n Pivot, vL, vR: Integer;\r\n\r\nbegin\r\n //if ExchangeItems is override call that, else call (faster) ExchangeItemsInt\r\n\r\n if R - L <= 1 then begin // a little bit of time saver\r\n if L < R then\r\n if CompareFn(Self, L, R) > 0 then\r\n ExchangeItems(L, R);\r\n\r\n Exit;\r\n end;\r\n\r\n vL := L;\r\n vR := R;\r\n\r\n Pivot := L + Random(R - L); // they say random is best\r\n\r\n while vL < vR do begin\r\n while (vL < Pivot) and (CompareFn(Self, vL, Pivot) <= 0) do\r\n Inc(vL);\r\n\r\n while (vR > Pivot) and (CompareFn(Self, vR, Pivot) > 0) do\r\n Dec(vR);\r\n\r\n ExchangeItems(vL, vR);\r\n\r\n if Pivot = vL then // swap pivot if we just hit it from one side\r\n Pivot := vR\r\n else if Pivot = vR then\r\n Pivot := vL;\r\n end;\r\n\r\n if Pivot - 1 >= L then\r\n QuickSort(L, Pivot - 1, CompareFn);\r\n if Pivot + 1 <= R then\r\n QuickSort(Pivot + 1, R, CompareFn);\r\nend;\r\n\r\n\r\nprocedure TStringList.InsertItem(Index: Integer; const S: string);\r\nbegin\r\n InsertItem(Index, S, nil);\r\nend;\r\n\r\n\r\nprocedure TStringList.InsertItem(Index: Integer; const S: string; O: TObject);\r\n\r\nVar\r\n It : TStringItem;\r\n \r\nbegin\r\n Changing;\r\n If FCount=Capacity then Grow;\r\n it.FString:=S;\r\n it.FObject:=O;\r\n TJSArray(FList).Splice(Index,0,It);\r\n Inc(FCount);\r\n Changed;\r\nend;\r\n\r\n\r\nprocedure TStringList.SetSorted(Value: Boolean);\r\n\r\nbegin\r\n If Value then\r\n SortStyle:=sslAuto\r\n else\r\n SortStyle:=sslNone\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Changed;\r\n\r\nbegin\r\n If (FUpdateCount=0) Then\r\n begin\r\n If Assigned(FOnChange) then\r\n FOnchange(Self);\r\n end;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Changing;\r\n\r\nbegin\r\n If FUpdateCount=0 then\r\n if Assigned(FOnChanging) then\r\n FOnchanging(Self);\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.Get(Index: Integer): string;\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Result:=Flist[Index].FString;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.GetCapacity: Integer;\r\n\r\nbegin\r\n Result:=Length(FList);\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.GetCount: Integer;\r\n\r\nbegin\r\n Result:=FCount;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.GetObject(Index: Integer): TObject;\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Result:=Flist[Index].FObject;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Put(Index: Integer; const S: string);\r\n\r\nbegin\r\n If Sorted then\r\n Error(SSortedListError,0);\r\n CheckIndex(Index);\r\n Changing;\r\n Flist[Index].FString:=S;\r\n Changed;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.PutObject(Index: Integer; AObject: TObject);\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Changing;\r\n Flist[Index].FObject:=AObject;\r\n Changed;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.SetCapacity(NewCapacity: Integer);\r\n\r\nbegin\r\n If (NewCapacity<0) then\r\n Error (SListCapacityError,NewCapacity);\r\n If NewCapacity<>Capacity then\r\n SetLength(FList,NewCapacity)\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.SetUpdateState(Updating: Boolean);\r\n\r\nbegin\r\n If Updating then\r\n Changing\r\n else\r\n Changed\r\nend;\r\n\r\n\r\n\r\ndestructor TStringList.Destroy;\r\n\r\nbegin\r\n InternalClear;\r\n Inherited destroy;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.Add(const S: string): Integer;\r\n\r\nbegin\r\n If Not (SortStyle=sslAuto) then\r\n Result:=FCount\r\n else\r\n If Find (S,Result) then\r\n Case DUplicates of\r\n DupIgnore : Exit;\r\n DupError : Error(SDuplicateString,0)\r\n end;\r\n InsertItem (Result,S);\r\nend;\r\n\r\nprocedure TStringList.Clear;\r\n\r\nbegin\r\n if FCount = 0 then Exit;\r\n Changing;\r\n InternalClear;\r\n Changed;\r\nend;\r\n\r\nprocedure TStringList.Delete(Index: Integer);\r\n\r\nbegin\r\n CheckIndex(Index);\r\n Changing;\r\n if FOwnsObjects then\r\n FreeAndNil(Flist[Index].FObject);\r\n TJSArray(FList).splice(Index,1); \r\n FList[Count-1].FString:='';\r\n Flist[Count-1].FObject:=Nil;\r\n Dec(FCount);\r\n Changed;\r\nend;\r\n\r\nprocedure TStringList.Exchange(Index1, Index2: Integer);\r\n\r\nbegin\r\n CheckIndex(Index1);\r\n CheckIndex(Index2);\r\n Changing;\r\n ExchangeItemsInt(Index1,Index2);\r\n changed;\r\nend;\r\n\r\nprocedure TStringList.SetCaseSensitive(b : boolean);\r\nbegin\r\n if b=FCaseSensitive then\r\n Exit;\r\n FCaseSensitive:=b;\r\n if FSortStyle=sslAuto then\r\n begin\r\n FForceSort:=True;\r\n try\r\n Sort;\r\n finally\r\n FForceSort:=False;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TStringList.SetSortStyle(AValue: TStringsSortStyle);\r\nbegin\r\n if FSortStyle=AValue then Exit;\r\n if (AValue=sslAuto) then\r\n Sort;\r\n FSortStyle:=AValue;\r\nend;\r\n\r\nprocedure TStringList.CheckIndex(AIndex: Integer);\r\nbegin\r\n If (AIndex<0) or (AIndex>=FCount) then\r\n Error(SListIndexError,AIndex);\r\nend;\r\n\r\n\r\nfunction TStringList.DoCompareText(const s1, s2: string): PtrInt;\r\nbegin\r\n if FCaseSensitive then\r\n result:=CompareStr(s1,s2)\r\n else\r\n result:=CompareText(s1,s2);\r\nend;\r\n\r\n\r\nfunction TStringList.CompareStrings(const s1,s2 : string) : Integer;\r\nbegin\r\n Result := DoCompareText(s1, s2);\r\nend;\r\n\r\n\r\nfunction TStringList.Find(const S: string; out Index: Integer): Boolean;\r\n\r\nvar\r\n L, R, I: Integer;\r\n CompareRes: PtrInt;\r\nbegin\r\n Result := false;\r\n Index:=-1;\r\n if Not Sorted then\r\n Raise EListError.Create(SErrFindNeedsSortedList);\r\n // Use binary search.\r\n L := 0;\r\n R := Count - 1;\r\n while (L<=R) do\r\n begin\r\n I := L + (R - L) div 2;\r\n CompareRes := DoCompareText(S, Flist[I].FString);\r\n if (CompareRes>0) then\r\n L := I+1\r\n else begin\r\n R := I-1;\r\n if (CompareRes=0) then begin\r\n Result := true;\r\n if (Duplicates<>dupAccept) then\r\n L := I; // forces end of while loop\r\n end;\r\n end;\r\n end;\r\n Index := L;\r\nend;\r\n\r\n\r\n\r\nfunction TStringList.IndexOf(const S: string): Integer;\r\n\r\nbegin\r\n If Not Sorted then\r\n Result:=Inherited indexOf(S)\r\n else\r\n // faster using binary search...\r\n If Not Find (S,Result) then\r\n Result:=-1;\r\nend;\r\n\r\n\r\n\r\nprocedure TStringList.Insert(Index: Integer; const S: string);\r\n\r\nbegin\r\n If SortStyle=sslAuto then\r\n Error (SSortedListError,0)\r\n else\r\n begin\r\n If (Index<0) or (Index>FCount) then\r\n Error(SListIndexError,Index); // Cannot use CheckIndex, because there >= FCount...\r\n InsertItem (Index,S);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TStringList.CustomSort(CompareFn: TStringListSortCompare);\r\n\r\nbegin\r\n If (FForceSort or (Not (FSortStyle=sslAuto))) and (FCount>1) then\r\n begin\r\n Changing;\r\n QuickSort(0,FCount-1, CompareFn);\r\n Changed;\r\n end;\r\nend;\r\n\r\nfunction StringListAnsiCompare(List: TStringList; Index1, Index: Integer): Integer;\r\n\r\nbegin\r\n Result := List.DoCompareText(List.FList[Index1].FString,\r\n List.FList[Index].FString);\r\nend;\r\n\r\nprocedure TStringList.Sort;\r\n\r\nbegin\r\n CustomSort(@StringListAnsiCompare);\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TCollectionItem *}\r\n{****************************************************************************}\r\n\r\n\r\nfunction TCollectionItem.GetIndex: Integer;\r\n\r\nbegin\r\n if FCollection<>nil then\r\n Result:=FCollection.FItems.IndexOf(Self)\r\n else\r\n Result:=-1;\r\nend;\r\n\r\n\r\n\r\nprocedure TCollectionItem.SetCollection(Value: TCollection);\r\n\r\nbegin\r\n IF Value<>FCollection then\r\n begin\r\n If FCollection<>Nil then FCollection.RemoveItem(Self);\r\n if Value<>Nil then Value.InsertItem(Self);\r\n end;\r\nend;\r\n\r\n\r\n\r\nprocedure TCollectionItem.Changed(AllItems: Boolean);\r\n\r\nbegin\r\n If (FCollection<>Nil) and (FCollection.UpdateCount=0) then\r\n begin\r\n If AllItems then\r\n FCollection.Update(Nil)\r\n else\r\n FCollection.Update(Self);\r\n end;\r\nend;\r\n\r\n\r\n\r\nfunction TCollectionItem.GetNamePath: string;\r\n\r\nbegin\r\n If FCollection<>Nil then\r\n Result:=FCollection.GetNamePath+'['+IntToStr(Index)+']'\r\n else\r\n Result:=ClassName;\r\nend;\r\n\r\n\r\nfunction TCollectionItem.GetOwner: TPersistent;\r\n\r\nbegin\r\n Result:=FCollection;\r\nend;\r\n\r\n\r\n\r\nfunction TCollectionItem.GetDisplayName: string;\r\n\r\nbegin\r\n Result:=ClassName;\r\nend;\r\n\r\n\r\n\r\nprocedure TCollectionItem.SetIndex(Value: Integer);\r\n\r\nVar Temp : Longint;\r\n\r\nbegin\r\n Temp:=GetIndex;\r\n If (Temp>-1) and (Temp<>Value) then\r\n begin\r\n FCollection.FItems.Move(Temp,Value);\r\n Changed(True);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCollectionItem.SetDisplayName(const Value: string);\r\n\r\nbegin\r\n Changed(False);\r\n if Value='' then ;\r\nend;\r\n\r\n\r\n\r\nconstructor TCollectionItem.Create(ACollection: TCollection);\r\n\r\nbegin\r\n Inherited Create;\r\n SetCollection(ACollection);\r\nend;\r\n\r\n\r\n\r\ndestructor TCollectionItem.Destroy;\r\n\r\nbegin\r\n SetCollection(Nil);\r\n Inherited Destroy;\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TCollectionEnumerator *}\r\n{****************************************************************************}\r\n\r\nconstructor TCollectionEnumerator.Create(ACollection: TCollection);\r\nbegin\r\n inherited Create;\r\n FCollection := ACollection;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TCollectionEnumerator.GetCurrent: TCollectionItem;\r\nbegin\r\n Result := FCollection.Items[FPosition];\r\nend;\r\n\r\nfunction TCollectionEnumerator.MoveNext: Boolean;\r\nbegin\r\n Inc(FPosition);\r\n Result := FPosition < FCollection.Count;\r\nend;\r\n\r\n\r\n{****************************************************************************}\r\n{* TCollection *}\r\n{****************************************************************************}\r\n\r\nfunction TCollection.Owner: TPersistent;\r\nbegin\r\n result:=getowner;\r\nend;\r\n\r\n\r\nfunction TCollection.GetCount: Integer;\r\n\r\nbegin\r\n Result:=FItems.Count;\r\nend;\r\n\r\n\r\nProcedure TCollection.SetPropName;\r\n\r\n{\r\nVar\r\n TheOwner : TPersistent;\r\n PropList : PPropList;\r\n I, PropCount : Integer;\r\n}\r\nbegin\r\n FPropName:='';\r\n{\r\n TheOwner:=GetOwner;\r\n // TODO: This needs to wait till Mattias finishes typeinfo.\r\n // It's normally only used in the designer so should not be a problem currently.\r\n if (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) Then Exit;\r\n // get information from the owner RTTI\r\n PropCount:=GetPropList(TheOwner, PropList);\r\n Try\r\n For I:=0 To PropCount-1 Do\r\n If (PropList^[i]^.PropType^.Kind=tkClass) And\r\n (GetObjectProp(TheOwner, PropList^[i], ClassType)=Self) Then\r\n Begin\r\n FPropName:=PropList^[i]^.Name;\r\n Exit;\r\n End;\r\n Finally\r\n FreeMem(PropList);\r\n End;\r\n}\r\nend;\r\n\r\n\r\nfunction TCollection.GetPropName: string;\r\n\r\n{Var\r\n TheOwner : TPersistent;}\r\n\r\nbegin\r\n Result:=FPropNAme;\r\n// TheOwner:=GetOwner;\r\n// If (Result<>'') or (TheOwner=Nil) Or (TheOwner.Classinfo=Nil) then exit;\r\n SetPropName;\r\n Result:=FPropName;\r\nend;\r\n\r\n\r\nprocedure TCollection.InsertItem(Item: TCollectionItem);\r\nbegin\r\n If Not(Item Is FitemClass) then\r\n exit;\r\n FItems.add(Item);\r\n Item.FCollection:=Self;\r\n Item.FID:=FNextID;\r\n inc(FNextID);\r\n SetItemName(Item);\r\n Notify(Item,cnAdded);\r\n Changed;\r\nend;\r\n\r\n\r\nprocedure TCollection.RemoveItem(Item: TCollectionItem);\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n Notify(Item,cnExtracting);\r\n I:=FItems.IndexOfItem(Item,fromEnd);\r\n If (I<>-1) then\r\n FItems.Delete(I);\r\n Item.FCollection:=Nil;\r\n Changed;\r\nend;\r\n\r\n\r\nfunction TCollection.GetAttrCount: Integer;\r\nbegin\r\n Result:=0;\r\nend;\r\n\r\n\r\nfunction TCollection.GetAttr(Index: Integer): string;\r\nbegin\r\n Result:='';\r\n if Index=0 then ;\r\nend;\r\n\r\n\r\nfunction TCollection.GetItemAttr(Index, ItemIndex: Integer): string;\r\nbegin\r\n Result:=TCollectionItem(FItems.Items[ItemIndex]).DisplayName;\r\n if Index=0 then ;\r\nend;\r\n\r\n\r\nfunction TCollection.GetEnumerator: TCollectionEnumerator;\r\nbegin\r\n Result := TCollectionEnumerator.Create(Self);\r\nend;\r\n\r\n\r\nfunction TCollection.GetNamePath: string;\r\nvar o : TPersistent;\r\nbegin\r\n o:=getowner;\r\n if assigned(o) and (propname<>'') then\r\n result:=o.getnamepath+'.'+propname\r\n else\r\n result:=classname;\r\nend;\r\n\r\n\r\nprocedure TCollection.Changed;\r\nbegin\r\n if FUpdateCount=0 then\r\n Update(Nil);\r\nend;\r\n\r\n\r\nfunction TCollection.GetItem(Index: Integer): TCollectionItem;\r\nbegin\r\n Result:=TCollectionItem(FItems.Items[Index]);\r\nend;\r\n\r\n\r\nprocedure TCollection.SetItem(Index: Integer; Value: TCollectionItem);\r\nbegin\r\n TCollectionItem(FItems.items[Index]).Assign(Value);\r\nend;\r\n\r\n\r\nprocedure TCollection.SetItemName(Item: TCollectionItem);\r\nbegin\r\n if Item=nil then ;\r\nend;\r\n\r\nprocedure TCollection.Update(Item: TCollectionItem);\r\nbegin\r\n if Item=nil then ;\r\nend;\r\n\r\n\r\nconstructor TCollection.Create(AItemClass: TCollectionItemClass);\r\nbegin\r\n inherited create;\r\n FItemClass:=AItemClass;\r\n FItems:=TFpList.Create;\r\nend;\r\n\r\n\r\ndestructor TCollection.Destroy;\r\nbegin\r\n FUpdateCount:=1; // Prevent OnChange\r\n try\r\n DoClear;\r\n Finally\r\n FUpdateCount:=0;\r\n end;\r\n if assigned(FItems) then\r\n FItems.Destroy;\r\n Inherited Destroy;\r\nend;\r\n\r\n\r\nfunction TCollection.Add: TCollectionItem;\r\nbegin\r\n Result:=FItemClass.Create(Self);\r\nend;\r\n\r\n\r\nprocedure TCollection.Assign(Source: TPersistent);\r\nVar I : Longint;\r\nbegin\r\n If Source is TCollection then\r\n begin\r\n Clear;\r\n For I:=0 To TCollection(Source).Count-1 do\r\n Add.Assign(TCollection(Source).Items[I]);\r\n exit;\r\n end\r\n else\r\n Inherited Assign(Source);\r\nend;\r\n\r\n\r\nprocedure TCollection.BeginUpdate;\r\nbegin\r\n inc(FUpdateCount);\r\nend;\r\n\r\n\r\nprocedure TCollection.Clear;\r\nbegin\r\n if FItems.Count=0 then\r\n exit; // Prevent Changed\r\n BeginUpdate;\r\n try\r\n DoClear;\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCollection.DoClear;\r\nvar\r\n Item: TCollectionItem;\r\nbegin\r\n While FItems.Count>0 do\r\n begin\r\n Item:=TCollectionItem(FItems.Last);\r\n if Assigned(Item) then\r\n Item.Destroy;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TCollection.EndUpdate;\r\nbegin\r\n if FUpdateCount>0 then\r\n dec(FUpdateCount);\r\n if FUpdateCount=0 then\r\n Changed;\r\nend;\r\n\r\n\r\nfunction TCollection.FindItemID(ID: Integer): TCollectionItem;\r\nVar\r\n I : Longint;\r\nbegin\r\n For I:=0 to Fitems.Count-1 do\r\n begin\r\n Result:=TCollectionItem(FItems.items[I]);\r\n If Result.Id=Id then\r\n exit;\r\n end;\r\n Result:=Nil;\r\nend;\r\n\r\n\r\nprocedure TCollection.Delete(Index: Integer);\r\nVar\r\n Item : TCollectionItem;\r\nbegin\r\n Item:=TCollectionItem(FItems[Index]);\r\n Notify(Item,cnDeleting);\r\n If assigned(Item) then\r\n Item.Destroy;\r\nend;\r\n\r\n\r\nfunction TCollection.Insert(Index: Integer): TCollectionItem;\r\nbegin\r\n Result:=Add;\r\n Result.Index:=Index;\r\nend;\r\n\r\n\r\nprocedure TCollection.Notify(Item: TCollectionItem;Action: TCollectionNotification);\r\nbegin\r\n if Item=nil then ;\r\n if Action=cnAdded then ;\r\nend;\r\n\r\nprocedure TCollection.Sort(Const Compare : TCollectionSortCompare);\r\n\r\nbegin\r\n BeginUpdate;\r\n try\r\n FItems.Sort(TListSortCompare(Compare));\r\n Finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TCollection.Exchange(Const Index1, index2: integer);\r\n\r\nbegin\r\n FItems.Exchange(Index1,Index2);\r\nend;\r\n\r\n\r\n{****************************************************************************}\r\n{* TOwnedCollection *}\r\n{****************************************************************************}\r\n\r\n\r\n\r\nConstructor TOwnedCollection.Create(AOwner: TPersistent; AItemClass: TCollectionItemClass);\r\n\r\nBegin\r\n FOwner := AOwner;\r\n inherited Create(AItemClass);\r\nend;\r\n\r\nFunction TOwnedCollection.GetOwner: TPersistent;\r\n\r\nbegin\r\n Result:=FOwner;\r\nend;\r\n\r\n{****************************************************************************}\r\n{* TComponent *}\r\n{****************************************************************************}\r\n\r\n\r\nFunction TComponent.GetComponent(AIndex: Integer): TComponent;\r\n\r\nbegin\r\n If not assigned(FComponents) then\r\n Result:=Nil\r\n else\r\n Result:=TComponent(FComponents.Items[Aindex]);\r\nend;\r\n\r\nFunction TComponent.GetComponentCount: Integer;\r\n\r\nbegin\r\n If not assigned(FComponents) then\r\n result:=0\r\n else\r\n Result:=FComponents.Count;\r\nend;\r\n\r\n\r\nFunction TComponent.GetComponentIndex: Integer;\r\n\r\nbegin\r\n If Assigned(FOwner) and Assigned(FOwner.FComponents) then\r\n Result:=FOWner.FComponents.IndexOf(Self)\r\n else\r\n Result:=-1;\r\nend;\r\n\r\n\r\nProcedure TComponent.Insert(AComponent: TComponent);\r\n\r\nbegin\r\n If not assigned(FComponents) then\r\n FComponents:=TFpList.Create;\r\n FComponents.Add(AComponent);\r\n AComponent.FOwner:=Self;\r\nend;\r\n\r\n\r\nProcedure TComponent.Remove(AComponent: TComponent);\r\n\r\nbegin\r\n AComponent.FOwner:=Nil;\r\n If assigned(FCOmponents) then\r\n begin\r\n FComponents.Remove(AComponent);\r\n IF FComponents.Count=0 then\r\n begin\r\n FComponents.Destroy;\r\n FComponents:=Nil;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nProcedure TComponent.RemoveNotification(AComponent: TComponent);\r\n\r\nbegin\r\n if FFreeNotifies<>nil then\r\n begin\r\n FFreeNotifies.Remove(AComponent);\r\n if FFreeNotifies.Count=0 then\r\n begin\r\n FFreeNotifies.Destroy;\r\n FFreeNotifies:=nil;\r\n Exclude(FComponentState,csFreeNotification);\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nProcedure TComponent.SetComponentIndex(Value: Integer);\r\n\r\nVar Temp,Count : longint;\r\n\r\nbegin\r\n If Not assigned(Fowner) then exit;\r\n Temp:=getcomponentindex;\r\n If temp<0 then exit;\r\n If value<0 then value:=0;\r\n Count:=Fowner.FComponents.Count;\r\n If Value>=Count then value:=count-1;\r\n If Value<>Temp then\r\n begin\r\n FOWner.FComponents.Delete(Temp);\r\n FOwner.FComponents.Insert(Value,Self);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.BeginUpdate;\r\nbegin\r\n\r\nend;\r\n\r\nProcedure TComponent.ChangeName(const NewName: TComponentName);\r\n\r\nbegin\r\n FName:=NewName;\r\nend;\r\n\r\n\r\nProcedure TComponent.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\n\r\nbegin\r\n // Does nothing.\r\n if Proc=nil then ;\r\n if Root=nil then ;\r\nend;\r\n\r\n\r\nFunction TComponent.GetChildOwner: TComponent;\r\n\r\nbegin\r\n Result:=Nil;\r\nend;\r\n\r\n\r\nFunction TComponent.GetChildParent: TComponent;\r\n\r\nbegin\r\n Result:=Self;\r\nend;\r\n\r\n\r\nFunction TComponent.GetNamePath: string;\r\n\r\nbegin\r\n Result:=FName;\r\nend;\r\n\r\n\r\nFunction TComponent.GetOwner: TPersistent;\r\n\r\nbegin\r\n Result:=FOwner;\r\nend;\r\n\r\n\r\nfunction TComponent.GetLeft: Integer;\r\nbegin\r\n Result := FLeft;\r\nend;\r\n\r\nfunction TComponent.GetTop: Integer;\r\nbegin\r\n Result := FTop;\r\nend;\r\n\r\nProcedure TComponent.Loaded;\r\n\r\nbegin\r\n Exclude(FComponentState,csLoading);\r\nend;\r\n\r\nProcedure TComponent.Loading;\r\n\r\nbegin\r\n Include(FComponentState,csLoading);\r\nend;\r\n\r\n\r\nProcedure TComponent.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\n\r\nVar\r\n C : Longint;\r\n\r\nbegin\r\n If (Operation=opRemove) then\r\n RemoveFreeNotification(AComponent);\r\n If Not assigned(FComponents) then\r\n exit;\r\n C:=FComponents.Count-1;\r\n While (C>=0) do\r\n begin\r\n TComponent(FComponents.Items[C]).Notification(AComponent,Operation);\r\n Dec(C);\r\n if C>=FComponents.Count then\r\n C:=FComponents.Count-1;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.PaletteCreated;\r\nbegin\r\nend;\r\n\r\n\r\n\r\nProcedure TComponent.SetAncestor(Value: Boolean);\r\n\r\nVar Runner : Longint;\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csAncestor)\r\n else\r\n Exclude(FCOmponentState,csAncestor);\r\n if Assigned(FComponents) then\r\n For Runner:=0 To FComponents.Count-1 do\r\n TComponent(FComponents.Items[Runner]).SetAncestor(Value);\r\nend;\r\n\r\n\r\nProcedure TComponent.SetDesigning(Value: Boolean; SetChildren : Boolean = True);\r\n\r\nVar Runner : Longint;\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csDesigning)\r\n else\r\n Exclude(FComponentState,csDesigning);\r\n if Assigned(FComponents) and SetChildren then\r\n For Runner:=0 To FComponents.Count - 1 do\r\n TComponent(FComponents.items[Runner]).SetDesigning(Value);\r\nend;\r\n\r\nProcedure TComponent.SetDesignInstance(Value: Boolean);\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csDesignInstance)\r\n else\r\n Exclude(FComponentState,csDesignInstance);\r\nend;\r\n\r\nProcedure TComponent.SetInline(Value: Boolean);\r\n\r\nbegin\r\n If Value then\r\n Include(FComponentState,csInline)\r\n else\r\n Exclude(FComponentState,csInline);\r\nend;\r\n\r\n\r\nProcedure TComponent.SetName(const NewName: TComponentName);\r\n\r\nbegin\r\n If FName=NewName then exit;\r\n If (NewName<>'') and not IsValidIdent(NewName) then\r\n Raise EComponentError.CreateFmt(SInvalidName,[NewName]);\r\n If Assigned(FOwner) Then\r\n FOwner.ValidateRename(Self,FName,NewName)\r\n else\r\n ValidateRename(Nil,FName,NewName);\r\n ChangeName(NewName);\r\nend;\r\n\r\n\r\nProcedure TComponent.SetChildOrder(Child: TComponent; Order: Integer);\r\n\r\nbegin\r\n // does nothing\r\n if Child=nil then ;\r\n if Order=0 then ;\r\nend;\r\n\r\n\r\nprocedure TComponent.SetLeft(AValue: Integer);\r\nbegin\r\n FLeft := AValue;\r\nend;\r\n\r\nprocedure TComponent.SetTop(AValue: Integer);\r\nbegin\r\n FTop := AValue;\r\nend;\r\n\r\nProcedure TComponent.SetParentComponent(Value: TComponent);\r\n\r\nbegin\r\n // Does nothing\r\n if Value=nil then ;\r\nend;\r\n\r\nProcedure TComponent.Updating;\r\n\r\nbegin\r\n Include (FComponentState,csUpdating);\r\nend;\r\n\r\n\r\nProcedure TComponent.Updated;\r\n\r\nbegin\r\n Exclude(FComponentState,csUpdating);\r\nend;\r\n\r\n\r\nProcedure TComponent.ValidateRename(AComponent: TComponent;\r\n const CurName, NewName: string);\r\n\r\nbegin\r\n//!! This contradicts the Delphi manual.\r\n If (AComponent<>Nil) and (CompareText(CurName,NewName)<>0) and (AComponent.Owner = Self) and\r\n (FindComponent(NewName)<>Nil) then\r\n raise EComponentError.Createfmt(SDuplicateName,[newname]);\r\n If (csDesigning in FComponentState) and (FOwner<>Nil) then\r\n FOwner.ValidateRename(AComponent,Curname,Newname);\r\nend;\r\n\r\n\r\nProcedure TComponent.ValidateContainer(AComponent: TComponent);\r\n\r\nbegin\r\n AComponent.ValidateInsert(Self);\r\nend;\r\n\r\n\r\nProcedure TComponent.ValidateInsert(AComponent: TComponent);\r\n\r\nbegin\r\n // Does nothing.\r\n if AComponent=nil then ;\r\nend;\r\n\r\n\r\nConstructor TComponent.Create(AOwner: TComponent);\r\n\r\nbegin\r\n FComponentStyle:=[csInheritable];\r\n If Assigned(AOwner) then AOwner.InsertComponent(Self);\r\nend;\r\n\r\n\r\nDestructor TComponent.Destroy;\r\n\r\nVar\r\n I : Integer;\r\n C : TComponent;\r\n\r\nbegin\r\n Destroying;\r\n If Assigned(FFreeNotifies) then\r\n begin\r\n I:=FFreeNotifies.Count-1;\r\n While (I>=0) do\r\n begin\r\n C:=TComponent(FFreeNotifies.Items[I]);\r\n // Delete, so one component is not notified twice, if it is owned.\r\n FFreeNotifies.Delete(I);\r\n C.Notification (self,opRemove);\r\n If (FFreeNotifies=Nil) then\r\n I:=0\r\n else if (I>FFreeNotifies.Count) then\r\n I:=FFreeNotifies.Count;\r\n dec(i);\r\n end;\r\n FreeAndNil(FFreeNotifies);\r\n end;\r\n DestroyComponents;\r\n If FOwner<>Nil Then FOwner.RemoveComponent(Self);\r\n inherited destroy;\r\nend;\r\n\r\n\r\nprocedure TComponent.AfterLoadDFMValues;\r\nbegin\r\n EndUpdate;\r\nend;\r\n\r\nProcedure TComponent.BeforeDestruction;\r\nbegin\r\n if not(csDestroying in FComponentstate) then\r\n Destroying;\r\nend;\r\n\r\nprocedure TComponent.BeforeLoadDFMValues;\r\nbegin\r\n BeginUpdate;\r\nend;\r\n\r\nProcedure TComponent.DestroyComponents;\r\n\r\nVar acomponent: TComponent;\r\n\r\nbegin\r\n While assigned(FComponents) do\r\n begin\r\n aComponent:=TComponent(FComponents.Last);\r\n Remove(aComponent);\r\n Acomponent.Destroy;\r\n end;\r\nend;\r\n\r\n\r\nProcedure TComponent.Destroying;\r\n\r\nVar Runner : longint;\r\n\r\nbegin\r\n If csDestroying in FComponentstate Then Exit;\r\n include (FComponentState,csDestroying);\r\n If Assigned(FComponents) then\r\n for Runner:=0 to FComponents.Count-1 do\r\n TComponent(FComponents.Items[Runner]).Destroying;\r\nend;\r\n\r\n\r\nprocedure TComponent.EndUpdate;\r\nbegin\r\n\r\nend;\r\n\r\nFunction TComponent.FindComponent(const AName: string): TComponent;\r\n\r\nVar I : longint;\r\n\r\nbegin\r\n Result:=Nil;\r\n If (AName='') or Not assigned(FComponents) then exit;\r\n For i:=0 to FComponents.Count-1 do\r\n if (CompareText(TComponent(FComponents[I]).Name,AName)=0) then\r\n begin\r\n Result:=TComponent(FComponents.Items[I]);\r\n exit;\r\n end;\r\nend;\r\n\r\n\r\nProcedure TComponent.FreeNotification(AComponent: TComponent);\r\n\r\nbegin\r\n If (Owner<>Nil) and (AComponent=Owner) then exit;\r\n If not (Assigned(FFreeNotifies)) then\r\n FFreeNotifies:=TFpList.Create;\r\n If FFreeNotifies.IndexOf(AComponent)=-1 then\r\n begin\r\n FFreeNotifies.Add(AComponent);\r\n AComponent.FreeNotification (self);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TComponent.RemoveFreeNotification(AComponent: TComponent);\r\nbegin\r\n RemoveNotification(AComponent);\r\n AComponent.RemoveNotification (self);\r\nend;\r\n\r\n\r\nFunction TComponent.GetParentComponent: TComponent;\r\n\r\nbegin\r\n Result:=Nil;\r\nend;\r\n\r\n\r\nFunction TComponent.HasParent: Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\n\r\nProcedure TComponent.InsertComponent(AComponent: TComponent);\r\n\r\nbegin\r\n AComponent.ValidateContainer(Self);\r\n ValidateRename(AComponent,'',AComponent.FName);\r\n Insert(AComponent);\r\n If csDesigning in FComponentState then\r\n AComponent.SetDesigning(true);\r\n Notification(AComponent,opInsert);\r\nend;\r\n\r\n\r\nProcedure TComponent.RemoveComponent(AComponent: TComponent);\r\n\r\nbegin\r\n Notification(AComponent,opRemove);\r\n Remove(AComponent);\r\n Acomponent.Setdesigning(False);\r\n ValidateRename(AComponent,AComponent.FName,'');\r\nend;\r\n\r\nprocedure TComponent.SetSubComponent(ASubComponent: Boolean);\r\nbegin\r\n if ASubComponent then\r\n Include(FComponentStyle, csSubComponent)\r\n else\r\n Exclude(FComponentStyle, csSubComponent);\r\nend;\r\n\r\nfunction TComponent.GetEnumerator: TComponentEnumerator;\r\nbegin\r\n Result:=TComponentEnumerator.Create(Self);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Global routines\r\n ---------------------------------------------------------------------}\r\n\r\nvar\r\n ClassList : TJSObject;\r\n \r\nProcedure RegisterClass(AClass : TPersistentClass);\r\n\r\nbegin\r\n ClassList[AClass.ClassName]:=AClass;\r\nend;\r\n\r\nFunction GetClass(AClassName : string) : TPersistentClass;\r\n\r\nbegin\r\n Result:=nil;\r\n if AClassName='' then exit;\r\n //if not ClassList.hasOwnProperty(AClassName) then exit;\r\n Result:=TPersistentClass(ClassList[AClassName]);\r\nend;\r\n\r\ninitialization\r\n ClassList:=TJSObject.create(nil);\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\n{$mode objfpc}\r\n{$modeswitch externalclass}\r\n\r\nunit Web;\r\n\r\ninterface\r\n\r\nuses Types, JS;\r\n\r\nType\r\n // Forward definitions\r\n TJSWindow = class;\r\n TJSDOMTokenList = class;\r\n TJSXPathResult = CLass;\r\n TJSNodeList = class;\r\n TJSDocument = class;\r\n TJSElement = class;\r\n TJSCSSStyleSheet = Class;\r\n TJSNodeFilter = Class;\r\n TJSIDBObjectStore = Class;\r\n TIDBDatabase = class;\r\n TJSIDBRequest = class;\r\n TJSEventTarget = class;\r\n TJSMouseEvent = Class;\r\n TJSWheelEvent = Class;\r\n TJSKeyBoardEvent = class;\r\n TJSPointerEvent = Class;\r\n TJSUIEvent = class;\r\n TJSTouchEvent = Class;\r\n TJSMessageEvent = class;\r\n\r\n TJSAttr = class external name 'Attr'\r\n Private\r\n fLocalName : String; external name 'localName';\r\n fNameSpaceURI : String external name 'namespaceURI';\r\n fPrefix : string; external name 'prefix';\r\n fName : string; external name 'name';\r\n public\r\n value : JSValue;\r\n property localName : String Read fLocalName;\r\n property namespaceURI : string Read fNameSpaceURI;\r\n property prefix : string read fPrefix;\r\n property name : string Read fName;\r\n end;\r\n\r\n\r\n { TEventListenerEvent }\r\n\r\n TEventListenerEvent = class external name 'EventListener_Event'\r\n private\r\n FTarget: TJSEventTarget; external name 'target';\r\n public\r\n Property target: TJSEventTarget Read FTarget;\r\n end;\r\n\r\n TJSEventHandler = reference to function(Event: TEventListenerEvent): boolean;\r\n\r\n TJSEventTarget = class external name 'EventTarget'\r\n public\r\n procedure addEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure addEventListener(aname : string; aListener : JSValue);\r\n function dispatchEvent(event : JSValue) : Boolean;\r\n procedure removeEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure removeEventListener(aname : string; aListener : JSValue);\r\n end;\r\n\r\n TJSNode = class external name 'Node' (TJSEventTarget)\r\n Private\r\n FBaseURI : String; external name 'baseURI';\r\n FChildNodes: TJSNodeList; external name 'childNodes';\r\n FFirstChild : TJSNode; external name 'firstChild';\r\n FNextSibling : TJSNode; external name 'nextSibling';\r\n FNodeName : String; external name 'nodeName';\r\n FNodeType : NativeInt; external name 'nodeType';\r\n FOwnerDocument : TJSDocument; external name 'ownerDocument';\r\n FParentElement : TJSElement; external name 'parentElement';\r\n FParentNode : TJSNode; external name 'parentNode';\r\n FPreviousSibling : TJSNode; external name 'previousSibling';\r\n Public \r\n Const\r\n ELEMENT_NODE \t=1;\r\n TEXT_NODE \t=3;\r\n PROCESSING_INSTRUCTION_NODE = \t7;\r\n COMMENT_NODE \t=8;\r\n DOCUMENT_NODE \t=9;\r\n DOCUMENT_TYPE_NODE \t= 10;\r\n DOCUMENT_FRAGMENT_NODE = 11;\r\n\r\n DOCUMENT_POSITION_DISCONNECTED \t= 1;\r\n DOCUMENT_POSITION_PRECEDING \t= 2;\r\n DOCUMENT_POSITION_FOLLOWING \t= 4;\r\n DOCUMENT_POSITION_CONTAINS \t= 8;\r\n DOCUMENT_POSITION_CONTAINED_BY \t= 16;\r\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32;\r\n Public \r\n nodeValue: string;\r\n innerText : string;\r\n textContent : string;\r\n function appendChild(aChild : TJSNode) : TJSNode;\r\n function cloneNode(deep: boolean): TJSNode;\r\n function compareDocumentPosition(aNode : TJSNode) : NativeInt;\r\n function contains(aNode : TJSNode) : boolean;\r\n function hasChildNodes : boolean;\r\n function insertBefore(newNode, referenceNode : TJSNode) : TJSNode;\r\n function isDefaultNameSpace(aNameSpaceURI : String) : Boolean;\r\n function isEqualNode(aNode : TJSNode) : boolean;\r\n function isSameNode(aNode : TJSNode) : boolean;\r\n function lookupNamespaceURI(aPrefix : string) : string;\r\n function lookupPrefix(aPrefix : string) : string;\r\n procedure normalize;\r\n function removeChild(aChild: TJSNode) : TJSNode;\r\n function replaceChild(aNewChild, aOldChild : TJSNode) : TJSNode;\r\n property baseURI : string read FBaseURI;\r\n property childNodes : TJSNodeList read FChildNodes;\r\n property firstChild : TJSNode Read FFirstChild;\r\n property nextSibling : TJSNode Read FNextSibling;\r\n property nodeName : String Read FNodeName;\r\n property nodeType : NativeInt Read FNodeType;\r\n property ownerDocument : TJSDocument read FOwnerDocument; \r\n property parentElement : TJSElement read FParentElement;\r\n property parentNode : TJSNode read FParentNode;\r\n property previousSibling : TJSNode Read FPreviousSibling;\r\n end;\r\n\r\n TJSNodeListCallBack = procedure (currentValue : TJSNode; currentIndex: NativeInt; list : TJSNodeList);\r\n TJSNodeListEvent = procedure (currentValue : TJSNode; currentIndex: NativeInt; list : TJSNodeList) of object;\r\n \r\n TJSNodeList = class external name 'NodeList'\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n Public\r\n procedure forEach(const aCallBack : TJSNodeListCallBack);\r\n procedure forEach(const aCallBack : TJSNodeListEvent);\r\n function item(aIndex : NativeInt) : TJSNode;\r\n Property length : NativeInt Read FLength;\r\n Property Nodes [aIndex : NativeInt] : TJSNode Read item; default;\r\n end;\r\n \r\n TJSNamedNodeMap = class external name 'NamedNodeMap'\r\n Public\r\n function getNamedItem(aName : string) : TJSAttr;\r\n Property Attrs[aIndex : String] : TJSattr Read getNamedItem; default;\r\n end;\r\n \r\n TJSHTMLCollection = class external name 'HTMLCollection'\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n public\r\n Function item(aIndex : Integer) : TJSNode;\r\n Function namedItem(aName : string) : TJSNode;\r\n property Items[aIndex : Integer] : TJSNode Read item; default;\r\n property NamedItems[aName : String] : TJSNode Read namedItem; \r\n Property length : NativeInt Read FLength;\r\n end; \r\n \r\n TJSDOMString = String;\r\n\r\n TDOMTokenlistCallBack = Procedure (Current : JSValue; currentIndex : NativeInt; list : TJSDOMTokenList);\r\n \r\n // Interface\r\n TJSDOMTokenList = class external name 'DOMTokenList'\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n public\r\n Procedure add(aToken : TJSDOMString); varargs;\r\n Procedure remove(aToken : TJSDOMString); varargs;\r\n function item(aIndex : NativeInt) : String;\r\n function contains(aToken : TJSDOMString) : Boolean;\r\n Procedure replace(aOldToken, ANewToken : TJSDOMString);\r\n function supports(aToken : TJSDOMString) : Boolean;\r\n function toggle(aToken : TJSDOMString) : Boolean;\r\n // entries,keys, values\r\n procedure forEach(const callback: TDOMTokenlistCallBack);\r\n property length : NativeInt read FLength;\r\n end;\r\n\r\n TJSDOMRect = class external name 'DOMRect'\r\n public\r\n left,top,right,bottom,x,y,width,height : double;\r\n {$IFDEF FIREFOX}\r\n constructor New;\r\n {$ENDIF}\r\n end;\r\n TJSClientRect = record\r\n left,top,right,bottom : double;\r\n {$IFDEF FIREFOX}\r\n width, height: double;\r\n {$ENDIF}\r\n end;\r\n \r\n TJSClientRectArray = array of TJSClientRect;\r\n \r\n TJSElement = class external name 'Element' (TJSNode)\r\n Private\r\n FAttributes : TJSNamedNodeMap; external name 'attributes';\r\n FChildElementCount : NativeInt; external name 'childElementCount';\r\n FChildren : TJSHTMLCollection; external name 'children';\r\n FClassList : TJSDOMTokenList; external name 'classList';\r\n FCLientHeight : NativeInt; external name 'clientHeight';\r\n FCLientLeft : NativeInt; external name 'clientLeft';\r\n FCLientTop : NativeInt; external name 'clientTop';\r\n FCLientWidth : NativeInt; external name 'clientWidth';\r\n FFirstElementChild : TJSElement; external name 'firstElementChild';\r\n FLastElementChild : TJSElement; external name 'lastElementChild';\r\n FLocalName : string; external name 'localName';\r\n FNameSpaceURI : String; external name 'namespaceURI';\r\n FNextElementSibling : TJSElement; external name 'nextElementSibling';\r\n FPreviousElementSibling : TJSElement; external name 'previousElementSibling';\r\n FPrefix : String; external name 'prefix';\r\n FScrollHeight : NativeInt; external name 'scrollHeight';\r\n{$IFDEF FIREFOX}\r\n FScrollLeftMax : NativeInt; external name 'scrollLeftMax';\r\n FScrollTopMax : NativeInt; external name 'scrollTopMax';\r\n{$endif}\r\n FScrollWidth : NativeInt; external name 'scrollWidth';\r\n FTagName : string; external name 'tagName';\r\n Public\r\n name : string;\r\n className : string;\r\n id : string;\r\n innerHTML : String;\r\n outerHTML : string;\r\n scrollLeft : NativeInt;\r\n scrollTop : NativeInt;\r\n procedure append(aText : String); overload;\r\n procedure append(aNode : TJSElement); overload;\r\n procedure append(aText : String; aNode : TJSElement); varargs; overload;\r\n procedure append(aNode1,aNode2: TJSElement); varargs; overload;\r\n function getAttribute(aName : string) : string;\r\n function getAttributeNode(aName : string) : TJSAttr;\r\n function getAttributeNodeNS(aNameSpace, aName : string) : TJSAttr;\r\n function getAttributeNS(aNameSpace, aName : string) : string;\r\n function getBoundingClientRect : TJSDOMRect;\r\n function getClientRects : TJSClientRectArray;\r\n function getElementsByClassName(aClassName: string) : TJSHTMLCollection;\r\n function getElementsByTagNameNS(aNameSpace, aTagName : String): TJSHTMLCollection;\r\n function getElementsByTagName(aTagName : String): TJSHTMLCollection;\r\n function hasAttribute(aName : String) : Boolean;\r\n function hasAttributeNS(aNameSpace,aName : String) : Boolean;\r\n function hasAttributes : Boolean;\r\n function insertAdjacentElement(aPosition : string; aElement : TJSElement) : TJSElement;\r\n procedure insertAdjacentHTML(aPosition,aHTML : string);\r\n procedure insertAdjacentText(aPosition,aText : string);\r\n function matches(aSelectorString : String) : Boolean;\r\n function querySelector(aSelectors : String) : TJSElement;\r\n function querySelectorAll(aSelectors : String) : TJSNodeList;\r\n procedure releasePointerCapture(evID : JSValue);\r\n procedure removeAttribute(aName: string);\r\n procedure removeAttributeNS(aNameSpace,aName: string);\r\n function removeAttributeNode(aAttr : TJSAttr) : TJSAttr;\r\n procedure setAttribute(aName : string; AValue : String);\r\n function setAttributeNode(aNode: TJSAttr) : TJSAttr;\r\n function setAttributeNodeNS(aNode: TJSAttr) : TJSAttr;\r\n procedure setAttributeNS(aNameSpace,aName : string; AValue : String);\r\n procedure setCapture(retargetToElement : Boolean);\r\n procedure setPointerCapture(pointerID : JSValue);\r\n procedure requestFullScreen; \r\n Property attributes : TJSNamedNodeMap read FAttributes;\r\n Property childElementCount : NativeInt Read FChildElementCount;\r\n Property children : TJSHTMLCollection Read FChildren;\r\n Property classList : TJSDOMTokenList read FClassList;\r\n property clientHeight : NativeInt read FClientHeight;\r\n property clientLeft : NativeInt read FClientLeft;\r\n property clientTop : NativeInt read FClientTop;\r\n property clientWidth : NativeInt read FClientWidth;\r\n property firstElementChild : TJSElement Read FFirstElementChild;\r\n property lastElementChild : TJSElement Read FLastElementChild;\r\n property localName : string Read FLocalName;\r\n property namespaceURI : String read FNameSpaceURI;\r\n property nextElementSibling : TJSElement Read FNextElementSibling;\r\n property previousElementSibling : TJSElement Read FPreviousElementSibling;\r\n property prefix : String read FPrefix;\r\n property scrollHeight : NativeInt Read FScrollHeight;\r\n{$IFDEF FIREFOX}\r\n property scrollLeftMax : NativeInt Read FScrollLeftMax;\r\n property scrollTopMax : NativeInt Read FScrollTopMax;\r\n{$ENDIF}\r\n property scrollWidth : NativeInt Read FScrollWidth;\r\n property tagName : String read FTagName;\r\n Property Attrs[aName : string] : String read getAttribute write setAttribute; default;\r\n end;\r\n \r\n TJSElementCreationOptions = record\r\n named : string;\r\n end;\r\n \r\n TJSDocumentType = class external name 'DocumentType' (TJSNode)\r\n private\r\n FName : String; external name 'name';\r\n FPublicID : String; external name 'publicId';\r\n FSystemID : String; external name 'systemId';\r\n public\r\n property name : String read FName;\r\n property publicId : String Read FPublicID;\r\n property systemId : String read FSystemID;\r\n end;\r\n\r\n TJSDOMImplementation = class external name 'DocumentImplementation'\r\n Public \r\n function createDocument(aNamespaceURI, aQualifiedNameStr : String; aDocumentType : TJSDocumentType) : TJSDocument;\r\n function createDocumentType(aQualifiedNameStr,aPublicId,aSystemId : String) : TJSDocumentType;\r\n function createHTMLDocument(aTitle : String) : TJSDocument;\r\n end;\r\n\r\n TJSLocation = class external name 'Location'\r\n Private\r\n FOrigin : string;\r\n Public\r\n hash : string;\r\n host : string;\r\n hostname : string;\r\n href : string;\r\n password : string;\r\n pathname : string;\r\n port : string;\r\n protocol : string;\r\n search : string;\r\n username : string;\r\n procedure assign(aURL : String);\r\n procedure reload(aForce : Boolean);\r\n procedure replace(aURL : String);\r\n function toString : String;\r\n property origin : string read FOrigin;\r\n end;\r\n \r\n TJSStyleSheet = class external name 'StyleSheet' (TJSEventTarget)\r\n Private\r\n FHRef : String; external name 'href';\r\n FOwnerNode : TJSNode; external name 'ownerNode';\r\n FParentStyleSheet : TJSStyleSheet; external name 'parentStyleSheet';\r\n FTitle : String; external name 'title';\r\n FType : String; external name 'type';\r\n Public\r\n disabled : String;\r\n Property href : String read FHRef;\r\n property ownerNode : TJSNode Read FOwnerNode;\r\n property parentStyleSheet : TJSStyleSheet read FParentStyleSheet;\r\n property title : string Read FTitle;\r\n property _type : String read FType;\r\n end;\r\n\r\n\r\n TJSCSSRule = class external name 'CSSRule'\r\n Private\r\n FCSSText : String; external name 'cssText';\r\n FParentStyleSheet : TJSCSSStyleSheet; external name 'parentStyleSheet';\r\n FparentRule : TJSCSSRule; external name 'parentRule';\r\n Public\r\n property cssText : String Read FCSSText;\r\n property parentRule : TJSCSSRule read FparentRule;\r\n property parentStyleSheet : TJSCSSStyleSheet Read FParentStyleSheet;\r\n end;\r\n \r\n TJSCSSRuleList = Class external name 'CSSRuleList'\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n Public\r\n function item(index : NativeInt) : TJSCSSRule;\r\n property length : NativeInt Read FLength;\r\n Property items[aIndex : NativeInt] : TJSCSSRule read item; default;\r\n end;\r\n \r\n \r\n TJSCSSStyleSheet = class external name 'CSSStyleSheet' (TJSStyleSheet)\r\n Private\r\n FCSSRules : TJSCSSRuleList; external name 'cssRules';\r\n Public\r\n procedure deleteRule(aIndex : NativeInt);\r\n function insertRule(aRule : String; aIndex : NativeInt) : NativeInt;\r\n Property cssRules : TJSCSSRuleList read FCSSRules;\r\n end;\r\n\r\n TJSStyleSheetList = Class external name 'StyleSheetList'\r\n Private\r\n FLength : NativeInt; external name 'length';\r\n Public\r\n function item(index : NativeInt) : TJSStyleSheet;\r\n property length : NativeInt Read FLength;\r\n Property items[aIndex : NativeInt] : TJSStyleSheet read item; default;\r\n end;\r\n\r\n { TJSDocumentFragment }\r\n\r\n TJSDocumentFragment = Class external name 'DocumentFragment' (TJSNode)\r\n private\r\n FchildElementCount: Integer; external name 'childElementCount';\r\n Fchildren: TJSHTMLCollection; external name 'children';\r\n FfirstElementChild: TJSElement; external name 'firstElementChild';\r\n FlastElementChild: TJSElement; external name 'lastElementChild';\r\n public\r\n constructor new;\r\n function querySelector(aSelector : String) : TJSElement;\r\n function querySelectorAll(aSelector : String) : TJSNodeList;\r\n property childElementCount : Integer read FchildElementCount;\r\n property children : TJSHTMLCollection read Fchildren;\r\n property firstElementChild : TJSElement read FfirstElementChild;\r\n property lastElementChild : TJSElement read FlastElementChild;\r\n end;\r\n\r\n TJSEventInit = record\r\n bubbles : boolean;\r\n cancelable : boolean;\r\n scoped : boolean;\r\n composed : boolean;\r\n end;\r\n\r\n TJSEvent = class external name 'Event'\r\n Private\r\n FBubbles : Boolean; external name 'bubbles';\r\n FCancelable : Boolean; external name 'cancelable';\r\n FComposed : Boolean; external name 'composed';\r\n FCurrentTarget : TJSElement; external name 'currentTarget';\r\n FdefaultPrevented : Boolean; external name 'defaultPrevented';\r\n FEventPhase : NativeInt; external name 'eventPhase';\r\n FTarget : TJSElement; external name 'target';\r\n FTimeStamp : NativeInt; external name 'timestamp';\r\n FType : String; external name 'type';\r\n FIsTrusted : Boolean; external name 'isTrusted';\r\n Public\r\n Const\r\n NONE = 0;\r\n CAPTURING_PHASE = 1;\r\n AT_TARGET = 2;\r\n BUBBLING_PHASE = 3;\r\n public \r\n cancelBubble : Boolean;\r\n constructor new (aType : String; const aInit : TJSEventInit); overload;\r\n procedure preventDefault;\r\n procedure stopImmediatePropagation;\r\n procedure stopPropagation;\r\n Property bubbles : Boolean Read FBubbles;\r\n Property cancelable : Boolean Read FCancelable;\r\n Property composed : Boolean Read FComposed;\r\n property currentTarget : TJSElement Read FCurrentTarget;\r\n property defaultPrevented : Boolean Read FdefaultPrevented;\r\n property eventPhase : NativeInt Read FEventPhase;\r\n property target : TJSElement Read FTarget;\r\n Property timestamp : NativeInt Read FTimeStamp;\r\n property _type : string read FType;\r\n property isTrusted : Boolean Read FIsTrusted;\r\n end;\r\n\r\n\r\n TJSXPathExpression = class external name 'XPathExpression'\r\n Public\r\n function evaluate(contextNode : TJSNode; aType : NativeInt; aResult : TJSXPathResult) : TJSXPathResult;\r\n function evaluateWithContext(contextNode : TJSNode; aPosition, aSize, aType : NativeInt; aResult : TJSXPathResult) : TJSXPathResult;\r\n end;\r\n\r\n TJSXPathNSResolver = class external name 'XPathNSResolver'\r\n Public\r\n function lookupNamespaceURI(prefix : string) : string;\r\n end;\r\n\r\n { TJSCharacterData }\r\n\r\n TJSCharacterData = class external name 'CharacterData' (TJSNode)\r\n private\r\n FnextElementSibling: TJSElement; external name 'nextElementSibling';\r\n FpreviousElementSibling: TJSElement; external name 'previousElementSibling';\r\n public\r\n property nextElementSibling : TJSElement read FnextElementSibling;\r\n property previousElementSibling : TJSElement read FpreviousElementSibling;\r\n end;\r\n\r\n TJSProcessingInstruction = class external name 'ProcessingInstruction' (TJSCharacterData);\r\n\r\n { TJSRange }\r\n\r\n TJSRange = class external name 'Range'\r\n private\r\n FCollapsed: boolean; external name 'collapsed';\r\n FcommonAncestorContainer: TJSNode; external name 'commonAncestorContainer';\r\n FendContainer: TJSNode; external name 'endContainer';\r\n FEndOffset: NativeInt; external name 'endOffset';\r\n FstartContainer: TJSNode; external name 'startContainer';\r\n FstartOffset: NativeInt; external name 'startOffset';\r\n Public\r\n const\r\n END_TO_END = 0;\r\n END_TO_START = 1;\r\n START_TO_END = 2;\r\n START_TO_START = 3;\r\n Public\r\n constructor new;\r\n function cloneContents : TJSDocumentFragment;\r\n function cloneRange : TJSRange;\r\n procedure collapse;\r\n function compareBoundaryPoints(aHow : NativeInt) : NativeInt;\r\n function createContextualFragment(aTagstring : String) : TJSDocumentFragment;\r\n procedure deleteContents;\r\n procedure detach;\r\n function extractContents : TJSDocumentFragment;\r\n procedure insertNode(aNode : TJSNode);\r\n procedure selectNode(aNode : TJSNode);\r\n procedure selectNodeContents(aNode : TJSNode);\r\n procedure setEnd(aEndNode : TJSNode; aEndOffset : NativeInt); \r\n procedure setEndAfter(aEndNode : TJSNode);\r\n procedure setEndBefore(aEndNode : TJSNode);\r\n procedure setStart(aStartNode : TJSNode; aStartOffset : NativeInt); \r\n procedure setStartAfter(aStartNode : TJSNode);\r\n procedure setStartBefore(aStartNode : TJSNode);\r\n procedure surroundContents(aNode : TJSNode);\r\n function toString : string;\r\n property collapsed : boolean read FCollapsed;\r\n property commonAncestorContainer : TJSNode read FcommonAncestorContainer ;\r\n property endContainer : TJSNode read FendContainer;\r\n property endOffset : NativeInt Read FEndOffset;\r\n property startContainer : TJSNode read FstartContainer;\r\n property startOffset : NativeInt Read FstartOffset;\r\n end;\r\n\r\n\r\n { TJSTreeWalker }\r\n\r\n TJSTreeWalker = class external name 'TreeWalker'\r\n private\r\n FCurrentNode: TJSNode; external name 'currentNode';\r\n FexpandEntityReference: Boolean; external name 'expandEntityReference';\r\n FFilter: TJSNodeFilter; external name 'filter';\r\n FRoot: TJSNode; external name 'root';\r\n FWhatToShow: NativeInt; external name 'whatToShow';\r\n Public\r\n function firstChild : TJSNode;\r\n function lastChild : TJSNode;\r\n function nextNode : TJSNode;\r\n function nextSibling : TJSNode;\r\n function parentNode : TJSNode;\r\n function previousNode : TJSNode;\r\n function previousSibling : TJSNode;\r\n\r\n property root : TJSNode read FRoot;\r\n property whatToShow : NativeInt read FWhatToShow;\r\n property filter : TJSNodeFilter Read FFilter;\r\n property expandEntityReference : Boolean Read FexpandEntityReference;\r\n property currentNode : TJSNode Read FCurrentNode;\r\n end;\r\n\r\n TJSNodeFilter = class external name 'NodeFilter'\r\n const\r\n SHOW_ALL = -1;\r\n SHOW_ATTRIBUTE = 2;\r\n SHOW_CDATA_SECTION = 8;\r\n SHOW_COMMENT = 128;\r\n SHOW_DOCUMENT = 256;\r\n SHOW_DOCUMENT_FRAGMENT = 1024;\r\n SHOW_DOCUMENT_TYPE = 512;\r\n SHOW_ELEMENT = 1;\r\n SHOW_ENTITY = 32;\r\n SHOW_ENTITY_REFERENCE = 16;\r\n SHOW_NOTATION = 2048;\r\n SHOW_PROCESSING_INSTRUCTION = 64;\r\n SHOW_TEXT = 4;\r\n function acceptNode (aNode : TJSNode) : NativeInt;\r\n end;\r\n\r\n TJSXPathResult = class external name 'XPathResult'\r\n private\r\n FBooleanValue : Boolean; external name 'booleanValue';\r\n FNumberValue : Double; external name 'numberValue';\r\n FResultType : NativeInt; external name 'resultType';\r\n FSingleNodeValue : TJSNode; external name 'singleNodeValue';\r\n FSnaphotLength : NativeInt; external name 'snapshotLength';\r\n FStringValue : String; external name 'stringValue';\r\n public \r\n Function iterateNext : TJSNode;\r\n Function snapshotItem(Index: NativeInt) : TJSNode;\r\n Property booleanValue : Boolean Read FBooleanValue;\r\n Property numberValue : Double Read FNumberValue;\r\n property resultType : NativeInt Read FResultType;\r\n Property singleNodeValue : TJSNode Read FSingleNodeValue;\r\n property snapshotLength : NativeInt read FSnaphotLength;\r\n property stringValue : String Read FStringValue;\r\n end;\r\n\r\n TJSSelection = class external name 'Selection'\r\n Private\r\n FanchorNode : TJSNode ; external name 'anchorNode';\r\n FanchorOffset : NativeInt ; external name 'anchorOffset';\r\n FfocusNode : TJSNode ; external name 'focusNode';\r\n FfocusOffset : NativeInt ; external name 'focusOffset';\r\n FisCollapsed : Boolean ; external name 'isCollapsed';\r\n FrangeCount : NativeInt ; external name 'rangeCount';\r\n Ftype : String ; external name 'type';\r\n Public\r\n function getRangeAt(aIndex : NativeInt) : TJSRange;\r\n procedure collapse(aParentNode : TJSNode; Offset : NativeInt);\r\n procedure extend(aParentNode : TJSNode; Offset : NativeInt);\r\n procedure collapseToStart;\r\n procedure collapseToEnd;\r\n procedure selectAllChildren(aParentNode : TJSNode);\r\n procedure addRange(aRange : TJSRange);\r\n procedure removeRange(aRange : TJSRange);\r\n procedure removeAllRanges;\r\n procedure deleteFromDocument;\r\n function containsNode(aNode : TJSNode; aPartlyContained : Boolean) : Boolean;\r\n procedure setBaseAndExtent(aAnchorNode : TJSNode; aAnchorOffset : NativeInt; aFocusNode : TJSNode; aFocusOffset : NativeInt);\r\n function toString : String;\r\n property anchorNode : TJSNode read FAnchorNode;\r\n property anchorOffset : NativeInt read FAnchorOffset;\r\n property focusNode : TJSNode read FFocusNode;\r\n property focusOffset : NativeInt read FFocusOffset;\r\n property isCollapsed : Boolean read FIsCollapsed;\r\n property rangeCount : NativeInt read FRangeCount;\r\n property _type : String Read FType;\r\n end;\r\n TJSNameSpaceMapperCallback = function (aNameSpace : string ) : String;\r\n\r\n TJSHTMLFile = class;\r\n TJSHTMLFileList = Class;\r\n\r\n { TJSDataTransferItem }\r\n\r\n TJSDataTransferItemCallBack = reference to Procedure(aData : String);\r\n\r\n TJSDataTransferItem = class external name 'DataTransferItem'\r\n private\r\n FKind: String; external name 'kind';\r\n FType: string; external name 'type';\r\n Public\r\n function getAsFile : TJSHTMLFile;\r\n Procedure getAsString(aCallBack : TJSDataTransferItemCallBack);\r\n property Kind : String read FKind;\r\n property _Type : string read FType;\r\n end;\r\n\r\n TJSDataTransferItemList = class external name 'DataTransferItemList'\r\n private\r\n FLength: NativeInt; external name 'length';\r\n function getitem(aIndex : nativeInt) : TJSDataTransferItem ; external name '[]';\r\n Public\r\n Function add(aData : string; AType: string) : TJSDataTransferItem; overload;\r\n Function add(aFile : TJSHTMLFile) : TJSDataTransferItem; overload;\r\n Procedure clear;\r\n procedure remove(aIndex : integer);\r\n property length : NativeInt read FLength;\r\n property Items[aIndex : NativeInt] : TJSDataTransferItem Read getitem; default;\r\n end;\r\n\r\n { TDataTransfer }\r\n\r\n TJSDataTransfer = class external name 'DataTransfer'\r\n private\r\n FFiles: TJSHTMLFileList; external name 'files';\r\n FItems: TJSDataTransferItemList; external name 'items';\r\n FTypes: TJSStringDynArray; external name 'types';\r\n Public\r\n dropEffect : string;\r\n effectAllowed : string;\r\n Procedure clearData; overload;\r\n Procedure clearData(aFormat : string); overload;\r\n function getData(aFormat : string) : String;\r\n procedure setData(aFormat : String; aData : String);\r\n procedure setDragImage(aImage: TJSElement; xOffset,yOffset : integer);\r\n property files : TJSHTMLFileList Read FFiles;\r\n property items : TJSDataTransferItemList read FItems;\r\n property types : TJSStringDynArray read FTypes;\r\n end;\r\n\r\n { TJSDragEvent }\r\n\r\n TJSDragEvent = class external name 'DragEvent' (TJSEvent)\r\n Private\r\n FDataTransfer: TJSDataTransfer; external name 'dataTransfer';\r\n FrelatedTarget : TJSEventTarget external name 'relatedTarget';\r\n FscreenX : NativeInt external name 'screenX';\r\n FscreenY : NativeInt external name 'screenY';\r\n FclientX : NativeInt external name 'clientX';\r\n FclientY : NativeInt external name 'clientY';\r\n Fbutton : NativeInt external name 'button';\r\n Fbuttons : NativeInt external name 'buttons';\r\n FctrlKey : Boolean external name 'ctrlKey';\r\n FshiftKey : Boolean external name 'shiftKey';\r\n FaltKey : Boolean external name 'altKey';\r\n FmetaKey : Boolean external name 'metaKey';\r\n Public\r\n Property relatedTarget : TJSEventTarget Read FRelatedTarget;\r\n Property screenX : NativeInt Read FScreenX;\r\n Property screenY : NativeInt Read FScreenY;\r\n Property clientX : NativeInt Read FClientX;\r\n Property clientY : NativeInt Read FClientY;\r\n Property button : NativeInt Read FButton;\r\n Property buttons : NativeInt Read FButtons;\r\n Property ctrlKey : Boolean Read FctrlKey;\r\n Property shiftKey : Boolean Read FshiftKey;\r\n Property altKey : Boolean Read FaltKey;\r\n Property metaKey : Boolean Read FmetaKey;\r\n property dataTransfer : TJSDataTransfer Read FDataTransfer;\r\n end;\r\n TJSDragDropEventHandler = reference to function(aEvent: TJSDragEvent) : Boolean;\r\n THTMLClickEventHandler = reference to function(aEvent : TJSMouseEvent) : boolean;\r\n { Various events }\r\n\r\n{$IFNDEF FIREFOX}\r\n TJSFocusEvent = TJSEvent;\r\n{$ELSE}\r\n TJSFocusEvent = Class(TJSEvent)\r\n private\r\n FrelatedTarget : TJSElement external name 'relatedTarget';\r\n public\r\n property relatedTarget : TJSElement Read FrelatedTarget;\r\n end;\r\n{$ENDIF}\r\n TJSAnimationEvent = Class(TJSEvent);\r\n TJSLoadEvent = Class(TJSEvent);\r\n\r\n TJSErrorEvent = class external name 'ErrorEvent' (TJSEvent)\r\n Private\r\n Fmessage : String external name 'message';\r\n Ffilename : string external name 'filename';\r\n Flineno : integer external name 'lineno';\r\n Fcolno : integer external name 'colno';\r\n Ferror : TJSObject external name 'error';\r\n Public\r\n Property message : String read FMessage;\r\n property filename : string Read FFileName;\r\n property lineno : integer read FLineNo;\r\n Property colno : integer read FColNo;\r\n Property error : TJSObject read FError;\r\n end;\r\n\r\n TJsPageTransitionEvent = class(TJSEvent)\r\n end;\r\n\r\n TJSHashChangeEvent = class external name 'HashChangeEvent' (TJSEvent)\r\n Private\r\n FnewURL : String external name 'newURL';\r\n FoldURL : String external name 'oldURL';\r\n public\r\n property newURL : String Read FNewURL;\r\n property oldURL : String Read FOldURL;\r\n end;\r\n\r\n TJSPopStateEvent = class external name 'PopStateEvent' (TJSEvent)\r\n Private\r\n FState : JSValue; external name 'state';\r\n Public\r\n property state : JSValue read FState;\r\n end;\r\n\r\n TJSStorageEvent = class external name 'StorageEvent' (TJSEvent)\r\n private\r\n Fkey : String external name 'key';\r\n FoldValue : String external name 'oldValue';\r\n FnewValue : String external name 'newValue';\r\n Furl : String external name 'url';\r\n FstorageArea : String external name 'storageArea';\r\n public\r\n Property key : String Read FKey;\r\n Property oldValue : String Read FOldValue;\r\n Property newValue : String Read FNewValue;\r\n Property url : String Read FURL;\r\n Property storageArea : String Read FstorageArea;\r\n end;\r\n\r\n { TJSProgressEvent }\r\n\r\n TJSProgressEvent = class external name 'ProgressEvent' (TJSEvent)\r\n Private\r\n FlengthComputable : Boolean external name 'lengthComputable';\r\n Floaded : NativeUINT external name 'loaded';\r\n FTotal : NativeUINT external name 'Total';\r\n Public\r\n property lengthComputable : Boolean Read FlengthComputable;\r\n property loaded : NativeUINT Read FLoaded;\r\n property Total : NativeUINT Read FTotal;\r\n end;\r\n\r\n TJSPageTransitionEventHandler = reference to function(aEvent : TJsPageTransitionEvent) : boolean;\r\n TJSHashChangeEventhandler = reference to function(aEvent : TJSHashChangeEvent) : boolean;\r\n TJSMouseWheelEventHandler = reference to function(aEvent : TJSWheelEvent) : boolean;\r\n TJSMouseEventHandler = reference to function(aEvent : TJSMouseEvent) : boolean;\r\n THTMLAnimationEventHandler = reference to function(aEvent : TJSAnimationEvent) : boolean;\r\n TJSErrorEventHandler = reference to function(aEvent : TJSErrorEvent) : boolean;\r\n TJSFocusEventHandler = reference to function(aEvent : TJSFocusEvent) : boolean;\r\n TJSKeyEventhandler = reference to function (aEvent : TJSKeyBoardEvent) : boolean;\r\n TJSLoadEventhandler = reference to function (aEvent : TJSLoadEvent) : boolean;\r\n TJSPointerEventHandler = reference to function(aEvent : TJSPointerEvent) : boolean;\r\n TJSUIEventHandler = reference to function(aEvent : TJSUIEvent) : Boolean;\r\n TJSPopStateEventHandler = reference to function(aEvent : TJSPopStateEvent) : Boolean;\r\n TJSStorageEventHandler = reference to function(aEvent : TJSStorageEvent) : Boolean;\r\n TJSProgressEventhandler = reference to function(aEvent : TJSProgressEvent) : Boolean;\r\n TJSTouchEventHandler = reference to function(aEvent : TJSTouchEvent) : boolean;\r\n\r\n TJSDocument = class external name 'Document' (TJSNode)\r\n Private\r\n fActiveElement : TJSElement; external name 'activeElement';\r\n FCharacterSet: String; external name 'characterSet';\r\n FChildElementCount: NativeInt; external name 'childElementCount';\r\n FCompatMode: String; external name 'compatMode';\r\n FCurrentScript: TJSElement; external name 'currentScript';\r\n FDefaultView: TJSWindow; external name 'defaultView';\r\n FDocType: TJSDocumentType; external name 'docrype';\r\n FDocumentElement: TJSElement; external name 'documentElement';\r\n FDocumentURI: String; external name 'documentURI';\r\n FEmbeds: TJSHTMLCollection; external name 'embeds';\r\n FFirstElementChild : TJSElement; external name 'firstElementChild';\r\n FForms: TJSHTMLCollection; external name 'forms';\r\n FFullScreenElement: TJSElement; external name 'fullscreenElement';\r\n FFullscreenEnabled: Boolean; external name 'fullscreenEnabled';\r\n FHead: TJSElement; external name 'head';\r\n FHidden: Boolean; external name 'hidden';\r\n FImages: TJSHTMLCollection; external name 'images';\r\n FImplementation: TJSDOMImplementation; external name 'implementation';\r\n FLastElementChild : TJSElement; external name 'lastElementChild';\r\n FLastModified: String; external name 'lastModified';\r\n FLastStyleSheetSet: String; external name 'lastStyleSheetSet';\r\n FLinks: TJSHTMLCollection; external name 'links';\r\n FLocation: TJSLocation; external name 'location';\r\n FLocationString: String; external name 'location';\r\n FPlugins: TJSHTMLCollection; external name 'plugins';\r\n FPointerLockElement: TJSElement; external name 'pointerLockElement';\r\n FPreferredStyleSheetSet: String; external name 'preferredStyleSheetSet';\r\n FReadyState: String; external name 'readyState';\r\n FReferrer: String; external name 'referrer';\r\n FScripts: TJSHTMLCollection; external name 'scripts';\r\n FStyleSheets: TJSStyleSheetList; external name 'styleSheets';\r\n FStyleSheetSets: TJSValueDynArray; external name 'styleSheetSets';\r\n FURL: String; external name 'URL';\r\n FVisibilityState: string; external name 'visibilityState';\r\n Public\r\n function adoptNode(aExternalNode : TJSNode) : TJSNode;\r\n procedure close;\r\n function createAttribute(aName : string) : TJSAttr;\r\n function createCDATASection(S : String) : TJSNode;\r\n function createComment(S : String) : TJSNode;\r\n function createDocumentFragment : TJSDocumentFragment;\r\n function createElement(tagName : string) : TJSElement; overload;\r\n function createElement(tagName : string; const options : TJSElementCreationOptions) : TJSElement; overload;\r\n function createElementNS(aNameSpace,tagName : string) : TJSElement; overload;\r\n function createElementNS(aNameSpace,tagName : string; const options : TJSElementCreationOptions) : TJSElement; overload;\r\n function createEvent(aType : string) : TJSEvent;\r\n function createExpression(xPathText : String; aNameSpaceMapper: TJSNameSpaceMapperCallback) : TJSXPathExpression;\r\n function createNSResolver(aNode : TJSNode) : TJSXPathNSResolver;\r\n function createProcessingInstruction(target, data : String) : TJSProcessingInstruction;\r\n function createRange : TJSRange;\r\n function createTextNode(S : String) : TJSNode;\r\n function createTreeWalker(root : TJSNode; whatToShow : NativeInt; filter : TJSNodeFilter) : TJSTreeWalker;\r\n function elementFromPoint(x,y : integer) : TJSElement;\r\n procedure enableStyleSheetsForSet(aSet : String);\r\n function evaluate(xpathExpression : String; ContextNode : TJSNode; NameSpaceResolver : TJSNamespaceMapperCallBack; resultType : NativeInt; aResult : TJSXPathResult) : TJSXPathResult;\r\n function execCommand(aCommandName : String; aShowDefaultUI : Boolean; AValueArgument : String) : boolean; overload;\r\n function execCommand(aCommandName : String; aShowDefaultUI : Boolean) : boolean; overload;\r\n Procedure exitFullScreen;\r\n function getElementById(aID : String) : TJSElement;\r\n function getElementsyClassName(aNames : string) : TJSHTMLCollection;\r\n function getElementsByName(aName : String) : TJSNodeList;\r\n function getElementsByTagName(aName : String) : TJSHTMLCollection;\r\n function getElementsByTagNameNS(aNameSpace,aName : String) : TJSHTMLCollection;\r\n function getSelection : TJSSelection;\r\n function hasFocus : boolean;\r\n function importNode(aExternalNode : TJSNode; Deep: boolean) : TJSNode;\r\n function querySelector(aSelectors : String) : TJSElement;\r\n function querySelectorAll(aSelectors : String) : TJSNodeList;\r\n procedure open;\r\n procedure releaseCapture;\r\n procedure write(aLine : string);\r\n procedure writeln(aLine : String);\r\n Public\r\n body : TJSElement;\r\n designMode : string;\r\n dir : string;\r\n domain : string;\r\n selectedStyleSheetSet : string;\r\n title : string;\r\n onabort : TJSEventHandler;\r\n onblur : TJSEventHandler;\r\n oncancel : TJSEventHandler;\r\n oncanplay : TJSEventHandler;\r\n oncanplaythrough : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onclick: THTMLClickEventHandler;\r\n onclose : TJSEventHandler;\r\n oncontextmenu : TJSEventHandler;\r\n oncuechange : TJSEventHandler;\r\n ondblclick : THTMLClickEventHandler;\r\n ondrag : TJSDragDropEventHandler;\r\n ondragend : TJSDragDropEventHandler;\r\n ondragenter : TJSDragDropEventHandler;\r\n ondragexit : TJSDragDropEventHandler;\r\n ondragover : TJSDragDropEventHandler;\r\n ondragleave : TJSDragDropEventHandler;\r\n ondragstart: TJSDragDropEventHandler;\r\n ondrop : TJSDragDropEventHandler;\r\n ondurationchange : TJSEventHandler;\r\n onemptied : TJSEventHandler;\r\n onended : TJSEventHandler;\r\n onerror : TJSErrorEventHandler;\r\n onfocus : TJSFocusEventhandler;\r\n ongotpointercapture : TJSPointerEventHandler;\r\n oninput : TJSEventhandler;\r\n oninvalid : TJSEventhandler;\r\n onkeydown : TJSKeyEventhandler;\r\n onkeypress : TJSKeyEventhandler;\r\n onkeyup : TJSKeyEventhandler;\r\n onload : TJSEventhandler;\r\n onloadeddata : TJSEventhandler;\r\n onloadedmetadata : TJSEventhandler;\r\n onloadend : TJSProgressEventhandler;\r\n onloadstart : TJSProgressEventhandler;\r\n onlostpointercapture : TJSPointerEventHandler;\r\n onmessage : TJSEventHandler;\r\n onmousedown : TJSMouseEventHandler;\r\n onmouseenter : TJSMouseEventHandler;\r\n onmouseleave : TJSMouseEventHandler;\r\n onmousemove : TJSMouseEventHandler;\r\n onmouseout : TJSMouseEventHandler;\r\n onmouseover : TJSMouseEventHandler;\r\n onmouseup : TJSMouseEventHandler;\r\n onmousewheel : TJSMouseEventHandler;\r\n onpause : TJSEventHandler;\r\n onplay : TJSEventHandler;\r\n onplaying : TJSEventHandler;\r\n onpointercancel : TJSPointerEventHandler;\r\n onpointerdown : TJSPointerEventHandler;\r\n onpointerenter : TJSPointerEventHandler;\r\n onpointerleave : TJSPointerEventHandler;\r\n onpointermove : TJSPointerEventHandler;\r\n onpointerout : TJSPointerEventHandler;\r\n onpointerover : TJSPointerEventHandler;\r\n onpointerup : TJSPointerEventHandler;\r\n onpointerlockchange : TJSPointerEventHandler;\r\n onprogress : TJSProgressEventhandler;\r\n onreset : TJSUIEventHandler;\r\n onratechange : TJSEventHandler;\r\n onscroll : TJSUIEventHandler;\r\n onseekend : TJSEventHandler;\r\n onseeking : TJSEventHandler;\r\n onselect : TJSEventHandler;\r\n onselectionchange : TJSEventHandler;\r\n onsshow : TJSEventHandler;\r\n onsubmit : TJSEventHandler;\r\n onunload : TJSUIEventHandler;\r\n onwaiting : TJSEventHandler;\r\n touchstart : TJSTouchEventHandler;\r\n touchend : TJSTouchEventHandler;\r\n touchmove : TJSTouchEventHandler;\r\n touchcancel : TJSTouchEventHandler;\r\n Property activeElement : TJSElement Read FActiveElement;\r\n Property characterSet : String Read FCharacterSet;\r\n property childElementCount : NativeInt Read FChildElementCount;\r\n property compatMode : String Read FCompatMode;\r\n property currentScript : TJSElement Read FCurrentScript;\r\n property defaultView : TJSWindow Read FDefaultView;\r\n property doctype : TJSDocumentType read FDocType;\r\n property documentElement : TJSElement read FDocumentElement;\r\n property documentURI : String Read FDocumentURI;\r\n property embeds : TJSHTMLCollection Read FEmbeds;\r\n property firstElementChild : TJSElement Read FFirstElementChild;\r\n property lastElementChild : TJSElement Read FLastElementChild;\r\n property Forms : TJSHTMLCollection Read FForms;\r\n property fullscreenElement : TJSElement Read FFullScreenElement;\r\n property fullscreenEnabled : Boolean Read FFullscreenEnabled;\r\n property head : TJSElement read FHead;\r\n Property hidden : Boolean read FHidden;\r\n property images : TJSHTMLCollection Read FImages;\r\n property _implementation : TJSDOMImplementation Read FImplementation;\r\n property lastModified : String Read FLastModified;\r\n property lastStyleSheetSet : String read FLastStyleSheetSet;\r\n property links : TJSHTMLCollection Read FLinks;\r\n property location : TJSLocation read FLocation;\r\n Property LocationString : String Read FURL Write FLocationString; // On purpose\r\n property plugins : TJSHTMLCollection Read FPlugins;\r\n property pointerLockElement : TJSElement Read FPointerLockElement;\r\n property preferredStyleSheetSet : String Read FPreferredStyleSheetSet;\r\n Property readyState : String Read FReadyState;\r\n Property referrer : String Read FReferrer;\r\n property scripts : TJSHTMLCollection Read FScripts;\r\n property styleSheets : TJSStyleSheetList Read FStyleSheets;\r\n property styleSheetSets : TJSValueDynArray Read FStyleSheetSets; // No type documented ?\r\n Property URL : String Read FURL;\r\n property visibilityState : string read FVisibilityState;\r\n end;\r\n\r\n TJSConsole = class external name 'Console'\r\n Public\r\n procedure assert(anAssertion : string; Obj1 : JSValue); varargs;\r\n Procedure clear; \r\n procedure count; overload;\r\n procedure count(aCounter : String);\r\n procedure error(Obj1 : JSValue); varargs;\r\n procedure group; overload;\r\n procedure group(aLabel : String); overload;\r\n procedure groupCollapsed; overload;\r\n procedure groupCollapsed(aLabel : String);overload;\r\n procedure groupEnd;\r\n procedure info(Obj1 : JSValue); varargs;\r\n procedure log(Obj1 : JSValue); varargs;\r\n procedure table(args: array of JSValue); overload;\r\n procedure table(args: array of JSValue; Columns : Array of string);\r\n procedure table(args: TJSObject); overload;\r\n procedure table(args: TJSObject; Columns : Array of string); overload;\r\n procedure time(aName : string);\r\n procedure timeEnd(aName : string);\r\n procedure trace;\r\n procedure warn(Obj1 : JSValue); varargs;\r\n end;\r\n\r\n { TJSCryptoKey }\r\n\r\n TJSCryptoKey = class external name 'CryptoKey'\r\n private\r\n FAlgorithm: JSValue; external name 'algorithm';\r\n FExtractable: Boolean; external name 'extractable';\r\n FType: string; external name 'type';\r\n FUsages: TStringDynArray; external name 'usages';\r\n Public\r\n property _type : string read FType;\r\n property extractable: Boolean read FExtractable;\r\n property algorithm : JSValue read FAlgorithm;\r\n property usages : TStringDynArray Read FUsages;\r\n end;\r\n \r\n { TJSSubtleCrypto }\r\n\r\n TJSBufferSource = class external name 'BufferSource' end;\r\n TJSTypedArray = class external name 'TypedArray' end;\r\n\r\n TJSSubtleCrypto = class external name 'SubtleCrypto'\r\n Public\r\n function decrypt(algorithm : JSValue; aKey : TJSCryptoKey; aData : TJSBufferSource) : TJSPromise;\r\n function deriveKey(algorithm : JSValue; aMasterKey : TJSCryptoKey; aDerivedAlgo : JSValue; extractable : Boolean; Usages : TStringDynArray) : TJSPromise;\r\n function digest(algorithm : string; Buffer : TJSArrayBuffer) : TJSPromise; overload;\r\n function digest(algorithm : string; Buffer : TJSTypedArray) : TJSPromise; overload;\r\n function encrypt(algorithm : JSValue; aKey : TJSCryptoKey; aData : TJSBufferSource) : TJSPromise;\r\n function exportKey(algorithm : String; AKey : TJSCryptoKey) : TJSPromise;\r\n function generateKey(algorithm : JSValue; extractable : Boolean; Usages : TStringDynArray) : TJSPromise;\r\n function importKey(format : String; KeyData : TJSArrayBuffer; algorithm : String; extractable : Boolean; Usages : TStringDynArray) : TJSPromise;\r\n function sign(algorithm : string; Key : TJSCryptoKey; aText : TJSArrayBuffer) : TJSPromise; overload;\r\n function unwrapKey(algorithm : string; wrappedKey : TJSArrayBuffer; Key: TJSCryptoKey;\r\n unwrapAlgo : string; unwrappedKeyAlgo : string; \r\n extractable : Boolean; Usages : TStringDynArray) : TJSPromise;\r\n function verify(algorithm : String; key : TJSCryptoKey; Signature : TJSArrayBuffer; \r\n textToVerify : TJSArrayBuffer): TJSPromise;\r\n function wrapKey(aFormat : string; Key,WrappingKey : TJSCryptoKey; WrapAlgorithm : String) : TJSPromise; \r\n end;\r\n \r\n { TJSCrypto }\r\n\r\n TJSCrypto = class external name 'Crypto'\r\n private\r\n FsubtleCrypto: TJSSubtleCrypto;\r\n Public\r\n procedure getRandomValues (anArray : TJSTypedArray);\r\n property subtleCrypto : TJSSubtleCrypto Read FsubtleCrypto;\r\n end;\r\n \r\n { TJSHistory }\r\n\r\n TJSHistory = class external name 'History'\r\n private\r\n FLength: NativeInt; external name 'length';\r\n{$IFDEF FIREFOX}\r\n FState : JSValue; external name 'state';\r\n{$ENDIF}\r\n Public\r\n procedure back;\r\n procedure forward;\r\n procedure go(aIndex : NativeInt);\r\n procedure go;\r\n procedure pushState(aState : jsValue; aTitle : String; AURL : String);\r\n procedure pushState(aState : jsValue; aTitle : String);\r\n procedure replaceState(aState : jsValue; aTitle : String; AURL : String);\r\n procedure replaceState(aState : jsValue; aTitle : String);\r\n procedure replaceState(aState : jsValue);\r\n{$IFDEF FIREFOX}\r\n property state : JSValue read FState;\r\n{$ENDIF}\r\n property length: NativeInt read FLength;\r\n end;\r\n\r\n TJSIDBTransactionMode = class\r\n const\r\n readonly = 'readonly';\r\n readwrite = 'readwrite';\r\n versionchange = 'versionchange';\r\n end;\r\n\r\n\r\n { TJSIDBTransaction }\r\n\r\n TJSIDBTransaction = class external name 'IDBTransaction' (TJSEventTarget)\r\n private\r\n FDB : TIDBDatabase; external name 'db';\r\n FError: JSValue; external name 'error';\r\n FMode: String; external name 'mode';\r\n FObjectStoreNames: TStringDynArray; external name 'objectStoreNames';\r\n public\r\n procedure abort;\r\n function objectStore(aName : String) : TJSIDBObjectStore;\r\n property db : TIDBDatabase read FDB;\r\n property mode : String read FMode;\r\n property objectStoreNames : TStringDynArray read FObjectStoreNames;\r\n property error : JSValue read FError;\r\n end;\r\n\r\n\r\n { TJSIDBKeyRange }\r\n\r\n TJSIDBKeyRange = class external name 'IDBKeyRange'\r\n private\r\n FLower: JSValue;\r\n FLowerOpen: Boolean;\r\n FUpper: JSValue;\r\n FUpperOpen: Boolean;\r\n Public\r\n Class Function bound(aLower,aUpper : JSValue) : TJSIDBKeyRange; overload;\r\n Class Function bound(aLower,aUpper : JSValue; aLowerOpen : Boolean) : TJSIDBKeyRange; overload;\r\n Class Function bound(aLower,aUpper : JSValue; aLowerOpen,aUpperOpen : Boolean) : TJSIDBKeyRange; overload;\r\n Class Function lowerBound(aLower : JSValue) : TJSIDBKeyRange; overload;\r\n Class Function lowerBound(aLower : JSValue; aOpen: Boolean) : TJSIDBKeyRange; overload;\r\n Class Function only(aValue : JSValue) : TJSIDBKeyRange;\r\n Class Function upperBound(aUpper : JSValue) : TJSIDBKeyRange; overload;\r\n Class Function upperBound(aUpper : JSValue; aOpen: Boolean) : TJSIDBKeyRange; overload;\r\n function includes (aValue : JSValue) : Boolean;\r\n property lower : JSValue read FLower;\r\n property lowerOpen : Boolean read FLowerOpen;\r\n property upper : JSValue read FUpper;\r\n property upperOpen : Boolean read FUpperOpen;\r\n end;\r\n\r\n TJSIDBIndexParameters = record\r\n unique : boolean;\r\n multiEntry : boolean;\r\n locale : string;\r\n end;\r\n\r\n\r\n { TJSIDBIndex }\r\n\r\n TJSIDBIndex = class external name 'IDBIndex'\r\n private\r\n FKeyPath: JSValue; external name 'keyPath';\r\n FMultiEntry: Boolean; external name 'multiEntry';\r\n FObjectStore: TJSIDBObjectStore; external name 'objectStore';\r\n FUnique: boolean; external name 'unique';\r\n public\r\n name : string;\r\n function count : TJSIDBRequest;\r\n function get(aKey : jsValue) : TJSIDBRequest; overload;\r\n function get(aKey : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll(aKey : jsValue) : TJSIDBRequest; overload;\r\n function getAll(aKey : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll(aKey : jsValue; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getAll(aKey : TJSIDBKeyRange; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : jsValue) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : jsValue; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : TJSIDBKeyRange; ACount : NativeInt) : TJSIDBRequest; overload;\r\n function getKey(aKey : jsValue) : TJSIDBRequest;\r\n function openCursor : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange; ADirection : String) : TJSIDBRequest;overload;\r\n function openKeyCursor : TJSIDBRequest;overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest;overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange; ADirection : String) : TJSIDBRequest;overload;\r\n Property keyPath : JSValue Read FKeyPath;\r\n property multiEntry : Boolean read FMultiEntry;\r\n property objectStore : TJSIDBObjectStore read FObjectStore;\r\n property unique : boolean read FUnique;\r\n end;\r\n\r\n TJSIDBCursorDirection = class external name 'IDBCursorDirection'\r\n Const\r\n next = 'next';\r\n nextUnique = 'nextUnique';\r\n prev = 'prev';\r\n prevUnique = 'prevUnique';\r\n end;\r\n\r\n\r\n { TJSIDBCursor }\r\n\r\n TJSIDBCursor = class external name 'IDBCursor'\r\n private\r\n FDirection: string; external name 'direction';\r\n FKey: JSValue; external name 'key';\r\n FPrimaryKey: JSValue; external name 'primaryKey';\r\n FSource: JSValue; external name 'source';\r\n FSourceAsIndex: TJSIDBIndex; external name 'source';\r\n FSourceAsStore: TJSIDBObjectStore; external name 'source';\r\n Public\r\n procedure advance(aCount : NativeInt); overload;\r\n procedure advance(aKey : JSValue); overload;\r\n procedure continue(aKey : JSValue); overload;\r\n procedure continue; overload;\r\n procedure continuePrimaryKey(aKey : JSValue); overload;\r\n procedure continuePrimaryKey(aKey,aPrimaryKey : JSValue); overload;\r\n procedure delete;\r\n procedure update(aValue : JSValue);\r\n property source : JSValue read FSource;\r\n property sourceAsStore : TJSIDBObjectStore read FSourceAsStore;\r\n property sourceAsIndex : TJSIDBIndex read FSourceAsIndex;\r\n property key : JSValue read FKey;\r\n property primaryKey : JSValue read FPrimaryKey;\r\n property direction : string read FDirection;\r\n end;\r\n\r\n TJSIDBObjectStore = class external name 'IDBObjectStore' (TJSEventTarget)\r\n public\r\n function add(aValue : JSValue; aKey : String) : TJSIDBRequest;\r\n function add(aValue : JSValue) : TJSIDBRequest;\r\n function clear : TJSIDBRequest;\r\n function delete(aKey : string) : TJSIDBRequest;\r\n function delete(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest;\r\n function get(aKey : string) : TJSIDBRequest; overload;\r\n function get(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getKey(aKey : string) : TJSIDBRequest; overload;\r\n function getKey(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll : TJSIDBRequest; overload;\r\n function getAll(aKey : String) : TJSIDBRequest; overload;\r\n function getAll(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAll(aKey : String; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function getAll(aKeyRange : TJSIDBKeyRange; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : String) : TJSIDBRequest; overload;\r\n function getAllKeys(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function getAllKeys(aKey : String; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function getAllKeys(aKeyRange : TJSIDBKeyRange; aCount: NativeInt) : TJSIDBRequest; overload;\r\n function createIndex (aIndexName : String; KeyPath : String) : TJSIDBIndex; overload;\r\n function createIndex (aIndexName : String; KeyPath : String; Options : TJSIDBIndexParameters) : TJSIDBIndex; overload;\r\n function createIndex (aIndexName : String; KeyPath : Array of String) : TJSIDBIndex; overload;\r\n function createIndex (aIndexName : String; KeyPath : Array of String; Options : TJSIDBIndexParameters) : TJSIDBIndex; overload;\r\n Procedure deleteIndex (aIndexName : String);\r\n function index (aIndexName : String) : TJSIDBIndex;\r\n function put(aValue : JSValue; aKey : String) : TJSIDBRequest; overload;\r\n function put(aValue : JSValue) : TJSIDBRequest; overload;\r\n function openCursor : TJSIDBRequest; overload;\r\n function openCursor(aKey : String) : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function openCursor(aKey : String; aDirection : string) : TJSIDBRequest; overload;\r\n function openCursor(aKeyRange : TJSIDBKeyRange; aDirection : string) : TJSIDBRequest; overload;\r\n function openKeyCursor : TJSIDBRequest; overload;\r\n function openKeyCursor(aKey : String) : TJSIDBRequest; overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n function openKeyCursor(aKey : String; aDirection : string) : TJSIDBRequest; overload;\r\n function openKeyCursor(aKeyRange : TJSIDBKeyRange; aDirection : string) : TJSIDBRequest; overload;\r\n function count : TJSIDBRequest; overload;\r\n function count(aKey : String) : TJSIDBRequest; overload;\r\n function count(aKeyRange : TJSIDBKeyRange) : TJSIDBRequest; overload;\r\n property Indexes [aIndexName : String] : TJSIDBIndex read index;\r\n end;\r\n\r\n { TJSIDBRequest }\r\n\r\n TJSIDBRequest = class external name 'IDBRequest' (TJSEventTarget)\r\n private\r\n Ferror : JSValue; external name 'error'; // standards are not quite clear on this one\r\n FReadyState: string; external name 'readyState';\r\n FResult: JSValue; external name 'result';\r\n FResultDatabase: TIDBDatabase; external name 'result';\r\n FResultIndex: TJSIDBIndex; external name 'result';\r\n FResultObjectStore : TJSIDBObjectStore; external name 'result';\r\n FResultCursor : TJSIDBCursor; external name 'result';\r\n FSourceDatabase: TIDBDatabase; external name 'source';\r\n FSourceIndex: TJSIDBIndex; external name 'source';\r\n FSourceObjectStore : TJSIDBObjectStore; external name 'source';\r\n FSourceCursor : TJSIDBCursor; external name 'source';\r\n FSource: JSValue; external name 'source';\r\n FTransaction: TJSIDBTransaction; external name 'transaction';\r\n Public\r\n onerror : TJSEventHandler;\r\n onsuccess : TJSEventHandler;\r\n Property error : JSValue read FError;\r\n property readyState : string read FReadyState;\r\n\r\n property result : JSValue read FResult;\r\n property resultAsObjectStore : TJSIDBObjectStore read FResultObjectStore;\r\n property resultAsCursor : TJSIDBCursor read FResultCursor;\r\n property resultAsIndex : TJSIDBIndex read FResultIndex;\r\n property resultAsDatabase : TIDBDatabase read FResultDatabase;\r\n\r\n property source : JSValue read FSource;\r\n property sourceAsObjectStore : TJSIDBObjectStore read FSourceObjectStore;\r\n property sourceAsCursor : TJSIDBCursor read FSourceCursor;\r\n property sourceAsIndex : TJSIDBIndex read FSourceIndex;\r\n property sourceAsDatabase : TIDBDatabase read FSourceDatabase;\r\n\r\n property transaction : TJSIDBTransaction read FTransaction;\r\n end;\r\n\r\n TJSIDBOpenDBRequest = class external name 'IDBOpenDBRequest' (TJSIDBRequest)\r\n Public\r\n onblocked : TJSEventHandler;\r\n onupgradeneeded : TJSEventHandler;\r\n end;\r\n\r\n TJSCreateObjectStoreOptions = record\r\n keyPath : jsValue;\r\n autoIncrement : boolean;\r\n end;\r\n\r\n { TIDBDatabase }\r\n\r\n TIDBDatabase = class external name 'IDBDatabase' (TJSEventTarget)\r\n private\r\n FName: string; external name 'name';\r\n FobjectStoreNames: TStringDynArray; external name 'objectStoreNames';\r\n FVersion: integer; external name 'version';\r\n public\r\n procedure close;\r\n function createObjectStore(aName : string) : TJSIDBObjectStore; overload;\r\n function createObjectStore(aName : string; Options: TJSCreateObjectStoreOptions) : TJSIDBObjectStore; overload;\r\n procedure deleteObjectStore(aName : string);\r\n function transaction(aStoreNames : array of string) : TJSIDBTransaction; overload;\r\n function transaction(aStoreNames : array of string; aMode : string) : TJSIDBTransaction; overload;\r\n property name : string read FName;\r\n property version : integer read FVersion;\r\n property objectStoreNames : TStringDynArray read FobjectStoreNames;\r\n end;\r\n\r\n TJSIDBFactory = class external name 'IDBFactory' (TJSEventTarget)\r\n public\r\n function open(aName : string) : TJSIDBOpenDBRequest;\r\n function open(aName : string; aVersion : Integer) : TJSIDBOpenDBRequest;\r\n function deleteDatabase(aName : string) : TJSIDBOpenDBRequest;\r\n function cmp (a,b : jsValue) : NativeInt;\r\n end;\r\n \r\n { TJSStorage }\r\n\r\n TJSStorage = class external name 'Storage' (TJSEventTarget)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n public\r\n function key(aIndex : Integer) : String;\r\n function getItem(aKeyName : string) : string;\r\n procedure setItem(aKeyName : string; aValue : string);\r\n procedure removeItem(aKeyName : string);\r\n procedure clear;\r\n property Keys[AIndex : Integer] : String read key;\r\n property Items[aKeyName: String] : String read getItem write setItem; default;\r\n property length : NativeInt Read FLength;\r\n end;\r\n\r\n // Fake object, used for objects whose visible can be checked\r\n TJSVisibleItem = class external name 'IVisible'\r\n Private\r\n FVisible : boolean; external name 'visible';\r\n Public\r\n Property visible : boolean read FVisible;\r\n end;\r\n \r\n TJSLocationBar = class external name 'LocationBar' (TJSVisibleItem);\r\n TJSMenuBar = class external name 'MenuBar' (TJSVisibleItem);\r\n TJSToolBar = class external name 'ToolBar' (TJSVisibleItem);\r\n TJSPersonalBar = class external name 'PersonalBar' (TJSVisibleItem);\r\n TJSScrollBars = class external name 'ScrollBars' (TJSVisibleItem);\r\n\r\n TJSPositionError = record\r\n code : integer;\r\n message : string;\r\n end;\r\n\r\n TJSPositionOptions = record\r\n enableHighAccuracy : boolean;\r\n timeout : integer;\r\n maximumAge : integer;\r\n end;\r\n\r\n TJSCoordinates = record\r\n latitude : double;\r\n longitude : double;\r\n altitude : double;\r\n accuracy : double;\r\n altitudeAccuracy : double;\r\n heading : double;\r\n speed : double;\r\n end;\r\n\r\n TJSPosition = record\r\n coords : TJSCoordinates;\r\n timestamp : String;\r\n end;\r\n\r\n TJSGeoLocationCallback = procedure (aPosition : TJSPosition);\r\n TJSGeoLocationEvent = procedure (aPosition : TJSPosition) of object;\r\n TJSGeoLocationErrorCallback = procedure (aValue : TJSPositionError);\r\n TJSGeoLocationErrorEvent = procedure (aValue : TJSPositionError) of object;\r\n\r\n TJSGeoLocation = class external name 'geolocation'\r\n Public\r\n Procedure getCurrentPosition(ASuccess : TJSGeoLocationCallback); overload;\r\n Procedure getCurrentPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback); overload;\r\n Procedure getCurrentPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback; AOptions : TJSPositionOptions); overload;\r\n Function watchPosition(ASuccess : TJSGeoLocationCallback) : NativeInt; overload;\r\n Function watchPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback) : NativeInt; overload;\r\n Function watchPosition(ASuccess : TJSGeoLocationCallback;aError : TJSGeoLocationErrorCallback; AOptions : TJSPositionOptions) : NativeInt; overload;\r\n procedure clearWatch(AID : NativeInt);\r\n end;\r\n\r\n TJSMediaDevices = class external name 'MediaDevices' (TJSEventTarget)\r\n end;\r\n\r\n TJSWorker = class external name 'Worker' (TJSEventTarget)\r\n public\r\n constructor new(aURL : string);\r\n procedure postMessage(aValue : JSValue);\r\n procedure postMessage(aValue : JSValue; aList : TJSValueDynArray);\r\n procedure terminate;\r\n end;\r\n\r\n TJSMessagePort = class external name 'MessagePort' (TJSEventTarget)\r\n Public\r\n procedure close;\r\n procedure postMessage(aValue : JSValue);\r\n procedure postMessage(aValue : JSValue; aList : TJSValueDynArray);\r\n procedure start;\r\n end;\r\n\r\n { TJSSharedWorker }\r\n\r\n TJSSharedWorker = class external name 'SharedWorker' (TJSEventTarget)\r\n private\r\n FPort: TJSMessagePort; external name 'port';\r\n Public\r\n constructor new(aURL : String); overload;\r\n constructor new(aURL : String; aName : string); overload;\r\n property port : TJSMessagePort Read FPort;\r\n end;\r\n\r\n { TJSServiceWorker }\r\n\r\n TJSServiceWorker = class external name 'ServiceWorker' (TJSWorker)\r\n private\r\n FscriptURL: String; external name 'scriptURL';\r\n FState: string; external name 'state';\r\n Public\r\n property state : string read FState;\r\n property scriptURL : String Read FscriptURL;\r\n end;\r\n\r\n { TJSServiceWorkerRegistration }\r\n\r\n TJSServiceWorkerRegistration = class external name 'ServiceWorkerRegistration'\r\n private\r\n FActive: TJSServiceWorker; external name 'active';\r\n FInstalling: TJSServiceWorker; external name 'installing';\r\n FScope: string; external name 'scope';\r\n FWaiting: TJSServiceWorker; external name 'waiting';\r\n public\r\n function unregister : TJSPromise;\r\n procedure update;\r\n property active : TJSServiceWorker read FActive;\r\n property scope : string read FScope;\r\n property waiting : TJSServiceWorker read FWaiting;\r\n property installing : TJSServiceWorker read FInstalling;\r\n end;\r\n\r\n TJSServiceWorkerContainerOptions = record\r\n scope : string;\r\n end;\r\n\r\n { TJSServiceWorkerContainer }\r\n\r\n TJSServiceWorkerContainer = class external name 'ServiceWorkerContainer'\r\n private\r\n FController: TJSServiceWorker; external name 'controller';\r\n FReady: TJSPromise; external name 'ready';\r\n Public\r\n function register(aURL : String) : TJSPromise; overload;\r\n function register(aURL : String; aOptions : TJSServiceWorkerContainerOptions) : TJSPromise; overload;\r\n function getRegistration(aURL : String) : TJSPromise; overload;\r\n function getRegistration : TJSPromise; overload;\r\n function getRegistrations : TJSPromise;\r\n property controller : TJSServiceWorker read FController;\r\n property ready : TJSPromise read FReady;\r\n end;\r\n\r\n\r\n { TJSNavigator }\r\n\r\n TJSNavigator = class external name 'Navigator'\r\n{$IFDEF FIREFOX}\r\n FbuildID : String ; external name 'buildID';\r\n FOSCPU : String ; external name 'oscpu';\r\n FproductSub : string; external name 'productSub';\r\n FVendor : string; external name 'vendor';\r\n{$ENDIF}\r\n private\r\n FCookieEnabled: Boolean; external name 'cookieEnabled';\r\n FGeoLocation: TJSGeoLocation; external name 'geoLocation';\r\n FLanguage: String; external name 'language';\r\n FMaxTouchPoints: NativeInt; external name 'maxTouchPoints';\r\n FMediaDevices: TJSMediaDevices; external name 'mediaDevices';\r\n FOnline: boolean; external name 'onLine';\r\n FPlatform: string; external name 'platform';\r\n FServiceWorker: TJSServiceWorkerContainer; external name 'serviceWorker';\r\n FUserAgent: string; external name 'userAgent';\r\n public\r\n function getBattery : TJSPromise;\r\n function requestMediaKeySystemAccess(aKeySystem : String; supportedConfigurations : TJSValueDynArray) : TJSPromise;\r\n Procedure registerContentHandler(aMimeType,aURI,aTitle : string);\r\n Procedure registerProtocolHandler(aProtocol,aURI,aTitle : string);\r\n Procedure vibrate(aPattern : NativeInt);\r\n Procedure vibrate(aPattern : Array of NativeInt);\r\n{$IFDEF FIREFOX}\r\n property buildID : String read FBuildID;\r\n property oscpu : string read FOSCPU;\r\n property productSub: string read FproductSub;\r\n property vendor : string read Fvendor;\r\n{$ENDIF}\r\n property cookieEnabled : Boolean read FCookieEnabled;\r\n property geoLocation : TJSGeoLocation Read FGeoLocation;\r\n property language : String read FLanguage;\r\n property maxTouchPoints : NativeInt read FMaxTouchPoints;\r\n property mediaDevices : TJSMediaDevices read FMediaDevices;\r\n property onLine : boolean read FOnline;\r\n property platform : string read FPlatform;\r\n property userAgent : string read FUserAgent;\r\n property serviceWorker : TJSServiceWorkerContainer read FServiceWorker;\r\n end;\r\n\r\n { TJSTouchEvent }\r\n TTouchCoord = longint;\r\n\r\n TJSTouch = class external name 'Touch'\r\n private\r\n FClientX: TTouchCoord; external name 'clientX';\r\n FClientY: TTouchCoord; external name 'clientY';\r\n FIDentifier: longint; external name 'identifier';\r\n FPageX: TTouchCoord; external name 'pageX';\r\n FPageY: TTouchCoord; external name 'pageY';\r\n FScreenX: TTouchCoord; external name 'screenX';\r\n FScreenY: TTouchCoord; external name 'screenY';\r\n FTarget: TJSElement; external name 'target';\r\n Public\r\n Property identifier : longint read FIDentifier;\r\n Property ScreenX : TTouchCoord Read FScreenX;\r\n Property ScreenY : TTouchCoord Read FScreenY;\r\n Property ClientX : TTouchCoord Read FClientX;\r\n Property ClientY : TTouchCoord Read FClientY;\r\n Property PageX : TTouchCoord Read FPageX;\r\n Property PageY : TTouchCoord Read FPageY;\r\n Property Target : TJSElement Read FTarget;\r\n end;\r\n\r\n { TJSTouchList }\r\n\r\n TJSTouchList = class external name 'TouchList'\r\n private\r\n FLength: NativeInt; external name 'length';\r\n Public\r\n function item (aIndex : Integer) : TJSTouch;\r\n property length : NativeInt Read FLength;\r\n Property Touches[AIndex : Integer] : TJSTouch Read item; default;\r\n end;\r\n\r\n\r\n TJSPerformance = class external name 'Performance' (TJSObject);\r\n\r\n TJSScreen = class external name 'Screen' (TJSObject);\r\n\r\n TJSURL = class external name 'URL' (TJSObject);\r\n \r\n TJSCSSStyleDeclaration = class; // forward\r\n\r\n TJSTimerCallBack = reference to procedure;\r\n\r\n { TJSMediaQueryList }\r\n\r\n TJSMediaQueryList = class external name 'MediaQueryList' (TJSObject)\r\n private\r\n FMatches: Boolean; external name 'matches';\r\n FMedia: String; external name 'media';\r\n Public\r\n Property matches : Boolean Read FMatches;\r\n Property media : String Read FMedia;\r\n end;\r\n\r\n { TJSWindow }\r\n TJSDOMHighResTimeStamp = Double;\r\n TFrameRequestCallback = procedure (aTime: TJSDOMHighResTimeStamp);\r\n\r\n TJSWindowArray = Array of TJSWindow;\r\n TJSWindow = class external name 'Window' (TJSObject)\r\n Private\r\n FClosed: boolean; external name 'closed';\r\n FConsole : TJSConsole; external name 'console';\r\n FCrypto: TJSCrypto; external name 'crypto';\r\n FDevicePixelRatio: Double; external name 'devicePixelRatio';\r\n FDocument: TJSDocument; external name 'document';\r\n FFrameElement: TJSElement; external name 'frameElement';\r\n FFrames: TJSWindowArray; external name 'frames';\r\n FHistory: TJSHistory; external name 'history';\r\n FIndexedDB: TJSIDBFactory; external name 'indexedDB';\r\n FInnerheight: NativeInt; external name 'innerHeight';\r\n FInnerWidth: NativeInt; external name 'innerWidth';\r\n FLength: NativeInt; external name 'length';\r\n FLocalStorage: TJSStorage; external name 'localStorage';\r\n FLocation: TJSLocation; external name 'location';\r\n FLocationBar: TJSLocationBar; external name 'locationbar';\r\n FLocationString: string; external name 'location';\r\n FMenuBar: TJSMenuBar; external name 'menubar';\r\n FNavigator: TJSNavigator; external name 'navigator';\r\n FOpener: TJSWindow; external name 'opener';\r\n FOuterheight: NativeInt; external name 'outerHeight';\r\n FOuterWidth: NativeInt; external name 'outerWidth';\r\n FParent: TJSWindow; external name 'parent';\r\n FPerformance: TJSPerformance; external name 'Performance';\r\n FPersonalBar: TJSPersonalBar; external name 'personalbar';\r\n FScreen: TJSScreen; external name 'screen';\r\n FScreenX: NativeInt; external name 'screenX';\r\n FScreenY: NativeInt; external name 'screenY';\r\n FScrollbar: TJSScrollBars; external name 'scrollbar';\r\n FScrollX: NativeInt; external name 'scrollX';\r\n FScrollY: NativeInt; external name 'scrollY';\r\n FSelf: TJSWindow; external name 'self';\r\n FSessionStorage: TJSStorage; external name 'sessionStorage';\r\n FToolBar: TJSToolBar; external name 'toolbar';\r\n FTop: TJSWindow; external name 'top';\r\n FURL: TJSURL; external name 'URL';\r\n Public\r\n fullSreen : Boolean; \r\n name : string;\r\n status : string;\r\n onabort : TJSEventHandler;\r\n onafterprint : TJSEventHandler;\r\n onbeforeprint : TJSEventHandler;\r\n onbeforeinstallprompt : TJSEventHandler;\r\n onbeforeunloadprompt : TJSEventHandler;\r\n onblur : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onclick: THTMLClickEventHandler;\r\n onclose : TJSEventHandler;\r\n oncontextmenu : TJSEventHandler;\r\n ondblclick : THTMLClickEventHandler;\r\n onerror : TJSErrorEventHandler;\r\n onfocus : TJSFocusEventhandler;\r\n onhashchange : TJSHashChangeEventhandler;\r\n oninput : TJSEventhandler;\r\n onkeydown : TJSKeyEventhandler;\r\n onkeypress : TJSKeyEventhandler;\r\n onkeyup : TJSKeyEventhandler;\r\n onlanguagechange : TJSEventhandler;\r\n onload : TJSEventhandler;\r\n onloadend : TJSLoadEventhandler;\r\n onloadstart : TJSLoadEventhandler;\r\n onmessage : TJSEventHandler;\r\n onmousedown : TJSMouseEventHandler;\r\n onmouseenter : TJSMouseEventHandler;\r\n onmouseleave : TJSMouseEventHandler;\r\n onmousemove : TJSMouseEventHandler;\r\n onmouseout : TJSMouseEventHandler;\r\n onmouseover : TJSMouseEventHandler;\r\n onmouseup : TJSMouseEventHandler;\r\n onmousewheel : TJSMouseEventHandler;\r\n onoffline : TJSEventHandler;\r\n ononline : TJSEventHandler;\r\n onpagehide : TJSPageTransitionEventHandler;\r\n onpageshow : TJSPageTransitionEventHandler;\r\n onpaint : TJSEventHandler;\r\n onpointercancel : TJSPointerEventHandler;\r\n onpointerdown : TJSPointerEventHandler;\r\n onpointerenter : TJSPointerEventHandler;\r\n onpointerleave : TJSPointerEventHandler;\r\n onpointermove : TJSPointerEventHandler;\r\n onpointerout : TJSPointerEventHandler;\r\n onpointerover : TJSPointerEventHandler;\r\n onpointerup : TJSPointerEventHandler;\r\n onpointerlockchange : TJSPointerEventHandler;\r\n onprogress : TJSProgressEventhandler;\r\n onpopstate : TJSPopStateEventHandler;\r\n onreset : TJSUIEventHandler;\r\n onscroll : TJSUIEventHandler;\r\n onselect : TJSEventHandler;\r\n onselectionchange : TJSEventHandler;\r\n onstorage : TJSStorageEventHandler;\r\n onsubmit : TJSEventHandler;\r\n onunload : TJSUIEventHandler;\r\n touchstart : TJSTouchEventHandler;\r\n touchend : TJSTouchEventHandler;\r\n touchmove : TJSTouchEventHandler;\r\n touchcancel : TJSTouchEventHandler;\r\n procedure addEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure addEventListener(aname : string; aListener : JSValue);\r\n Procedure alert(Const Msg : String);\r\n Function atob(Const aValue : string) : string;\r\n procedure blur;\r\n Procedure clearInterval(aID: NativeInt);\r\n Procedure clearTimeout(aID: NativeInt);\r\n Function btoa(Const aValue : string) : string;\r\n procedure cancelAnimationFrame(aHandle: Integer);\r\n Procedure close;\r\n Function confirm(Const aMsg : String) : boolean;\r\n procedure focus;\r\n Function getComputedStyle(aElement : TJSElement) : TJSCSSStyleDeclaration; overload;\r\n Function getComputedStyle(aElement,aPseudoElement : TJSElement) : TJSCSSStyleDeclaration; overload;\r\n function matchMedia(aQuery : String) : TJSMediaQueryList;\r\n procedure moveBy(x,y : NativeInt);\r\n procedure moveTo(x,y : NativeInt);\r\n function open : TJSWindow;\r\n function open(Const aURL : String) : TJSWindow; overload;\r\n function open(Const aURL,aTarget : String) : TJSWindow; overload;\r\n function open(Const aURL,aTarget : String; AOptions : TJSObject) : TJSWindow; overload;\r\n procedure print;\r\n function prompt(const aMessage : String) : String; overload;\r\n function prompt(const aMessage,aDefault : String) : String; overload;\r\n procedure removeEventListener(aname : string; aListener : TJSEventHandler);\r\n procedure removeEventListener(aname : string; aListener : JSValue);\r\n function requestAnimationFrame(aCallback: TFrameRequestCallback): Integer;\r\n procedure resizeBy(aWidth,aHeight : NativeInt);\r\n procedure resizeTo(aWidth,aHeight : NativeInt);\r\n procedure scrollBy(x,y : NativeInt);\r\n procedure scrollTo(x,y : NativeInt);\r\n Function setInterval(ahandler : TJSTimerCallBack; aInterval : NativeUInt) : NativeInt; varargs;\r\n Function setTimeout(ahandler : TJSTimerCallBack; aTimeout : NativeUInt) : NativeInt; varargs;\r\n Function setTimeout(ahandler : TJSTimerCallBack) : NativeInt;\r\n procedure stop;\r\n { public methods }\r\n property console : TJSConsole Read FConsole;\r\n property closed : boolean read FClosed;\r\n property crypto : TJSCrypto Read FCrypto;\r\n property devicePixelRatio : Double read FDevicePixelRatio;\r\n property document : TJSDocument read FDocument;\r\n property frameElement : TJSElement Read FFrameElement;\r\n Property frames : TJSWindowArray read FFrames;\r\n Property history : TJSHistory read FHistory;\r\n Property indexedDB : TJSIDBFactory read FIndexedDB;\r\n Property innerHeight : NativeInt Read FInnerheight;\r\n Property innerWidth : NativeInt Read FInnerWidth;\r\n Property length : NativeInt Read FLength;\r\n Property localStorage : TJSStorage Read FLocalStorage; \r\n property location : TJSLocation Read FLocation;\r\n Property locationString : String read FLocationString write FLocationString;\r\n property locationbar : TJSLocationBar Read FLocationBar;\r\n property menubar : TJSMenuBar Read FMenuBar;\r\n property navigator : TJSNavigator Read FNavigator;\r\n property opener : TJSWindow read FOpener;\r\n Property outerHeight : NativeInt Read FOuterheight;\r\n Property outerWidth : NativeInt Read FOuterWidth;\r\n Property parent : TJSWindow Read FParent;\r\n Property Performance : TJSPerformance Read FPerformance;\r\n property personalbar : TJSPersonalBar Read FPersonalBar;\r\n property screen : TJSScreen read FScreen;\r\n property screenX : NativeInt read FScreenX;\r\n Property screenY : NativeInt read FScreenY;\r\n Property scrollbar : TJSScrollBars Read FScrollbar;\r\n property scrollX : NativeInt read FScrollX;\r\n Property scrollY : NativeInt read FScrollY;\r\n Property _Self : TJSWindow read FSelf;\r\n Property sessionStorage : TJSStorage Read FSessionStorage; \r\n property toolbar : TJSToolBar Read FToolBar;\r\n property top : TJSWindow Read FTop;\r\n property URL : TJSURL Read FURL; \r\n end;\r\n\r\n { TJSCSSStyleDeclaration }\r\n\r\n TJSCSSStyleDeclaration = class external name 'CSSStyleDeclaration'\r\n private\r\n FLength: NativeInt; external name 'length';\r\n FParentRule: TJSCSSRule; external name 'parentRule';\r\n public\r\n cssText : string;\r\n function item(aIndex : Integer) : string;\r\n function removeProperty(const aProperty : String) : string;\r\n function getPropertyPriority(const aProperty : String) : string;\r\n function getPropertyValue(const aProperty : String) : string;\r\n procedure setProperty(const aProperty,aValue : String);overload;\r\n procedure setProperty(const aProperty,aValue,aPriority : string); overload;\r\n property length : NativeInt read FLength;\r\n property parentRule : TJSCSSRule read FParentRule;\r\n end;\r\n\r\n\r\n\r\n\r\n\r\n { TJSHTMLElement }\r\n TJSHTMLElement = class external name 'HTMLELement' (TJSElement)\r\n private\r\n FDataset: TJSObject ; external name 'dataset';\r\n FIsContentEditable: Boolean ; external name 'isContentEditable';\r\n FOffsetHeight: Double; external name 'offsetHeight';\r\n FOffsetLeft: Double; external name 'offsetLeft';\r\n FOffsetParent: TJSElement; external name 'offsetParent';\r\n FOffsetTop: Double; external name 'offsetTop';\r\n FOffsetWidth: Double; external name 'offsetWidth';\r\n Public\r\n accessKey : string;\r\n contentEditable : string;\r\n dir : string;\r\n draggable : boolean;\r\n hidden : boolean;\r\n lang : string;\r\n spellcheck : boolean;\r\n style : TJSCSSStyleDeclaration;\r\n tabIndex : Integer;\r\n title: string;\r\n onabort : TJSEventHandler;\r\n onanimationcancel: THTMLAnimationEventHandler;\r\n onanimationend: THTMLAnimationEventHandler;\r\n onblur : TJSEventHandler;\r\n oncancel : TJSEventHandler;\r\n oncanplay : TJSEventHandler;\r\n oncanplaythrough : TJSEventHandler;\r\n onchange : TJSEventHandler;\r\n onclick: THTMLClickEventHandler;\r\n onclose : TJSEventHandler;\r\n oncontextmenu : TJSEventHandler;\r\n ondblclick : THTMLClickEventHandler;\r\n ondrag : TJSDragDropEventHandler;\r\n ondragend : TJSDragDropEventHandler;\r\n ondragenter : TJSDragDropEventHandler;\r\n ondragexit : TJSDragDropEventHandler;\r\n ondragover : TJSDragDropEventHandler;\r\n ondragleave : TJSDragDropEventHandler;\r\n ondragstart: TJSDragDropEventHandler;\r\n ondrop : TJSDragDropEventHandler;\r\n onerror : TJSErrorEventHandler;\r\n onfocus : TJSFocusEventhandler;\r\n ondurationchange : TJSEventHandler;\r\n onemptied : TJSEventHandler;\r\n onended : TJSEventHandler;\r\n ongotpointercapture : TJSPointerEventHandler;\r\n oninput : TJSEventhandler;\r\n oninvalid : TJSEventhandler;\r\n onkeydown : TJSKeyEventhandler;\r\n onkeypress : TJSKeyEventhandler;\r\n onkeyup : TJSKeyEventhandler;\r\n onload : TJSEventhandler;\r\n onloadeddata : TJSEventhandler;\r\n onloadedmetadata : TJSEventhandler;\r\n onloadend : TJSLoadEventhandler;\r\n onloadstart : TJSLoadEventhandler;\r\n onlostpointercapture : TJSPointerEventHandler;\r\n onmousedown : TJSMouseEventHandler;\r\n onmouseenter : TJSMouseEventHandler;\r\n onmouseleave : TJSMouseEventHandler;\r\n onmousemove : TJSMouseEventHandler;\r\n onmouseout : TJSMouseEventHandler;\r\n onmouseover : TJSMouseEventHandler;\r\n onmouseup : TJSMouseEventHandler;\r\n onmousewheel : TJSMouseEventHandler;\r\n onpause : TJSPointerEventHandler;\r\n onplay : TJSPointerEventHandler;\r\n onplaying : TJSPointerEventHandler;\r\n onpointercancel : TJSPointerEventHandler;\r\n onpointerdown : TJSPointerEventHandler;\r\n onpointerenter : TJSPointerEventHandler;\r\n onpointerleave : TJSPointerEventHandler;\r\n onpointermove : TJSPointerEventHandler;\r\n onpointerout : TJSPointerEventHandler;\r\n onpointerover : TJSPointerEventHandler;\r\n onpointerup : TJSPointerEventHandler;\r\n onpointerlockchange : TJSPointerEventHandler;\r\n onprogress : TJSProgressEventhandler;\r\n onseeked : TJSEventHandler;\r\n onseeking : TJSEventHandler;\r\n onreset : TJSUIEventHandler;\r\n onscroll : TJSUIEventHandler;\r\n onselect : TJSEventHandler;\r\n onselectstart : TJSEventHandler;\r\n onselectionchange : TJSEventHandler;\r\n onshow : TJSEventHandler;\r\n onstalled : TJSEventHandler;\r\n ontimeupdate : TJSEventHandler;\r\n ontransitioncancel : TJSEventHandler;\r\n ontransitionend : TJSEventHandler;\r\n onvolumechange : TJSEventHandler;\r\n onsubmit : TJSEventHandler;\r\n onwheel : TJSMouseWheelEventHandler;\r\n onwaiting : TJSEventHandler;\r\n touchstart : TJSTouchEventHandler;\r\n touchend : TJSTouchEventHandler;\r\n touchmove : TJSTouchEventHandler;\r\n touchcancel : TJSTouchEventHandler;\r\n Procedure blur;\r\n Procedure focus;\r\n Procedure click;\r\n property dataset : TJSObject read FDataset;\r\n property isContentEditable : Boolean read FIsContentEditable;\r\n property offsetHeight : Double Read FOffsetHeight;\r\n property offsetLeft : Double Read FOffsetLeft;\r\n property offsetTop : Double Read FOffsetTop;\r\n property offsetWidth : Double Read FOffsetWidth;\r\n property offsetParent : TJSElement Read FOffsetParent;\r\n end;\r\n\r\n TJSHTMLFormControlsCollection = class external name 'HTMLFormControlsCollection' (TJSHTMLCollection)\r\n Public\r\n function namedItem(S : String) : TJSElement; reintroduce; external name 'namedItem';\r\n property Items[S : String] : TJSElement read namedItem; default;\r\n end;\r\n\r\n { TJSHTMLFormElement }\r\n\r\n TJSHTMLFormElement = class external name 'HTMLFormElement' (TJSHTMLElement)\r\n private\r\n FElements: TJSHTMLFormControlsCollection; external name 'elements';\r\n FLength: NativeInt; external name 'length';\r\n Public\r\n method : string;\r\n target : string;\r\n action : string;\r\n encoding : string;\r\n enctype : string;\r\n acceptCharset : string;\r\n autocomplete : string;\r\n noValidate : boolean;\r\n property elements : TJSHTMLFormControlsCollection read FElements;\r\n Property length : NativeInt Read FLength;\r\n end;\r\n\r\n { TJSValidityState }\r\n\r\n TJSValidityState = class external name 'ValidityState'\r\n private\r\n FBadInput: Boolean; external name 'badInput';\r\n FCustomError: Boolean; external name 'customError';\r\n FPatternMismatch: Boolean; external name 'patternMisMatch';\r\n FRangeOverflow: Boolean; external name 'rangeOverflow';\r\n FRangeUnderflow: Boolean; external name 'rangeUnderflow';\r\n FStepMismatch: Boolean; external name 'stepMismatch';\r\n FTooLong: Boolean; external name 'tooLong';\r\n FTooShort: Boolean; external name 'tooShort';\r\n FTypeMismatch: Boolean; external name 'typeMisMatch';\r\n FValid: Boolean; external name 'valid';\r\n FValueMissing: Boolean; external name 'valueMissing';\r\n public\r\n property badInput : Boolean read FBadInput;\r\n property customError : Boolean read FCustomError;\r\n property patternMisMatch : Boolean read FPatternMismatch;\r\n property rangeOverflow : Boolean read FRangeOverflow;\r\n property rangeUnderflow : Boolean read FRangeUnderflow;\r\n property stepMismatch : Boolean read FStepMismatch;\r\n property tooLong : Boolean read FTooLong;\r\n property tooShort : Boolean read FTooShort;\r\n property typeMisMatch : Boolean read FTypeMismatch;\r\n property valid : Boolean Read FValid;\r\n property valueMissing : Boolean read FValueMissing;\r\n end;\r\n\r\n { TJSBlob }\r\n\r\n TJSBlob = class external name 'Blob' (TJSEventTarget)\r\n private\r\n FSize: NativeInt; external name 'size';\r\n FType: string; external name 'type';\r\n Public\r\n procedure close;\r\n function slice : TJSBlob; overload;\r\n function slice(aStart : NativeInt) : TJSBlob; overload;\r\n function slice(aStart,aEnd : NativeInt) : TJSBlob; overload;\r\n function slice(aStart,aEnd : NativeInt; AContentType : String) : TJSBlob; overload;\r\n property size : NativeInt read FSize;\r\n property _type : string read FType;\r\n end;\r\n\r\n\r\n { TJSHTMLFile }\r\n\r\n TJSHTMLFile = class external name 'File' (TJSBlob)\r\n private\r\n FLastModified: NativeInt; external name 'lastModified';\r\n FLastModifiedDate: TJSDate; external name 'lastModifiedDate';\r\n FName: string; external name 'name';\r\n Public\r\n property name : string read FName;\r\n property lastModified : NativeInt read FLastModified;\r\n property lastModifiedDate : TJSDate read FLastModifiedDate;\r\n end;\r\n\r\n { TJSHTMLFileList }\r\n\r\n TJSHTMLFileList = class external name 'FileList' (TJSEventTarget)\r\n private\r\n FLength: NativeInt; external name 'length';\r\n Public\r\n function item(aIndex : NativeInt) : TJSHTMLFile;\r\n property length : NativeInt read FLength;\r\n property Files[aIndex : NativeInt] : TJSHTMLFile Read item; default;\r\n end;\r\n\r\n { TJSHTMLInputElement }\r\n // https://html.spec.whatwg.org/multipage/forms.html#the-input-element\r\n\r\n TJSHTMLInputElement = class external name 'HTMLInputElement' (TJSHTMLElement)\r\n private\r\n FFiles: TJSHTMLFileList; external name 'files';\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FLabels: TJSNodeList; external name 'labels';\r\n FList: TJSHTMLElement; external name 'list';\r\n FValidationmMessage: string; external name 'validationMessage';\r\n FValidity: TJSValidityState; external name 'validity';\r\n FWillValidate: boolean; external name 'willValidate';\r\n Public\r\n procedure select;\r\n procedure setCustomValidity(aText : string);\r\n procedure stepUp; overload;\r\n procedure stepUp(n : Integer); overload;\r\n function checkValidity : Boolean;\r\n function reportValidity : Boolean;\r\n procedure setSelectionRange(selectionStart, selectionEnd: NativeInt) ; overload;\r\n procedure setSelectionRange(selectionStart, selectionEnd: NativeInt; Direction : string) ; overload;\r\n procedure setRangeText(aText : string; selectionStart, selectionEnd: NativeInt) ; overload;\r\n procedure setRangeText(aText : string; selectionStart, selectionEnd: NativeInt; Direction : string) ; overload;\r\n Public\r\n accept : string;\r\n allowDirs : boolean;\r\n align : string;\r\n alt : string;\r\n autofocus : boolean;\r\n autocapitalize : string;\r\n autocomplete : string;\r\n defaultValue : string;\r\n defaultChecked : string;\r\n checked : boolean;\r\n dirName : string;\r\n disabled : boolean;\r\n formAction : string;\r\n formEncType : string;\r\n formMethod : string;\r\n formNoValidate : Boolean;\r\n formTarget : string;\r\n height : Boolean;\r\n indeterminate : boolean;\r\n inputMode : string;\r\n max : string;\r\n maxLength : NativeInt;\r\n min : string;\r\n minLength : NativeInt;\r\n multiple : boolean;\r\n pattern : string;\r\n placeholder : string;\r\n readOnly : boolean;\r\n required : boolean;\r\n size : NativeInt;\r\n src : string;\r\n step : string;\r\n _type : string; external name 'type';\r\n selectionStart : NativeInt;\r\n selectionEnd : NativeInt;\r\n selectionDirection : string;\r\n useMap : string;\r\n value : string;\r\n width : NativeInt;\r\n property files : TJSHTMLFileList Read FFiles;\r\n property form : TJSHTMLFormElement read FForm;\r\n property labels : TJSNodeList read FLabels;\r\n property list : TJSHTMLElement Read FList;\r\n property validationMessage : string read FValidationmMessage;\r\n property willValidate : boolean read FWillValidate;\r\n property validity : TJSValidityState read FValidity;\r\n end;\r\n\r\n { TJSHTMLOptionElement }\r\n\r\n TJSHTMLOptionElement = class external name 'Option' (TJSHTMLElement)\r\n private\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FIndex: NativeInt; external name 'index';\r\n Public\r\n Constructor New; overload;\r\n Constructor New(aText : String); overload;\r\n Constructor New(aText,aValue : String); overload;\r\n Constructor New(aText,aValue : String; aDefaultSelected : Boolean); overload;\r\n Constructor New(aText,aValue : String; aDefaultSelected,Selected : Boolean); overload;\r\n Public\r\n defaultSelected : boolean;\r\n disabled : boolean;\r\n _label : string ; external name 'label';\r\n selected : boolean;\r\n text : string;\r\n value : string;\r\n property index : NativeInt Read FIndex;\r\n property form : TJSHTMLFormElement Read FForm;\r\n end;\r\n\r\n TJSHTMLOptGroupElement = class external name 'HTMLOptGroupElement' (TJSHTMLElement)\r\n end;\r\n\r\n TJSHTMLOptionsCollection = class external name 'HTMLOptionsCollection' (TJSHTMLCollection)\r\n end;\r\n\r\n { TJSHTMLSelectElement }\r\n\r\n TJSHTMLSelectElement = Class external name 'HTMLSelectElement' (TJSHTMLElement)\r\n private\r\n FForm: TJSHTMLFormElement; external name 'form';\r\n FLabels: TJSNodeList; external name 'labels';\r\n FLength: NativeInt; external name 'length';\r\n FOptions: TJSHTMLOptionsCollection; external name 'options';\r\n FSelectedOptions: TJSHTMLCollection; external name 'selectedOptions';\r\n FType: String; external name 'type';\r\n FValidationMessage: string; external name 'validationMessage';\r\n FValidity: TJSValidityState; external name 'validity';\r\n fwillValidate: Boolean; external name 'willValidate';\r\n Public\r\n Procedure add(anItem : TJSHTMLOptionElement); overload;\r\n Procedure add(anItem, before : TJSHTMLOptionElement); overload;\r\n function item(aIndex : NativeInt): TJSHTMLOptionElement;\r\n function namedItem(aName : String): TJSHTMLOptionElement;\r\n procedure remove(aIndex : NativeInt);\r\n procedure checkValidity;\r\n procedure setCustomValidity(aMessage : String);\r\n Public\r\n multiple : boolean;\r\n required: boolean;\r\n selectedIndex : NativeInt;\r\n size : NativeInt;\r\n value : string;\r\n property length : NativeInt read FLength;\r\n Property options : TJSHTMLOptionsCollection read FOptions;\r\n Property selectedOptions : TJSHTMLCollection read FSelectedOptions;\r\n Property form : TJSHTMLFormElement read FForm;\r\n property labels : TJSNodeList Read FLabels;\r\n property _type : String Read FType;\r\n property validity : TJSValidityState Read FValidity;\r\n property validationMessage : string Read FValidationMessage;\r\n property willValidate : Boolean read fwillValidate;\r\n end;\r\n\r\n { TJSHTMLTableElement }\r\n\r\n TJSHTMLTableSectionElement = class;\r\n TJSHTMLTableRowElement = class;\r\n\r\n TJSHTMLTableElement = Class external name 'HTMLTableElement'(TJSHTMLElement)\r\n private\r\n FAlign: String; external name 'align';\r\n FBGColor: String; external name 'bgColor';\r\n FBorder: String; external name 'border';\r\n FCaption: TJSHTMLElement; external name 'caption';\r\n FCellPadding: String; external name 'cellPadding';\r\n FCellSpacing: String; external name 'cellSpacing';\r\n FFrame: String; external name 'frame';\r\n FRows: TJSHTMLCollection; external name 'rows';\r\n FRules: String; external name 'rules';\r\n FSummary: String; external name 'summary';\r\n FTBodies: TJSHTMLCollection; external name 'tBodies';\r\n FTfoot: TJSHTMLTableSectionElement; external name 'tfoot';\r\n FTHead: TJSHTMLTableSectionElement; external name 'tHead';\r\n FWidth: String; external name 'width';\r\n public\r\n { Methods }\r\n function createCaption: TJSHTMLElement;\r\n function createTFoot: TJSHTMLTableSectionElement;\r\n function createTHead: TJSHTMLTableSectionElement;\r\n procedure deleteCaption;\r\n procedure deleteRow(index: Integer);\r\n procedure deleteTFoot;\r\n procedure deleteTHead;\r\n function insertRow(index: Integer): TJSHTMLTableRowElement;\r\n { Properties }\r\n property align: String read FAlign write FAlign;\r\n property bgColor: String read FBGColor write FBGColor;\r\n property border: String read FBorder write FBorder;\r\n property caption: TJSHTMLElement read FCaption;\r\n property cellPadding: String read FCellPadding write FCellPadding;\r\n property cellSpacing: String read FCellSpacing write FCellSpacing;\r\n property frame: String read FFrame write FFrame;\r\n property rows: TJSHTMLCollection read FRows;\r\n property rules: String read FRules write FRules;\r\n property summary: String read FSummary write FSummary;\r\n property tBodies: TJSHTMLCollection read FTBodies;\r\n property tfoot: TJSHTMLTableSectionElement read FTfoot;\r\n property tHead: TJSHTMLTableSectionElement read FTHead;\r\n property width: String read FWidth write FWidth;\r\n end;\r\n\r\n { TJSHTMLTableSectionElement }\r\n\r\n TJSHTMLTableSectionElement = Class external name 'HTMLTableSectionElement' (TJSHTMLElement)\r\n private\r\n Falign: String; external name 'align';\r\n Frows: TJSHTMLCollection external name 'rows';\r\n Fch: String; external name 'ch';\r\n FchOff: String; external name 'chOff';\r\n FvAlign: String; external name 'vAlign';\r\n public\r\n { Methods }\r\n procedure deleteRow(index: Integer);\r\n function insertRow(index: Integer): TJSHTMLTableRowElement;\r\n { Properties }\r\n property align: String read Falign write Falign;\r\n property rows: TJSHTMLCollection read Frows;\r\n property ch: String read Fch write Fch;\r\n property chOff: String read FchOff write FchOff;\r\n property vAlign: String read FvAlign write FvAlign;\r\n end;\r\n\r\n { TJSHTMLTableCellElement }\r\n\r\n TJSHTMLTableCellElement = Class external name 'HTMLTableCellElement' (TJSHTMLElement)\r\n private\r\n Fabbr: String; external name 'abbr';\r\n Falign: String; external name 'align';\r\n Faxis: String; external name 'axis';\r\n FbgColor: String; external name 'bgColor';\r\n FcellIndex: Integer; external name 'cellIndex';\r\n Fch: String; external name 'ch';\r\n FchOff: String; external name 'chOff';\r\n FcolSpan: Integer; external name 'colSpan';\r\n Fheaders: String; external name 'headers';\r\n Fheight: String; external name 'height';\r\n FnoWrap: Boolean; external name 'noWrap';\r\n FrowSpan: Integer; external name 'rowSpan';\r\n Fscope: String; external name 'scope';\r\n FvAlign: String; external name 'vAlign';\r\n Fwidth: String; external name 'width';\r\n public\r\n { Properties }\r\n property abbr: String read Fabbr write Fabbr;\r\n property align: String read Falign write Falign;\r\n property axis: String read Faxis write Faxis;\r\n property bgColor: String read FbgColor write FbgColor;\r\n property cellIndex: Integer read FcellIndex;\r\n property ch: String read Fch write Fch;\r\n property chOff: String read FchOff write FchOff;\r\n property colSpan: Integer read FcolSpan write FcolSpan;\r\n property headers: String read Fheaders write Fheaders;\r\n property height: String read Fheight write Fheight;\r\n property noWrap: Boolean read FnoWrap write FnoWrap;\r\n property rowSpan: Integer read FrowSpan write FrowSpan;\r\n property scope: String read Fscope write Fscope;\r\n property vAlign: String read FvAlign write FvAlign;\r\n property width: String read Fwidth write Fwidth;\r\n end;\r\n\r\n { TJSHTMLTableRowElement }\r\n\r\n TJSHTMLTableRowElement = Class external name 'HTMLTableRowElement' (TJSHTMLElement)\r\n private\r\n Falign: String; external name 'align';\r\n FbgColor: String; external name 'bgColor';\r\n Fcells: TJSHTMLCollection; external name 'cells';\r\n Fch: String; external name 'ch';\r\n FchOff: String; external name 'chOff';\r\n FrowIndex: Integer; external name 'rowIndex';\r\n FsectionRowIndex: Integer; external name 'sectionRowIndex';\r\n FvAlign: String; external name 'vAlign';\r\n public\r\n { Methods }\r\n procedure deleteCell(index: Integer);\r\n function insertCell(index: Integer): TJSHTMLTableCellElement;\r\n { Properties }\r\n property align: String read Falign write Falign;\r\n property bgColor: String read FbgColor write FbgColor;\r\n property cells: TJSHTMLCollection read Fcells;\r\n property ch: String read Fch write Fch;\r\n property chOff: String read FchOff write FchOff;\r\n property rowIndex: Integer read FrowIndex;\r\n property sectionRowIndex: Integer read FsectionRowIndex;\r\n property vAlign: String read FvAlign write FvAlign;\r\n end;\r\n\r\n { TJSHTMLTableDataCellElement }\r\n\r\n TJSHTMLTableDataCellElement = Class external name 'HTMLTableDataCellElement' (TJSHTMLElement)\r\n private\r\n Fabbr: String; external name 'abbr';\r\n public\r\n { Properties }\r\n property abbr: String read Fabbr write Fabbr;\r\n end;\r\n\r\n\r\n TJSCanvasRenderingContext2D = Class;\r\n\r\n THTMLCanvasToBlobCallback = Reference to function (aBlob : TJSBlob) : boolean;\r\n\r\n TJSHTMLCanvasElement = Class external name 'HTMLCanvasElement' (TJSHTMLElement)\r\n Public\r\n height : integer;\r\n width : integer;\r\n Function getContext(contextType : string) : TJSObject;\r\n Function getContext(contextType : string; contextAttributes : TJSObject) : TJSObject;\r\n Function getContextAs2DContext(contextType : string; contextAttributes : TJSObject) : TJSCanvasRenderingContext2D; external name 'getContext';\r\n Function getContextAs2DContext(contextType : string) : TJSCanvasRenderingContext2D; external name 'getContext';\r\n Procedure toBlob (aCallBack : THTMLCanvasToBlobCallback; aMimeType : String); overload;\r\n Procedure toBlob (aCallBack : THTMLCanvasToBlobCallback; aMimeType : String; aQuality : Double); overload;\r\n Function toDataURL : String; overload;\r\n Function toDataURL(aMimeType : String) : String; overload;\r\n Function toDataURL(aMimeType : String; aQuality : Double) : String; overload;\r\n end;\r\n\r\n // Opaque objects\r\n TJSCanvasGradient = class external name 'CanvasGradient'\r\n end;\r\n\r\n TJSCanvasPattern = class external name 'CanvasPattern'\r\n end;\r\n\r\n TJSPath2D = class external name 'Path2D'\r\n end;\r\n\r\n { TJSImageData }\r\n\r\n TJSImageData = class external name 'ImageData'\r\n private\r\n FData: TJSUint8ClampedArray; external name 'data';\r\n FHeight: Integer; external name 'height';\r\n FWidth: Integer; external name 'width';\r\n Public\r\n constructor new(awidth,aheight : integer); overload;\r\n constructor new(anArray :TJSUint8ClampedArray; awidth,aheight : integer); overload;\r\n property data : TJSUint8ClampedArray read FData;\r\n property height : Integer Read FHeight;\r\n property width : Integer Read FWidth;\r\n end;\r\n\r\n TCanvasCoordType = double; // Is in fact a number.\r\n\r\n TJSTextMetrics = record\r\n width : TCanvasCoordType;\r\n actualBoundingBoxLeft : TCanvasCoordType;\r\n actualBoundingBoxRight : TCanvasCoordType;\r\n fontBoundingBoxAscent : TCanvasCoordType;\r\n fontBoundingBoxDescent : TCanvasCoordType;\r\n actualBoundingBoxAscent : TCanvasCoordType;\r\n actualBoundingBoxDescent : TCanvasCoordType;\r\n emHeightAscent : TCanvasCoordType;\r\n emHeightDescent : TCanvasCoordType;\r\n hangingBaseline : TCanvasCoordType;\r\n alphabeticBaseline : TCanvasCoordType;\r\n ideographicBaseline : TCanvasCoordType;\r\n end;\r\n\r\n { TJSCanvasRenderingContext2D }\r\n TJSCanvasRenderingContext2D = class external name 'CanvasRenderingContext2D'\r\n private\r\n FCanvas: TJSHTMLCanvasElement; external name 'canvas';\r\n FfillStyleColor: String; external name 'fillStyle';\r\n FfillStyleGradient: TJSCanvasGradient; external name 'fillStyle';\r\n FfillStylePattern: TJSCanvasPattern; external name 'fillStyle';\r\n FstrokeStyleColor: String; external name 'strokeStyle';\r\n FstrokeStyleGradient: TJSCanvasGradient; external name 'strokeStyle';\r\n FstrokeStylePattern: TJSCanvasPattern; external name 'strokeStyle';\r\n Public\r\n fillStyle : JSValue;\r\n font : string;\r\n globalAlpha : double;\r\n globalCompositeOperation : String;\r\n lineCap : string;\r\n lineDashOffset : Double;\r\n lineJoin : String;\r\n lineWidth : Double;\r\n miterLimit : Double;\r\n shadowBlur : Double;\r\n shadowColor : String;\r\n shadowOffsetX : Double;\r\n shadowOffsetY : Double;\r\n strokeStyle : JSValue;\r\n textAlign : String;\r\n textBaseline : String;\r\n procedure arc(x,y, radius,startAngle,endAngle : TCanvasCoordType); overload;\r\n procedure arc(x,y, radius,startAngle,endAngle : TCanvasCoordType; antiClockWise : boolean); overload;\r\n procedure arcTo(x1,y1,x2,y2,radius : TCanvasCoordType); overload;\r\n procedure beginPath;\r\n procedure bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y : TCanvasCoordType); overload;\r\n procedure clearRect(x,y,width,height : TCanvasCoordType);\r\n procedure clip; overload;\r\n procedure clip(aFillRule : String); overload;\r\n procedure clip(aPath : TJSPath2D); overload;\r\n procedure closePath;\r\n function createImageData(aWidth,aHeight : Integer) : TJSImageData; overload;\r\n function createImageData(aImage : TJSImageData) : TJSImageData; overload;\r\n function createLinearGradient(x0,y0,x1,y1 : TCanvasCoordType) : TJSCanvasGradient;\r\n function createPattern(aImage : TJSObject; repetition : string) : TJSCanvasPattern;\r\n function createRadialGradient(x0,y0,r0,x1,y1,r1 : TCanvasCoordType) : TJSCanvasGradient;\r\n procedure drawFocusIfNeeded(aElement : TJSElement); overload;\r\n procedure drawFocusIfNeeded(aPath : TJSPath2D; aElement : TJSElement); overload;\r\n procedure drawImage(image : TJSObject; dx,dy : TCanvasCoordType); overload;\r\n procedure drawImage(image : TJSObject; dx,dy,dwidth,dheight : TCanvasCoordType); overload;\r\n procedure drawImage(image : TJSObject; sx,sy,sWidth,sHeight,dx,dy,dwidth,dheight : TCanvasCoordType); overload;\r\n procedure fill; overload;\r\n procedure fill(aRule : String); overload;\r\n procedure fill(aPath : TJSPath2D); overload;\r\n procedure fill(aPath : TJSPath2D;aRule : String); overload;\r\n procedure fillRect(x,y,awidth,aheight: TCanvasCoordType); overload;\r\n procedure fillText(aText : string; x,y : TCanvasCoordType); overload;\r\n procedure fillText(aText : string; x,y, aMaxWidth : TCanvasCoordType); overload;\r\n function getImageData(x,y,awidth,aheight: TCanvasCoordType) : TJSImageData; overload;\r\n function getLineDash : TJSArray;\r\n function isPointInPath(x,y : TCanvasCoordType) : Boolean; overload;\r\n function isPointInPath(x,y : TCanvasCoordType; aFillRule : String) : Boolean; overload;\r\n function isPointInPath(aPath : TJSPath2D; x,y : TCanvasCoordType) : Boolean; overload;\r\n function isPointInPath(aPath : TJSPath2D; x,y : TCanvasCoordType; aFillRule : String) : Boolean; overload;\r\n function isPointInStroke(x,y : TCanvasCoordType) : Boolean; overload;\r\n function isPointInStroke(aPath : TJSPath2D; x,y : TCanvasCoordType) : Boolean; overload;\r\n procedure lineTo(x,y : TCanvasCoordType);\r\n function measureText(S : String) : TJSTextMetrics;\r\n procedure moveTo(x,y : TCanvasCoordType);\r\n procedure putImageData(aData : TJSImageData; x,y: TCanvasCoordType) ; overload;\r\n procedure putImageData(aData : TJSImageData; x,y,dityX,dirtyY,dirtyWidth,dirtyHeight: TCanvasCoordType) ; overload;\r\n procedure quadraticCurveTo(cpx,cpy,x,y : TCanvasCoordType);\r\n procedure rect(x,y,awidth,aheight: TCanvasCoordType); overload;\r\n procedure restore;\r\n procedure rotate(anAngle : double);\r\n procedure save;\r\n procedure scale(x,y : double);\r\n procedure setLineDash(segments : TJSArray); overload;\r\n procedure setLineDash(segments : array of integer); overload;\r\n procedure setTransform(a,b,c,d,e,f : double);\r\n procedure stroke; overload;\r\n procedure stroke(aPath : TJSPath2D); overload;\r\n procedure strokeRect(x,y,awidth,aheight: TCanvasCoordType);\r\n procedure strokeText(aText : string; x,y : TCanvasCoordType); overload;\r\n procedure strokeText(aText : string; x,y, aMaxWidth : TCanvasCoordType); overload;\r\n procedure transform(a,b,c,d,e,f : double);\r\n procedure translate(x,y : TCanvasCoordType);\r\n\r\n property canvas : TJSHTMLCanvasElement Read FCanvas;\r\n property fillStyleAsColor : String Read FfillStyleColor Write FfillStyleColor;\r\n property fillStyleAsGradient : TJSCanvasGradient Read FfillStyleGradient Write FfillStyleGradient;\r\n property fillStyleAsPattern : TJSCanvasPattern Read FfillStylePattern Write FfillStylePattern;\r\n property strokeStyleAsColor : String Read FstrokeStyleColor Write FstrokeStyleColor;\r\n property strokeStyleAsGradient : TJSCanvasGradient Read FstrokeStyleGradient Write FstrokeStyleGradient;\r\n property strokeStyleAsPattern : TJSCanvasPattern Read FstrokeStylePattern Write FstrokeStylePattern;\r\n end;\r\n\r\n { TJSHTMLIFrameElement }\r\n\r\n TJSHTMLIFrameElement = Class external name 'HTMLIFrameElement' (TJSHTMLElement)\r\n private\r\n FAllowPaymentRequest: Boolean; external name 'allowPaymentRequest';\r\n FContentDocument: TJSDocument; external name 'contentDocument';\r\n FContentWindow: TJSWindow; external name 'contentWindow';\r\n FSandbox: string; external name 'sandbox';\r\n Public\r\n height : string;\r\n src : string;\r\n srcdoc : string;\r\n width : string;\r\n Property allowPaymentRequest : Boolean Read FAllowPaymentRequest;\r\n property contentWindow : TJSWindow Read FContentWindow;\r\n property contentDocument : TJSDocument Read FContentDocument;\r\n property sandbox : string read FSandbox;\r\n end;\r\n\r\n TJSHTMLScriptElement = Class external name 'HTMLScriptElement' (TJSHTMLElement)\r\n Public\r\n type_ : String;\r\n src : String;\r\n charset : string;\r\n async : boolean;\r\n defer : boolean;\r\n text : string;\r\n noModule : boolean;\r\n end;\r\n\r\n\r\n\r\n TJSXMLHttpRequestEventTarget = class external name 'XMLHttpRequestEventTarget' (TJSEventTarget)\r\n end;\r\n\r\n TJSXMLHttpRequestUpload = class external name 'XMLHttpRequestUpload' (TJSXMLHttpRequestEventTarget)\r\n end;\r\n\r\n { TJSXMLHttpRequest }\r\n TJSOnReadyStateChangeHandler = reference to procedure;\r\n\r\n TJSXMLHttpRequest = class external name 'XMLHttpRequest' (TJSXMLHttpRequestEventTarget)\r\n private\r\n FReadyState: NativeInt; external name 'readyState';\r\n FResponse: JSValue; external name 'response';\r\n FResponseText: string; external name 'responseText';\r\n FResponseType: string; external name 'responseType';\r\n FresponseURL: string; external name 'responseURL';\r\n FresponseXML: TJSDocument; external name 'responseXML';\r\n FUpload: TJSXMLHttpRequestUpload; external name 'upload';\r\n FStatus : integer; external name 'status';\r\n FStatusText : string; external name 'statusText';\r\n public\r\n const\r\n UNSENT = 0;\r\n OPENED = 1;\r\n HEADERS_RECEIVED = 3;\r\n LOADING = 3;\r\n DONE = 4;\r\n public\r\n timeout : LongWord;\r\n withCredentials : Boolean;\r\n onreadystatechange : TJSOnReadyStateChangeHandler;\r\n constructor new;\r\n procedure abort;\r\n function getResponseHeader(aName : string) : String;\r\n function getAllResponseHeaders : String;\r\n procedure open(aMethod,aURL : String); overload;\r\n procedure open(aMethod,aURL : String; Async : Boolean); overload;\r\n procedure open(aMethod,aURL : String; Async : Boolean; AUserame : String); overload;\r\n procedure open(aMethod,aURL : String; Async : Boolean; AUserame,APassword : String); overload;\r\n procedure overrideMimeType(aType : String);\r\n procedure send(aBody : jsValue);overload;\r\n procedure send;overload;\r\n procedure setRequestHeader(aName, AValue : string);\r\n\r\n property readyState : NativeInt read FReadyState;\r\n property ResponseHeaders[aName : string] : string Read getResponseHeader;\r\n property responseXML : TJSDocument read FresponseXML;\r\n property responseURL : string read FresponseURL;\r\n property responseType : string read FResponseType;\r\n property response : JSValue Read FResponse;\r\n property responseText : string read FResponseText;\r\n property Status : integer read FStatus;\r\n property StatusText : string read FStatusText;\r\n property upload : TJSXMLHttpRequestUpload read FUpload;\r\n\r\n end;\r\n\r\n { TJSUIEvent }\r\n\r\n TJSUIEvent = class external name 'UIEvent' (TJSEvent)\r\n private\r\n FDetail: NativeInt; external name 'detail';\r\n FView: TJSWindow; external name 'view';\r\n Public\r\n property detail : NativeInt read FDetail;\r\n property view : TJSWindow read FView;\r\n end;\r\n\r\n { TJSMouseEvent }\r\n\r\n TJSMouseEvent = class external name 'MouseEvent' (TJSUIevent)\r\n private\r\n FAltKey: Boolean; external name 'altKey';\r\n FBUtton: NativeInt; external name 'button';\r\n FBUttons: NativeInt; external name 'buttons';\r\n FClientX: Double; external name 'clientX';\r\n FClientY: Double; external name 'clientY';\r\n FCtrlKey: Boolean; external name 'ctrlKey';\r\n FMetaKey: Boolean; external name 'metaKey';\r\n FmovementX: Double; external name 'movementX';\r\n FmovementY: Double; external name 'movementY';\r\n FoffsetX: Double; external name 'offsetX';\r\n FoffsetY: Double; external name 'offsetY';\r\n FRegion: String; external name 'region';\r\n FRelatedTarget: TJSEventTarget; external name 'relatedTarget';\r\n FscreenX: Double; external name 'screenX';\r\n FscreenY: Double; external name 'screenY';\r\n FShiftKey: Boolean; external name 'shiftKey';\r\n Public\r\n function getModifierState(keyArg: String): boolean;\r\n Property altKey : Boolean read FAltKey;\r\n Property button: NativeInt read FBUtton;\r\n Property buttons: NativeInt read FBUttons;\r\n property clientX : Double read FClientX;\r\n property clientY : Double read FClientY;\r\n property ctrlKey : Boolean read FCtrlKey;\r\n property metaKey : Boolean read FMetaKey;\r\n property movementX : Double read FmovementX;\r\n property movementY : Double read FmovementY;\r\n property offsetX : Double read FoffsetX;\r\n property offsetY : Double read FoffsetY;\r\n{$IFDEF FIREFOX}\r\n property pageX : Double read FpageX;\r\n property pageY : Double read FpageY;\r\n{$ENDIF}\r\n property region : String read FRegion;\r\n property relatedTarget : TJSEventTarget read FRelatedTarget;\r\n property screenX : Double read FscreenX;\r\n property screenY : Double read FscreenY;\r\n property shiftKey : Boolean read FShiftKey;\r\n property x : Double read FClientX;\r\n property y : Double read FClientY;\r\n end;\r\n\r\n { TJSWheelEvent }\r\n TJSWheelEventInit = record\r\n deltaX : Double;\r\n deltaY : Double;\r\n deltaZ : Double;\r\n deltaMode : NativeInt;\r\n end;\r\n\r\n TJSWheelEvent = class external name 'WheelEvent' (TJSMouseEvent)\r\n private\r\n FDeltaMode: NativeInt; external name 'deltaMode';\r\n FDeltaX: Double; external name 'deltaX';\r\n FDeltaY: Double; external name 'deltaY';\r\n FDeltaZ: Double; external name 'deltaZ';\r\n Public\r\n constructor new(atype : String); overload;\r\n constructor new(atype : String; aInit : TJSWheelEventInit); overload;\r\n Property deltaX : Double Read FDeltaX;\r\n Property deltaY : Double Read FDeltaY;\r\n Property deltaZ : Double Read FDeltaZ;\r\n Property deltaMode : NativeInt Read FDeltaMode;\r\n end;\r\n\r\n TJSPointerEvent = Class external name 'PointerEvent' (TJSMouseEvent);\r\n\r\n TJSTouchEvent = Class external name 'TouchEvent'(TJSUIEvent)\r\n private\r\n FAltKey: Boolean; external name 'altKey';\r\n FChangedTouches: TJSTouchList; external name 'changedTouches';\r\n FCtrlKey: Boolean; external name 'ctrlKey';\r\n FMetaKey: Boolean; external name 'metaKey';\r\n FShiftKey: Boolean; external name 'shiftKey';\r\n FTargetTouches: TJSTouchList; external name 'targetTouches';\r\n FTouches: TJSTouchList; external name 'touches';\r\n Public\r\n Property altKey : Boolean Read FAltKey;\r\n Property ctrlKey : Boolean Read FCtrlKey;\r\n Property metaKey : Boolean Read FMetaKey;\r\n Property shiftKey : Boolean Read FShiftKey;\r\n property changedTouches : TJSTouchList Read FChangedTouches;\r\n property touches : TJSTouchList Read FTouches;\r\n property targetTouches : TJSTouchList Read FTargetTouches;\r\n end;\r\n\r\n\r\n // Namespace for standard key names.\r\n // See list at https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values\r\n TJSKeyNames = Class\r\n Const\r\n Alt = 'Alt';\r\n AltGraph = 'AltGraph';\r\n CapsLock = 'CapsLock';\r\n Control = 'Control';\r\n Fn = 'Fn';\r\n FnLock = 'FnLock';\r\n Hyper = 'Hyper';\r\n Meta = 'Meta';\r\n NumLock = 'NumLock';\r\n ScrollLock = 'ScrollLock';\r\n Shift = 'Shift';\r\n Super = 'Super';\r\n Symbol = 'Symbol';\r\n SymbolLock = 'SymbolLock';\r\n Enter = 'Enter';\r\n Tab = 'Tab';\r\n Space = ' ';\r\n ArrowDown = 'ArrowDown';\r\n ArrowLeft = 'ArrowLeft';\r\n ArrowRight = 'ArrowRight';\r\n ArrowUp = 'ArrowUp';\r\n _End = 'End';\r\n Home = 'Home';\r\n PageDown = 'PageDown';\r\n PageUp = 'PageUp';\r\n BackSpace = 'Backspace';\r\n Clear = 'Clear';\r\n Copy = 'Copy';\r\n CrSel = 'CrSel';\r\n Cut = 'Cut';\r\n Delete = 'Delete';\r\n EraseEof = 'EraseEof';\r\n ExSel = 'ExSel';\r\n Insert = 'Insert';\r\n Paste = 'Paste';\r\n Redo = 'Redo';\r\n Undo = 'Undo';\r\n Accept = 'Accept';\r\n Again = 'Again';\r\n Attn = 'Attn';\r\n Cancel = 'Cancel';\r\n ContextMenu = 'Contextmenu';\r\n Escape = 'Escape';\r\n Execute = 'Execute';\r\n Find = 'Find';\r\n Finish = 'Finish';\r\n Help = 'Help';\r\n Pause = 'Pause';\r\n Play = 'Play';\r\n Props = 'Props';\r\n Select = 'Select';\r\n ZoomIn = 'ZoomIn';\r\n ZoomOut = 'ZoomOut';\r\n BrightnessDown = 'BrightnessDown';\r\n BrightnessUp = 'BrightnessUp';\r\n Eject = 'Eject';\r\n LogOff = 'LogOff';\r\n Power = 'Power';\r\n PowerOff = 'PowerOff';\r\n PrintScreen = 'PrintScreen';\r\n Hibernate = 'Hibernate';\r\n Standby = 'Standby';\r\n WakeUp = 'WakeUp';\r\n AllCandidates = 'AllCandidates';\r\n Alphanumeric = 'Alphanumeric';\r\n CodeInput = 'CodeInput';\r\n Compose = 'Compose';\r\n Convert = 'Convert';\r\n Dead = 'Dead';\r\n FinalMode = 'FinalMode';\r\n GroupFirst = 'GroupFirst';\r\n GroupLast = 'GroupLast';\r\n GroupNext = 'GroupNext';\r\n GroupPrevious = 'GroupPrevious';\r\n ModelChange = 'ModelChange';\r\n NextCandidate = 'NextCandidate';\r\n NonConvert = 'NonConvert';\r\n PreviousCandidate = 'PreviousCandidate';\r\n Process = 'Process';\r\n SingleCandidate = 'SingleCandidate';\r\n HangulMode = 'HangulMode';\r\n HanjaMode = 'HanjaMode';\r\n JunjaMode = 'JunjaMode';\r\n Eisu = 'Eisu';\r\n Hankaku = 'Hankaku';\r\n Hiranga = 'Hiranga';\r\n HirangaKatakana = 'HirangaKatakana';\r\n KanaMode = 'KanaMode';\r\n Katakana = 'Katakana';\r\n Romaji = 'Romaji';\r\n Zenkaku = 'Zenkaku';\r\n ZenkakuHanaku = 'ZenkakuHanaku';\r\n F1 = 'F1';\r\n F2 = 'F2';\r\n F3 = 'F3';\r\n F4 = 'F4';\r\n F5 = 'F5';\r\n F6 = 'F6';\r\n F7 = 'F7';\r\n F8 = 'F8';\r\n F9 = 'F9';\r\n F10 = 'F10';\r\n F11 = 'F11';\r\n F12 = 'F12';\r\n F13 = 'F13';\r\n F14 = 'F14';\r\n F15 = 'F15';\r\n F16 = 'F16';\r\n F17 = 'F17';\r\n F18 = 'F18';\r\n F19 = 'F19';\r\n F20 = 'F20';\r\n Soft1 = 'Soft1';\r\n Soft2 = 'Soft2';\r\n Soft3 = 'Soft3';\r\n Soft4 = 'Soft4';\r\n Decimal = 'Decimal';\r\n Key11 = 'Key11';\r\n Key12 = 'Key12';\r\n Multiply = 'Multiply';\r\n Add = 'Add';\r\n NumClear = 'Clear';\r\n Divide = 'Divide';\r\n Subtract = 'Subtract';\r\n Separator = 'Separator';\r\n AppSwitch = 'AppSwitch';\r\n Call = 'Call';\r\n Camera = 'Camera';\r\n CameraFocus = 'CameraFocus';\r\n EndCall = 'EndCall';\r\n GoBack = 'GoBack';\r\n GoHome = 'GoHome';\r\n HeadsetHook = 'HeadsetHook';\r\n LastNumberRedial = 'LastNumberRedial';\r\n Notification = 'Notification';\r\n MannerMode = 'MannerMode';\r\n VoiceDial = 'VoiceDial';\r\n // TODO : Multimedia keys\r\n // TODO : Audio control keys\r\n // TODO : TV control keys\r\n // TODO : Media controller keys\r\n // TODO : Speech recognition keys\r\n // TODO : Document keys\r\n // TODO : Application selector keys\r\n // TODO : Browser Control keys\r\n end;\r\n\r\n\r\n { TJSKeyboardEvent }\r\n\r\n TJSKeyboardEvent = class external name 'KeyboardEvent' (TJSUIEvent)\r\n private\r\n FAltKey: Boolean; external name 'altKey';\r\n FCode: string; external name 'code';\r\n FCtrlKey: Boolean; external name 'ctrlKey';\r\n FIsComposing: Boolean; external name 'isComposing';\r\n FKey: String; external name 'key';\r\n FLocale: string; external name 'locale';\r\n FLocation: NativeInt; external name 'location';\r\n FMetaKey: Boolean; external name 'metaKey';\r\n FRepeat: Boolean; external name 'repeat';\r\n FShiftKey: Boolean; external name 'shiftKey';\r\n Public\r\n function getModifierState(aKey : string) : Boolean;\r\n property code : string read FCode;\r\n Property altKey : Boolean read FAltKey;\r\n property ctrlKey : Boolean read FCtrlKey;\r\n property isComposing : Boolean read FIsComposing;\r\n property Key : String read FKey;\r\n property locale : string read FLocale;\r\n property location : NativeInt read FLocation;\r\n property metaKey : Boolean read FMetaKey;\r\n property _repeat : Boolean read FRepeat;\r\n property shiftKey : Boolean read FShiftKey;\r\n end;\r\n\r\n TJSMessageEvent = class external name 'MessageEvent' (TJSevent)\r\n private\r\n FOrigin: string; external name 'origin';\r\n FData: TJSObject; external name 'data';\r\n public\r\n property origin : string read FOrigin;\r\n property data: TJSObject read FData;\r\n end;\r\n\r\nvar\r\n document : TJSDocument; external name 'document';\r\n window : TJSWindow; external name 'window';\r\n console : TJSConsole; external name 'window.console';\r\n \r\nimplementation\r\n \r\nend.\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2017 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit Math;\r\n\r\n{$mode objfpc}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils;\r\n\r\nconst\r\n MinInteger = -$10000000000000;\r\n MaxInteger = $fffffffffffff;\r\n MinDouble = 5.0e-324;\r\n MaxDouble = 1.7e+308;\r\n\r\n\r\nvar // ToDo: make these const\r\n NaN: Double; external name 'NaN';\r\n Infinity: Double; external name 'Infinity';\r\n NegInfinity: Double; external name '-Infinity';\r\n\r\ntype\r\n float = double;\r\n\r\n //EInvalidArgument = class(EMathError);\r\n\r\nfunction Min(const a, b: Integer): Integer; varargs; external name 'Math.min'; overload;\r\nfunction Max(const a, b: Integer): Integer; varargs; external name 'Math.max'; overload;\r\nfunction Min(const a, b: Double): Double; varargs; external name 'Math.min'; overload;\r\nfunction Max(const a, b: Double): Double; varargs; external name 'Math.max'; overload;\r\nfunction Min(const a, b: NativeLargeInt): Double; varargs; external name 'Math.min'; overload;\r\nfunction Max(const a, b: NativeLargeUInt): Double; varargs; external name 'Math.max'; overload;\r\n\r\nfunction InRange(const AValue, AMin, AMax: Integer): Boolean; assembler; overload;\r\nfunction InRange(const AValue, AMin, AMax: Double): Boolean; assembler; overload;\r\n\r\nfunction EnsureRange(const AValue, AMin, AMax: Integer): Integer; assembler; overload;\r\nfunction EnsureRange(const AValue, AMin, AMax: Double): Double; assembler; overload;\r\n\r\ntype\r\n TRoundToRange = -37..37;\r\n\r\nfunction RoundTo(const AValue: Double; const Digits: TRoundToRange): Double;\r\nfunction SimpleRoundTo(const AValue: Double; const Digits: TRoundToRange = -2): Double;\r\n\r\nfunction randg(mean,stddev : float) : float;\r\nfunction RandomRange(const aFrom, aTo: Integer): Integer;\r\nfunction RandomRange(const aFrom, aTo: NativeLargeInt): NativeLargeInt;\r\n\r\nconst\r\n NegativeValue = -1;\r\n ZeroValue = 0;\r\n PositiveValue = 1;\r\n\r\nfunction Sign(const AValue: Integer): Integer; external name 'Math.sign'; overload;\r\nfunction Sign(const AValue: Double): Double; external name 'Math.sign'; overload;\r\n\r\nfunction IsZero(const d: Double; Epsilon: Double): Boolean; overload;\r\nfunction IsZero(const d: Double): Boolean; overload;\r\n\r\nfunction IsNaN(const v: JSValue): boolean; external name {$IFDEF ECMAScript5}'isNaN'{$ELSE}'Number.isNan'{$ENDIF}; overload;\r\nfunction IsFinite(const d: JSValue): Boolean; external name 'isFinite'; overload;// false if NaN, positive or negative infinity\r\nfunction IsInfinite(const d: JSValue): Boolean; assembler; overload; // negative or positive infinity\r\n{$IFDEF ECMAScript6}\r\nfunction IsInteger(const d: JSValue): Boolean; external name 'Number.isInteger'; // any integer representable by a double\r\nfunction IsSafeInteger(const d: JSValue): Boolean; external name 'Number.isSafeInteger'; // an integer between MinInteger and MaxInteger, inclusive\r\n{$ENDIF}\r\n\r\nfunction SameValue(const A, B: Double; Epsilon: Double = 0.0): Boolean; overload;\r\n\r\n// function Abs is in System.pas\r\nfunction ArcCos(const A : Double): Double; external name 'Math.acos';\r\nfunction ArcCosH(const A: Double): Double; external name 'Math.acosh'; // not on IE\r\nfunction ArcSin(const A : Double): Double; external name 'Math.asin';\r\nfunction ArcSinH(const A : Double): Double; external name 'Math.asinh'; // not on IE\r\nfunction ArcTanH(const A: Double): Double; external name 'Math.atanh'; // not on IE\r\nfunction CosH(const A: Double): Double; external name 'Math.cosh'; // not on IE\r\nfunction ExpM1(const A: Double): Double; external name 'Math.expm1'; // not on IE\r\nfunction FRound(const A: Double): Double; overload; external name 'Math.fround'; // not on IE\r\nfunction FTrunc(const A: Double): double; overload; external name 'Math.trunc'; // not on IE\r\nfunction Hypot(const A : Double): Double; varargs; external name 'Math.hypot'; // not on IE\r\nfunction IMul(const A, B: Integer): Integer; external name 'Math.imul'; // not on IE\r\nfunction Log10(const A: Double): Double; external name 'Math.log10';\r\nfunction Log1p(const A: Double): Double; external name 'Math.log1p'; // not on IE\r\nfunction Log2(const A: Double): Double; external name 'Math.log2'; // not on IE\r\nfunction LogN(const A, Base: Double): Double; \r\nfunction Power(const Base, Exponent: Double): Double; external name 'Math.pow';\r\n// ln, round, sqrt, trunc, cos, sin, arctan, round, exp are in unit system\r\nfunction Ceil(const A: Double): Integer;\r\nfunction Floor(const A: Double): Integer;\r\nfunction Ceil64(const A: Double): NativeLargeInt;\r\nfunction Floor64(const A: Double): NativeLargeInt;\r\nfunction ldexp(x : double;const p : Integer) : double;\r\nprocedure Frexp(X: double; out Mantissa: double; out Exponent: integer);\r\nfunction lnxp1(x : double) : double;\r\n\r\nfunction IntPower(base : float;const exponent : Integer) : double;\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result, Remainder: Word);\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result, Remainder: SmallInt);\r\nprocedure DivMod(Dividend: DWord; Divisor: DWord; out Result, Remainder: DWord);\r\nprocedure DivMod(Dividend: LongInt; Divisor: LongInt; out Result, Remainder: LongInt);\r\n\r\n{ Angle conversion }\r\nfunction DegToRad(deg : double) : double;\r\nfunction RadToDeg(rad : double) : double;\r\nfunction GradToRad(grad : double) : double;\r\nfunction RadToGrad(rad : double) : double;\r\nfunction DegToGrad(deg : double) : double;\r\nfunction GradToDeg(grad : double) : double;\r\n{ one cycle are 2*Pi rad }\r\nfunction CycleToRad(cycle : double) : double;\r\nfunction RadToCycle(rad : double) : double;\r\nFunction DegNormalize(deg : double) : double;\r\n\r\nfunction Norm(const data : array of double) : double;\r\n\r\n// Statistical functions\r\nfunction Mean(const data : array of double) : double;\r\nfunction Sum(const data : array of double) : double;\r\nprocedure SumsAndSquares(const data : Array of Double; out Sum,SumOfSquares : double);\r\n\r\nfunction StdDev(const data : array of Double) : float;\r\nprocedure MeanAndStdDev(const data : array of Double; out Mean,StdDev : double);\r\nfunction Variance(const data : array of Double) : double;\r\nfunction TotalVariance(const data : array of Double) : double;\r\nfunction PopNStdDev(const data : array of Double) : double;\r\nfunction PopNVariance(const data : array of Double) : double;\r\nprocedure MomentSkewKurtosis(const data : array of Double; out m1,m2,m3,m4,skew,kurtosis : double);\r\n\r\n// Financial functions\r\n\r\nType\r\n TPaymentTime = (ptEndOfPeriod,ptStartOfPeriod);\r\n\r\nfunction FutureValue(ARate: double; NPeriods: Integer;\r\n APayment, APresentValue: double; APaymentTime: TPaymentTime): double;\r\n\r\nfunction InterestRate(NPeriods: Integer; APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n\r\nfunction NumberOfPeriods(ARate, APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n\r\nfunction Payment(ARate: double; NPeriods: Integer;\r\n APresentValue, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\n\r\nfunction PresentValue(ARate: double; NPeriods: Integer;\r\n APayment, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\n\r\n// Miscellaneous\r\n\r\nfunction IfThen(val:boolean;const ifTrue:integer; const ifFalse:integer= 0) :integer; overload;\r\nfunction IfThen(val:boolean;const ifTrue:double ; const ifFalse:double =0.0):double; overload;\r\n\r\nType\r\n TValueRelationship = -1..1;\r\n\r\nconst\r\n EqualsValue = 0;\r\n LessThanValue = Low(TValueRelationship);\r\n GreaterThanValue = High(TValueRelationship);\r\n\r\nfunction CompareValue ( const A, B : Integer) : TValueRelationship;\r\nfunction CompareValue ( const A, B : NativeLargeInt) : TValueRelationship;\r\nfunction CompareValue ( const A, B : NativeLargeUInt) : TValueRelationship;\r\nfunction CompareValue ( const A, B : Double; delta : Double = 0.0) : TValueRelationship;\r\n\r\nimplementation\r\n\r\nfunction InRange(const AValue, AMin, AMax: Integer): Boolean; assembler;\r\nasm\r\n return (AValue >= AMin) && (AValue <= AMax);\r\nend;\r\n\r\nfunction InRange(const AValue, AMin, AMax: Double): Boolean; assembler;\r\nasm\r\n return (AValue >= AMin) && (AValue <= AMax);\r\nend;\r\n\r\nfunction EnsureRange(const AValue, AMin, AMax: Integer): Integer; assembler;\r\nasm\r\n if (AValueAMax){ return AMax;\r\n } else return AValue;\r\nend;\r\n\r\nfunction EnsureRange(const AValue, AMin, AMax: Double): Double; assembler;\r\nasm\r\n if (AValueAMax){ return AMax;\r\n } else return AValue;\r\nend;\r\n\r\nfunction RoundTo(const AValue: Double; const Digits: TRoundToRange): Double;\r\nvar\r\n RV : Double;\r\n\r\nbegin\r\n RV:=IntPower(10,Digits);\r\n Result:=Round(AValue/RV)*RV;\r\nend;\r\n\r\nfunction SimpleRoundTo(const AValue: Double; const Digits: TRoundToRange): Double;\r\nvar\r\n RV : Double;\r\n\r\nbegin\r\n RV := IntPower(10, -Digits);\r\n if AValue < 0 then\r\n Result := Int((AValue*RV) - 0.5)/RV\r\n else\r\n Result := Int((AValue*RV) + 0.5)/RV;\r\nend;\r\n\r\nfunction randg(mean,stddev : float) : float;\r\n\r\nVar\r\n U1,S2 : Float;\r\n\r\nbegin\r\n repeat\r\n u1:= 2*random-1;\r\n S2:=Sqr(U1)+sqr(2*random-1);\r\n until s2<1;\r\n Result:=Sqrt(-2*ln(S2)/S2)*u1*stddev+Mean;\r\nend;\r\n\r\n\r\nfunction RandomRange(const aFrom, aTo: Integer): Integer;\r\nbegin\r\n Result:=Random(Abs(aFrom-aTo))+Min(aTo,AFrom);\r\nend;\r\n\r\n\r\nfunction RandomRange(const aFrom, aTo: NativeLargeInt): NativeLargeInt;\r\n\r\nVar\r\n m : NativeLargeInt;\r\nbegin\r\n if aFromB) then\r\n Result:=((A-B)<=Epsilon)\r\n else\r\n Result:=((B-A)<=Epsilon);\r\nend;\r\n\r\nfunction JSFloor(const A: Double): Double; external name 'Math.floor';\r\nfunction JSCeil(const A: Double): Double; external name 'Math.ceil';\r\n\r\nfunction Ceil(const A: Double): Integer;\r\n\r\nbegin\r\n // TODO: add Range check ?\r\n Result:=trunc(JSCeil(a));\r\nend;\r\n\r\nfunction Floor(const A: Double): Integer;\r\n\r\nbegin\r\n // TODO: add Range check ?\r\n Result:=trunc(JSFloor(a));\r\nend;\r\n\r\nfunction Ceil64(const A: Double): NativeLargeInt;\r\n\r\nbegin\r\n Result:=trunc(JSCeil(a));\r\nend;\r\n\r\nfunction Floor64(const A: Double): NativeLargeInt;\r\n\r\nbegin\r\n Result:=trunc(JSCeil(a));\r\nend;\r\n\r\nprocedure Frexp(X: double; out Mantissa: double; out Exponent: integer);\r\n\r\nbegin\r\n Exponent:=0;\r\n if (X<>0) then\r\n if (abs(X)<0.5) then\r\n repeat\r\n X:=X*2;\r\n Dec(Exponent);\r\n until (abs(X)>=0.5)\r\n else\r\n while (abs(X)>=1) do\r\n begin\r\n X:=X/2;\r\n Inc(Exponent);\r\n end;\r\n Mantissa:=X;\r\nend;\r\n\r\nfunction LogN(const A, Base: Double): Double; \r\n\r\nbegin\r\n Result:=Ln(A)/Ln(Base);\r\nend;\r\n\r\nfunction lnxp1(x: double): double;\r\n\r\nvar\r\n y: float;\r\n\r\nbegin\r\n if (x>=4.0) then\r\n result:=ln(1.0+x)\r\n else\r\n begin\r\n y:=1.0+x;\r\n if (y=1.0) then\r\n result:=x\r\n else\r\n begin\r\n result:=ln(y); { lnxp1(-1) = ln(0) = -Inf }\r\n if y>0.0 then\r\n result:=result+(x-(y-1.0))/y;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction ldexp(x : double;const p : Integer) : double;\r\n\r\nbegin\r\n result:=x*intpower(2.0,p);\r\nend;\r\n\r\n\r\nfunction IntPower(base: float; const exponent: Integer): double;\r\n\r\nvar\r\n i : longint;\r\n\r\nbegin\r\n if (base = 0.0) and (exponent = 0) then\r\n result:=1\r\n else\r\n begin\r\n i:=abs(exponent);\r\n Result:=1.0;\r\n while i>0 do\r\n begin\r\n while (i and 1)=0 do\r\n begin\r\n i:=i shr 1;\r\n base:=sqr(base);\r\n end;\r\n i:=i-1;\r\n Result:=Result*base;\r\n end;\r\n if exponent<0 then\r\n Result:=1.0/Result;\r\n end;\r\nend;\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result, Remainder: Word);\r\nbegin\r\n if Dividend < 0 then\r\n begin\r\n Dividend:=-Dividend;\r\n Result:=-(Dividend Div Divisor);\r\n Remainder:=-(Dividend+(Result*Divisor));\r\n end\r\n else\r\n begin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\n end;\r\nend;\r\n\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: Word; out Result,\r\n Remainder: SmallInt);\r\nbegin\r\n if Dividend < 0 then\r\n begin\r\n Dividend:=-Dividend;\r\n Result:=-(Dividend Div Divisor);\r\n Remainder:=-(Dividend+(Result*Divisor));\r\n end\r\n else\r\n begin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\n end;\r\nend;\r\n\r\n\r\nprocedure DivMod(Dividend: DWord; Divisor: DWord; out Result, Remainder: DWord);\r\nbegin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\nend;\r\n\r\n\r\nprocedure DivMod(Dividend: LongInt; Divisor: LongInt; out Result,\r\n Remainder: LongInt);\r\n\r\nbegin\r\n if Dividend < 0 then\r\n begin\r\n Dividend:=-Dividend;\r\n Result:=-(Dividend Div Divisor);\r\n Remainder:=-(Dividend+(Result*Divisor));\r\n end\r\n else\r\n begin\r\n Result:=Dividend Div Divisor;\r\n Remainder:=Dividend-(Result*Divisor);\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Angle conversion\r\n ---------------------------------------------------------------------}\r\nfunction DegToRad(deg: double): double;\r\n\r\nbegin\r\n Result:=deg*(pi/180.0);\r\nend;\r\n\r\n\r\nfunction RadToDeg(rad: double): double;\r\n\r\nbegin\r\n Result:=rad*(180.0/pi);\r\nend;\r\n\r\n\r\nfunction GradToRad(grad: double): double;\r\n\r\nbegin\r\n Result:=grad*(pi/200.0);\r\nend;\r\n\r\n\r\nfunction RadToGrad(rad: double): double;\r\n\r\nbegin\r\n Result:=rad*(200.0/pi);\r\nend;\r\n\r\n\r\nfunction DegToGrad(deg: double): double;\r\n\r\nbegin\r\n Result:=deg*(200.0/180.0);\r\nend;\r\n\r\n\r\nfunction GradToDeg(grad: double): double;\r\n\r\nbegin\r\n Result:=grad*(180.0/200.0);\r\nend;\r\n\r\n\r\nfunction CycleToRad(cycle: double): double;\r\n\r\nbegin\r\n Result:=(2*pi)*cycle;\r\nend;\r\n\r\n\r\nfunction RadToCycle(rad: double): double;\r\n\r\nbegin\r\n Result:=rad*(1/(2*pi));\r\nend;\r\n\r\n\r\nfunction DegNormalize(deg: double): double;\r\n\r\nbegin\r\n Result:=Deg-Int(Deg/360)*360;\r\n If (Result<0) then Result:=Result+360;\r\nend;\r\n\r\nfunction sumofsquares(const data : array of double) : double;\r\nvar\r\n i,N : longint;\r\n\r\nbegin\r\n N:=Length(Data);\r\n Result:=0.0;\r\n for i:=0 to N-1 do\r\n Result:=Result+sqr(data[i]);\r\nend;\r\n\r\nfunction Norm(const data: array of double): double;\r\nbegin\r\n Result:=sqrt(sumofsquares(data));\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Statistical functions\r\n ---------------------------------------------------------------------}\r\n\r\nfunction Sum(const data: array of double): double;\r\n\r\nvar\r\n i,N : longint;\r\n\r\nbegin\r\n N:=Length(Data);\r\n Result:=0.0;\r\n for i:=0 to N-1 do\r\n Result:=Result+data[i];\r\nend;\r\n\r\nfunction Mean(const data: array of double): double;\r\n\r\nVar\r\n N : integer;\r\n\r\nbegin\r\n N:=Length(Data);\r\n if N=0 then\r\n Result:=0\r\n else\r\n Result:=Sum(Data)/N;\r\nend;\r\nprocedure SumsAndSquares(const data: array of Double; out Sum,\r\n SumOfSquares: double);\r\n\r\nvar\r\n i,n : Integer;\r\n t,s,ss: double;\r\n\r\nbegin\r\n n:=length(Data);\r\n ss:=0.0; // Use local vars, var is very inefficient in js\r\n s:=0.0;\r\n for i:=0 to N-1 do\r\n begin\r\n t:=data[i];\r\n ss:=ss+sqr(t);\r\n s:=s+t;\r\n end;\r\n Sum:=s;\r\n SumOfSquares:=ss;\r\nend;\r\n\r\nfunction StdDev(const data: array of Double): float;\r\n\r\nbegin\r\n Result:=Sqrt(Variance(Data));\r\nend;\r\n\r\nfunction Variance(const data: array of Double): double;\r\n\r\nvar\r\n n : integer;\r\n\r\nbegin\r\n N:=Length(Data);\r\n If N=1 then\r\n Result:=0\r\n else\r\n Result:=TotalVariance(Data)/(N-1);\r\nend;\r\n\r\nfunction TotalVariance(const data: array of Double): double;\r\n\r\nvar\r\n S,SS : Float;\r\n N : integer;\r\nbegin\r\n N:=Length(Data);\r\n If Length(Data)=1 then\r\n Result:=0\r\n else\r\n begin\r\n SumsAndSquares(Data,S,SS);\r\n Result := SS-Sqr(S)/N;\r\n end;\r\nend;\r\n\r\nprocedure MeanAndStdDev(const data: array of Double; out Mean, StdDev: double);\r\n\r\nVar\r\n I,N : longint;\r\n M,S : Double;\r\n\r\nbegin\r\n N:=Length(Data);\r\n M:=0;\r\n S:=0;\r\n For I:=0 to N-1 do\r\n begin\r\n M:=M+Data[i];\r\n S:=S+Sqr(Data[i]);\r\n end;\r\n M:=M/N;\r\n S:=(S-N*Sqr(M));\r\n If N>1 then\r\n S:=Sqrt(S/(N-1))\r\n else\r\n S:=0;\r\n Mean:=M;\r\n StdDev:=S;\r\nend;\r\n\r\nfunction PopNStdDev(const data : array of Double) : double;\r\n\r\nbegin\r\n Result:=Sqrt(PopnVariance(Data));\r\nend;\r\n\r\nfunction PopNVariance(const data : array of Double) : double;\r\n\r\nVar\r\n N : integer;\r\n\r\nbegin\r\n N:=Length(Data);\r\n if N=0 then\r\n Result:=0\r\n else\r\n Result:=TotalVariance(Data)/N;\r\nend;\r\n\r\nprocedure MomentSkewKurtosis(const data: array of Double; out m1, m2, m3, m4, skew, kurtosis: double);\r\n\r\nvar\r\n i,N: integer;\r\n deviation, deviation2: double;\r\n reciprocalN: float;\r\n // Use local vars for all calculations, var is very slow\r\n lm1, lm2, lm3, lm4, lskew, lkurtosis: double;\r\n\r\nbegin\r\n N:=length(Data);\r\n lm1 := 0;\r\n reciprocalN := 1/N;\r\n for i := 0 to N-1 do\r\n lm1 := lm1 + data[i];\r\n lm1 := reciprocalN * lm1;\r\n\r\n lm2 := 0;\r\n lm3 := 0;\r\n lm4 := 0;\r\n for i := 0 to N-1 do\r\n begin\r\n deviation := (data[i]-lm1);\r\n deviation2 := deviation * deviation;\r\n lm2 := lm2 + deviation2;\r\n lm3 := lm3 + deviation2 * deviation;\r\n lm4 := lm4 + deviation2 * deviation2;\r\n end;\r\n lm2 := reciprocalN * lm2;\r\n lm3 := reciprocalN * lm3;\r\n lm4 := reciprocalN * lm4;\r\n\r\n lskew := lm3 / (sqrt(lm2)*lm2);\r\n lkurtosis := lm4 / (lm2 * lm2);\r\n\r\n m1:=lm1;\r\n m2:=lm2;\r\n m3:=lm3;\r\n m4:=lm4;\r\n skew:=lskew;\r\n kurtosis:=lkurtosis;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Financial functions\r\n ---------------------------------------------------------------------}\r\n\r\nfunction FutureValue(ARate: double; NPeriods: Integer;\r\n APayment, APresentValue: double; APaymentTime: TPaymentTime): double;\r\nvar\r\n q, qn, factor: double;\r\nbegin\r\n if ARate = 0 then\r\n Result := -APresentValue - APayment * NPeriods\r\n else begin\r\n q := 1.0 + ARate;\r\n qn := power(q, NPeriods);\r\n factor := (qn - 1) / (q - 1);\r\n if APaymentTime = ptStartOfPeriod then\r\n factor := factor * q;\r\n Result := -(APresentValue * qn + APayment*factor);\r\n end;\r\nend;\r\n\r\nfunction InterestRate(NPeriods: Integer; APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n{ The interest rate cannot be calculated analytically. We solve the equation\r\n numerically by means of the Newton method:\r\n - guess value for the interest reate\r\n - calculate at which interest rate the tangent of the curve fv(rate)\r\n (straight line!) has the requested future vale.\r\n - use this rate for the next iteration. }\r\nconst\r\n DELTA = 0.001;\r\n EPS = 1E-9; // required precision of interest rate (after typ. 6 iterations)\r\n MAXIT = 20; // max iteration count to protect agains non-convergence\r\nvar\r\n r1, r2, dr: double;\r\n fv1, fv2: double;\r\n iteration: Integer;\r\nbegin\r\n iteration := 0;\r\n r1 := 0.05; // inital guess\r\n repeat\r\n r2 := r1 + DELTA;\r\n fv1 := FutureValue(r1, NPeriods, APayment, APresentValue, APaymentTime);\r\n fv2 := FutureValue(r2, NPeriods, APayment, APresentValue, APaymentTime);\r\n dr := (AFutureValue - fv1) / (fv2 - fv1) * delta; // tangent at fv(r)\r\n r1 := r1 + dr; // next guess\r\n inc(iteration);\r\n until (abs(dr) < EPS) or (iteration >= MAXIT);\r\n Result := r1;\r\nend;\r\n\r\nfunction NumberOfPeriods(ARate, APayment, APresentValue, AFutureValue: double;\r\n APaymentTime: TPaymentTime): double;\r\n{ Solve the cash flow equation (1) for q^n and take the logarithm }\r\nvar\r\n q, x1, x2: double;\r\nbegin\r\n if ARate = 0 then\r\n Result := -(APresentValue + AFutureValue) / APayment\r\n else begin\r\n q := 1.0 + ARate;\r\n if APaymentTime = ptStartOfPeriod then\r\n APayment := APayment * q;\r\n x1 := APayment - AFutureValue * ARate;\r\n x2 := APayment + APresentValue * ARate;\r\n if (x2 = 0) // we have to divide by x2\r\n or (sign(x1) * sign(x2) < 0) // the argument of the log is negative\r\n then\r\n Result := Infinity\r\n else begin\r\n Result := ln(x1/x2) / ln(q);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction Payment(ARate: double; NPeriods: Integer;\r\n APresentValue, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\nvar\r\n q, qn, factor: double;\r\nbegin\r\n if ARate = 0 then\r\n Result := -(AFutureValue + APresentValue) / NPeriods\r\n else begin\r\n q := 1.0 + ARate;\r\n qn := power(q, NPeriods);\r\n factor := (qn - 1) / (q - 1);\r\n if APaymentTime = ptStartOfPeriod then\r\n factor := factor * q;\r\n Result := -(AFutureValue + APresentValue * qn) / factor;\r\n end;\r\nend;\r\n\r\nfunction PresentValue(ARate: double; NPeriods: Integer;\r\n APayment, AFutureValue: double; APaymentTime: TPaymentTime): double;\r\nvar\r\n q, qn, factor: double;\r\nbegin\r\n if ARate = 0.0 then\r\n Result := -AFutureValue - APayment * NPeriods\r\n else begin\r\n q := 1.0 + ARate;\r\n qn := power(q, NPeriods);\r\n factor := (qn - 1) / (q - 1);\r\n if APaymentTime = ptStartOfPeriod then\r\n factor := factor * q;\r\n Result := -(AFutureValue + APayment*factor) / qn;\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Miscellaneous\r\n ---------------------------------------------------------------------}\r\n\r\nfunction IfThen(val: boolean; const ifTrue: integer; const ifFalse: integer): integer;\r\n\r\nbegin\r\n if val then result:=iftrue else result:=iffalse;\r\nend;\r\n\r\nfunction IfThen(val: boolean; const ifTrue: double; const ifFalse: double): double;\r\n\r\nbegin\r\n if val then result:=iftrue else result:=iffalse;\r\nend;\r\n\r\nfunction CompareValue(const A, B : Integer): TValueRelationship;\r\n\r\nbegin\r\n result:=GreaterThanValue;\r\n if a=b then\r\n result:=EqualsValue\r\n else\r\n if a nil) then\r\n begin\r\n Clear;\r\n FList.Destroy;\r\n end;\r\n inherited Destroy;\r\nend;\r\n\r\nProcedure TFPObjectList.Clear;\r\nvar\r\n i: integer;\r\n O : TObject;\r\nbegin\r\n if FFreeObjects then\r\n for i:=FList.Count-1 downto 0 do\r\n begin\r\n O:=TObject(FList[i]);\r\n FList[i]:=Nil;\r\n O.Free;\r\n end;\r\n FList.Clear;\r\nend;\r\n\r\nconstructor TFPObjectList.Create;\r\nbegin\r\n inherited Create;\r\n FList:=TFPList.Create;\r\n FFreeObjects:=True;\r\nend;\r\n\r\nFunction TFPObjectList.GetCount: integer;\r\nbegin\r\n Result:=FList.Count;\r\nend;\r\n\r\nProcedure TFPObjectList.SetCount(const AValue: integer);\r\nbegin\r\n if FList.Count <> AValue then\r\n FList.Count:=AValue;\r\nend;\r\n\r\nFunction TFPObjectList.GetItem(Index: Integer): TObject;\r\nbegin\r\n Result:=TObject(FList[Index]);\r\nend;\r\n\r\nProcedure TFPObjectList.SetItem(Index: Integer; AObject: TObject);\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n if OwnsObjects then\r\n begin\r\n O:=TObject(FList[Index]);\r\n FList[Index]:=AObject;\r\n O.Free;\r\n end\r\n else\r\n FList[index]:=AObject;\r\nend;\r\n\r\nProcedure TFPObjectList.SetCapacity(NewCapacity: Integer);\r\nbegin\r\n FList.Capacity:=NewCapacity;\r\nend;\r\n\r\nFunction TFPObjectList.GetCapacity: integer;\r\nbegin\r\n Result:=FList.Capacity;\r\nend;\r\n\r\nFunction TFPObjectList.Add(AObject: TObject): Integer;\r\nbegin\r\n Result:=FList.Add(AObject);\r\nend;\r\n\r\nProcedure TFPObjectList.Delete(Index: Integer);\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n if OwnsObjects then\r\n begin\r\n O:=TObject(FList[Index]);\r\n FList[Index]:=Nil;\r\n O.Free;\r\n end;\r\n FList.Delete(Index);\r\nend;\r\n\r\nProcedure TFPObjectList.Exchange(Index1, Index2: Integer);\r\nbegin\r\n FList.Exchange(Index1, Index2);\r\nend;\r\n\r\nFunction TFPObjectList.Expand: TFPObjectList;\r\nbegin\r\n FList.Expand;\r\n Result:=Self;\r\nend;\r\n\r\nFunction TFPObjectList.Extract(Item: TObject): TObject;\r\nbegin\r\n Result:=TObject(FList.Extract(Item));\r\nend;\r\n\r\nFunction TFPObjectList.Remove(AObject: TObject): Integer;\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n Result:=IndexOf(AObject);\r\n if (Result <> -1) then\r\n begin\r\n if OwnsObjects then\r\n begin\r\n O:=TObject(FList[Result]);\r\n FList[Result]:=Nil;\r\n O.Free;\r\n end;\r\n FList.Delete(Result);\r\n end;\r\nend;\r\n\r\nFunction TFPObjectList.IndexOf(AObject: TObject): Integer;\r\nbegin\r\n Result:=FList.IndexOf(JSValue(AObject));\r\nend;\r\n\r\nFunction TFPObjectList.FindInstanceOf(AClass: TClass; AExact: Boolean; AStartAt : Integer): Integer;\r\nvar\r\n I : Integer;\r\nbegin\r\n I:=AStartAt;\r\n Result:=-1;\r\n if AExact then\r\n while (I=Acount)\r\nend;\r\n\r\nFunction TOrderedList.Count: Integer;\r\nbegin\r\n Result:=FList.Count;\r\nend;\r\n\r\nconstructor TOrderedList.Create;\r\nbegin\r\n FList:=Tlist.Create;\r\nend;\r\n\r\ndestructor TOrderedList.Destroy;\r\nbegin\r\n FList.Free;\r\nend;\r\n\r\nFunction TOrderedList.Peek: JSValue;\r\nbegin\r\n if AtLeast(1) then\r\n Result:=PeekItem\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nFunction TOrderedList.PeekItem: JSValue;\r\n\r\nbegin\r\n with Flist do\r\n Result:=Items[Count-1]\r\nend;\r\n\r\nFunction TOrderedList.Pop: JSValue;\r\nbegin\r\n If Atleast(1) then\r\n Result:=PopItem\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nFunction TOrderedList.PopItem: JSValue;\r\nbegin\r\n with FList do\r\n if Count>0 then\r\n begin\r\n Result:=Items[Count-1];\r\n Delete(Count-1);\r\n end\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nFunction TOrderedList.Push(AItem: JSValue): JSValue;\r\nbegin\r\n PushItem(AItem);\r\n Result:=AItem;\r\nend;\r\n\r\n{ TStack }\r\n\r\nProcedure TStack.PushItem(AItem: JSValue);\r\nbegin\r\n FList.Add(AItem);\r\nend;\r\n\r\n{ TObjectStack }\r\n\r\nFunction TObjectStack.Peek: TObject;\r\nbegin\r\n Result:=TObject(inherited Peek);\r\nend;\r\n\r\nFunction TObjectStack.Pop: TObject;\r\nbegin\r\n Result:=TObject(Inherited Pop);\r\nend;\r\n\r\nFunction TObjectStack.Push(AObject: TObject): TObject;\r\nbegin\r\n Result:=TObject(inherited Push(JSValue(AObject)));\r\nend;\r\n\r\n{ TQueue }\r\n\r\nProcedure TQueue.PushItem(AItem: JSValue);\r\nbegin\r\n with FList Do\r\n Insert(0,AItem);\r\nend;\r\n\r\n{ TObjectQueue }\r\n\r\nFunction TObjectQueue.Peek: TObject;\r\nbegin\r\n Result:=TObject(inherited Peek);\r\nend;\r\n\r\nFunction TObjectQueue.Pop: TObject;\r\nbegin\r\n Result:=TObject(inherited Pop);\r\nend;\r\n\r\nFunction TObjectQueue.Push(AObject: TObject): TObject;\r\nbegin\r\n Result:=TObject(inherited Push(JSValue(AObject)));\r\nend;\r\n\r\n\r\n{*****************************************************************************\r\n TFPHashList\r\n*****************************************************************************}\r\n(*\r\n Function FPHash(const s:shortstring):LongWord;\r\n var\r\n p,pmax : PChar;\r\n begin\r\n{$push}\r\n{$Q-}\r\n Result:=0;\r\n p:=@s[1];\r\n pmax:=@s[length(s)+1];\r\n while (p0 then\r\n for i:=1 to Length(S) do\r\n begin\r\n Result:=Result * a + Ord(S[i]);\r\n a:=a * b;\r\n end;\r\n Result:=(Result and $7FFFFFFF) mod TableSize;\r\nend;\r\n\r\n{ THTNode }\r\n\r\nconstructor THTCustomNode.CreateWith(const AString: string);\r\nbegin\r\n inherited Create;\r\n FKey:=AString;\r\nend;\r\n\r\nFunction THTCustomNode.HasKey(const AKey: string): boolean;\r\nbegin\r\n Result:=(AKey=FKey);\r\nend;\r\n\r\n{ TFPCustomHashTable }\r\n\r\nconstructor TFPCustomHashTable.Create;\r\nbegin\r\n CreateWith(196613,@RSHash);\r\nend;\r\n\r\nconstructor TFPCustomHashTable.CreateWith(AHashTableSize: Longword;\r\n aHashFunc: THashFunction);\r\nbegin\r\n inherited Create;\r\n FHashTable:=TFPObjectList.Create(True);\r\n HashTableSize:=AHashTableSize;\r\n FHashFunction:=aHashFunc;\r\nend;\r\n\r\ndestructor TFPCustomHashTable.Destroy;\r\nbegin\r\n FHashTable.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetDensity: Longword;\r\nbegin\r\n Result:=FHashTableSize - VoidSlots\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetNumberOfCollisions: Longword;\r\nbegin\r\n Result:=FCount -(FHashTableSize - VoidSlots)\r\nend;\r\n\r\nProcedure TFPCustomHashTable.SetHashTableSize(const Value: Longword);\r\nvar\r\n i: Longword;\r\n newSize: Longword;\r\nbegin\r\n if Value <> FHashTableSize then\r\n begin\r\n i:=0;\r\n while (PRIMELIST[i] < Value) and (i < 27) do\r\n Inc(i);\r\n newSize:=PRIMELIST[i];\r\n if Count = 0 then\r\n begin\r\n FHashTableSize:=newSize;\r\n InitializeHashTable;\r\n end\r\n else\r\n ChangeTableSize(newSize);\r\n end;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.InitializeHashTable;\r\nvar\r\n i: LongWord;\r\nbegin\r\n if FHashTableSize>0 Then\r\n for i:=0 to FHashTableSize-1 do\r\n FHashTable.Add(nil);\r\n FCount:=0;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.ChangeTableSize(const ANewSize: Longword);\r\nvar\r\n SavedTable: TFPObjectList;\r\n SavedTableSize: Longword;\r\n i, j: Longword;\r\n temp: THTCustomNode;\r\nbegin\r\n SavedTable:=FHashTable;\r\n SavedTableSize:=FHashTableSize;\r\n FHashTableSize:=ANewSize;\r\n FHashTable:=TFPObjectList.Create(True);\r\n InitializeHashTable;\r\n if SavedTableSize>0 Then\r\n for i:=0 to SavedTableSize-1 do\r\n if Assigned(SavedTable[i]) then\r\n for j:=0 to TFPObjectList(SavedTable[i]).Count -1 do\r\n begin\r\n temp:=THTCustomNode(TFPObjectList(SavedTable[i])[j]);\r\n AddNode(temp);\r\n end;\r\n SavedTable.Free;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.SetHashFunction(AHashFunction: THashFunction);\r\nbegin\r\n if IsEmpty then\r\n FHashFunction:=AHashFunction\r\n else\r\n raise Exception.Create(NotEmptyMsg);\r\nend;\r\n\r\nFunction TFPCustomHashTable.Find(const aKey: string): THTCustomNode;\r\nvar\r\n hashCode: Longword;\r\n chn: TFPObjectList;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n chn:=Chain(hashCode);\r\n if Assigned(chn) then\r\n if chn.count>0 then\r\n for i:=0 to chn.Count - 1 do\r\n if THTCustomNode(chn[i]).Key=aKey then\r\n Exit(THTCustomNode(chn[i]));\r\n Result:=nil;\r\nend;\r\n\r\nFunction TFPCustomHashTable.FindChainForAdd(Const aKey : String) : TFPObjectList;\r\nvar\r\n hashCode: Longword;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n Result:=Chain(hashCode);\r\n if Assigned(Result) then\r\n begin\r\n if Result.count>0 then\r\n for i:=0 to Result.Count - 1 do\r\n if (THTCustomNode(Result[i]).Key=aKey) then\r\n raise EDuplicate.CreateFmt(DuplicateMsg, [aKey]);\r\n end\r\n else\r\n begin\r\n FHashTable[hashcode]:=TFPObjectList.Create(True);\r\n Result:=Chain(hashCode);\r\n end;\r\n Inc(FCount);\r\nend;\r\n\r\n\r\nProcedure TFPCustomHashTable.Delete(const aKey: string);\r\nvar\r\n hashCode: Longword;\r\n chn: TFPObjectList;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n chn:=Chain(hashCode);\r\n if Assigned(chn) then\r\n if chn.count>0 then\r\n for i:=0 to chn.Count - 1 do\r\n if THTCustomNode(chn[i]).Key=aKey then\r\n begin\r\n chn.Delete(i);\r\n dec(FCount);\r\n Exit;\r\n end;\r\nend;\r\n\r\nFunction TFPCustomHashTable.IsEmpty: boolean;\r\nbegin\r\n Result:=(FCount = 0);\r\nend;\r\n\r\nFunction TFPCustomHashTable.Chain(const index: Longword): TFPObjectList;\r\nbegin\r\n Result:=TFPObjectList(FHashTable[index]);\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetVoidSlots: Longword;\r\nvar\r\n i: Longword;\r\n num: Longword;\r\nbegin\r\n num:=0;\r\n if FHashTableSize>0 then\r\n for i:= 0 to FHashTableSize-1 do\r\n if not Assigned(Chain(i)) then\r\n Inc(num);\r\n Result:=num;\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetLoadFactor: double;\r\nbegin\r\n Result:=Count / FHashTableSize;\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetAVGChainLen: double;\r\nbegin\r\n Result:=Count / (FHashTableSize - VoidSlots);\r\nend;\r\n\r\nFunction TFPCustomHashTable.GetMaxChainLength: Longword;\r\nvar\r\n i: Longword;\r\nbegin\r\n Result:=0;\r\n if FHashTableSize>0 Then\r\n for i:=0 to FHashTableSize-1 do\r\n if ChainLength(i) > Result then\r\n Result:=ChainLength(i);\r\nend;\r\n\r\nFunction TFPCustomHashTable.FindOrCreateNew(const aKey: string): THTCustomNode;\r\nvar\r\n hashCode: Longword;\r\n chn: TFPObjectList;\r\n i: Longword;\r\nbegin\r\n hashCode:=FHashFunction(aKey, FHashTableSize);\r\n chn:=Chain(hashCode);\r\n if Assigned(chn) then\r\n begin\r\n if chn.count>0 then\r\n for i:=0 to chn.Count - 1 do\r\n if (THTCustomNode(chn[i]).Key=aKey) then\r\n Exit(THTNode(chn[i]));\r\n end\r\n else\r\n begin\r\n FHashTable[hashcode]:=TFPObjectList.Create(true);\r\n chn:=Chain(hashcode);\r\n end;\r\n Inc(FCount);\r\n Result:=CreateNewNode(aKey);\r\n chn.Add(Result);\r\nend;\r\n\r\nFunction TFPCustomHashTable.ChainLength(const ChainIndex: Longword): Longword;\r\nbegin\r\n if Assigned(Chain(ChainIndex)) then\r\n Result:=Chain(ChainIndex).Count\r\n else\r\n Result:=0;\r\nend;\r\n\r\nProcedure TFPCustomHashTable.Clear;\r\nvar\r\n i: Longword;\r\nbegin\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize - 1 do\r\n if Assigned(Chain(i)) then\r\n Chain(i).Clear;\r\n FCount:=0;\r\nend;\r\n\r\n\r\n\r\n{ TFPDataHashTable }\r\n\r\nProcedure TFPDataHashTable.Add(const aKey: string; aItem: JSValue);\r\nvar\r\n chn: TFPObjectList;\r\n NewNode: THtDataNode;\r\nbegin\r\n chn:=FindChainForAdd(akey);\r\n NewNode:=THtDataNode(CreateNewNode(aKey));\r\n NewNode.Data:=aItem;\r\n chn.Add(NewNode);\r\nend;\r\n\r\nFunction TFPDataHashTable.GetData(const Index: string): JSValue;\r\nvar\r\n node: THTDataNode;\r\nbegin\r\n node:=THTDataNode(Find(Index));\r\n if Assigned(node) then\r\n Result:=node.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPDataHashTable.SetData(const index: string; const AValue: JSValue);\r\nbegin\r\n THTDataNode(FindOrCreateNew(index)).Data:=AValue;\r\nend;\r\n\r\nFunction TFPDataHashTable.CreateNewNode(const aKey : string) : THTCustomNode;\r\n\r\nbegin\r\n Result:=THTDataNode.CreateWith(aKey);\r\nend;\r\n\r\nFunction TFPDataHashTable.Iterate(aMethod: TDataIteratorMethod): JSValue;\r\nvar\r\n N : THTDataNode;\r\nbegin\r\n N:=ForEachCall(AMethod);\r\n if Assigned(N) then\r\n Result:=N.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPDataHashTable.CallbackIterator(Item: JSValue; const Key: string; var Continue: Boolean);\r\nbegin\r\n FIteratorCallBack(Item, Key, Continue);\r\nend;\r\n\r\nFunction TFPDataHashTable.Iterate(aMethod: TDataIteratorCallBack): JSValue;\r\nbegin\r\n FIteratorCallBack := aMethod;\r\n Result := Iterate(@CallbackIterator);\r\nend;\r\n\r\nFunction TFPDataHashTable.ForEachCall(aMethod: TDataIteratorMethod): THTDataNode;\r\nvar\r\n i, j: Longword;\r\n continue: Boolean;\r\nbegin\r\n Result:=nil;\r\n continue:=true;\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize-1 do\r\n if Assigned(Chain(i)) then\r\n if chain(i).count>0 then\r\n for j:=0 to Chain(i).Count-1 do\r\n begin\r\n aMethod(THTDataNode(Chain(i)[j]).Data, THTDataNode(Chain(i)[j]).Key, continue);\r\n if not continue then\r\n begin\r\n Result:=THTDataNode(Chain(i)[j]);\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nProcedure TFPDataHashTable.AddNode(ANode : THTCustomNode);\r\nbegin\r\n with THTDataNode(ANode) do\r\n Add(Key,Data);\r\nend;\r\n\r\n{ TFPStringHashTable }\r\n\r\nProcedure TFPStringHashTable.AddNode(ANode : THTCustomNode);\r\nbegin\r\n with THTStringNode(ANode) do\r\n Add(Key,Data);\r\nend;\r\n\r\nFunction TFPStringHashTable.GetData(const Index: string): String;\r\nvar\r\n node: THTStringNode;\r\nbegin\r\n node:=THTStringNode(Find(Index));\r\n if Assigned(node) then\r\n Result:=node.Data\r\n else\r\n Result:='';\r\nend;\r\n\r\nProcedure TFPStringHashTable.SetData(const index, AValue: string);\r\nbegin\r\n THTStringNode(FindOrCreateNew(index)).Data:=AValue;\r\nend;\r\n\r\nProcedure TFPStringHashTable.Add(const aKey, aItem: string);\r\nvar\r\n chn: TFPObjectList;\r\n NewNode: THtStringNode;\r\nbegin\r\n chn:=FindChainForAdd(akey);\r\n NewNode:=THtStringNode(CreateNewNode(aKey));\r\n NewNode.Data:=aItem;\r\n chn.Add(NewNode);\r\nend;\r\n\r\nFunction TFPStringHashTable.CreateNewNode(const aKey : string) : THTCustomNode;\r\nbegin\r\n Result:=THTStringNode.CreateWith(aKey);\r\nend;\r\n\r\nFunction TFPStringHashTable.Iterate(aMethod: TStringIteratorMethod): String;\r\nvar\r\n N : THTStringNode;\r\nbegin\r\n N:=ForEachCall(AMethod);\r\n if Assigned(N) then\r\n Result:=N.Data\r\n else\r\n Result:='';\r\nend;\r\n\r\nProcedure TFPStringHashTable.CallbackIterator(Item: String; const Key: string; var Continue: Boolean);\r\nbegin\r\n FIteratorCallBack(Item, Key, Continue);\r\nend;\r\n\r\nFunction TFPStringHashTable.Iterate(aMethod: TStringIteratorCallback): String;\r\nbegin\r\n FIteratorCallBack := aMethod;\r\n Result := Iterate(@CallbackIterator);\r\nend;\r\n\r\nFunction TFPStringHashTable.ForEachCall(aMethod: TStringIteratorMethod): THTStringNode;\r\nvar\r\n i, j: Longword;\r\n continue: boolean;\r\nbegin\r\n Result:=nil;\r\n continue:=True;\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize-1 do\r\n if Assigned(Chain(i)) then\r\n if chain(i).Count>0 then\r\n for j:=0 to Chain(i).Count-1 do\r\n begin\r\n aMethod(THTStringNode(Chain(i)[j]).Data, THTStringNode(Chain(i)[j]).Key, continue);\r\n if not continue then\r\n begin\r\n Result:=THTStringNode(Chain(i)[j]);\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TFPObjectHashTable }\r\n\r\nProcedure TFPObjectHashTable.AddNode(ANode : THTCustomNode);\r\nbegin\r\n With THTObjectNode(ANode) do\r\n Add(Key,Data);\r\nend;\r\n\r\nFunction TFPObjectHashTable.GetData(const Index: string): TObject;\r\nvar\r\n node: THTObjectNode;\r\nbegin\r\n node:=THTObjectNode(Find(Index));\r\n if Assigned(node) then\r\n Result:=node.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPObjectHashTable.SetData(const index : string; AObject : TObject);\r\nbegin\r\n THTObjectNode(FindOrCreateNew(index)).Data:=AObject;\r\nend;\r\n\r\nProcedure TFPObjectHashTable.Add(const aKey: string; AItem : TObject);\r\nvar\r\n chn: TFPObjectList;\r\n NewNode: THTObjectNode;\r\nbegin\r\n chn:=FindChainForAdd(akey);\r\n NewNode:=THTObjectNode(CreateNewNode(aKey));\r\n NewNode.Data:=aItem;\r\n chn.Add(NewNode);\r\nend;\r\n\r\nFunction TFPObjectHashTable.CreateNewNode(const aKey : string) : THTCustomNode;\r\nbegin\r\n if OwnsObjects then\r\n Result:=THTOwnedObjectNode.CreateWith(aKey)\r\n else\r\n Result:=THTObjectNode.CreateWith(aKey);\r\nend;\r\n\r\n\r\nFunction TFPObjectHashTable.Iterate(aMethod: TObjectIteratorMethod): TObject;\r\nvar\r\n N : THTObjectNode;\r\nbegin\r\n N:=ForEachCall(AMethod);\r\n if Assigned(N) then\r\n Result:=N.Data\r\n else\r\n Result:=nil;\r\nend;\r\n\r\nProcedure TFPObjectHashTable.CallbackIterator(Item: TObject; const Key: string; var Continue: Boolean);\r\nbegin\r\n FIteratorCallBack(Item, Key, Continue);\r\nend;\r\n\r\nFunction TFPObjectHashTable.Iterate(aMethod: TObjectIteratorCallback): TObject;\r\nbegin\r\n FIteratorCallBack := aMethod;\r\n Result := Iterate(@CallbackIterator);\r\nend;\r\n\r\nFunction TFPObjectHashTable.ForEachCall(aMethod: TObjectIteratorMethod): THTObjectNode;\r\nvar\r\n i, j: Longword;\r\n continue: boolean;\r\nbegin\r\n Result:=nil;\r\n continue:=true;\r\n if FHashTableSize>0 then\r\n for i:=0 to FHashTableSize-1 do\r\n if Assigned(Chain(i)) then\r\n if Chain(i).Count>0 then\r\n for j:=0 to Chain(i).Count-1 do\r\n begin\r\n aMethod(THTObjectNode(Chain(i)[j]).Data, THTObjectNode(Chain(i)[j]).Key, continue);\r\n if not continue then\r\n begin\r\n Result:=THTObjectNode(Chain(i)[j]);\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nconstructor TFPObjectHashTable.Create(AOwnsObjects : Boolean = True);\r\nbegin\r\n inherited Create;\r\n FOwnsObjects:=AOwnsObjects;\r\nend;\r\n\r\nconstructor TFPObjectHashTable.CreateWith(AHashTableSize: Longword; aHashFunc: THashFunction; AOwnsObjects : Boolean = True);\r\nbegin\r\n inherited CreateWith(AHashTableSize,AHashFunc);\r\n FOwnsObjects:=AOwnsObjects;\r\nend;\r\n\r\ndestructor THTOwnedObjectNode.Destroy;\r\nbegin\r\n FreeAndNil(FData);\r\n inherited;\r\nend;\r\n\r\n{ TCustomBucketList }\r\n\r\nFunction TCustomBucketList.GetData(AItem: JSValue): JSValue;\r\nvar\r\n B,I : Integer;\r\nbegin\r\n GetBucketItem(AItem,B,I);\r\n Result:=FBuckets[B].Items[I].Data;\r\nend;\r\n\r\nFunction TCustomBucketList.GetBucketCount: Integer;\r\nbegin\r\n Result:=Length(FBuckets);\r\nend;\r\n\r\nProcedure TCustomBucketList.SetData(AItem: JSValue; const AData: JSValue);\r\nvar\r\n B,I : Integer;\r\nbegin\r\n GetBucketItem(AItem,B,I);\r\n FBuckets[B].Items[I].Data:=AData;\r\nend;\r\n\r\nProcedure TCustomBucketList.SetBucketCount(const Value: Integer);\r\nbegin\r\n if (Value<>GetBucketCount) then\r\n SetLength(FBuckets,Value);\r\nend;\r\n\r\nProcedure TCustomBucketList.GetBucketItem(AItem: JSValue; out ABucket,\r\n AIndex: Integer);\r\nbegin\r\n if not FindItem(AItem,ABucket,AIndex) then\r\n Error(SErrNoSuchItem,[AItem]);\r\nend;\r\n\r\nFunction TCustomBucketList.AddItem(ABucket: Integer; AItem, AData: JSValue\r\n ): JSValue;\r\nvar\r\n L : Integer;\r\nbegin\r\n L:=Length(FBuckets[ABucket].Items);\r\n if (FBuckets[ABucket].Count=L) then\r\n begin\r\n if L<8 then\r\n L:=8\r\n else\r\n L:=L+L div 2;\r\n SetLength(FBuckets[ABucket].Items,L);\r\n end;\r\n with FBuckets[ABucket] do\r\n begin\r\n Items[Count].Item:=AItem;\r\n Items[Count].Data:=AData;\r\n Result:=AData;\r\n Inc(Count);\r\n end;\r\nend;\r\n\r\nFunction TCustomBucketList.DeleteItem(ABucket: Integer; AIndex: Integer): JSValue;\r\nvar\r\n I,L : Integer;\r\nbegin\r\n Result:=FBuckets[ABucket].Items[AIndex].Data;\r\n if FBuckets[ABucket].Count=1 then\r\n SetLength(FBuckets[ABucket].Items,0)\r\n else\r\n begin\r\n L:=(FBuckets[ABucket].Count-AIndex-1);// No point in moving if last one...\r\n For I:=0 to L-1 do\r\n FBuckets[ABucket].Items[AIndex+I]:=FBuckets[ABucket].Items[AIndex+I+1];\r\n end;\r\n Dec(FBuckets[ABucket].Count);\r\nend;\r\n\r\nProcedure TCustomBucketList.Error(Msg: String; Args: array of JSValue);\r\nbegin\r\n raise ElistError.CreateFmt(Msg,Args);\r\nend;\r\n\r\nFunction TCustomBucketList.FindItem(AItem: JSValue; out ABucket, AIndex: Integer\r\n ): Boolean;\r\nvar\r\n I : Integer;\r\n B : TBucket;\r\nbegin\r\n ABucket:=BucketFor(AItem);\r\n B:=FBuckets[ABucket];\r\n I:=B.Count-1;\r\n while (I>=0) and (B.Items[I].Item<>AItem) do\r\n Dec(I);\r\n Result:=I>=0;\r\n if Result then\r\n AIndex:=I;\r\nend;\r\n\r\ndestructor TCustomBucketList.Destroy;\r\nbegin\r\n Clear;\r\n inherited Destroy;\r\nend;\r\n\r\nProcedure TCustomBucketList.Clear;\r\nvar\r\n B : TBucket;\r\n I,J : Integer;\r\nbegin\r\n for I:=0 to Length(FBuckets)-1 do\r\n begin\r\n B:=FBuckets[I];\r\n for J:=B.Count-1 downto 0 do\r\n DeleteItem(I,J);\r\n end;\r\n SetLength(FBuckets,0);\r\nend;\r\n\r\nFunction TCustomBucketList.Add(AItem, AData: JSValue): JSValue;\r\nvar\r\n B,I : Integer;\r\nbegin\r\n if FindItem(AItem,B,I) then\r\n Error(SDuplicateItem,[AItem]);\r\n Result:=AddItem(B,AItem,AData);\r\nend;\r\n\r\nProcedure TCustomBucketList.Assign(AList: TCustomBucketList);\r\nvar\r\n I,J : Integer;\r\nbegin\r\n Clear;\r\n SetLength(FBuckets,Length(Alist.FBuckets));\r\n for I:=0 to BucketCount-1 do\r\n begin\r\n SetLength(FBuckets[i].Items,Length(AList.Fbuckets[I].Items));\r\n for J:=0 to AList.Fbuckets[I].Count-1 do\r\n with AList.Fbuckets[I].Items[J] do\r\n AddItem(I,Item,Data);\r\n end;\r\nend;\r\n\r\nFunction TCustomBucketList.Exists(AItem: JSValue): Boolean;\r\nvar\r\n B,I : Integer;\r\nbegin\r\n Result:=FindItem(AItem,B,I);\r\nend;\r\n\r\nFunction TCustomBucketList.Find(AItem: JSValue; out AData: JSValue): Boolean;\r\nvar\r\n B,I : integer;\r\nbegin\r\n Result:=FindItem(AItem,B,I);\r\n if Result then\r\n AData:=FBuckets[B].Items[I].Data;\r\nend;\r\n\r\nFunction TCustomBucketList.ForEach(AProc: TBucketProc): Boolean;\r\nbegin\r\n Result:=Foreach(aProc,Null);\r\nend;\r\n\r\nFunction TCustomBucketList.ForEach(AProc: TBucketProc; AInfo: JSValue): Boolean;\r\nvar\r\n I,J,S : Integer;\r\n Bu : TBucket;\r\nbegin\r\n I:=0;\r\n Result:=True;\r\n S:=GetBucketCount;\r\n while Result and (I AName) then\r\n begin\r\n FName := AName;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TFont.SetSize(const ASize: Integer);\r\nbegin\r\n if (FSize <> ASize) then\r\n begin\r\n FSize := ASize;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TFont.SetColor(const AColor: TColor);\r\nbegin\r\n if (FColor <> AColor) then\r\n begin\r\n FColor := AColor;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TFont.SetHeight(const Value: Integer);\r\nvar\r\n d: double;\r\nbegin\r\n FHeight := Value;\r\n d := -FHeight * 72/96;\r\n FSize := Round(d);\r\n DoChange;\r\nend;\r\n\r\nprocedure TFont.SetStyle(const AStyle: TFontStyles);\r\nbegin\r\n FStyle := AStyle;\r\n DoChange;\r\nend;\r\n\r\nconstructor TFont.Create;\r\nbegin\r\n inherited;\r\n FName := 'Tahoma';\r\n FSize := 8;\r\n FStyle := [];\r\n FColor := clBlack;\r\nend;\r\n\r\nprocedure TFont.DoChange;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n{ TCanvas }\r\n\r\nprocedure TCanvas.AngleArc(X, Y, Radius: Double; StartAngle,\r\n SweepAngle: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n FContext.arc(X, Y, Radius, StartAngle, StartAngle + SweepAngle);\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.ApplyFill;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.fillStyle := ColorToHtml(Brush.Color);\r\nend;\r\n\r\nprocedure TCanvas.ApplyStroke;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.lineWidth := Pen.Width;\r\n FContext.strokeStyleAsColor := ColorToHtml(Pen.Color);\r\n case Pen.Style of\r\n psSolid: FContext.setlinedash([]);\r\n psDot: FContext.setlinedash([1,2]);\r\n psDash: FContext.setlinedash([8,2]);\r\n psDashDot: FContext.setlinedash([6,2,2,2]);\r\n psDashDotDot: FContext.setlinedash([6,2,2,2,2,2]);\r\n psClear: FContext.setlinedash([0, $FFFF]);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.BeginScene;\r\nbegin\r\n if Assigned(OnBeginScene) then\r\n OnBeginScene(Self);\r\nend;\r\n\r\nprocedure TCanvas.Clear;\r\nbegin\r\n if Assigned(FContext) and Assigned(FElementCanvas) then\r\n FContext.clearRect(0, 0, FElementCanvas.width, FElementCanvas.height);\r\nend;\r\n\r\nprocedure TCanvas.Clear(AColor: TColor);\r\nvar\r\n c: TColor;\r\n s: TBrushStyle;\r\nbegin\r\n Clear;\r\n if Assigned(FElementCanvas) then\r\n begin\r\n c := Brush.Color;\r\n s := Brush.Style;\r\n Brush.Color := AColor;\r\n Brush.Style := bsSolid;\r\n FillRect(Rect(0, 0, FElementCanvas.width, FElementCanvas.height));\r\n Brush.Color := c;\r\n Brush.Style := s;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Clip;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.clip;\r\nend;\r\n\r\nconstructor TCanvas.Create;\r\nbegin\r\n FElementCanvas := TJSHTMLCanvasElement(document.createElement('CANVAS'));\r\n Create(FElementCanvas);\r\nend;\r\n\r\nconstructor TCanvas.Create(AControl: TJSHTMLCanvasElement);\r\nbegin\r\n FElementCanvas := AControl;\r\n FContext := AControl.getContextAs2DContext('2d');\r\n FPen := TPen.Create;\r\n FBrush := TBrush.Create;\r\n FPathOpen := false;\r\n FFont := TFont.Create;\r\nend;\r\n\r\nprocedure TCanvas.AngleArc(X, Y: Integer; Radius: Cardinal; StartAngle, SweepAngle: Double);\r\nbegin\r\n AngleArc(Double(X), Double(Y), Double(Radius), Double(StartAngle), Double(SweepAngle));\r\nend;\r\n\r\nprocedure TCanvas.MoveTo(X,Y: Integer);\r\nbegin\r\n MoveTo(Double(X), Double(Y));\r\nend;\r\n\r\nprocedure TCanvas.LineTo(X,Y: Integer);\r\nbegin\r\n LineTo(Double(X), Double(Y));\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(const Rect: TRect); \r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(X1, Y1, X2, Y2: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n FContext.rect(X1, Y1, X2 - X1, Y2 - Y1);\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(const Rect: TCanvasRectF);\r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Refresh;\r\nbegin\r\nend;\r\n\r\nprocedure TCanvas.Restore;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.restore();\r\nend;\r\n\r\nprocedure TCanvas.Rectangle(X1, Y1, X2, Y2: Integer);\r\nbegin\r\n Rectangle(Double(X1), Double(Y1), Double(X2), Double(Y2));\r\nend;\r\n\r\nprocedure TCanvas.FillRect(const Rect: TRect);\r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(X1,Y1,X2,Y2,X3,Y3: Integer);\r\nbegin\r\n RoundRect(Double(X1), Double(Y1), Double(X2), Double(Y2), Double(X3), Double(Y3));\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(const Rect: TRect; CX, CY: Integer);\r\nbegin\r\n RoundRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, CX, CY);\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(X1, Y1, X2, Y2, X3, Y3: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n FContext.moveTo(X1 + X3/2, Y1);\r\n FContext.lineTo(X2 - X3/2, Y1);\r\n FContext.quadraticCurveTo(X2,Y1, X2, Y1 + Y3/2);\r\n FContext.lineTo(X2, Y2 - Y3/2);\r\n FContext.quadraticCurveTo(X2, Y2, X2 - X3/2, Y2);\r\n FContext.lineTo(X1 + X3/2, Y2);\r\n FContext.quadraticCurveTo(X1, Y2, X1, Y2 - Y3/2);\r\n FContext.lineTo(X1, Y1 + Y3/2);\r\n FContext.quadraticCurveTo(X1, Y1, X1 + X3/2, Y1);\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(X1, Y1, X2, Y2: Integer);\r\nbegin\r\n Ellipse(Double(X1), Double(Y1), Double(X2), Double(Y2));\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(const Rect: TRect); \r\nbegin\r\n Ellipse(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Polyline(const Points: array of TPoint);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Polygon(const Points: array of TPoint);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n FContext.closePath();\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nfunction TCanvas.TextExtent(const Text: string): TCanvasSizeF;\r\nbegin\r\n Result.cx := TextWidth(Text);\r\n Result.cy := TextHeight(Text);\r\nend;\r\n\r\nfunction TCanvas.TextHeight(const Text: string): Double;\r\nbegin\r\n Result := FontSizeToPx(Font.Size);\r\nend;\r\n\r\nprocedure TCanvas.MoveTo(X, Y: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FPathOpen := true;\r\n FContext.beginPath();\r\n ApplyStroke;\r\n FContext.moveTo(X,Y);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.TextOut(X, Y: Double; const Text: string);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.fillStyle := ColorToHtml(Font.Color);\r\n FContext.font := Font.ToString;\r\n FContext.textBaseline := 'hanging';\r\n FContext.fillText(Text, X, Y + 0.5);\r\n end;\r\nend;\r\n\r\nfunction TCanvas.TextRect(ARect: TCanvasRectF; const Text: String; const WordWrap: Boolean = False; const Calculate: Boolean = False; const AHorizontalAlignment: TAlignment = taLeftJustify; const AVerticalAlignment: TVerticalAlignment = taAlignTop): TCanvasRectF;\r\nvar\r\n i: Integer;\r\n s, sn, st: string;\r\n l: Integer;\r\n w, mw: Double;\r\n f: Boolean;\r\n p: Integer;\r\n tw: Double;\r\n th: Double;\r\n lcnt: Integer;\r\n rs: TCanvasRectF;\r\n fws: Double;\r\n ths: Double;\r\n ww, wwx, fx: Boolean;\r\n\r\n procedure DrawText(AText: string; AWidth, AHeight: Single);\r\n begin\r\n if ww then\r\n begin\r\n case AHorizontalAlignment of\r\n taCenter: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Top, AText);\r\n taLeftJustify: TextOut(ARect.Left, ARect.Top, AText);\r\n taRightJustify: TextOut(ARect.Right - AWidth, ARect.Top, AText);\r\n end;\r\n end\r\n else\r\n begin\r\n case AHorizontalAlignment of\r\n taCenter:\r\n begin\r\n case AVerticalAlignment of\r\n taAlignTop: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Top, AText);\r\n taVerticalCenter: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Top + (ARect.Bottom - ARect.Top - AHeight) / 2, AText);\r\n taAlignBottom: TextOut(ARect.Left + (ARect.Right - ARect.Left - AWidth) / 2, ARect.Bottom - AHeight, AText);\r\n end;\r\n end;\r\n taLeftJustify:\r\n begin\r\n case AVerticalAlignment of\r\n taAlignTop: TextOut(ARect.Left, ARect.Top, AText);\r\n taVerticalCenter: TextOut(ARect.Left, ARect.Top + (ARect.Bottom - ARect.Top - AHeight) / 2, AText);\r\n taAlignBottom: TextOut(ARect.Left, ARect.Bottom - AHeight, AText);\r\n end;\r\n end;\r\n taRightJustify:\r\n begin\r\n case AVerticalAlignment of\r\n taAlignTop: TextOut(ARect.Right - AWidth, ARect.Top, AText);\r\n taVerticalCenter: TextOut(ARect.Right - AWidth, ARect.Top + (ARect.Bottom - ARect.Top - AHeight) / 2, AText);\r\n taAlignBottom: TextOut(ARect.Right - AWidth, ARect.Bottom - AHeight, AText);\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n function FindNextWord(Text: String; var APos: Integer): String;\r\n var\r\n l: Integer;\r\n i: Integer;\r\n begin\r\n Result := '';\r\n\r\n l := Length(Text);\r\n if APos > l then\r\n Exit;\r\n\r\n i := APos;\r\n while True do\r\n begin\r\n if ((Text[i] = #10) and (Text[i - 1] = #13)) or ((Text[i] = #13) and (Text[i - 1] = #10)) or (Text[i] = ' ') then\r\n begin\r\n if Text[i] = ' ' then\r\n Result := Copy(Text, APos, i - (APos - 1))\r\n else\r\n Result := Copy(Text, APos, i - APos);\r\n\r\n Break;\r\n end\r\n else if (Text[i] = #10) or (Text[i] = #13) or (Text[i] = ' ') then\r\n begin\r\n result := Copy(Text, APos, i - (APos - 1));\r\n Break;\r\n end\r\n else if i >= l then\r\n begin\r\n result := Copy(Text, APos, i - (APos - 1));\r\n Break;\r\n end\r\n else\r\n inc(i);\r\n end;\r\n\r\n APos := i + 1;\r\n end;\r\nbegin\r\n ww := WordWrap or (Pos(#13, Text) > 0) or (Pos(#10, Text) > 0);\r\n wwx := not WordWrap and ((Pos(#13, Text) > 0) or (Pos(#10, Text) > 0));\r\n \r\n if not ww then\r\n begin\r\n w := TextWidth(Text);\r\n th := TextHeight(Text);\r\n if not Calculate then\r\n DrawText(Text, w, th);\r\n\r\n Result := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Left + w, ARect.Top + th);\r\n end\r\n else\r\n begin\r\n rs := ARect;\r\n\r\n mw := 0;\r\n i := 1;\r\n ths := FFont.Size * 0.5;\r\n lcnt := 0;\r\n fws := 0;\r\n tw := 0;\r\n s := FindNextWord(Text, i);\r\n w := TextWidth(s);\r\n th := TextHeight(s) + ths;\r\n\r\n mw := mw + w;\r\n if (Length(s) > 0) and (s[Length(s)] = ' ') then\r\n mw := mw + fws;\r\n\r\n fx := False;\r\n while i <= Length(Text) do\r\n begin\r\n l := Length(s);\r\n if (l >= 2) and (((s[l] = #10) and (s[l - 1] = #13)) or ((s[l] = #13) and (s[l - 1] = #10))) then\r\n begin\r\n s := Copy(s, 1, l - 2);\r\n f := True;\r\n end\r\n else if (l >= 1) and ((s[l] = #10) or (s[l] = #13)) then\r\n begin\r\n s := Copy(s, 1, l - 1);\r\n f := True;\r\n end\r\n else\r\n f := False;\r\n\r\n sn := FindNextWord(Text, i);\r\n w := TextWidth(sn);\r\n th := Max(th, TextHeight(sn) + ths);\r\n\r\n if (ARect.Left + mw + w > ARect.Right) or f then\r\n begin\r\n if (s <> '') and not fx then\r\n begin\r\n p := Length(s);\r\n\r\n st := Copy(s, 1, p);\r\n\r\n Inc(lcnt);\r\n if mw > tw then\r\n tw := mw;\r\n\r\n if not Calculate then\r\n DrawText(st, mw, th);\r\n\r\n mw := 0;\r\n end;\r\n\r\n s := '';\r\n\r\n fx := False;\r\n if (wwx and f) or not wwx then\r\n ARect.Top := ARect.Top + th\r\n else if (wwx and not f) then\r\n fx := True;\r\n\r\n if (Trunc(ARect.Top) > Trunc(ARect.Bottom - th)) and not Calculate then\r\n Break;\r\n end;\r\n\r\n mw := mw + w;\r\n if (Length(sn) > 0) and (sn[Length(sn)] = ' ') then\r\n mw := mw + fws;\r\n s := s + sn;\r\n end;\r\n\r\n if s <> '' then\r\n begin\r\n p := Length(s);\r\n st := Copy(s, 1, p);\r\n Inc(lcnt);\r\n if mw > tw then\r\n tw := mw;\r\n\r\n if not Calculate then\r\n DrawText(st, mw, th);\r\n end;\r\n\r\n Result := CreateCanvasRectF(rs.Left, rs.Top, rs.Left + tw, rs.Top + lcnt * th);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.TextOut(X,Y: Integer; const Text: string);\r\nbegin\r\n TextOut(Double(X), Double(Y), Text);\r\nend;\r\n\r\nfunction TCanvas.TextRect(ARect: TRect; const Text: String; const WordWrap: Boolean = False; const Calculate: Boolean = False; const AHorizontalAlignment: TAlignment = taLeftJustify; const AVerticalAlignment: TVerticalAlignment = taAlignTop): TRect;\r\nvar\r\n r: TCanvasRectF;\r\nbegin\r\n r := TextRect(CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom), Text, WordWrap, Calculate, AHorizontalAlignment, AVerticalAlignment);\r\n Result := Rect(Round(r.Left), Round(r.Top), Round(r.Right), Round(r.Bottom));\r\nend;\r\n\r\nfunction TCanvas.TextWidth(const Text: string): Double;\r\nvar\r\n f: string;\r\n tm: TJSTextMetrics;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n f := Font.ToString;\r\n FContext.font := f;\r\n tm := FContext.measureText(Text);\r\n Result := tm.width;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Transform(m11, m12, m21, m22, dx, dy: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.transform(m11, m12, m21, m22, dx, dy);\r\nend;\r\n\r\nprocedure TCanvas.Translate(X, Y: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.translate(X, Y);\r\nend;\r\n\r\nprocedure TCanvas.Draw(X, Y: Integer; Graphic: TGraphic);\r\nbegin\r\n Draw(Double(X), Double(Y), Graphic);\r\nend;\r\n\r\ndestructor TCanvas.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TCanvas.Draw(X, Y: Double; Graphic: TGraphic);\r\nvar\r\n img: TJSObject;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n img := Graphic.Image;\r\n FContext.drawImage(img, X, Y);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.DrawFocusRect(const Rect: TCanvasRectF);\r\nvar\r\n ps: TPenStyle;\r\nbegin\r\n ps := Pen.Style;\r\n Pen.Style := psDot;\r\n Pen.Width := 1;\r\n Pen.Color := clBlack;\r\n\r\n MoveTo(Rect.Left, Rect.Top);\r\n LineTo(Rect.Right, Rect.Top);\r\n LineTo(Rect.Right, Rect.Bottom);\r\n LineTo(Rect.Left, Rect.Bottom);\r\n LineTo(Rect.Left, Rect.Top);\r\n\r\n Pen.Style := ps;\r\nend;\r\n\r\nprocedure TCanvas.DrawFocusRect(const Rect: TRect);\r\nbegin\r\n DrawFocusRect(CreateCanvasRectF(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom));\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(X1, Y1, X2, Y2: Double);\r\nvar\r\n w, h: Double;\r\n kappa: Double;\r\n ox, oy, xe, ye, xm, ym: Double;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n w := x2 - x1;\r\n h := y2 - y1;\r\n\r\n kappa := 0.5522848;\r\n\r\n ox := (w / 2) * kappa;\r\n oy := (h / 2) * kappa;\r\n xe := x1 + w;\r\n ye := y1 + h;\r\n xm := x1 + w / 2;\r\n ym := y1 + h / 2;\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n FContext.moveTo(x1, ym);\r\n FContext.bezierCurveTo(x1, ym - oy, xm - ox, y1, xm, y1);\r\n FContext.bezierCurveTo(xm + ox, y1, xe, ym - oy, xe, ym);\r\n FContext.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\r\n FContext.bezierCurveTo(xm - ox, ye, x1, ym + oy, x1, ym);\r\n FContext.closePath();\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nfunction TCanvas.GetPixel(X,Y: Integer): TColor;\r\nvar\r\n imgd: TJSImageData;\r\nbegin\r\n Result := clNone;\r\n if Assigned(FContext) then\r\n begin\r\n imgd := FContext.getImageData(x, y, 1, 1);\r\n Result := RGB(imgd.data[0], imgd.data[1], imgd.data[2]);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.LineTo(X, Y: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n if not FPathOpen then\r\n begin\r\n FContext.beginPath();\r\n ApplyStroke;\r\n FContext.moveTo(FPathX, FPathY);\r\n end;\r\n\r\n FContext.lineTo(X,Y);\r\n FContext.stroke();\r\n FPathX := X;\r\n FPathY := Y;\r\n\r\n FPathOpen := false;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Save;\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.save();\r\nend;\r\n\r\nprocedure TCanvas.SetClipRect(const Value: TCanvasRectF);\r\nbegin\r\n FClipRect := Value;\r\n if Assigned(FContext) then\r\n begin\r\n FContext.beginPath;\r\n FContext.rect(FClipRect.Left, FClipRect.Top, FClipRect.Right - FClipRect.Left, FClipRect.Bottom - FClipRect.Top);\r\n FContext.clip;\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.SetPixel(X,Y: Integer; Clr: TColor);\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n FContext.fillStyle := ColorToHtml(Clr);;\r\n FContext.fillRect(x,y, 1+0.5, 1+0.5);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.SetTransform(m11, m12, m21, m22, dx, dy: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.setTransform(m11, m12, m21, m22, dx, dy);\r\nend;\r\n\r\nprocedure TCanvas.StretchDraw(Rect: TCanvasRectF; Graphic: TGraphic);\r\nvar\r\n img: TJSObject;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n img := Graphic.Image;\r\n FContext.drawImage(img, 0, 0, Graphic.width, Graphic.height, Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.StretchDraw(Rect: TRect; Graphic: TGraphic);\r\nbegin\r\n StretchDraw(CreateCanvasRectF(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom), Graphic);\r\nend;\r\n\r\nprocedure TCanvas.Polygon(const Points: array of TCanvasPointF);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n ApplyFill;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n FContext.closePath();\r\n\r\n if Brush.Style <> bsClear then\r\n FContext.fill();\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Polyline(const Points: array of TCanvasPointF);\r\nvar\r\n l, i: Integer;\r\nbegin\r\n if Assigned(FContext) then\r\n begin\r\n l := Length(Points);\r\n\r\n FContext.beginPath();\r\n ApplyStroke;\r\n i := 0;\r\n FContext.moveTo(Points[i].X, Points[i].Y);\r\n\r\n while (i < l - 1) do\r\n begin\r\n inc(i);\r\n FContext.lineTo(Points[i].X, Points[i].Y);\r\n end;\r\n\r\n if Pen.Style <> psClear then\r\n FContext.stroke();\r\n end;\r\nend;\r\n\r\nprocedure TCanvas.Ellipse(const Rect: TCanvasRectF);\r\nbegin\r\n Ellipse(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.EndScene;\r\nbegin\r\n if Assigned(OnEndScene) then\r\n OnEndScene(Self);\r\nend;\r\n\r\nprocedure TCanvas.FillRect(const Rect: TCanvasRectF);\r\nbegin\r\n Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);\r\nend;\r\n\r\nprocedure TCanvas.Rotate(Angle: Double);\r\nbegin\r\n if Assigned(FContext) then\r\n FContext.rotate(Angle);\r\nend;\r\n\r\nprocedure TCanvas.RoundRect(const Rect: TCanvasRectF; CX, CY: Double);\r\nbegin\r\n RoundRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, CX, CY);\r\nend;\r\n\r\n{ TGraphic }\r\n\r\nconstructor TGraphic.Create(Img: TJSObject);\r\nbegin\r\n FAddToQueue := True;\r\n FEmpty := True;\r\n FData := '';\r\n FURL := '';\r\n FImage := Img;\r\nend;\r\n\r\nprocedure TGraphic.AssignEvents;\r\nbegin\r\n asm\r\n var me = this;\r\n this.FImage.onload = function() {\r\n me.DoChange();\r\n };\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.CaptureCanvas;\r\nbegin\r\n if Assigned(FCanvas) and Assigned(FCanvas.Element) then\r\n LoadFromResource(FCanvas.Element.toDataURL());\r\nend;\r\n\r\nconstructor TGraphic.Create;\r\nbegin\r\n FAddToQueue := True;\r\n FEmpty := True;\r\n FData := '';\r\n CreateImage;\r\n AssignEvents;\r\nend;\r\n\r\nconstructor TGraphic.Create(URL: string);\r\nbegin\r\n FAddToQueue := True;\r\n FEmpty := True;\r\n FData := '';\r\n Create;\r\n LoadFromURL(URL);\r\nend;\r\n\r\nprocedure TGraphic.Assign(Source: TGraphic);\r\nvar\r\n s: string;\r\nbegin\r\n if Assigned(Source) and Assigned(Source.FCanvas) then\r\n LoadFromCanvas(Source.FCanvas)\r\n else if Assigned(Source) and Assigned(Source.FImage) and not Source.Empty then\r\n begin\r\n asm\r\n s = Source.FImage.src;\r\n end;\r\n\r\n LoadFromURL(s);\r\n end;\r\nend;\r\n\r\nfunction TGraphic.Image: TJSObject;\r\nbegin\r\n Result := FImage;\r\nend;\r\n\r\nprocedure TGraphic.LoadFromCache(AData: String);\r\nvar\r\n dt: string;\r\n o: TJSObject;\r\n b: Boolean;\r\n s: string;\r\n l: Boolean;\r\nbegin\r\n FData := AData;\r\n dt := AData;\r\n if (dt <> '') and not FCache.Find(dt, o) then\r\n begin\r\n b := False;\r\n s := '';\r\n asm\r\n s = this.FImage.src;\r\n b = (s != '');\r\n end;\r\n\r\n l := b and (dt <> s);\r\n if l then\r\n begin\r\n CreateImage;\r\n AssignEvents;\r\n end;\r\n\r\n if (not l and (FQueue.IndexOf(dt) = -1)) or l then\r\n begin\r\n asm\r\n this.FImage.src = dt;\r\n end;\r\n\r\n Inc(FCacheCount);\r\n if FAddToQueue then\r\n FQueue.Add(dt);\r\n end;\r\n end\r\n else\r\n begin\r\n FImage := o;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.LoadFromCanvas(ACanvas: TCanvas);\r\nbegin\r\n if Assigned(ACanvas) and Assigned(ACanvas.Element) then\r\n LoadFromResource(ACanvas.Element.toDataURL());\r\nend;\r\n\r\nprocedure TGraphic.LoadFromFile(AFileName: string);\r\nbegin\r\n LoadFromURL(AFileName);\r\nend;\r\n\r\nfunction TGraphic.GetBase64Image: string;\r\nbegin\r\n Result := '';\r\n if Assigned(FCanvas) and Assigned(FCanvas.Element) then\r\n Result := FCanvas.Element.toDataURL();\r\nend;\r\n\r\nprocedure TGraphic.LoadFromResource(AResource: string; AHInstance: Integer);\r\nbegin\r\n FEmpty := True;\r\n LoadFromCache(AResource);\r\nend;\r\n\r\nprocedure TGraphic.LoadFromResource(AResource: string);\r\nbegin\r\n LoadFromResource(AResource, 0);\r\nend;\r\n\r\nprocedure TGraphic.LoadFromStream(AStream: TStream);\r\nbegin\r\n DoChange;\r\nend;\r\n\r\nprocedure TGraphic.LoadFromURL(AURL: string; AHInstance: Integer);\r\nbegin\r\n FEmpty := True;\r\n LoadFromCache(AURL);\r\nend;\r\n\r\nprocedure TGraphic.LoadFromURL(AURL: string);\r\nbegin\r\n LoadFromURL(AURL, 0);\r\nend;\r\n\r\nprocedure TGraphic.RecreateCanvas;\r\nbegin\r\n if not Assigned(FCanvasElement) then\r\n FCanvasElement := TJSHTMLCanvasElement(document.createElement('CANVAS'));\r\n\r\n if Assigned(FCanvasElement) then\r\n begin\r\n FCanvasElement.height := Height;\r\n FCanvasElement.width := Width;\r\n if not Assigned(FCanvas) then\r\n begin\r\n FCanvas := TCanvas.Create(FCanvasElement);\r\n FCanvas.OnBeginScene := DoBeginScene;\r\n FCanvas.OnEndScene := DoEndScene;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TGraphic.CreateFromResource(AResource: String;\r\n AInstance: NativeUInt): TGraphic;\r\nbegin\r\n Result := TGraphic.Create;\r\n Result.LoadFromResource(AResource);\r\nend;\r\n\r\nclass function TGraphic.CreateFromURL(AURL: String): TGraphic;\r\nbegin\r\n Result := CreateFromURL(AURL, 0);\r\nend;\r\n\r\nclass function TGraphic.CreateFromURL(AURL: String;\r\n AInstance: NativeUInt): TGraphic;\r\nbegin\r\n Result := TGraphic.Create;\r\n Result.LoadFromURL(AURL);\r\nend;\r\n\r\nclass function TGraphic.CreateFromResource(AResource: string): TGraphic;\r\nbegin\r\n Result := CreateFromResource(AResource, 0);\r\nend;\r\n\r\nprocedure TGraphic.CreateImage;\r\nbegin\r\n asm\r\n this.FImage = new Image();\r\n end;\r\nend;\r\n\r\nprocedure TGraphic.DoBeginScene(Sender: TObject);\r\nbegin\r\n FCanvas.Clear;\r\nend;\r\n\r\nprocedure TGraphic.DoChange;\r\nvar\r\n i: Integer;\r\nbegin\r\n FEmpty := (Width = 0) and (Height = 0);\r\n if not FEmpty and (FData <> '') and not FCache.Exists(FData) then\r\n begin\r\n FCache.Add(TGraphicCache.Create(FImage, FData));\r\n i := FQueue.IndexOf(FData);\r\n if (i >= 0) and (i <= FQueue.Count - 1) then\r\n FQueue.Delete(i);\r\n\r\n Dec(FCacheCount);\r\n if FCacheCount = 0 then\r\n begin\r\n if Assigned(Application.OnImageCacheReady) then\r\n Application.OnImageCacheReady(Application);\r\n end;\r\n end;\r\n\r\n if Assigned(FOnChange) then\r\n FOnChange(Self);\r\nend;\r\n\r\nprocedure TGraphic.DoEndScene(Sender: TObject);\r\nbegin\r\n FAddToQueue := False;\r\n CaptureCanvas;\r\n FAddToQueue := True;\r\nend;\r\n\r\nfunction TGraphic.Empty: Boolean;\r\nbegin\r\n Result := FEmpty;\r\nend;\r\n\r\nprocedure TGraphic.SetHeight(const Value: Integer);\r\nbegin\r\n asm\r\n this.FImage.height = Value;\r\n end;\r\n RecreateCanvas;\r\n DoChange;\r\nend;\r\n\r\nprocedure TGraphic.SetSize(AWidth, AHeight: Integer);\r\nbegin\r\n Width := AWidth;\r\n Height := AHeight;\r\nend;\r\n\r\nprocedure TGraphic.SetURL(const URL: string);\r\nbegin\r\n LoadFromURL(URL);\r\nend;\r\n\r\nprocedure TGraphic.SetWidth(const Value: Integer);\r\nbegin\r\n asm\r\n this.FImage.width = Value;\r\n end;\r\n RecreateCanvas;\r\n DoChange;\r\nend;\r\n\r\nfunction TGraphic.GetWidth: Integer;\r\nvar\r\n w: integer;\r\nbegin\r\n asm\r\n w = this.FImage.width;\r\n end;\r\n Result := w;\r\nend;\r\n\r\nfunction TGraphic.GetCanvas: TCanvas;\r\nbegin\r\n if not Assigned(FCanvas) then\r\n RecreateCanvas;\r\n\r\n Result := FCanvas;\r\nend;\r\n\r\nfunction TGraphic.GetHeight: Integer;\r\nvar\r\n h: integer;\r\nbegin\r\n asm\r\n h = this.FImage.height;\r\n end;\r\n Result := h;\r\nend;\r\n\r\n{ TGraphicCache }\r\n\r\nconstructor TGraphicCache.Create(AImage: TJSObject; AID: string);\r\nbegin\r\n FImage := AImage;\r\n FID := AID;\r\nend;\r\n\r\n{ TGraphicCacheList }\r\n\r\nfunction TGraphicCacheList.Exists(AID: string): Boolean;\r\nvar\r\n I: Integer;\r\n it: TGraphicCache;\r\nbegin\r\n Result := False;\r\n for I := 0 to Count - 1 do\r\n begin\r\n it := Items[I] as TGraphicCache;\r\n if (it.ID = AID) and Assigned(it.Image) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TGraphicCacheList.Find(AID: string; var FImage: TJSObject): Boolean;\r\nvar\r\n I: Integer;\r\n it: TGraphicCache;\r\nbegin\r\n Result := False;\r\n for I := 0 to Count - 1 do\r\n begin\r\n it := Items[I] as TGraphicCache;\r\n if (it.ID = AID) and Assigned(it.Image) then\r\n begin\r\n FImage := it.Image;\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\ninitialization\r\nbegin\r\n FCache := TGraphicCacheList.Create;\r\n FQueue := TStringList.Create;\r\nend;\r\n\r\nend.","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.StdCtrls;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Controls, SysUtils, Web, WEBLib.Graphics, Types;\r\n\r\ntype\r\n Single = Double;\r\n TEditCharCase = (wecLowerCase, wecNormal, wecMixedCase, wecUpperCase);\r\n TCheckBoxState = (cbChecked, cbGrayed, cbUnchecked);\r\n TDateTimeKind = (dtkDate, dtkTime);\r\n TEllipsisPosition = (epEndEllipsis, epNone);\r\n TTextLayout = (tlTop, tlCenter, tlBottom);\r\n TSysLinkType = (sltID, sltURL);\r\n\r\n TLinkClickEvent = procedure(Sender: TObject; Link: string; LinkType: TSysLinkType) of object;\r\n\r\n TCustomLabel = class(TCustomControl)\r\n private\r\n FContent: TJSElement;\r\n FAutoSize: boolean;\r\n FCaption: string;\r\n FEllipsisPosition: TEllipsisPosition;\r\n FWordWrap: Boolean;\r\n FAlignment: TAlignment;\r\n FLayout: TTextLayout;\r\n FTransparent: boolean;\r\n procedure SetLayout(const Value: TTextLayout);\r\n procedure SetAlignment(const Value: TAlignment);\r\n function GetContentHandle: TJSHTMLElement;\r\n protected\r\n function GetOuterWidth: integer; override;\r\n function GetOuterHeight: integer; override;\r\n function CreateElement: TJSElement; override;\r\n function GetDisplayText: string; virtual;\r\n function CanShowFocus: boolean; override;\r\n procedure BindElement; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n procedure SetAutoSize(AValue: boolean);\r\n procedure SetCaption(AValue: string); virtual;\r\n procedure SetEllipsisPosition(AValue: TEllipsisPosition);\r\n property ContentHandle: TJSHTMLElement read GetContentHandle;\r\n property Alignment: TAlignment read FAlignment write SetAlignment;\r\n property AutoSize: boolean read FAutoSize write SetAutoSize;\r\n property Caption: string read FCaption write SetCaption;\r\n property EllipsisPosition: TEllipsisPosition read FEllipsisPosition write SetEllipsisPosition;\r\n property Layout: TTextLayout read FLayout write SetLayout;\r\n property Transparent: boolean read FTransparent write FTransparent;\r\n property WordWrap: Boolean read FWordWrap write FWordWrap;\r\n public\r\n procedure CreateInitialize; override;\r\n end;\r\n\r\n TLabel = class(TCustomLabel)\r\n published\r\n property Align;\r\n property Alignment;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property Caption;\r\n property Color;\r\n property EllipsisPosition;\r\n property Enabled;\r\n property ElementClassName;\r\n property ElementID;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Layout;\r\n property Left;\r\n property Margins;\r\n property ShowHint;\r\n property Top;\r\n property Transparent;\r\n property Visible;\r\n property Width;\r\n property WordWrap;\r\n property OnClick;\r\n property OnDblClick;\r\n end;\r\n\r\n TWebLabel = class(TLabel);\r\n\r\n TCustomInput = class(TCustomControl)\r\n private\r\n protected\r\n function GetInputType: string; virtual;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElementVisual; override;\r\n public\r\n procedure CreateInitialize; override;\r\n end;\r\n\r\n TCustomEdit = class(TCustomInput)\r\n private\r\n FCharCase: TEditCharCase;\r\n FMaxLength: integer;\r\n FReadOnly: Boolean;\r\n FText: string;\r\n FTextHint: string;\r\n FSelStart: Integer;\r\n FAlignment: TAlignment;\r\n FHideSelection: Boolean;\r\n FPasswordChar: Char;\r\n FOnChange: TNotifyEvent;\r\n FAutoSize: Boolean;\r\n FAutoSelect: Boolean;\r\n FSelLength: Integer;\r\n FNumeric: Boolean;\r\n procedure SetAlignment(const Value: TAlignment);\r\n procedure SetHideSelection(const Value: Boolean);\r\n procedure SetAutoSelect(const Value: Boolean);\r\n procedure SetAutoSize(const Value: Boolean);\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n procedure SetSelLength(const Value: Integer);\r\n procedure SetSelStart(const Value: Integer);\r\n procedure SetPasswordChar(const Value: Char);\r\n procedure SetNumeric(const Value: Boolean);\r\n protected\r\n function GetInputType: string; override;\r\n procedure PersistinHTML; override;\r\n procedure DisableTab; override;\r\n function GetText: string;\r\n function GetDisplayText: string; virtual;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n function IsReadOnly: boolean; virtual;\r\n procedure BindEvents; override;\r\n procedure UpdateElementData; override;\r\n procedure SetCharCase(AValue: TEditCharCase); virtual;\r\n procedure SetMaxLength(AValue: integer);\r\n procedure SetReadOnly(AValue: boolean);\r\n procedure SetText(AValue: string);\r\n procedure SetTextHint(AValue: string);\r\n property Font;\r\n property Color;\r\n property BorderStyle;\r\n property HideSelection: Boolean read FHideSelection write SetHideSelection;\r\n property CharCase: TEditCharCase read FCharCase write SetCharCase;\r\n property MaxLength: integer read FMaxLength write SetMaxLength;\r\n property Numeric: Boolean read FNumeric write SetNumeric;\r\n property PasswordChar: Char read FPasswordChar write SetPasswordChar;\r\n property ReadOnly: Boolean read FReadOnly write SetReadOnly;\r\n property Text: string read GetText write SetText;\r\n property TextHint: string read FTextHint write SetTextHint;\r\n property AutoSize: Boolean read FAutoSize write SetAutoSize;\r\n property AutoSelect: Boolean read FAutoSelect write SetAutoSelect;\r\n property Alignment: TAlignment read FAlignment write SetAlignment;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n public\r\n procedure CreateInitialize; override;\r\n property SelStart: Integer read FSelStart write SetSelStart;\r\n property SelLength: Integer read FSelLength write SetSelLength;\r\n procedure Clear;\r\n procedure ClearSelection;\r\n procedure Change; virtual;\r\n procedure SelectAll;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n end;\r\n\r\n TEdit = class(TCustomEdit)\r\n published\r\n property Alignment;\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property AutoSelect;\r\n property BorderStyle;\r\n property CharCase;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property HideSelection;\r\n property Left;\r\n property PasswordChar;\r\n property Margins;\r\n property MaxLength;\r\n property ReadOnly;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property TextHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebEdit = class(TEdit);\r\n\r\n TSpinEdit = class(TCustomInput)\r\n private\r\n FIncrement: integer;\r\n FMaxValue: integer;\r\n FMinValue: integer;\r\n FValue: integer;\r\n FAutoSize: Boolean;\r\n FOnChange: TNotifyEvent;\r\n FReadOnly: boolean;\r\n function GetText: string;\r\n procedure SetText(const Value: string);\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n procedure SetReadOnly(const Value: boolean);\r\n protected\r\n procedure PersistinHTML; override;\r\n procedure DisableTab; override;\r\n function GetInputType: string; override;\r\n procedure UpdateElementData; override;\r\n function GetValue: integer;\r\n procedure SetIncrement(AValue: integer);\r\n procedure SetMaxValue(AValue: integer);\r\n procedure SetMinValue(AValue: integer);\r\n procedure SetValue(AValue: integer);\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n function IsReadOnly: boolean; virtual;\r\n function GetDisplayText: string; virtual;\r\n procedure BindEvents; override;\r\n procedure Change; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n property Text: string read GetText write SetText;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize: Boolean read FAutoSize write FAutoSize;\r\n property BorderStyle;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Increment: integer read FIncrement write SetIncrement;\r\n property Left;\r\n property Margins;\r\n property MaxValue: integer read FMaxValue write SetMaxValue;\r\n property MinValue: integer read FMinValue write SetMinValue;\r\n property ReadOnly: boolean read FReadOnly write SetReadOnly;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabStop;\r\n property TabOrder;\r\n property Value: integer read GetValue write SetValue;\r\n property Visible;\r\n property Width;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebSpinEdit = class(TSpinEdit);\r\n\r\n TDateTimePicker = class(TCustomInput)\r\n private\r\n FDate: TDateTime;\r\n FKind: TDateTimeKind;\r\n FTime: TDateTime;\r\n FOnChange: TNotifyEvent;\r\n procedure SetDate(AValue: TDateTime);\r\n function GetDate: TDateTime;\r\n procedure SetTime(AValue: TDateTime);\r\n function GetTime: TDateTime;\r\n procedure SetKind(AValue: TDateTimeKind);\r\n procedure SetText(const Value: String);\r\n function GetText: String;\r\n protected\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure BindEvents; override;\r\n procedure UpdateElementData; override;\r\n function CreateElement: TJSElement; override;\r\n function GetInputType: string; override;\r\n procedure Change; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderStyle;\r\n property Color;\r\n property Date: TDateTime read GetDate write SetDate;\r\n property ElementClassName;\r\n property ElementID;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Kind: TDateTimeKind read FKind write SetKind;\r\n property Left;\r\n property Margins;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabStop;\r\n property TabOrder;\r\n property Text: String read GetText write SetText;\r\n property Time: TDateTime read GetTime write SetTime;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebDateTimePicker = class(TDateTimePicker);\r\n\r\n TButton = class(TCustomControl)\r\n private\r\n FCaption: string;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure SetCaption(AValue: string);\r\n procedure DisableTab; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderStyle;\r\n property Caption: string read FCaption write SetCaption;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property Margins;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebButton = class(TButton);\r\n\r\n TCheckBox = class(TCustomControl)\r\n private\r\n FCaption: string;\r\n FChecked: boolean;\r\n FState: TCheckBoxState;\r\n protected\r\n procedure Loaded; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementSize; override;\r\n procedure PersistinHTML; override;\r\n procedure DisableTab; override;\r\n function CreateElement: TJSElement; override;\r\n procedure SetChecked(AValue: boolean);\r\n function GetChecked: boolean;\r\n procedure SetState(AValue: TCheckBoxState);\r\n function GetState: TCheckBoxState;\r\n procedure SetCaption(AValue: string);\r\n procedure SetEnabled(Value: boolean); override;\r\n function HandleLabelClick(Event: TJSMouseEvent): Boolean; virtual;\r\n procedure Click; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Checked: boolean read GetChecked write SetChecked;\r\n property Color;\r\n property Caption: string read FCaption write SetCaption;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property Margins;\r\n property ShowHint;\r\n property State: TCheckBoxState read GetState write SetState;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebCheckBox = class(TCheckBox);\r\n\r\n TRadioButton = class(TCustomControl)\r\n private\r\n FCaption: string;\r\n FChecked: boolean;\r\n FGroupName: string;\r\n protected\r\n procedure Loaded; override;\r\n procedure PersistInHTML; override;\r\n procedure DisableTab; override;\r\n function CreateElement: TJSElement; override;\r\n procedure SetChecked(AValue: boolean);\r\n function GetChecked: boolean;\r\n procedure SetEnabled(Value: boolean); override;\r\n procedure SetCaption(AValue: string);\r\n procedure SetGroupName(AValue: string);\r\n function HandleLabelClick(Event: TJSMouseEvent): Boolean; virtual;\r\n procedure UpdateElementSize; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Caption: string read FCaption write SetCaption;\r\n property Checked: boolean read GetChecked write SetChecked;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property GroupName: string read FGroupName write SetGroupName;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebRadioButton = class(TRadioButton);\r\n\r\n TListBox = class(TCustomControl)\r\n private\r\n FItems: TStringList;\r\n FItemIndex: integer;\r\n FMultiSelect: boolean;\r\n FSelected: TList;\r\n FItemHeight: Integer;\r\n FSorted: Boolean;\r\n FOnChange: TNotifyEvent;\r\n procedure SetItemHeight(const Value: Integer);\r\n procedure SetSorted(const Value: Boolean);\r\n function GetCount: Integer;\r\n function GetElementSelectHandle: TJSHTMLSelectElement;\r\n function GetSelCount: integer;\r\n protected\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure DoItemsChange(Sender: TObject);\r\n procedure DoUpdateList; virtual;\r\n procedure PersistinHTML; override;\r\n procedure DisableTab; override;\r\n function GetItemIndex: integer;\r\n function CreateElement: TJSElement; override;\r\n function GetSelected(AIndex: integer): boolean;\r\n procedure SetSelected(AIndex: Integer; AValue: boolean);\r\n procedure SetItems(AItems: TStringList);\r\n procedure SetItemIndex(AIndex: integer);\r\n procedure SetMultiSelect(AValue: boolean);\r\n procedure Loaded; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n procedure BindEvents; override;\r\n procedure Change; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure ClearSelection;\r\n procedure SelectAll;\r\n property Sorted: Boolean read FSorted write SetSorted;\r\n property Count: Integer read GetCount;\r\n property SelCount: integer read GetSelCount;\r\n property ElementSelectHandle: TJSHTMLSelectElement read GetElementSelectHandle;\r\n procedure AddItem(Item: string; AObject: TObject);\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property BorderStyle;\r\n property Color;\r\n property Font;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Height;\r\n property Hint;\r\n property ItemHeight: Integer read FItemHeight write SetItemHeight;\r\n property ItemIndex: integer read GetItemIndex write SetItemIndex;\r\n property Items: TStringList read FItems write SetItems;\r\n property Left;\r\n property MultiSelect: boolean read FMultiSelect write SetMultiSelect;\r\n property Selected[i: Integer]: boolean read GetSelected write SetSelected;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebListBox = class(TListBox);\r\n\r\n TComboBoxStyle = (csDropDown, csSimple, csDropDownList, csOwnerDrawFixed,\r\n csOwnerDrawVariable);\r\n\r\n TCustomComboBox = class(TCustomControl)\r\n private\r\n FItems: TStringList;\r\n FItemIndex: integer;\r\n FStyle: TComboBoxStyle;\r\n FDroppedDown: Boolean;\r\n FOnChange: TNotifyEvent;\r\n function GetText: string;\r\n procedure SetText(const Value: string);\r\n procedure SetStyle(const Value: TComboBoxStyle);\r\n procedure SetDroppedDown(const Value: Boolean);\r\n function GetElementSelectHandle: TJSHTMLSelectElement;\r\n protected\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean; virtual;\r\n procedure DoItemsChange(Sender: TObject);\r\n procedure DoUpdateList; virtual;\r\n function GetItemIndex: integer;\r\n function CreateElement: TJSElement; override;\r\n procedure DisableTab; override;\r\n procedure BindEvents; override;\r\n procedure UpdateElementData; override;\r\n procedure SetItems(AItems: TStringList);\r\n procedure SetItemIndex(AIndex: integer);\r\n procedure Loaded; override;\r\n procedure Change; virtual;\r\n procedure PersistinHTML; override;\r\n property Items: TStringList read FItems write SetItems;\r\n property Align;\r\n property AlignWithMargins;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property ItemIndex: integer read GetItemIndex write SetItemIndex;\r\n property Left;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text: string read GetText write SetText;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n procedure Clear;\r\n procedure AddItem(Item: string; AObject: TObject);\r\n property ElementSelectHandle: TJSHTMLSelectElement read GetElementSelectHandle;\r\n property Style: TComboBoxStyle read FStyle write SetStyle;\r\n property DroppedDown: Boolean read FDroppedDown write SetDroppedDown;\r\n end;\r\n\r\n TComboBox = class(TCustomComboBox)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property ItemIndex;\r\n property Items;\r\n property Left;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebComboBox = class(TComboBox);\r\n\r\n TFontPicker = class(TCustomComboBox)\r\n public\r\n procedure CreateInitialize; override;\r\n property Items;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property ItemIndex;\r\n property Left;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebFontPicker = class(TFontPicker);\r\n\r\n TFontSizePickerMode = (fmPointSize, fmRelativeSize);\r\n\r\n TFontSizePicker = class(TCustomComboBox)\r\n private\r\n FPickerMode: TFontSizePickerMode;\r\n procedure SetPickerMode(const AValue: TFontSizePickerMode);\r\n protected\r\n procedure Init; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n property Items;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property ItemIndex;\r\n property Left;\r\n property PickerMode: TFontSizePickerMode read FPickerMode write SetPickerMode;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebFontSizePicker = class(TFontSizePicker);\r\n\r\n\r\n TCaretPosition = TPoint;\r\n\r\n TCustomMemo = class(TCustomControl)\r\n private\r\n FWordWrap: Boolean;\r\n FBlockChange: Boolean;\r\n FLines: TStringList;\r\n FSelStart: Integer;\r\n FSelLength: Integer;\r\n FCaretPosition: TCaretPosition;\r\n FAutoSize: Boolean;\r\n FOnChange: TNotifyEvent;\r\n FReadOnly: boolean;\r\n function GetText: String;\r\n procedure SetText(const Value: String);\r\n procedure SetSelLength(const Value: Integer);\r\n procedure SetSelStart(const Value: Integer);\r\n procedure SetAutoSize(const Value: Boolean);\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n procedure SetReadOnly(const Value: boolean);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n function DoHandleInput(Event: TEventListenerEvent): Boolean; virtual;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean; virtual;\r\n function IsReadOnly: boolean; virtual;\r\n procedure PersistinHTML; override;\r\n function GetDisplayText: string; virtual;\r\n procedure BindEvents; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n procedure SetLines(ALines: TStringList);\r\n procedure DoLinesChange(Sender: TObject);\r\n property Text: String read GetText write SetText;\r\n property Font;\r\n property Color;\r\n property BorderStyle;\r\n property AutoSize: Boolean read FAutoSize write SetAutoSize;\r\n property Lines: TStringList read FLines write SetLines;\r\n property ReadOnly: boolean read FReadOnly write SetReadOnly;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n procedure Change; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n property CaretPosition: TCaretPosition read FCaretPosition write FCaretPosition;\r\n property SelStart: Integer read FSelStart write SetSelStart;\r\n property SelLength: Integer read FSelLength write SetSelLength;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n property WordWrap: Boolean read FWordWrap write FWordWrap;\r\n end;\r\n\r\n TMemo = class(TCustomMemo)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property BorderStyle;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property Lines;\r\n property ReadOnly;\r\n property SelStart;\r\n property SelLength;\r\n property ShowFocus;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Text;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseLeave;\r\n property OnMouseEnter;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TWebMemo = class(TMemo);\r\n\r\n TRadioGroup = class(TCustomControl)\r\n private\r\n FCaption: string;\r\n FColumns: integer;\r\n FItems: TStringList;\r\n FItemIndex: integer;\r\n FOldItemIndex: integer;\r\n FOnChange: TNotifyEvent;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n function GetItemIndex: integer;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure DoRadioClick(Sender: TObject);\r\n procedure SetCaption(AValue: string);\r\n procedure SetColumns(AValue: integer);\r\n procedure SetItems(AItems: TStringList);\r\n procedure SetItemIndex(AIndex: integer);\r\n procedure DoUpdateList; virtual;\r\n procedure Change; virtual;\r\n procedure Loaded; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Caption: string read FCaption write SetCaption;\r\n property Columns: integer read FColumns write SetColumns;\r\n property Items: TStringList read FItems write SetItems;\r\n property ItemIndex: integer read GetItemIndex write SetItemIndex;\r\n property Visible;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TWebRadioGroup = class(TRadioGroup);\r\n\r\n TProgressBar = class(TCustomControl)\r\n private\r\n FMax: integer;\r\n FMin: integer;\r\n FPosition: integer;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure SetMax(AValue: integer);\r\n procedure SetMin(AValue: integer);\r\n procedure SetPosition(AValue: integer);\r\n procedure DoUpdate; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Height;\r\n property Left;\r\n property Max: integer read FMax write SetMax;\r\n property Min: integer read FMin write SetMin;\r\n property Position: integer read FPosition write SetPosition;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n end;\r\n\r\n TWebProgressBar = class(TProgressBar);\r\n\r\n TColorPicker = class(TCustomInput)\r\n private\r\n FColor: TColor;\r\n FOnSelect: TNotifyEvent;\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n protected\r\n procedure UpdateElementVisual; override;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n function GetInputType: string; override;\r\n function GetColor: TColor;\r\n procedure SetColor(AValue: TColor); reintroduce;\r\n procedure BindEvents; override;\r\n procedure Select; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n published\r\n property Color: TColor read GetColor write SetColor;\r\n property Enabled;\r\n property Height;\r\n property Left;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnSelect: TNotifyEvent read FOnSelect write FOnSelect;\r\n end;\r\n\r\n TWebColorPicker = class(TColorPicker);\r\n\r\n TScrollBarContent = class(TCustomControl)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n end;\r\n\r\n TScrollBarKind = (sbHorizontal, sbVertical);\r\n TScrollBarInc = Integer;\r\n\r\n TScrollBar = class(TCustomControl)\r\n private\r\n FScrolling: Boolean;\r\n FContent: TScrollBarContent;\r\n FKind: TScrollBarKind;\r\n FPosition: Integer;\r\n FSmallChange: TScrollBarInc;\r\n FMax: Integer;\r\n FMin: Integer;\r\n FLargeChange: TScrollBarInc;\r\n FPageSize: Integer;\r\n FOnChange: TNotifyEvent;\r\n procedure SetKind(const Value: TScrollBarKind);\r\n procedure SetPosition(const Value: Integer);\r\n procedure SetMax(const Value: Integer);\r\n procedure SetMin(const Value: Integer);\r\n procedure SetPageSize(const Value: Integer);\r\n function GetPosition: Integer;\r\n function GetPageSize: Integer;\r\n protected\r\n function GetValue(XYPos: Double): Double;\r\n function CreateElement: TJSElement; override;\r\n function DoScroll(Event: TJSUIEvent): Boolean; virtual;\r\n procedure BindEvents; override;\r\n procedure UpdateElementVisual; override;\r\n procedure UpdateContent; virtual;\r\n procedure Loaded; override;\r\n procedure SetBounds(X, Y, AWidth, AHeight: Integer); override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Height;\r\n property Kind: TScrollBarKind read FKind write SetKind;\r\n property Position: Integer read GetPosition write SetPosition;\r\n property Left;\r\n property SmallChange: TScrollBarInc read FSmallChange write FSmallChange;\r\n property LargeChange: TScrollBarInc read FLargeChange write FLargeChange;\r\n property Max: Integer read FMax write SetMax;\r\n property Min: Integer read FMin write SetMin;\r\n property PageSize: Integer read GetPageSize write SetPageSize;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TWebScrollBar = class(TScrollBar);\r\n\r\nimplementation\r\n\r\n{ TCustomLabel }\r\n\r\nprocedure TCustomLabel.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAutoSize := true;\r\n FLayout := tlTop;\r\n FCaption := '';\r\n FEllipsisPosition := epNone;\r\n FTransparent := True;\r\n Color := clWhite;\r\n FAlignment := taLeftJustify;\r\n TabStop := false;\r\nend;\r\n\r\nfunction TCustomLabel.CanShowFocus: boolean;\r\nbegin\r\n Result := false;\r\nend;\r\n\r\nfunction TCustomLabel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\n FContent := document.createElement('SPAN');\r\n Result.appendChild(FContent);\r\nend;\r\n\r\nprocedure TCustomLabel.BindElement;\r\nbegin\r\n FContent := Container.firstElementChild;\r\nend;\r\n\r\nfunction TCustomLabel.GetContentHandle: TJSHTMLElement;\r\nbegin\r\n Result := TJSHTMLElement(FContent);\r\nend;\r\n\r\nfunction TCustomLabel.GetDisplayText: string;\r\nbegin\r\n Result := Caption;\r\nend;\r\n\r\nfunction TCustomLabel.GetOuterHeight: integer;\r\nbegin\r\n Result := Height;\r\n if AutoSize then // take 1px inner border in account\r\n Result := Result + 4;\r\nend;\r\n\r\nfunction TCustomLabel.GetOuterWidth: integer;\r\nbegin\r\n Result := Width;\r\n// if AutoSize then // take 1px inner border in account\r\n Result := Result + 4;\r\nend;\r\n\r\nprocedure TCustomLabel.SetAutoSize(AValue: boolean);\r\nbegin\r\n if FAutoSize <> AValue then\r\n begin\r\n FAutoSize := AValue;\r\n if FAutoSize then\r\n begin\r\n Width := -1;\r\n Height := -1;\r\n FEllipsisPosition := epNone;\r\n end;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetCaption(AValue: string);\r\nbegin\r\n if FCaption <> AValue then\r\n begin\r\n FCaption := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetEllipsisPosition(AValue: TEllipsisPosition);\r\nbegin\r\n if FEllipsisPosition <> AValue then\r\n begin\r\n FEllipsisPosition := AValue;\r\n if FEllipsisPosition <> epNone then\r\n FAutoSize := False;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetLayout(const Value: TTextLayout);\r\nbegin\r\n if FLayout <> Value then\r\n begin\r\n FLayout := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.SetAlignment(const Value: TAlignment);\r\nbegin\r\n if FAlignment <> Value then\r\n begin\r\n FAlignment := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLabel.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ContentHandle) then\r\n ContentHandle.innerHTML := GetDisplayText\r\n else\r\n ElementHandle.innerHTML := GetDisplayText;\r\nend;\r\n\r\nprocedure TCustomLabel.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('display', 'table');\r\n if AutoSize then\r\n ElementHandle.style.setProperty('overflow', '')\r\n else\r\n ElementHandle.style.setProperty('overflow', 'hidden');\r\n end;\r\n\r\n if Assigned(ContentHandle) then\r\n begin\r\n case Layout of\r\n tlTop: ContentHandle.style.setProperty('vertical-align', 'top');\r\n tlCenter: ContentHandle.style.setProperty('vertical-align', 'middle');\r\n tlBottom: ContentHandle.style.setProperty('vertical-align', 'bottom');\r\n end;\r\n\r\n case Alignment of\r\n taCenter: ContentHandle['align'] := 'center';\r\n taRightJustify: ContentHandle['align'] := 'right';\r\n end;\r\n\r\n if not Transparent then\r\n ContentHandle.style.setProperty('background-color', ColorToHTML(Color));\r\n\r\n ContentHandle.style.setProperty('display', 'table-cell');\r\n\r\n if Enabled then\r\n ContentHandle.style.setProperty('color', ColorToHtml(Font.Color));\r\n\r\n SetElementFont(ContentHandle, Font);\r\n\r\n if FEllipsisPosition = epNone then\r\n ContentHandle.style.setProperty('text-overflow', 'clip')\r\n else\r\n ContentHandle.style.setProperty('text-overflow', 'ellipsis');\r\n\r\n if WordWrap then\r\n ContentHandle.style.setProperty('white-space', 'normal')\r\n else\r\n ContentHandle.style.setProperty('white-space', 'nowrap');\r\n end;\r\nend;\r\n\r\n{ TCustomInput }\r\n\r\nfunction TCustomInput.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('INPUT');\r\n Result['type'] := GetInputType;\r\nend;\r\n\r\nprocedure TCustomInput.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n if Color <> clWindow then\r\n TJSHTMLInputElement(Container).style.setProperty('background-Color',ColorToHTML(Color));\r\n\r\n TJSHTMLInputElement(Container).style.setProperty('-moz-box-sizing', 'border-box');\r\n TJSHTMLInputElement(Container).style.setProperty('-webkit-box-sizing', 'border-box');\r\n TJSHTMLInputElement(Container).style.setProperty('box-sizing', 'border-box');\r\n end;\r\nend;\r\n\r\nprocedure TCustomInput.CreateInitialize;\r\nbegin\r\n inherited;\r\n ShowFocus := true;\r\nend;\r\n\r\nfunction TCustomInput.GetInputType: string;\r\nbegin\r\n Result := 'EDIT';\r\nend;\r\n\r\n{ TCustomEdit }\r\n\r\nprocedure TCustomEdit.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.oninput := DoHandleChange;\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.Change;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n FText := ElementInputHandle.value;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TCustomEdit.Clear;\r\nbegin\r\n Text := '';\r\nend;\r\n\r\nprocedure TCustomEdit.ClearSelection;\r\nvar\r\n s: string;\r\nbegin\r\n s := Text;\r\n Text := Copy(s, 1, SelStart) + Copy(s, SelStart + SelLength, Length(s));\r\nend;\r\n\r\nprocedure TCustomEdit.CreateInitialize;\r\nbegin\r\n inherited;\r\n FText := '';\r\n FCharCase := wecNormal;\r\n FMaxLength := 0;\r\n FReadOnly := false;\r\n FTextHint := '';\r\nend;\r\n\r\nprocedure TCustomEdit.DisableTab;\r\nbegin\r\n inherited;\r\n Container.setAttribute('tabindex','-1');\r\nend;\r\n\r\nfunction TCustomEdit.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomEdit.SetReadOnly(AValue: Boolean);\r\nbegin\r\n FReadOnly := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetSelLength(const Value: Integer);\r\nbegin\r\n FSelLength := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetSelStart(const Value: Integer);\r\nbegin\r\n FSelStart := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetPasswordChar(const Value: Char);\r\nbegin\r\n FPasswordChar := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetNumeric(const Value: Boolean);\r\nbegin\r\n FNumeric := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetText(AValue: string);\r\nbegin\r\n FText := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TCustomEdit.GetText: string;\r\nbegin\r\n Result := FText;\r\n if Assigned(ElementInputHandle) then\r\n Result := ElementInputHandle.value;\r\nend;\r\n\r\nfunction TCustomEdit.IsReadOnly: boolean;\r\nbegin\r\n Result := ReadOnly;\r\nend;\r\n\r\nprocedure TCustomEdit.SetTextHint(AValue: string);\r\nbegin\r\n FTextHint := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.UpdateElementData;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n case CharCase of\r\n wecUpperCase: ElementInputHandle.style.setProperty('text-transform', 'uppercase');\r\n wecLowerCase: ElementInputHandle.style.setProperty('text-transform', 'lowercase');\r\n wecMixedCase: ElementInputHandle.style.setProperty('text-transform', 'capitalize');\r\n wecNormal: ElementInputHandle.style.setProperty('text-transform', 'initial');\r\n end;\r\n\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n ElementInputHandle.placeholder := TextHint;\r\n ElementInputHandle['type'] := GetInputType;\r\n\r\n if MaxLength <= 0 then\r\n ElementInputHandle.removeAttribute('maxLength')\r\n else\r\n ElementInputHandle.maxLength := MaxLength;\r\n\r\n ElementInputHandle.value := GetDisplayText;\r\n\r\n if not Numeric then\r\n ElementInputHandle.setSelectionRange(SelStart, SelStart + SelLength);\r\n end;\r\nend;\r\n\r\nprocedure TCustomEdit.SelectAll;\r\nbegin\r\n if Assigned(ElementInputHandle) then\r\n ElementInputHandle.select;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAlignment(const Value: TAlignment);\r\nbegin\r\n FAlignment := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAutoSelect(const Value: Boolean);\r\nbegin\r\n FAutoSelect := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetAutoSize(const Value: Boolean);\r\nbegin\r\n FAutoSize := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetCharCase(AValue: TEditCharCase);\r\nbegin\r\n FCharcase := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetHideSelection(const Value: Boolean);\r\nbegin\r\n FHideSelection := Value;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomEdit.SetMaxLength(AValue: integer);\r\nbegin\r\n FMaxLength := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TCustomEdit.GetDisplayText: string;\r\nbegin\r\n Result := FText;\r\nend;\r\n\r\nfunction TCustomEdit.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nfunction TCustomEdit.GetInputType: string;\r\nbegin\r\n if PasswordChar <> '' then\r\n Result := 'PASSWORD'\r\n else if Numeric then\r\n Result := 'NUMBER'\r\n else\r\n Result := 'TEXT';\r\nend;\r\n\r\nprocedure TCustomEdit.PersistinHTML;\r\nbegin\r\n ElementInputHandle.setAttribute('value', Text);\r\nend;\r\n\r\n{ TSpinEdit }\r\n\r\nprocedure TSpinEdit.CreateInitialize;\r\nbegin\r\n inherited;\r\n FIncrement := 1;\r\n FMaxValue := 0;\r\n FMinValue := 0;\r\n ShowFocus := true;\r\nend;\r\n\r\nprocedure TSpinEdit.BindEvents; \r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.oninput := DoHandleChange;\r\n end;\r\nend;\r\n\r\nfunction TSpinEdit.GetDisplayText: string;\r\nbegin\r\n Result := IntToStr(FValue);\r\nend;\r\n\r\nfunction TSpinEdit.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nprocedure TSpinEdit.DisableTab;\r\nbegin\r\n inherited;\r\n Container.setAttribute('tabindex','-1');\r\nend;\r\n\r\nfunction TSpinEdit.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TSpinEdit.Change;\r\nbegin\r\n FValue := GetValue;\r\n\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TSpinEdit.GetInputType: string;\r\nbegin\r\n Result := 'NUMBER';\r\nend;\r\n\r\nfunction TSpinEdit.GetText: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TSpinEdit.GetValue: integer;\r\nvar\r\n s: string;\r\nbegin\r\n Result := FValue;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n s := TJSHTMLInputElement(Container).value;\r\n if (s <> '') then\r\n Result := StrToInt(s);\r\nend;\r\n\r\nfunction TSpinEdit.IsReadOnly: boolean;\r\nbegin\r\n Result := FReadOnly;\r\nend;\r\n\r\nprocedure TSpinEdit.SetIncrement(AValue: integer);\r\nbegin\r\n FIncrement := AValue;\r\n if Assigned(Container) then\r\n Container['step'] := IntToStr(AValue);\r\nend;\r\n\r\nprocedure TSpinEdit.SetMaxValue(AValue: integer);\r\nbegin\r\n FMaxValue := AValue;\r\n if Assigned(Container) then\r\n Container['max'] := IntToStr(AValue);\r\nend;\r\n\r\nprocedure TSpinEdit.SetMinValue(AValue: integer);\r\nbegin\r\n FMinValue := AValue;\r\n if Assigned(Container) then\r\n Container['min'] := IntToStr(AValue);\r\nend;\r\n\r\nprocedure TSpinEdit.SetReadOnly(const Value: boolean);\r\nbegin\r\n if (FReadOnly <> Value) then\r\n begin\r\n FReadOnly := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TSpinEdit.SetText(const Value: string);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TSpinEdit.PersistinHTML;\r\nbegin\r\n ElementInputHandle.setAttribute('value',IntToStr(Value));\r\nend;\r\n\r\nprocedure TSpinEdit.SetValue(AValue: integer);\r\nbegin\r\n FValue := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TSpinEdit.UpdateElementData;\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n begin\r\n Container['inputmode'] := 'numeric';\r\n Container['pattern'] := '[0-9]*';\r\n TJSHTMLInputElement(Container).value := GetDisplayText;\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n end;\r\nend;\r\n\r\n{ TDateTimePicker }\r\n\r\nfunction TDateTimePicker.GetInputType: string; \r\nbegin\r\n if FKind = dtkDate then\r\n Result := 'DATE'\r\n else\r\n Result := 'TIME';\r\nend;\r\n\r\nprocedure TDateTimePicker.SetDate(AValue: TDateTime);\r\nbegin\r\n if FDate <> AValue then\r\n begin\r\n FDate := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n begin\r\n TJSHTMLInputElement(Container).oninput := DoHandleChange;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.Change;\r\nbegin\r\n FTime := GetTime;\r\n FDate := GetDate;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TDateTimePicker.CreateElement: TJSElement;\r\nbegin\r\n Result := inherited CreateElement;\r\n if Assigned(Container) then\r\n Container['step'] := '1';\r\nend;\r\n\r\nprocedure TDateTimePicker.CreateInitialize;\r\nbegin\r\n inherited;\r\n Date := now;\r\n ShowFocus := true;\r\nend;\r\n\r\nfunction TDateTimePicker.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := true;\r\nend;\r\n\r\nfunction TDateTimePicker.GetDate: TDateTime;\r\nvar\r\n str: string;\r\n ye,mo,da: string;\r\nbegin\r\n Result := FTime;\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n str := TJSHTMLInputElement(Container).value;\r\n\r\n ye := copy(str,1,4);\r\n mo := copy(str,6,2);\r\n da := copy(str,9,2);\r\n\r\n Result := EncodeDate(StrToInt(ye), StrToInt(mo), StrToInt(da));\r\nend;\r\n\r\nprocedure TDateTimePicker.SetText(const Value: String);\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n // TJSHTMLInputElement(Container).value := Value;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetTime(AValue: TDateTime);\r\nbegin\r\n if FTime <> AValue then\r\n begin\r\n FTime := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimePicker.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n case Kind of\r\n dtkTime: TJSHTMLInputElement(Container).value := FormatDateTime(LongTimeFormat, FTime);\r\n dtkDate: TJSHTMLInputElement(Container).value := FormatDateTime('yyyy-MM-dd', FDate);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TDateTimePicker.GetText: String;\r\nbegin\r\n Result := '';\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n Result := TJSHTMLInputElement(Container).value;\r\nend;\r\n\r\nfunction TDateTimePicker.GetTime: TDateTime;\r\nvar\r\n str: string;\r\n d: TDateTime;\r\nbegin\r\n Result := FTime;\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n str := TJSHTMLInputElement(Container).value;\r\n if TryStrToTime(str, d) then\r\n Result := d;\r\nend;\r\n\r\nprocedure TDateTimePicker.SetKind(AValue: TDateTimeKind);\r\nbegin\r\n FKind := AValue;\r\n if Assigned(Container) then\r\n begin\r\n if AValue = dtkDate then\r\n Container['type'] := 'DATE'\r\n else\r\n Container['type'] := 'TIME';\r\n end;\r\nend;\r\n\r\n{ TButton }\r\n\r\nprocedure TButton.CreateInitialize;\r\nbegin\r\n inherited;\r\n FCaption := ElementID;\r\nend;\r\n\r\nprocedure TButton.DisableTab;\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n Container.setAttribute('tabindex','-1');\r\nend;\r\n\r\nfunction TButton.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('BUTTON');\r\n Result['type'] := 'BUTTON';\r\nend;\r\n\r\nprocedure TButton.SetCaption(AValue: string);\r\nbegin\r\n FCaption := AValue;\r\n if Assigned(Container) then\r\n begin\r\n ElementHandle.innerHTML := AValue;\r\n end;\r\nend;\r\n\r\n{ TCheckBox }\r\n\r\nprocedure TCheckBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FCaption := ElementID;\r\n ShowFocus := true;\r\nend;\r\n\r\nprocedure TCheckBox.DisableTab;\r\nvar\r\n cb: TJSHTMLInputElement;\r\nbegin\r\n inherited;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n cb := TJSHTMLInputElement(Container.firstElementChild);\r\n cb.setAttribute('tabindex','-1');\r\nend;\r\n\r\nprocedure TCheckBox.Click;\r\nbegin\r\n inherited;\r\n FChecked := GetChecked;\r\nend;\r\n\r\nfunction TCheckBox.CreateElement: TJSElement;\r\nvar\r\n btn, lbl: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n btn := document.createElement('INPUT');\r\n lbl := document.createElement('SPAN');\r\n\r\n btn['TYPE'] := 'CHECKBOX';\r\n btn['id'] := GetID;\r\n lbl['id'] := GetID + 'lbl';\r\n lbl['value'] := GetID;\r\n\r\n TJSHTMLElement(btn).style.setProperty('vertical-align','middle');\r\n TJSHTMLElement(lbl).style.setProperty('vertical-align','middle');\r\n\r\n Result.appendChild(btn);\r\n Result.appendChild(lbl);\r\nend;\r\n\r\nfunction TCheckBox.HandleLabelClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n chk: TJSHTMLInputElement;\r\nbegin\r\n if Assigned(Container) then\r\n begin\r\n chk := TJSHTMLInputElement(Container.firstElementChild);\r\n chk.checked := not chk.checked;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nprocedure TCheckBox.Loaded;\r\nvar\r\n lbl: TJSHTMLInputElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n lbl := TJSHTMLInputElement(Container.children[1]);\r\n lbl.OnClick := @HandleLabelClick;\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.UpdateElementData;\r\nvar\r\n chk: TJSHTMLInputElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n chk := TJSHTMLInputElement(Container.firstElementChild);\r\n chk.disabled := not Enabled;\r\n chk.checked := FChecked;\r\n chk.indeterminate := (State = cbGrayed);\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.UpdateElementSize;\r\nbegin\r\n inherited;\r\n if (HeightStyle = ssAbsolute) and Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('height','');\r\n end;\r\nend;\r\n\r\nprocedure TCheckBox.SetCaption(AValue: string);\r\nbegin\r\n FCaption := AValue;\r\n if Assigned(Container) then\r\n Container.lastElementChild.innerHTML := AValue;\r\nend;\r\n\r\nprocedure TCheckBox.SetEnabled(Value: boolean);\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(Container.firstElementChild).disabled := not Value;\r\nend;\r\n\r\nprocedure TCheckBox.SetChecked(AValue: boolean);\r\nbegin\r\n FChecked := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TCheckBox.GetChecked: boolean;\r\nbegin\r\n if Assigned(Container) then\r\n FChecked := TJSHTMLInputElement(Container.firstElementChild).checked;\r\n\r\n Result := FChecked;\r\nend;\r\n\r\nprocedure TCheckBox.SetState(AValue: TCheckBoxState);\r\nbegin\r\n FState := AValue;\r\n FChecked := FState = cbChecked;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TCheckBox.GetState: TCheckBoxState;\r\nbegin\r\n Result := FState;\r\nend;\r\n\r\nprocedure TCheckBox.PersistinHTML;\r\nvar\r\n cb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n cb := TJSHTMLInputElement(Container.firstElementChild);\r\n\r\n if (cb.checked) then\r\n cb.setAttribute('checked','checked')\r\n else\r\n cb.removeAttribute('checked');\r\nend;\r\n\r\n\r\n{ TRadioButton }\r\n\r\nprocedure TRadioButton.CreateInitialize;\r\nbegin\r\n inherited;\r\n FCaption := ElementID;\r\n FGroupName := '';\r\n ShowFocus := true;\r\nend;\r\n\r\nprocedure TRadioButton.DisableTab;\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n inherited;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n rb := TJSHTMLInputElement(Container.firstElementChild);\r\n rb.setAttribute('tabindex','-1');\r\nend;\r\n\r\nfunction TRadioButton.CreateElement: TJSElement;\r\nvar\r\n btn, lbl: TJSElement;\r\nbegin\r\n Result := document.createElement('LABEL');\r\n btn := document.createElement('INPUT');\r\n lbl := document.createElement('SPAN');\r\n btn['TYPE'] := 'RADIO';\r\n btn['id'] := GetID + 'rd';\r\n btn['name'] := GroupName;\r\n\r\n TJSHTMLInputElement(btn).disabled := not Enabled;\r\n TJSHTMLInputElement(btn).style.setProperty('vertical-align','middle');\r\n\r\n TJSHTMLInputElement(btn).style.setProperty('margin-top','-2px');\r\n\r\n lbl['id'] := GetID + 'lbl';\r\n lbl['value'] := GetID;\r\n\r\n Result.appendChild(btn);\r\n Result.appendChild(lbl);\r\nend;\r\n\r\nfunction TRadioButton.HandleLabelClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n if Assigned(Container) then\r\n begin\r\n rb := TJSHTMLInputElement(Container.firstElementChild);\r\n rb.checked := true;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nprocedure TRadioButton.Loaded;\r\nvar\r\n lbl: TJSHTMLInputElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(Container) then\r\n begin\r\n lbl := TJSHTMLInputElement(Container.children[1]);\r\n lbl.OnClick := @HandleLabelClick;\r\n end;\r\nend;\r\n\r\nprocedure TRadioButton.SetCaption(AValue: string);\r\nbegin\r\n FCaption := AValue;\r\n if Assigned(Container) then\r\n Container.lastElementChild.innerHTML := AValue;\r\nend;\r\n\r\nprocedure TRadioButton.SetEnabled(Value: boolean);\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(Container.firstElementChild).disabled := not Value;\r\nend;\r\n\r\nprocedure TRadioButton.SetGroupName(AValue: string);\r\nbegin\r\n FGroupName := AValue;\r\n if Assigned(Container) then\r\n Container.firstElementChild['name'] := AValue;\r\nend;\r\n\r\nprocedure TRadioButton.UpdateElementSize;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n inherited;\r\n el := document.getElementById(GetID + 'rd');\r\n if Assigned(el) then\r\n begin\r\n TJSHTMLElement(el).style.setProperty('height',InttoStr(Height)+'px');\r\n end;\r\nend;\r\n\r\nprocedure TRadioButton.SetChecked(AValue: boolean);\r\nbegin\r\n FChecked := AValue;\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(Container.firstElementChild).checked := AValue;\r\nend;\r\n\r\nfunction TRadioButton.GetChecked: boolean;\r\nbegin\r\n Result := FChecked;\r\n if Assigned(Container) then\r\n Result := TJSHTMLInputElement(Container.firstElementChild).checked;\r\nend;\r\n\r\nprocedure TRadioButton.PersistInHTML;\r\nvar\r\n rb: TJSHTMLInputElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n rb := TJSHTMLInputElement(Container.firstElementChild);\r\n if (rb.checked) then\r\n rb.setAttribute('checked','checked')\r\n else\r\n rb.removeAttribute('checked');\r\nend;\r\n\r\n{ TListBox }\r\n\r\nprocedure TListBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FItems := TStringList.Create;\r\n FItems.OnChange := DoItemsChange;\r\n FMultiSelect := false;\r\n FSelected := TList.Create;\r\n ShowFocus := true;\r\nend;\r\n\r\nfunction TListBox.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SELECT');\r\n Result['Size'] := '2';\r\nend;\r\n\r\ndestructor TListBox.Destroy;\r\nbegin\r\n FItems.Free;\r\n FSelected.Free;\r\n inherited;\r\nend;\r\n\r\n\r\nprocedure TListBox.DisableTab;\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n Container.setAttribute('tabindex','-1');\r\nend;\r\n\r\nfunction TListBox.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TListBox.AddItem(Item: string; AObject: TObject);\r\nbegin\r\n FItems.AddObject(Item, AObject);\r\nend;\r\n\r\nprocedure TListBox.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.onchange := DoHandleChange;\r\n end;\r\nend;\r\n\r\nprocedure TListBox.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TListBox.ClearSelection;\r\nvar\r\n i: integer;\r\nbegin\r\n ItemIndex := -1;\r\n\r\n if not Assigned(Container) then\r\n Exit; \r\n\r\n for i := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected := false;\r\nend;\r\n\r\nprocedure TListBox.SelectAll;\r\nvar\r\n i: integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit; \r\n\r\n for i := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n begin\r\n Selected[i] := true;\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected := true;\r\n end;\r\nend;\r\n\r\nprocedure TListBox.SetItems(AItems: TStringList);\r\nbegin\r\n FItems.Assign(AItems);\r\nend;\r\n\r\nfunction TListBox.GetCount: Integer;\r\nbegin\r\n Result := FItems.Count;\r\nend;\r\n\r\nfunction TListBox.GetElementSelectHandle: TJSHTMLSelectElement;\r\nbegin\r\n Result := TJSHTMLSelectElement(Container);\r\nend;\r\n\r\nfunction TListBox.GetItemIndex: integer;\r\nbegin\r\n Result := FItemIndex;\r\n if Assigned(Container) then\r\n Result := TJSHTMLSelectElement(Container).selectedIndex;\r\nend;\r\n\r\nprocedure TListBox.PersistinHTML; \r\nvar\r\n i: integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n for i := 0 to TJSHTMLSelectElement(Container).options.length - 1 do\r\n begin\r\n if TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected then\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).setAttribute('selected','selected')\r\n else\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).removeAttribute('selected');\r\n end;\r\nend;\r\n\r\nprocedure TListBox.SetItemHeight(const Value: Integer);\r\nbegin\r\n FItemHeight := Value;\r\nend;\r\n\r\nprocedure TListBox.SetItemIndex(AIndex: integer);\r\nbegin\r\n if FItemIndex <> AIndex then\r\n begin\r\n FItemIndex := AIndex;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TListBox.SetMultiSelect(AValue: boolean);\r\nbegin\r\n FMultiSelect := AValue;\r\n if Assigned(Container) then\r\n TJSHTMLSelectElement(Container).multiple := AValue;\r\nend;\r\n\r\nfunction TListBox.GetSelCount: integer;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := 0;\r\n\r\n if Assigned(Container) then\r\n begin\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n if TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[i]).selected then\r\n inc(Result);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TListBox.GetSelected(AIndex: integer): boolean;\r\nbegin\r\n if (AIndex < FSelected.Count) then\r\n Result := boolean(FSelected.Items[AIndex])\r\n else\r\n Result := False;\r\n\r\n if Assigned(Container) then\r\n Result := TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[Aindex]).selected;\r\nend;\r\n\r\n\r\nprocedure TListBox.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TListBox.SetSelected(AIndex: integer; AValue: boolean);\r\nbegin \r\n while (AIndex >= FSelected.Count) do\r\n FSelected.Add(false);\r\n\r\n FSelected.Items[AIndex] := AValue;\r\n\r\n if Assigned(Container) then\r\n TJSHTMLOptionElement(TJSHTMLSelectElement(Container).options[Aindex]).selected := AValue;\r\nend;\r\n\r\nprocedure TListBox.SetSorted(const Value: Boolean);\r\nbegin\r\n FSorted := Value;\r\n Items.Sort;\r\nend;\r\n\r\nprocedure TListBox.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementSelectHandle) then\r\n begin\r\n ElementSelectHandle.style.setProperty('overflow', 'auto');\r\n ElementSelectHandle.selectedIndex := FItemIndex;\r\n end;\r\nend;\r\n\r\nprocedure TListBox.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Color <> clWindow then\r\n ElementHandle.style.setProperty('background-Color',ColorToHTML(Color));\r\nend;\r\n\r\nprocedure TListBox.DoItemsChange(Sender: TObject);\r\nbegin\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TListBox.DoUpdateList;\r\nvar\r\n i: integer;\r\n opt: TJSHTMLOptionElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n for i := TJSHTMLSelectElement(Container).options.length - 1 downto 0 do\r\n TJSHTMLSelectElement(Container).remove(i);\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n opt := TJSHTMLOptionElement.New(FItems[i]);\r\n TJSHTMLSelectElement(Container).add(opt);\r\n Selected[i] := false;\r\n end;\r\nend;\r\n\r\n{ TCustomComboBox }\r\n\r\nprocedure TCustomComboBox.AddItem(Item: string; AObject: TObject);\r\nbegin\r\n FItems.AddObject(Item, AObject);\r\nend;\r\n\r\nprocedure TCustomComboBox.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.onchange := DoHandleChange;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.Clear;\r\nbegin\r\n Items.Clear;\r\nend;\r\n\r\nprocedure TCustomComboBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FItems := TStringList.Create;\r\n FItems.OnChange := DoItemsChange;\r\n ShowFocus := true;\r\nend;\r\n\r\nfunction TCustomComboBox.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SELECT');\r\nend;\r\n\r\ndestructor TCustomComboBox.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomComboBox.DisableTab;\r\nbegin\r\n inherited;\r\n if Assigned(Container) then\r\n Container.setAttribute('tabindex','-1');\r\nend;\r\n\r\nprocedure TCustomComboBox.SetItems(AItems: TStringList);\r\nbegin\r\n FItems.Assign(AItems);\r\nend;\r\n\r\nprocedure TCustomComboBox.SetStyle(const Value: TComboBoxStyle);\r\nbegin\r\n FStyle := Value;\r\nend;\r\n\r\nprocedure TCustomComboBox.SetText(const Value: string);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if Value = Items[I] then\r\n ItemIndex := I;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.UpdateElementData;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementSelectHandle) then\r\n ElementSelectHandle.selectedIndex := FItemIndex;\r\nend;\r\n\r\nfunction TCustomComboBox.GetElementSelectHandle: TJSHTMLSelectElement;\r\nbegin\r\n Result := TJSHTMLSelectElement(Container);\r\nend;\r\n\r\nfunction TCustomComboBox.GetItemIndex: integer;\r\nbegin\r\n Result := FItemIndex;\r\n if Assigned(Container) then\r\n Result := TJSHTMLSelectElement(Container).selectedIndex;\r\nend;\r\n\r\nfunction TCustomComboBox.GetText: string;\r\nbegin\r\n if ItemIndex >= 0 then\r\n Result := Items[ItemIndex]\r\n else\r\n Result := '';\r\nend;\r\n\r\nprocedure TCustomComboBox.Change;\r\nbegin\r\n FItemIndex := GetItemIndex;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TCustomComboBox.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomComboBox.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TCustomComboBox.PersistinHTML;\r\nvar\r\n sel: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n\r\n sel := TJSHTMLElement(ElementHandle.children[ItemIndex]);\r\n sel.setAttribute('selected','selected');\r\nend;\r\n\r\nprocedure TCustomComboBox.SetDroppedDown(const Value: Boolean);\r\nbegin\r\n FDroppedDown := Value;\r\nend;\r\n\r\nprocedure TCustomComboBox.SetItemIndex(AIndex: integer);\r\nbegin\r\n if FItemIndex <> AIndex then\r\n begin\r\n FItemIndex := AIndex;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomComboBox.DoItemsChange(Sender: TObject);\r\nbegin\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TCustomComboBox.DoUpdateList;\r\nvar\r\n i: integer;\r\n s: string;\r\n opt: TJSElement;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n for i := TJSHTMLSelectElement(Container).options.length - 1 downto 0 do\r\n TJSHTMLSelectElement(Container).remove(i);\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n s := FItems[i];\r\n opt := document.createElement('OPTION');\r\n opt['value'] := s;\r\n opt.innerHTML := s;\r\n Container.appendChild(opt);\r\n end;\r\n\r\n UpdateElement;\r\nend;\r\n\r\n\r\n{ TFontPicker }\r\n\r\nprocedure TFontPicker.CreateInitialize;\r\nvar\r\n tst: boolean;\r\n \r\n procedure Add(s: string);\r\n begin\r\n asm\r\n tst = d.detect(s);\r\n end;\r\n if tst then\r\n Self.Items.Add(s);\r\n end;\r\n\r\nbegin\r\n inherited;\r\n\r\n asm\r\n var Detector = function() {\r\n // a font will be compared against all the three default fonts.\r\n // and if it doesn't match all 3 then that font is not available.\r\n var baseFonts = ['monospace', 'sans-serif', 'serif'];\r\n\r\n //we use m or w because these two characters take up the maximum width.\r\n // And we use a LLi so that the same matching fonts can get separated\r\n var testString = \"mmmmmmmmmmlli\";\r\n\r\n //we test using 72px font size, we may use any size. I guess larger the better.\r\n var testSize = '72px';\r\n\r\n var h = document.getElementsByTagName(\"body\")[0];\r\n\r\n // create a SPAN in the document to get the width of the text we use to test\r\n var s = document.createElement(\"span\");\r\n s.style.fontSize = testSize;\r\n s.innerHTML = testString;\r\n var defaultWidth = {};\r\n var defaultHeight = {};\r\n for (var index in baseFonts) {\r\n //get the default width for the three base fonts\r\n s.style.fontFamily = baseFonts[index];\r\n h.appendChild(s);\r\n defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font\r\n defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font\r\n h.removeChild(s);\r\n }\r\n\r\n function detect(font) {\r\n var detected = false;\r\n for (var index in baseFonts) {\r\n s.style.fontFamily = font + ',' + baseFonts[index]; // name of the font along with the base font for fallback.\r\n h.appendChild(s);\r\n var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]);\r\n h.removeChild(s);\r\n detected = detected || matched;\r\n }\r\n return detected;\r\n }\r\n\r\n this.detect = detect;\r\n };\r\n\r\n var d = new Detector();\r\n //tst = d.detect(\"Arial\");\r\n end;\r\n\r\n Add('Arial');\r\n Add('Arial Black');\r\n Add('Arial Narrow');\r\n Add('Courier');\r\n Add('Courier New');\r\n Add('Georgia');\r\n Add('Lucida Console');\r\n Add('Modena');\r\n Add('Monotype Corsiva');\r\n Add('Papyrus');\r\n Add('Tahoma');\r\n Add('Times');\r\n Add('Times New Roman');\r\n Add('Trebuchet MS');\r\n Add('Verdana');\r\n Add('Verona');\r\nend;\r\n\r\n{ TFontSizePicker }\r\n\r\nprocedure TFontSizePicker.CreateInitialize;\r\nbegin\r\n inherited;\r\n PickerMode := fmPointSize;\r\nend;\r\n\r\nprocedure TFontSizePicker.Init;\r\nbegin\r\n Items.Clear;\r\n\r\n case PickerMode of\r\n fmPointSize:\r\n begin\r\n Items.Add('8');\r\n Items.Add('9');\r\n Items.Add('10');\r\n Items.Add('11');\r\n Items.Add('12');\r\n Items.Add('14');\r\n Items.Add('16');\r\n Items.Add('18');\r\n Items.Add('20');\r\n Items.Add('22');\r\n Items.Add('24');\r\n Items.Add('26');\r\n Items.Add('28');\r\n Items.Add('36');\r\n Items.Add('48');\r\n Items.Add('72');\r\n end;\r\n fmRelativeSize:\r\n begin\r\n Items.Add('8');\r\n Items.Add('9');\r\n Items.Add('10');\r\n Items.Add('14');\r\n Items.Add('18');\r\n Items.Add('24');\r\n Items.Add('36');\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TFontSizePicker.SetPickerMode(const AValue: TFontSizePickerMode);\r\nbegin\r\n FPickerMode := AValue;\r\n Init;\r\nend;\r\n\r\n\r\n{ TCustomMemo }\r\n\r\nfunction TCustomMemo.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomMemo.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n ElementInputHandle.oninput := DoHandleInput;\r\n\r\n if Assigned(ElementInputHandle) then\r\n ElementInputHandle.onchange := DoHandleChange;\r\nend;\r\n\r\nprocedure TCustomMemo.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nprocedure TCustomMemo.CreateInitialize;\r\nbegin\r\n inherited;\r\n FLines := TStringList.Create;\r\n FLines.OnChange := DoLinesChange;\r\n ShowFocus := true;\r\nend;\r\n\r\nfunction TCustomMemo.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('TEXTAREA');\r\nend;\r\n\r\ndestructor TCustomMemo.Destroy;\r\nbegin\r\n FLines.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TCustomMemo.DoHandleInput(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n GetText;\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomMemo.DoLinesChange(Sender: TObject);\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TCustomMemo.SetAutoSize(const Value: Boolean);\r\nbegin\r\n if FAutoSize <> Value then\r\n begin\r\n FAutoSize := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetLines(ALines: TStringList);\r\nbegin\r\n FLines.Assign(ALines);\r\nend;\r\n\r\nprocedure TCustomMemo.SetReadOnly(const Value: boolean);\r\nbegin\r\n if (FReadOnly <> Value) then\r\n begin\r\n FReadOnly := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetSelLength(const Value: Integer);\r\nbegin\r\n if FSelLength <> Value then\r\n begin\r\n FSelLength := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetSelStart(const Value: Integer);\r\nbegin\r\n if FSelStart <> Value then\r\n begin\r\n FSelStart := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.SetText(const Value: String);\r\nbegin\r\n FLines.Text := Value;\r\nend;\r\n\r\nprocedure TCustomMemo.UpdateElementData;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) and not FBlockChange then\r\n begin\r\n ElementInputHandle.value := GetDisplayText;\r\n ElementInputHandle.setSelectionRange(SelStart, SelStart + SelLength);\r\n ElementInputHandle.style.setProperty('resize', 'none');\r\n ElementInputHandle.readOnly := IsReadOnly;\r\n end;\r\nend;\r\n\r\nprocedure TCustomMemo.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) and not FBlockChange then\r\n begin\r\n ElementInputHandle.style.setProperty('overflow', '');\r\n end;\r\n\r\nend;\r\n\r\nfunction TCustomMemo.GetText: String;\r\nbegin\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n FBlockChange := True;\r\n FLines.Text := ElementInputHandle.value;\r\n FBlockChange := False;\r\n end;\r\n\r\n Result := FLines.Text;\r\nend;\r\n\r\nfunction TCustomMemo.IsReadOnly: boolean;\r\nbegin\r\n Result := FReadOnly;\r\nend;\r\n\r\nprocedure TCustomMemo.PersistinHTML;\r\nbegin\r\n ElementInputHandle.innerHTML := Lines.Text;\r\nend;\r\n\r\nfunction TCustomMemo.GetDisplayText: string;\r\nbegin\r\n Result := FLines.Text;\r\nend;\r\n\r\nfunction TCustomMemo.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\n{ TRadioGroup }\r\n\r\nprocedure TRadioGroup.CreateInitialize;\r\nbegin\r\n inherited;\r\n FCaption := '';\r\n FColumns := 1;\r\n FItems := TStringList.Create;\r\n FItemIndex := -1;\r\n BorderWidth := 2;\r\nend;\r\n\r\nprocedure TRadioGroup.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TRadioGroup.CreateElement: TJSElement;\r\nvar\r\n legend: TJSElement;\r\nbegin\r\n Result := document.createElement('FIELDSET');\r\n legend := document.createElement('LEGEND');\r\n Result.appendChild(legend);\r\n legend.innerHTML := Caption;\r\n if Caption = '' then\r\n TJSHTMLElement(legend).style.setProperty('display', 'none')\r\n else\r\n TJSHTMLElement(legend).style.setProperty('display', '');\r\n\r\n TJSHTMLElement(Result).style.setProperty('display', 'inline-block');\r\n\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-before','0px');\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-after','0px');\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-end','0px');\r\n TJSHTMLElement(Result).style.setProperty('-webkit-padding-start','0px');\r\nend;\r\n\r\ndestructor TRadioGroup.Destroy;\r\nbegin\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TRadioGroup.Loaded;\r\nbegin\r\n inherited;\r\n DoUpdateList;\r\nend;\r\n\r\nprocedure TRadioGroup.SetCaption(AValue: string);\r\nbegin\r\n FCaption := AValue;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n Container.firstElementChild.innerHTML := AValue;\r\n\r\n if AValue = '' then\r\n TJSHTMLElement(Container.firstElementChild).style.setProperty('display', 'none')\r\n else\r\n TJSHTMLElement(Container.firstElementChild).style.setProperty('display', '');\r\nend;\r\n\r\nprocedure TRadioGroup.SetColumns(AValue: integer);\r\nbegin\r\n if (FColumns > 0) and (FColumns <> AValue) then\r\n begin\r\n FColumns := AValue;\r\n DoUpdateList;\r\n end;\r\nend;\r\n\r\nprocedure TRadioGroup.SetItems(AItems: TStringList);\r\nbegin\r\n FItems.Assign(AItems);\r\n DoUpdateList; \r\nend;\r\n\r\nfunction TRadioGroup.GetItemIndex: integer;\r\nvar\r\n el: TJSElement;\r\n i: integer;\r\nbegin\r\n Result := FItemIndex;\r\n\r\n for i := 0 to FItems.Count -1 do\r\n begin\r\n el := document.getElementByID(GetID + IntToStr(i) + 'rd');\r\n if Assigned(el) then\r\n begin\r\n if TJSHTMLInputElement(el).checked then\r\n Result := i;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TRadioGroup.SetItemIndex(AIndex: integer);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n FItemIndex := AIndex;\r\n\r\n el := document.getElementByID(GetID + IntToStr(AIndex) + 'rd');\r\n if Assigned(el) then\r\n TJSHTMLInputElement(el).checked := True;\r\nend;\r\n\r\nfunction TRadioGroup.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := true;\r\nend;\r\n\r\nprocedure TRadioGroup.DoRadioClick(Sender: TObject);\r\nbegin\r\n if ItemIndex = FOldItemIndex then\r\n Exit;\r\n\r\n Change;\r\n\r\n FOldItemIndex := ItemIndex;\r\nend;\r\n\r\nprocedure TRadioGroup.DoUpdateList;\r\nvar\r\n i: integer;\r\n s: string;\r\n rd: TRadioButton;\r\n dx,dy,col,row: integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n if FItems.Count = 0 then\r\n Exit;\r\n\r\n dy := Height div (FItems.Count div Columns);\r\n dx := Width div FColumns;\r\n col := 0;\r\n row := 0;\r\n\r\n for i := 0 to FItems.Count - 1 do\r\n begin\r\n s := FItems[i];\r\n rd := TRadioButton.Create(GetID + IntToStr(i));\r\n rd.Parent := Parent;\r\n rd.Caption := s;\r\n rd.GroupName := GetID;\r\n rd.Top := 16 + row * dy;\r\n rd.Left := 4 + col * dx;\r\n rd.WidthStyle := ssPercent;\r\n rd.WidthPercent := 100;\r\n rd.ControlPosition := cpAbsolute;\r\n rd.OnClick := DoRadioClick;\r\n\r\n if FItemIndex = i then\r\n rd.Checked := true;\r\n\r\n TJSHTMLElement(rd.Container).style.setProperty('float', 'left');\r\n TJSHTMLElement(rd.Container).style.setProperty('width', IntToStr(Trunc(100 / FColumns)) + '%');\r\n\r\n if i mod FColumns = 0 then\r\n TJSHTMLElement(rd.Container).style.setProperty('clear', 'left');\r\n\r\n Container.appendChild(rd.Container);\r\n\r\n if col < FColumns - 1 then\r\n inc(col)\r\n else\r\n begin\r\n col := 0;\r\n inc(row);\r\n end;\r\n end;\r\nend;\r\n\r\n{ TProgressBar }\r\n\r\nprocedure TProgressBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n FMax := 100;\r\n FMin := 0;\r\n FPosition := 0;\r\nend;\r\n\r\nfunction TProgressBar.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('PROGRESS');\r\nend;\r\n\r\nprocedure TProgressBar.SetMax(AValue: integer);\r\nbegin\r\n FMax := AValue;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TProgressBar.SetMin(AValue: integer);\r\nbegin\r\n FMin := AValue;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TProgressBar.DoUpdate;\r\nvar\r\n value: integer;\r\n maxvalue: integer;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n value := FPosition - FMin; \r\n maxvalue := FMax - FMin;\r\n Container['max'] := IntToStr(maxvalue);\r\n Container['value'] := IntToStr(value);\r\nend;\r\n\r\nprocedure TProgressBar.SetPosition(AValue: integer);\r\nbegin\r\n FPosition := AValue;\r\n DoUpdate;\r\nend;\r\n\r\n{ TColorPicker }\r\n\r\nprocedure TColorPicker.CreateInitialize;\r\nbegin\r\n inherited;\r\n FColor := clBlack;\r\nend;\r\n\r\nprocedure TColorPicker.BindEvents; \r\nbegin\r\n inherited;\r\n if Assigned(ElementInputHandle) then\r\n begin\r\n ElementInputHandle.oninput := DoHandleChange;\r\n end;\r\nend;\r\n\r\nfunction TColorPicker.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nprocedure TColorPicker.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('padding','0px'); \r\n ElementHandle.style.setProperty('width', IntToStr(Width - 2) + 'px');\r\n ElementHandle.style.setProperty('height',IntToStr(Height - 2) + 'px');\r\n end;\r\nend;\r\n\r\nfunction TColorPicker.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin \r\n Select;\r\n Result := true;\r\nend;\r\n\r\nprocedure TColorPicker.Select;\r\nbegin\r\n if Assigned(OnSelect) then\r\n OnSelect(Self);\r\nend;\r\n\r\nfunction TColorPicker.GetColor: TColor;\r\nbegin\r\n Result := FColor;\r\n\r\n if Assigned(Container) then\r\n Result := HexToColor(TJSHTMLInputElement(Container).value);\r\nend;\r\n\r\nprocedure TColorPicker.SetColor(AValue: TColor);\r\nbegin\r\n FColor := AValue;\r\n\r\n if Assigned(Container) then\r\n TJSHTMLInputElement(Container).value := ColorToHTML(AValue);\r\nend;\r\n\r\nfunction TColorPicker.GetInputType: string;\r\nbegin \r\n Result := 'COLOR';\r\nend;\r\n\r\n{ TScrollBar }\r\n\r\nprocedure TScrollBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n TabStop := True;\r\n FKind := sbHorizontal;\r\n FPosition := 0;\r\n FMin := 0;\r\n FMax := 100;\r\n FSmallChange := 1;\r\n FLargeChange := 1;\r\n\r\n FContent := TScrollBarContent.Create(Self);\r\n FContent.Parent := Self;\r\n FContent.Width := 121;\r\n FContent.Height := 17;\r\n\r\n Width := 121;\r\n Height := 17;\r\n\r\n UpdateContent;\r\nend;\r\n\r\nprocedure TScrollBar.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n ElementHandle.onscroll := @DoScroll;\r\nend;\r\n\r\nfunction TScrollBar.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\ndestructor TScrollBar.Destroy;\r\nbegin\r\n FContent.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TScrollBar.DoScroll(Event: TJSUIEvent): Boolean;\r\nbegin\r\n FScrolling := True;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\n\r\n FScrolling := False;\r\n Result := True;\r\nend;\r\n\r\nfunction TScrollBar.GetPageSize: Integer;\r\nbegin\r\n Result := FPageSize;\r\n if Result = 0 then\r\n Result := 25;\r\nend;\r\n\r\nfunction TScrollBar.GetValue(XYPos: Double): Double;\r\nbegin\r\n Result := 0;\r\n if Assigned(FContent) then\r\n begin\r\n case Kind of\r\n sbHorizontal: Result := (XYPos / FContent.Width) * (Max - Min);\r\n sbVertical: Result := (XYPos / FContent.Height) * (Max - Min);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TScrollBar.GetPosition: Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(Element) then\r\n begin\r\n case Kind of\r\n sbHorizontal: Result := Round(GetValue(Element.scrollLeft));\r\n sbVertical: Result := Round(GetValue(Element.scrollTop));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.Loaded;\r\nbegin\r\n inherited;\r\n UpdateContent;\r\nend;\r\n\r\nprocedure TScrollBar.SetBounds(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n inherited;\r\n UpdateContent;\r\nend;\r\n\r\nprocedure TScrollBar.SetKind(const Value: TScrollBarKind);\r\nbegin\r\n if FKind <> Value then\r\n begin\r\n FKind := Value;\r\n// if not (csLoading in ComponentState) then\r\n begin\r\n case Kind of\r\n sbHorizontal:\r\n begin\r\n SetBounds(Left, Top, Height, 17)\r\n end;\r\n sbVertical:\r\n begin\r\n SetBounds(Left, Top, 17, Width)\r\n end;\r\n end;\r\n end;\r\n UpdateElement;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetMax(const Value: Integer);\r\nbegin\r\n if FMax <> Value then\r\n begin\r\n FMax := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetMin(const Value: Integer);\r\nbegin\r\n if FMin <> Value then\r\n begin\r\n FMin := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetPageSize(const Value: Integer);\r\nbegin\r\n if FPageSize <> Value then\r\n begin\r\n FPageSize := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.SetPosition(const Value: Integer);\r\nbegin\r\n if FPosition <> Value then\r\n begin\r\n FPosition := Value;\r\n UpdateContent;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'auto');\r\n case Kind of\r\n sbHorizontal:\r\n begin\r\n ElementHandle.style.setProperty('overflow-y', 'hidden');\r\n ElementHandle.style.setProperty('overflow-x', '');\r\n end;\r\n sbVertical:\r\n begin\r\n ElementHandle.style.setProperty('overflow-y', '');\r\n ElementHandle.style.setProperty('overflow-x', 'hidden');\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TScrollBar.UpdateContent;\r\nvar\r\n x, y, w, h: Integer;\r\n ps: Integer;\r\n v: Single;\r\nbegin\r\n if not Assigned(FContent) or not Assigned(ElementHandle) or (csLoading in ComponentState) or FScrolling then\r\n Exit;\r\n\r\n ps := PageSize;\r\n v := (Max - Min) / ps;\r\n\r\n case Kind of\r\n sbHorizontal:\r\n begin\r\n y := 0;\r\n h := Height;\r\n w := Round(v * Width);\r\n x := Round(((FPosition - Min) / (Max - Min)) * w);\r\n end;\r\n sbVertical:\r\n begin\r\n x := 0;\r\n w := Width;\r\n h := Round(v * Height);\r\n y := Round(((FPosition - Min) / (Max - Min)) * h);\r\n end;\r\n end;\r\n\r\n FContent.SetBounds(0, 0, w, h);\r\n ElementHandle.scrollLeft := x;\r\n ElementHandle.scrollTop := y;\r\nend;\r\n\r\n{ TScrollBarContent }\r\n\r\nfunction TScrollBarContent.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Controls;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Graphics, Types, SysUtils, Web;\r\n\r\nconst\r\n VK_CANCEL = 3;\r\n VK_BACK = 8;\r\n VK_TAB = 9;\r\n VK_RETURN = 13;\r\n VK_SHIFT = 16;\r\n VK_CONTROL = 17;\r\n VK_MENU = 18;\r\n VK_PAUSE = 19;\r\n VK_CAPITAL = 20;\r\n VK_ESCAPE = 27;\r\n VK_SPACE = 32;\r\n VK_PRIOR = 33;\r\n VK_NEXT = 34;\r\n VK_END = 35;\r\n VK_HOME = 36;\r\n VK_LEFT = 37;\r\n VK_UP = 38;\r\n VK_RIGHT = 39;\r\n VK_DOWN = 40;\r\n VK_PRINT = 42;\r\n VK_SNAPSHOT = 44;\r\n VK_INSERT = 45;\r\n VK_DELETE = 46;\r\n VK_HELP = 47;\r\n VK_LWIN = 91;\r\n VK_RWIN = 92;\r\n VK_NUMPAD0 = 96;\r\n VK_NUMPAD1 = 97;\r\n VK_NUMPAD2 = 98;\r\n VK_NUMPAD3 = 99;\r\n VK_NUMPAD4 = 100;\r\n VK_NUMPAD5 = 101;\r\n VK_NUMPAD6 = 102;\r\n VK_NUMPAD7 = 103;\r\n VK_NUMPAD8 = 104;\r\n VK_NUMPAD9 = 105;\r\n VK_MULTIPLY = 106;\r\n VK_ADD = 107;\r\n VK_SEPARATOR = 108;\r\n VK_SUBTRACT = 109;\r\n VK_DECIMAL = 110;\r\n VK_DIVIDE = 111;\r\n VK_F1 = 112;\r\n VK_F2 = 113;\r\n VK_F3 = 114;\r\n VK_F4 = 115;\r\n VK_F5 = 116;\r\n VK_F6 = 117;\r\n VK_F7 = 118;\r\n VK_F8 = 119;\r\n VK_F9 = 120;\r\n VK_F10 = 121;\r\n VK_F11 = 122;\r\n VK_F12 = 123;\r\n VK_F13 = 124;\r\n VK_F14 = 125;\r\n VK_F15 = 126;\r\n VK_F16 = 127;\r\n VK_F17 = 128;\r\n VK_F18 = 129;\r\n VK_F19 = 130;\r\n VK_F20 = 131;\r\n VK_F21 = 132;\r\n VK_F22 = 133;\r\n VK_F23 = 134;\r\n VK_F24 = 135;\r\n VK_NUMLOCK = 144;\r\n\r\ntype\r\n TCursor = Integer;\r\nconst\r\n crDefault = 0;\r\n crNone = 1;\r\n crArrow = 2;\r\n crCross = 3;\r\n crIBeam = 4;\r\n crSize = 22;\r\n crSizeNESW = 6;\r\n crSizeNS = 7;\r\n crSizeNWSE = 8;\r\n crSizeWE = 9;\r\n crUpArrow = 10;\r\n crHourGlass = 11;\r\n crDrag = 12;\r\n crNoDrop = 13;\r\n crHSplit = 14;\r\n crVSplit = 15;\r\n crMultIDrag = 16;\r\n crSQLWait = 17;\r\n crNo = 18;\r\n crAppStart = 19;\r\n crHelp = 20;\r\n crHandPoint = 21;\r\n crSizeAll = 22;\r\n\r\ntype\r\n TCSSCodeManager = class;\r\n Single = Double;\r\n TDragState = (dsDragEnter, dsDragLeave, dsDragMove);\r\n TDragObject = class(TObject);\r\n\r\n TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient, alCustom);\r\n TMouseButton = (mbLeft, mbRight, mbMiddle);\r\n TBorderStyle = (bsNone, bsSingle);\r\n TControlPosition = (cpAbsolute, cpRelative, cpNone);\r\n TSizeStyle = (ssPercent, ssAbsolute, ssAuto);\r\n TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth);\r\n\r\n TAnchorKind = (akLeft, akTop, akRight, akBottom);\r\n TAnchors = set of TAnchorKind;\r\n\r\n TMaterialGlyph = string;\r\n\r\n TElementClassName = string;\r\n TElementID = string;\r\n\r\n // Classes\r\n TShiftState = set of (ssShift, ssAlt, ssCtrl,\r\n ssLeft, ssRight, ssMIDdle, ssDouble, ssTouch, ssPen, ssCommand);\r\n \r\n TNotifyEvent = procedure(Sender: TObject) of object;\r\n TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer) of object;\r\n TMouseWheelEvent = procedure(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean) of object;\r\n TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X,Y: Integer) of object;\r\n TKeyEvent = procedure(Sender: TObject; var AKey: Word; Shift: TShiftState) of object;\r\n TKeyPressEvent = procedure(Sender: TObject; var AChar: Char) of object;\r\n TTouchEvent = procedure(Sender: TObject; X,Y: integer) of object;\r\n\r\n TDragOverEvent = procedure(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object;\r\n TDragDropEvent = procedure(Sender, Source: TObject; X, Y: Integer) of object;\r\n TStartDragEvent = procedure(Sender: TObject; var DragObject: TDragObject) of object;\r\n TEndDragEvent = procedure(Sender, Target: TObject; X, Y: Integer) of object;\r\n\r\n TControlStyleValue = (csAcceptsControls);\r\n TControlStyle = set of TControlStyleValue;\r\n\r\n TMargins = class(TPersistent)\r\n private \r\n FOnChange: TNotifyEvent;\r\n FLeft, FTop, FRight, FBottom: Integer;\r\n protected\r\n procedure SetLeft(const Value: integer);\r\n procedure SetTop(const Value: integer);\r\n procedure SetRight(const Value: integer);\r\n procedure SetBottom(const Value: integer);\r\n procedure DoChange; virtual;\r\n public\r\n constructor Create; reintroduce;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n published\r\n property Left: Integer read FLeft write SetLeft default 3;\r\n property Top: Integer read FTop write SetTop default 3;\r\n property Right: Integer read FRight write SetRight default 3;\r\n property Bottom: Integer read FBottom write SetBottom default 3;\r\n end;\r\n\r\n TPercentSize = 0..100;\r\n\r\n TControl = class(TComponent)\r\n private\r\n FMouseInsideLayer: Boolean;\r\n FLayer: TJSElement;\r\n FCaptured: Boolean;\r\n FControlCreated: Boolean;\r\n FUpdateCount: integer;\r\n FBlockUpdateElement: Boolean;\r\n FElement: TJSElement;\r\n FID: string;\r\n FNew: Boolean;\r\n FContainer: TJSElement;\r\n FElementEvent: TJSEvent;\r\n \r\n FElementClassName: string;\r\n FColor: TColor; \r\n FFont: TFont;\r\n FParent, FPrevParent: TControl;\r\n FControls: array of TControl;\r\n\r\n FOnDragOver: TDragOverEvent;\r\n FOnDragDrop: TDragDropEvent;\r\n FOnStartDrag: TStartDragEvent;\r\n FonEndDrag: TEndDragEvent;\r\n FOnClick: TNotifyEvent;\r\n FOnDblClick: TNotifyEvent;\r\n FOnMouseDown: TMouseEvent;\r\n FOnMouseUp: TMouseEvent;\r\n FOnMouseMove: TMouseMoveEvent;\r\n FOnKeyDown: TKeyEvent;\r\n FOnKeyUp: TKeyEvent;\r\n FOnKeyPress: TKeyPressEvent;\r\n FOnEnter: TNotifyEvent;\r\n FOnExit: TNotifyEvent;\r\n FEnabled: Boolean;\r\n FHint: string;\r\n FShowHint: Boolean;\r\n FTabOrder: Integer;\r\n FTabStop: Boolean;\r\n FVisible: Boolean;\r\n FWidth: Integer;\r\n FHeight: Integer;\r\n FTag: Integer;\r\n FControlPosition: TControlPosition;\r\n FAlign: TAlign;\r\n FAnchors: TAnchors;\r\n FAlignWithMargins: boolean;\r\n FIsAligning: boolean;\r\n FOnMouseEnter: TNotifyEvent;\r\n FOnMouseLeave: TNotifyEvent;\r\n FCursor: TCursor;\r\n FDoubleBuffered: Boolean;\r\n FControlStyle: TControlStyle;\r\n FMargins: TMargins;\r\n FOnMouseWheel: TMouseWheelEvent;\r\n FParentDoubleBuffered: Boolean;\r\n FParentColor: Boolean;\r\n FParentFont: Boolean;\r\n FOnTouchMove: TTouchEvent;\r\n FOnTouchStart: TTouchEvent;\r\n FOnTouchEnd: TTouchEvent;\r\n FLinkTouchEvents: Boolean;\r\n FWidthStyle: TSizeStyle;\r\n FHeightStyle: TSizeStyle;\r\n FWidthPercent: TPercentSize;\r\n FHeightPercent: TPercentSize;\r\n FOrigRect: TRect;\r\n FOrigParentRect: TRect;\r\n FIsResizing: boolean;\r\n FShowFocus: boolean;\r\n FBorderWidth: integer;\r\n FOrigTop: integer;\r\n FOrigLeft: integer;\r\n FUpdateTopLeft: boolean;\r\n FEnablePropagation: Boolean;\r\n FParentShowHint: Boolean;\r\n function GetControlsCount: Integer;\r\n function GetControls(Index: Integer): TControl;\r\n procedure SetVisible(AValue: Boolean);\r\n procedure SetWidth(AValue: Integer); virtual;\r\n procedure SetHeight(AValue: Integer); virtual;\r\n procedure SetControlPosition(AValue: TControlPosition); virtual;\r\n procedure SetHint(AValue: string);\r\n procedure SetShowHint(AValue: Boolean);\r\n procedure SetTabOrder(AValue: Integer);\r\n procedure SetTabStop(AValue: Boolean);\r\n procedure SetAlign(const Value: TAlign);\r\n procedure SetAlignWithMargins(const Value: boolean);\r\n procedure SetCursor(const Value: TCursor);\r\n function GetBoundsRect: TRect;\r\n procedure SetBoundsRect(const Value: TRect);\r\n procedure SetID(const Value: string);\r\n procedure SetMargins(const Value: TMargins);\r\n procedure SetAnchors(const Value: TAnchors);\r\n function GetElementEvent: TJSEvent;\r\n function GetClientOrigin: TPoint;\r\n procedure SetHeightStyle(const Value: TSizeStyle);\r\n procedure SetWidthStyle(const Value: TSizeStyle);\r\n procedure SetHeightPercent(const Value: TPercentSize);\r\n procedure SetWidthPercent(const Value: TPercentSize);\r\n procedure SetShowFocus(const Value: boolean);\r\n procedure SetBorderWidth(const Value: integer);\r\n function GetIsLinked: boolean;\r\n protected\r\n procedure SetEnabled(Value: Boolean); virtual;\r\n procedure SetBounds(X, Y, AWidth, AHeight: Integer); virtual;\r\n procedure RecreateCanvas; virtual;\r\n procedure VisibleChanging; virtual;\r\n function GetWidth: Integer; virtual;\r\n function GetHeight: Integer; virtual;\r\n function GetOuterWidth: integer; virtual;\r\n function GetOuterHeight: integer; virtual;\r\n function GetLeft: Integer; override;\r\n function GetTop: Integer; override;\r\n function HandleAllocated: Boolean; virtual;\r\n function CreateElement: TJSElement; virtual;\r\n function ContainerElement: TJSElement; virtual;\r\n procedure RecreateElement; virtual;\r\n procedure BindElement; virtual;\r\n procedure CreateInitialize; virtual;\r\n procedure ClearControls; virtual;\r\n function GetMouseEventButton(Event: TJSMouseEvent): TMouseButton; virtual;\r\n function GetMouseEventShiftState(Event: TJSMouseEvent): TShiftState; virtual;\r\n function GetKeyBoardEventShiftState(Event: TJSKeyBoardEvent): TShiftState; virtual;\r\n function GetMouseWheelEventShiftState(Event: TJSWheelEvent): TShiftState; virtual;\r\n function GetTouchEventShiftState(Event: TJSTouchEvent): TShiftState; virtual;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoWheel(Event: TJSWheelEvent): Boolean; virtual;\r\n function HandleDoDblClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseDown(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseUp(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseMove(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseLeave(Event: TJSMouseEvent): Boolean; virtual;\r\n function LayerHandleDoMouseEnter(Event: TJSMouseEvent): Boolean; virtual;\r\n function LayerHandleDoMouseLeave(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoMouseEnter(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n function HandleDoKeyUp(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n function HandleDoKeyPress(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n function HandleDoExit(Event: TEventListenerEvent): Boolean; virtual;\r\n function HandleDoEnter(Event: TJSFocusEvent): Boolean; virtual;\r\n function HandleDoTouchStart(Event: TJSTouchEvent): Boolean; virtual;\r\n function HandleDoTouchMove(Event: TJSTouchEvent): Boolean; virtual;\r\n function HandleDoTouchEnd(Event: TJSTouchEvent): Boolean; virtual;\r\n procedure HandleFontChanged(Sender: TObject);\r\n procedure DoExit; virtual;\r\n procedure DoEnter; virtual;\r\n procedure Click; virtual;\r\n procedure UpdateElement; virtual;\r\n procedure UpdateElementSize; virtual;\r\n procedure UpdateElementVisual; virtual;\r\n procedure UpdateElementData; virtual;\r\n procedure UpdateParent; virtual;\r\n procedure InternalUpdateParent; virtual;\r\n procedure UpdateChildren(AControl: TControl); virtual;\r\n procedure PersistinHTML; virtual;\r\n procedure InitFromHTML; virtual;\r\n procedure DisableTab; virtual;\r\n\r\n procedure SetElementClassName(AValue: string);\r\n procedure SetColor(AValue: TColor); virtual;\r\n procedure SetFont(AValue: TFont); virtual;\r\n procedure SetParent(AValue: TControl); virtual;\r\n procedure RegisterParent(AValue: TControl); virtual;\r\n procedure UnRegisterParent(AValue: TControl); virtual;\r\n\r\n procedure SetLeft(AValue: Integer); override;\r\n procedure SetTop(AValue: Integer); override;\r\n\r\n procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); virtual;\r\n procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); virtual;\r\n procedure MouseMove(Shift: TShiftState; X,Y: Integer); virtual;\r\n\r\n procedure TouchStart(X,Y: Integer); virtual;\r\n procedure TouchMove(X,Y: Integer); virtual;\r\n procedure TouchEnd(X,Y: Integer); virtual;\r\n\r\n procedure DoMouseEnter; virtual;\r\n procedure DoMouseLeave; virtual;\r\n procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); virtual;\r\n procedure DblClick; virtual;\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); virtual;\r\n procedure KeyPress(var Key: Char); virtual;\r\n procedure KeyUp(var Key: Word; Shift: TShiftState); virtual;\r\n procedure SetFocus; virtual;\r\n procedure DoMarginsChanged(Sender: TObject); virtual;\r\n procedure DoRealign; virtual;\r\n procedure DoBoundsChange; virtual;\r\n procedure DoEndDrag(Target: TObject; X, Y: Integer); virtual;\r\n procedure DoStartDrag(var DragObject: TDragObject); virtual;\r\n procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;\r\n var Accept: Boolean); virtual;\r\n function IsFocused: Boolean; virtual;\r\n function Focused: Boolean; virtual;\r\n function GetID: string;\r\n function GetElementHandle: TJSHTMLElement; virtual;\r\n function GetElementBindHandle: TJSEventTarget; virtual;\r\n function GetElement: TJSElement;\r\n function GetKeyCode(AValue: string): Integer;\r\n function IsKeyCharacter(AValue: string): Boolean;\r\n function GetClientRect: TRect;\r\n property Container: TJSElement read FContainer write FContainer;\r\n property ElementBindHandle: TJSEventTarget read GetElementBindHandle;\r\n property Element: TJSElement read GetElement;\r\n property ElementEvent: TJSEvent read GetElementEvent;\r\n\r\n procedure CreateControl; virtual;\r\n procedure BindEvents; virtual;\r\n procedure UnbindEvents; virtual;\r\n procedure SetElementFont(he: TJSHTMLElement; Font: TFont); virtual;\r\n procedure AlignControls(AControl: TControl; var Rect: TRect); virtual;\r\n procedure AlignControl(AControl: TControl); virtual;\r\n procedure InitAnchoring; virtual;\r\n procedure InitScript; virtual;\r\n procedure Realign; virtual;\r\n procedure Loaded; override;\r\n procedure InternalResize; virtual;\r\n procedure FontChanged; virtual;\r\n procedure DisposeOf;\r\n\r\n property Color: TColor read FColor write SetColor;\r\n property Font: TFont read FFont write SetFont;\r\n property ClientOrigin: TPoint read GetClientOrigin;\r\n property OrigRect: TRect read FOrigRect;\r\n\r\n property OnClick: TNotifyEvent read FOnClick write FOnClick;\r\n property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;\r\n property ControlStyle: TControlStyle read FControlStyle write FControlStyle;\r\n procedure HookElement;\r\n procedure CreateWithID(AID: string); virtual;\r\n procedure AddInstanceStyle(const css: string); virtual;\r\n procedure AddControlStyle(const css: string); virtual;\r\n procedure AddControlLink(const linkid, link: string); virtual;\r\n procedure AddControlScript(const link: string); virtual;\r\n procedure UpdateAnchoring; virtual;\r\n procedure UpdateChildAnchoring; virtual;\r\n function GetWebClassName: string; virtual;\r\n function GetCSSManager: TCSSCodeManager; virtual;\r\n function IsUpdating: boolean;\r\n function CanShowFocus: boolean; virtual;\r\n procedure InjectCSS; virtual;\r\n property LinkTouchEvents: Boolean read FLinkTouchEvents write FLinkTouchEvents;\r\n property OnTouchStart: TTouchEvent read FOnTouchStart write FOnTouchStart;\r\n property OnTouchMove: TTouchEvent read FOnTouchMove write FOnTouchMove;\r\n property OnTouchEnd: TTouchEvent read FOnTouchEnd write FOnTouchEnd;\r\n property ShowFocus: boolean read FShowFocus write SetShowFocus;\r\n property BorderWidth: integer read FBorderWidth write SetBorderWidth;\r\n public\r\n constructor Create(ID: string); virtual; overload;\r\n constructor Create(AOwner: TComponent); overload; override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure DragDrop(Source: TObject; X, Y: Integer); virtual;\r\n procedure Resize; virtual;\r\n procedure Capture;\r\n procedure ReleaseCapture;\r\n procedure BringToFront;\r\n procedure SendToBack;\r\n procedure PreventDefault;\r\n procedure StopPropagation;\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n procedure Invalidate; virtual;\r\n procedure SetParentComponent(Value: TComponent); override;\r\n function Captured: Boolean; virtual;\r\n function MakeScreenshot: TBitmap; virtual;\r\n function ClientToScreen(const Point: TPoint): TPoint; virtual;\r\n function ScreenToClient(const Point: TPoint): TPoint; virtual;\r\n function CanFocus: Boolean; virtual;\r\n property Controls[Index: Integer]: TControl read GetControls;\r\n property ControlCount: Integer read GetControlsCount;\r\n property Parent: TControl read FParent write SetParent;\r\n property BoundsRect: TRect read GetBoundsRect write SetBoundsRect;\r\n property ControlPosition: TControlPosition read FControlPosition write SetControlPosition;\r\n property DoubleBuffered: Boolean read FDoubleBuffered write FDoubleBuffered;\r\n property ParentDoubleBuffered: Boolean read FParentDoubleBuffered write FParentDoubleBuffered;\r\n property ParentColor: boolean read FParentColor write FParentColor;\r\n property ParentFont: boolean read FParentFont write FParentFont;\r\n property Align: TAlign read FAlign write SetAlign;\r\n property AlignWithMargins: boolean read FAlignWithMargins write SetAlignWithMargins;\r\n property ElementHandle: TJSHTMLElement read GetElementHandle;\r\n property ElementClassName: string read FElementClassName write SetElementClassName;\r\n property ElementID: string read GetID write SetID;\r\n property Margins: TMargins read FMargins write SetMargins;\r\n property ClientRect: TRect read GetClientRect;\r\n property EnablePropagation: Boolean read FEnablePropagation write FEnablePropagation default False;\r\n\r\n property Anchors: TAnchors read FAnchors write SetAnchors;\r\n property Cursor: TCursor read FCursor write SetCursor;\r\n property Enabled: Boolean read FEnabled write SetEnabled;\r\n property HeightStyle: TSizeStyle read FHeightStyle write SetHeightStyle;\r\n property Height: Integer read GetHeight write SetHeight;\r\n property HeightPercent: TPercentSize read FHeightPercent write SetHeightPercent;\r\n property Hint: string read FHint write SetHint;\r\n property IsLinked: boolean read GetIsLinked;\r\n property ShowHint: Boolean read FShowHint write SetShowHint;\r\n property ParentShowHint: Boolean read FParentShowHint write FParentShowHint;\r\n property TabOrder: Integer read FTabOrder write SetTabOrder;\r\n property TabStop: Boolean read FTabStop write SetTabStop;\r\n property Tag: Integer read FTag write FTag;\r\n property Visible: Boolean read FVisible write SetVisible;\r\n property WidthStyle: TSizeStyle read FWidthStyle write SetWidthStyle;\r\n property Width: Integer read GetWidth write SetWidth;\r\n property WidthPercent: TPercentSize read FWidthPercent write SetWidthPercent;\r\n\r\n property OnDragOver: TDragOverEvent read FOnDragOver write FOnDragOver;\r\n property OnDragDrop: TDragDropEvent read FOnDragDrop write FOnDragDrop;\r\n property OnStartDrag: TStartDragEvent read FOnStartDrag write FOnStartDrag;\r\n property OnEndDrag: TEndDragEvent read FOnEndDrag write FOnEndDrag;\r\n\r\n property OnMouseWheel: TMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;\r\n property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;\r\n property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;\r\n property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;\r\n property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;\r\n property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;\r\n property OnKeyUp: TKeyEvent read FOnKeyUp write FOnKeyUp;\r\n property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;\r\n property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;\r\n property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;\r\n property OnExit: TNotifyEvent read FOnExit write FOnExit;\r\n end;\r\n\r\n TWinControl = class(TControl)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Cursor;\r\n property ElementClassName;\r\n property Enabled;\r\n property Height;\r\n property HeightStyle;\r\n property Hint;\r\n property Left;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Tag;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WidthStyle;\r\n\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnMouseMove;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnKeyUp;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnEnter;\r\n property OnExit;\r\n end;\r\n\r\n TCustomControl = class(TWinControl)\r\n private\r\n FPixelRatio: Single;\r\n FPainting: boolean;\r\n FCanvas: TCanvas;\r\n FElementCanvas: TJSHTMLCanvasElement;\r\n FBorderStyle: TBorderStyle;\r\n FBorderColor: TColor;\r\n FCustomBorder: boolean;\r\n function GetCanvas: TCanvas;\r\n protected\r\n function GetPixelRatio: Single;\r\n procedure BlockDocumentTouch(Event: TJSTouchEvent);\r\n procedure RecreateCanvas; override;\r\n procedure SetBorderStyle(AValue: TBorderStyle); virtual;\r\n procedure SetBorderColor(AValue: TColor); virtual;\r\n procedure CreateControl; override;\r\n procedure Loaded; override;\r\n procedure UpdateElementVisual; override;\r\n function CreateElement: TJSElement; override;\r\n function GetCanvasHeightOffset: Integer; virtual;\r\n function GetCanvasWidthOffset: Integer; virtual;\r\n property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;\r\n property BorderColor: TColor read FBorderColor write SetBorderColor default clSilver;\r\n procedure BindEvents; override;\r\n procedure Paint; virtual;\r\n property CustomBorder: boolean read FCustomBorder write FCustomBorder;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n function MakeScreenShot: TBitmap; override;\r\n procedure Resize; override;\r\n property Canvas: TCanvas read GetCanvas;\r\n property ElementCanvas: TJSHTMLCanvasElement read FElementCanvas;\r\n procedure Invalidate; override;\r\n end;\r\n\r\n TjQueryCustomControl = class(TWinControl)\r\n private\r\n FIsInitialized: boolean;\r\n procedure InitJQueryOnce;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure Loaded; override;\r\n procedure SetParent(AValue: TControl); override;\r\n function GetJQID: string;\r\n procedure InitJQuery; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Visible;\r\n end;\r\n\r\n TGraphicControl = class(TCustomControl);\r\n\r\n TScrollingGraphicControl = class(TCustomControl)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n public\r\n procedure UpdateElement; override;\r\n end;\r\n\r\n TControlManager = class(TComponent)\r\n private\r\n FInstanceCount: integer;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n function GetInstanceNumber: integer;\r\n procedure Reset;\r\n end;\r\n\r\n TCSSCodeFragment = class(TCollectionItem)\r\n private\r\n FControlClassname: string;\r\n FCSS: TStringList;\r\n procedure SetCSS(const Value: TStringList);\r\n public\r\n constructor Create(Collection: TCollection); override;\r\n destructor Destroy; override;\r\n published\r\n property ControlClassname: string read FControlClassname write FControlClassname;\r\n property CSS: TStringList read FCSS write SetCSS;\r\n end;\r\n\r\n TCSSCodeFragments = class(TOwnedCollection)\r\n private\r\n function GetItemEx(Index: integer): TCSSCodeFragment;\r\n procedure SetItemEx(Index: integer; const Value: TCSSCodeFragment);\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TCSSCodeFragment; reintroduce;\r\n function Insert(Index: integer): TCSSCodeFragment; reintroduce;\r\n property Items[Index: integer]: TCSSCodeFragment read GetItemEx write SetItemEx;\r\n end;\r\n\r\n TCSSCodeManager = class(TComponent)\r\n private\r\n FCSSFragments: TCSSCodeFragments;\r\n procedure SetCSSFragments(const Value: TCSSCodeFragments);\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetClassFragment(AClassname: string): TCSSCodeFragment;\r\n function GetClassCSS(AClassname: string): string;\r\n published\r\n property CSSFragments: TCSSCodeFragments read FCSSFragments write SetCSSFragments;\r\n end;\r\n\r\nfunction FindGlobalComponent(const Name: string): TComponent;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Forms, WEBLib.StdCtrls;\r\n\r\nvar\r\n ControlManager: TControlManager;\r\n\r\nfunction FindGlobalComponent(const Name: string): TComponent;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nfunction FindUniqueName(const Name: string): string;\r\nbegin\r\n Result := Name + IntToStr(ControlManager.GetInstanceNumber);\r\nend;\r\n\r\n{ TMargins }\r\n\r\nprocedure TMargins.SetLeft(const Value: integer);\r\nbegin\r\n if (Value <> FLeft) then\r\n begin\r\n FLeft := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.SetTop(const Value: integer);\r\nbegin\r\n if (Value <> FTop) then\r\n begin\r\n FTop := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.SetRight(const Value: integer);\r\nbegin\r\n if (Value <> FRight) then\r\n begin\r\n FRight := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.SetBottom(const Value: integer);\r\nbegin\r\n if (Value <> FBottom) then\r\n begin\r\n FBottom := Value;\r\n DoChange;\r\n end;\r\nend;\r\n\r\nprocedure TMargins.DoChange; \r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n\r\n{ TControl }\r\n\r\nfunction TControl.MakeScreenshot: TBitmap;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nprocedure TControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X,\r\n Y: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.MouseMove(Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X,\r\n Y: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.MouseWheel(Shift: TShiftState; WheelDelta: Integer;\r\n var Handled: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.DoMouseLeave;\r\nbegin\r\nend;\r\n\r\nprocedure TControl.DoMouseEnter;\r\nbegin\r\nend;\r\n\r\nprocedure TControl.AlignControls(AControl: TControl; var Rect: TRect);\r\nvar\r\n j: Integer;\r\n\r\n procedure DoPosition(Control: TControl; AAlign: TAlign);\r\n var\r\n dl, dt, dr, db: integer;\r\n begin\r\n Control.FUpdateTopLeft := true;\r\n\r\n if Control.AlignWithMargins then\r\n begin\r\n dl := Control.Margins.Left;\r\n dt := Control.Margins.Top;\r\n db := Control.Margins.Bottom;\r\n dr := Control.Margins.Right;\r\n end\r\n else\r\n begin\r\n dl := 0;\r\n dt := 0;\r\n db := 0;\r\n dr := 0;\r\n end;\r\n\r\n case AAlign of\r\n alTop:\r\n begin\r\n Control.Width := Rect.Right - Rect.Left - dl - dr;\r\n Control.Top := Rect.Top + dt;\r\n Control.Left := Rect.Left + dl;\r\n Rect.Top := Rect.Top + Control.Height + dt + db;\r\n end;\r\n alBottom:\r\n begin\r\n Control.Width := Rect.Right - Rect.Left - dl - dr - 1;\r\n Control.Top := Rect.Bottom - Control.Height - db - 1;\r\n Control.Left := Rect.Left + dl;\r\n Rect.Bottom := Rect.Bottom - Control.Height - dt - db;\r\n end;\r\n alLeft:\r\n begin\r\n Control.Height := Rect.Bottom - Rect.Top - dt - db;\r\n Control.Left := Rect.Left + dl;\r\n Control.Top := Rect.Top + dt;\r\n Rect.Left := Rect.Left + Control.Width + dl + dr;\r\n end;\r\n alRight:\r\n begin\r\n Control.Height := Rect.Bottom - Rect.Top - db - dt - 1;\r\n Control.Left := Rect.Right - Control.Width - dr - 2;\r\n Control.Top := Rect.Top + dt;\r\n Rect.Right := Rect.Right - Control.Width - dr - dl;\r\n end;\r\n alClient:\r\n begin\r\n Control.Top := Rect.Top + dt;\r\n Control.Left := Rect.Left + dl;\r\n Control.Width := Rect.Right - Rect.Left - dl - dr;\r\n Control.Height := Rect.Bottom - Rect.Top - db - dt;\r\n Rect.Left := 0;\r\n Rect.Top := 0;\r\n Rect.Right := 0;\r\n Rect.Bottom := 0;\r\n end;\r\n end;\r\n Control.FUpdateTopLeft := false;\r\n end;\r\n\r\n procedure DoAlign(AAlign: TAlign);\r\n var\r\n i,j,ins: Integer;\r\n il: TList;\r\n begin\r\n il := TList.Create;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if (Controls[i].Align = AAlign) and (Controls[i].Visible) then\r\n begin\r\n ins := il.Count;\r\n\r\n for j := il.Count - 1 downto 0 do\r\n begin\r\n case AAlign of\r\n alTop:\r\n if Controls[i].FOrigTop < TControl(il.Items[j]).FOrigTop then\r\n ins := j;\r\n alLeft:\r\n if Controls[i].FOrigLeft < TControl(il.Items[j]).FOrigLeft then\r\n ins := j;\r\n alRight:\r\n if Controls[i].FOrigLeft + Controls[i].Width > TControl(il.Items[j]).FOrigLeft + TControl(il.Items[j]).Width then\r\n ins := j;\r\n alBottom:\r\n if Controls[i].FOrigTop + Controls[i].Height > TControl(il.Items[j]).FOrigTop + TControl(il.Items[j]).Height then\r\n ins := j;\r\n end;\r\n end;\r\n il.Insert(ins, Controls[i]);\r\n end;\r\n end;\r\n\r\n for i := 0 to il.Count - 1 do\r\n begin\r\n DoPosition(TControl(il.Items[i]), AAlign);\r\n end;\r\n\r\n il.Free;\r\n end;\r\n\r\nbegin\r\n DoAlign(alTop);\r\n DoAlign(alBottom);\r\n DoAlign(alLeft);\r\n DoAlign(alRight);\r\n DoAlign(alClient);\r\n DoAlign(alCustom);\r\n\r\n for j := 0 to ControlCount - 1 do\r\n begin\r\n Controls[j].AlignControl(Controls[j]);\r\n end;\r\nend;\r\n\r\nconstructor TControl.Create(ID: string);\r\nbegin\r\n CreateWithID(ID);\r\nend;\r\n\r\nprocedure TControl.HookElement;\r\nvar\r\n el: TJSElement;\r\n i: integer;\r\nbegin\r\n el := document.getElementByID(FID);\r\n Container := el;\r\n BindElement;\r\n BindEvents;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].HookElement;\r\nend;\r\n\r\nfunction TControl.CanFocus: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TControl.CanShowFocus: boolean;\r\nbegin\r\n Result := FShowFocus;\r\nend;\r\n\r\nprocedure TControl.Capture;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n if Captured then\r\n ReleaseCapture;\r\n\r\n FMouseInsideLayer := true;\r\n\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.addEventListener('mouseenter',@LayerHandleDoMouseEnter);\r\n eh.addEventListener('mouseleave',@LayerHandleDoMouseLeave);\r\n eh.addEventListener('mousedown',@HandleDoMouseDown);\r\n eh.addEventListener('mouseup',@HandleDoMouseUp);\r\n eh.addEventListener('mousemove',@HandleDoMouseMove);\r\n\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\n\r\n FCaptured := True;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TControl.Captured: Boolean;\r\nbegin\r\n Result := FCaptured and Assigned(FLayer);\r\nend;\r\n\r\nprocedure TControl.ClearControls;\r\nbegin\r\n SetLength(FControls, 0);\r\nend;\r\n\r\nprocedure TControl.Click;\r\nbegin\r\n if Assigned(OnClick) then\r\n OnClick(Self);\r\nend;\r\n\r\nfunction TControl.ClientToScreen(const Point: TPoint): TPoint;\r\nvar\r\n Origin: TPoint;\r\nbegin\r\n Origin := ClientOrigin;\r\n Result.X := Point.X + Origin.X;\r\n Result.Y := Point.Y + Origin.Y;\r\nend;\r\n\r\nfunction TControl.ContainerElement: TJSElement;\r\nbegin\r\n Result := document.body;\r\nend;\r\n\r\nconstructor TControl.Create(AOwner: TComponent);\r\nvar\r\n s,prefix: String;\r\n frm: TCustomForm;\r\n\r\nbegin\r\n inherited Create(AOwner);\r\n s := ClassName;\r\n Delete(s, 1, 1);\r\n\r\n prefix := '';\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) then\r\n prefix := frm.ClassName;\r\n\r\n CreateWithID(prefix+'_'+FindUniqueName(s));\r\nend;\r\n\r\nprocedure TControl.CreateControl;\r\nbegin\r\n if not Assigned(FElement) then\r\n begin\r\n FElement := CreateElement;\r\n if Assigned(FElement) then\r\n begin\r\n FControlCreated := True;\r\n Container := FElement;\r\n Container['id'] := ElementID;\r\n Container['zindex'] := '0';\r\n BindEvents;\r\n UpdateElement;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.CreateElement: TJSElement;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nprocedure TControl.CreateInitialize;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.CreateWithID(AID: string);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n FUpdateCount := 0;\r\n\r\n FControlCreated := False;\r\n FLinkTouchEvents := True;\r\n FIsResizing := false;\r\n\r\n if (Assigned(Owner) and (csLoading in Owner.ComponentState)) or not Assigned(Owner) then\r\n Loading;\r\n\r\n FControlPosition := cpAbsolute;\r\n FWidthStyle := ssAbsolute;\r\n FHeightStyle := ssAbsolute;\r\n\r\n el := document.getElementByID(AID);\r\n\r\n if not Assigned(el) then\r\n begin\r\n Container := nil;\r\n FNew := True;\r\n end\r\n else\r\n begin\r\n Container := el;\r\n FNew := False;\r\n FControlCreated := true;\r\n FControlPosition := cpRelative;\r\n BindElement;\r\n BindEvents;\r\n end;\r\n\r\n FID := AID;\r\n FFont := TFont.Create;\r\n FFont.OnChange := HandleFontChanged;\r\n FEnabled := True;\r\n FVisible := True;\r\n FLeft := 0;\r\n FTop := 0;\r\n FTabStop := true;\r\n FAlign := alNone;\r\n FAlignWithMargins := false;\r\n FIsAligning := false;\r\n ParentFont := true;\r\n FAnchors := [akLeft, akTop];\r\n FOrigRect := Rect(-1,-1,-1,-1);\r\n FShowFocus := false;\r\n FBorderWidth := 0;\r\n FEnablePropagation := False;\r\n\r\n FColor := clWhite;\r\n\r\n FMargins := TMargins.Create;\r\n FMargins.OnChange := DoMarginsChanged;\r\n\r\n FParent := nil;\r\n FPrevParent := nil;\r\n\r\n ClearControls;\r\n CreateInitialize;\r\nend;\r\n\r\nprocedure TControl.BindElement;\r\nbegin\r\nend;\r\n\r\nprocedure TControl.AddControlLink(const linkid, link: string);\r\nbegin\r\n asm\r\n function writeLinkOnce(linkName, linkText) {\r\n var linkElement = document.getElementById(linkName);\r\n if (linkElement)\r\n return;\r\n linkElement = document.createElement('link');\r\n linkElement.id = linkName;\r\n linkElement.setAttribute('rel', 'stylesheet');\r\n linkElement.setAttribute('type', 'text/css');\r\n linkElement.setAttribute('href', linkText);\r\n document.getElementsByTagName('head')[0].appendChild(linkElement);\r\n }\r\n writeLinkOnce(linkid,link);\r\n end;\r\n\r\nend;\r\n\r\n\r\n{$HINTS OFF}\r\nprocedure TControl.AddControlScript(const link: string);\r\nvar\r\n id: string;\r\nbegin\r\n id := ClassName;\r\n\r\n asm\r\n if(!document.getElementById(id)) {\r\n var script = document.createElement('script');\r\n script.id = id;\r\n script.src = link;\r\n script.type = 'text/javascript';\r\n document.head.appendChild(script);\r\n }\r\n end;\r\nend;\r\n\r\nprocedure TControl.AddControlStyle(const css: string);\r\nvar\r\n cssname: string;\r\nbegin\r\n cssname := ClassName;\r\n\r\n asm\r\n function writeStylesOnce(styleName, cssText) {\r\n var styleElement = document.getElementById(styleName);\r\n if (styleElement)\r\n return;\r\n styleElement = document.createElement('style');\r\n styleElement.type = 'text/css';\r\n styleElement.id = styleName;\r\n styleElement.innerHTML = cssText;\r\n document.getElementsByTagName('head')[0].appendChild(styleElement);\r\n }\r\n writeStylesOnce(cssname,css);\r\n end;\r\nend;\r\n\r\nprocedure TControl.AddInstanceStyle(const css: string);\r\nvar\r\n cssname: string;\r\nbegin\r\n cssname := Name;\r\n\r\n asm\r\n function writeStylesOnce(styleName, cssText) {\r\n var styleElement = document.getElementById(styleName);\r\n if (styleElement) {\r\n styleElement.innerHTML = cssText;\r\n return;\r\n }\r\n styleElement = document.createElement('style');\r\n styleElement.type = 'text/css';\r\n styleElement.id = styleName;\r\n styleElement.innerHTML = cssText;\r\n document.getElementsByTagName('head')[0].appendChild(styleElement);\r\n }\r\n writeStylesOnce(cssname,css);\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\n\r\nprocedure TControl.AlignControl(AControl: TControl);\r\nvar\r\n r: TRect;\r\n cr: TJSDOMRect;\r\n ovf, ovfx, ovfy: string;\r\n eh: TJSHTMLElement;\r\n el: TJSElement;\r\n frm: TCustomForm;\r\n ctop: integer;\r\nbegin\r\n if FIsAligning then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) and frm.IsUpdating then\r\n Exit;\r\n\r\n ctop := 0;\r\n\r\n if Assigned(frm) and (frm.FormContainer <> '') and (AControl is TCustomForm) then\r\n begin\r\n el := document.getElementById(frm.FormContainer);\r\n if Assigned(el) then\r\n begin\r\n cr := el.getBoundingClientRect;\r\n ctop := Round(cr.Top);\r\n end;\r\n end;\r\n\r\n FIsAligning := true;\r\n\r\n if not Assigned(AControl) then\r\n Exit;\r\n\r\n eh := AControl.ElementHandle;\r\n\r\n if Assigned(eh) then\r\n begin\r\n ovf := eh.style.getPropertyValue('overflow');\r\n ovfx := eh.style.getPropertyValue('overflow-x');\r\n ovfy := eh.style.getPropertyValue('overflow-y');\r\n eh.style.setProperty('overflow', 'hidden');\r\n end;\r\n\r\n r := GetClientRect;\r\n\r\n if r.Bottom + ctop > window.innerHeight then\r\n r.Bottom := window.innerHeight - ctop;\r\n\r\n AlignControls(AControl, r);\r\n\r\n if Assigned(eh) then\r\n begin\r\n eh.style.setProperty('overflow', ovf);\r\n eh.style.setProperty('overflow-x', ovfx);\r\n eh.style.setProperty('overflow-y', ovfy);\r\n end;\r\n\r\n FIsAligning := false;\r\nend;\r\n\r\nprocedure TControl.DblClick;\r\nbegin\r\n if Assigned(OnDblClick) then\r\n OnDblClick(Self);\r\nend;\r\n\r\ndestructor TControl.Destroy;\r\nvar\r\n i: integer;\r\n ctrl: TControl;\r\nbegin\r\n UnbindEvents;\r\n\r\n for i := ControlCount - 1 downto 0 do\r\n begin\r\n ctrl := Controls[i];\r\n ctrl.Free;\r\n end;\r\n\r\n if Assigned(Container) and Assigned(Parent) and Assigned(Parent.Container) then\r\n begin\r\n Parent.Container.removeChild(Container);\r\n Container := nil;\r\n FControlCreated := False;\r\n end;\r\n FMargins.Free;\r\n FFont.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TControl.DisableTab;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].DisableTab;\r\n end;\r\nend;\r\n\r\nprocedure TControl.DisposeOf;\r\nvar\r\n t: TControl;\r\nbegin\r\n t := Self;\r\n t.Free;\r\nend;\r\n\r\nprocedure TControl.Assign(Source: TPersistent);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TControl.GetElement: TJSElement;\r\nbegin\r\n Result := document.getElementByID(GetID);\r\nend;\r\n\r\nfunction TControl.GetElementBindHandle: TJSEventTarget;\r\nbegin\r\n Result := TJSEventTarget(GetElementHandle);\r\nend;\r\n\r\nfunction TControl.GetElementEvent: TJSEvent;\r\nbegin\r\n Result := FElementEvent;\r\nend;\r\n\r\nprocedure TControl.SetEnabled(Value: Boolean);\r\nbegin\r\n if (FEnabled <> Value) then\r\n begin\r\n FEnabled := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetVisible(AValue: Boolean);\r\nbegin\r\n if (FVisible <> AValue) then\r\n begin\r\n VisibleChanging;\r\n FVisible := AValue;\r\n UpdateElement;\r\n DoRealign;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetWidth(AValue: Integer);\r\nbegin\r\n if (FWidth <> AValue) then\r\n begin\r\n FWidth := AValue;\r\n DoBoundsChange;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetWidthPercent(const Value: TPercentSize);\r\nbegin\r\n if (FWidthPercent <> Value) then\r\n begin\r\n FWidthPercent := Value;\r\n UpdateElementSize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetWidthStyle(const Value: TSizeStyle);\r\nbegin\r\n if (FWidthStyle <> Value) then\r\n begin\r\n FWidthStyle := Value;\r\n UpdateElementSize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.StopPropagation;\r\nbegin\r\n if Assigned(ElementEvent) and not EnablePropagation then\r\n ElementEvent.stopPropagation;\r\nend;\r\n\r\nprocedure TControl.TouchEnd(X, Y: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.TouchMove(X, Y: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.TouchStart(X, Y: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.SetHeight(AValue: Integer);\r\nvar\r\n dr: TJSDOMRect;\r\nbegin\r\n if FHeight <> AValue then\r\n begin\r\n if (Align in [alLeft, alRight, alClient]) and Assigned(ElementHandle) then\r\n begin\r\n dr := ElementHandle.getBoundingClientRect;\r\n if dr.top + AValue >= window.innerHeight then\r\n begin\r\n AValue := Round(window.innerHeight - dr.top);\r\n\r\n if AlignWithMargins then\r\n AValue := AValue - Margins.Bottom - Margins.Top;\r\n end;\r\n end;\r\n\r\n FHeight := AValue;\r\n\r\n DoBoundsChange;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetHeightPercent(const Value: TPercentSize);\r\nbegin\r\n if (FHeightPercent <> Value) then\r\n begin\r\n FHeightPercent := Value;\r\n UpdateElementSize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetHeightStyle(const Value: TSizeStyle);\r\nbegin\r\n if (FHeightStyle <> Value) then\r\n begin\r\n FHeightStyle := Value;\r\n UpdateElementSize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetControlPosition(AValue: TControlPosition);\r\nbegin\r\n if FControlPosition <> AValue then\r\n begin\r\n FControlPosition := AValue;\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n InternalResize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetLeft(AValue: Integer);\r\nbegin\r\n if FLeft <> AValue then\r\n begin\r\n FLeft := AValue;\r\n if not FUpdateTopLeft then\r\n FOrigLeft := AValue;\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n InternalResize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetMargins(const Value: TMargins);\r\nbegin\r\n FMargins.Assign(Value);\r\nend;\r\n\r\nprocedure TControl.SetTop(AValue: Integer);\r\nbegin\r\n if FTop <> AValue then\r\n begin\r\n FTop := AValue;\r\n if not FUpdateTopLeft then\r\n FOrigTop := AValue;\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n InternalResize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetShowFocus(const Value: boolean);\r\nbegin\r\n if (FShowFocus <> Value) then\r\n begin\r\n FShowFocus := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetShowHint(AValue: Boolean);\r\nbegin\r\n if FShowHint <> AValue then\r\n begin\r\n FShowHint := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetHint(AValue: string);\r\nbegin\r\n if FHint <> AValue then\r\n begin\r\n FHint := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetID(const Value: string);\r\nbegin\r\n FID := Value;\r\n if Assigned(FContainer) then\r\n FContainer['id'] := Value;\r\nend;\r\n\r\nprocedure TControl.SetTabOrder(AValue: Integer);\r\nbegin\r\n if FTabOrder <> AValue then\r\n begin\r\n FTabOrder := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetTabStop(AValue: Boolean);\r\nbegin\r\n if FTabStop <> AValue then\r\n begin\r\n FTabStop := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nfunction TControl.ScreenToClient(const Point: TPoint): TPoint;\r\nvar\r\n Origin: TPoint;\r\nbegin\r\n Origin := ClientOrigin;\r\n Result.X := Point.X - Origin.X;\r\n Result.Y := Point.Y - Origin.Y;\r\nend;\r\n\r\nprocedure TControl.SendToBack;\r\nbegin\r\n// if Assigned(ElementHandle) then\r\n// ElementHandle.style.setProperty('z-index', '-1');\r\nend;\r\n\r\nprocedure TControl.BeginUpdate;\r\nbegin\r\n inc(FUpdateCount);\r\nend;\r\n\r\nprocedure TControl.Invalidate;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.EndUpdate;\r\nbegin\r\n if (FUpdateCount > 0) then\r\n begin\r\n dec(FUpdateCount);\r\n\r\n if FUpdateCount = 0 then\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nfunction TControl.IsUpdating: boolean;\r\nbegin\r\n Result := FUpdateCount > 0;\r\nend;\r\n\r\nprocedure TControl.SetAlign(const Value: TAlign);\r\nbegin\r\n if FAlign <> Value then\r\n begin\r\n FAlign := Value;\r\n DoRealign; \r\n end;\r\nend;\r\n\r\nprocedure TControl.SetAlignWithMargins(const Value: boolean);\r\nbegin\r\n if FAlignWithMargins <> Value then\r\n begin\r\n FAlignWithMargins := Value;\r\n DoRealign;\r\n end;\r\nend;\r\n\r\nprocedure TControl.DoMarginsChanged(Sender: TObject);\r\nbegin\r\n DoRealign;\r\nend;\r\n\r\nprocedure TControl.DoRealign;\r\nbegin\r\n if Assigned(Parent) and not Parent.IsUpdating then\r\n begin\r\n Parent.AlignControl(Parent);\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetAnchors(const Value: TAnchors);\r\nbegin\r\n if (FAnchors <> Value) then\r\n begin\r\n FAnchors := Value;\r\n UpdateAnchoring;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBorderWidth(const Value: integer);\r\nbegin\r\n if (FBorderWidth <> Value) then\r\n begin\r\n FBorderWidth := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBounds(X, Y, AWidth, AHeight: Integer);\r\nbegin\r\n if (X <> Left) or (Y <> Top) or (AWidth <> Width) or (AHeight <> Height) then\r\n begin\r\n FBlockUpdateElement := True;\r\n Left := X;\r\n Top := Y;\r\n Width := AWidth;\r\n Height := AHeight;\r\n Realign;\r\n FBlockUpdateElement := False;\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n InternalResize;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetBoundsRect(const Value: TRect);\r\nbegin\r\n SetBounds(Value.Left, Value.Top, Value.Right - Value.Left, Value.Bottom - Value.Top);\r\nend;\r\n\r\nprocedure TControl.SetElementClassName(AValue: string);\r\nbegin\r\n FElementClassName := AValue;\r\n if Assigned(FContainer) then\r\n FContainer['class'] := AValue;\r\nend;\r\n\r\nprocedure TControl.SetElementFont(he: TJSHTMLElement; Font: TFont);\r\nvar\r\n s: string;\r\nbegin\r\n he.style.setProperty('font-family', Font.Name);\r\n\r\n he.style.setProperty('font-style', 'normal');\r\n\r\n if fsBold in Font.Style then\r\n he.style.setProperty('font-weight', 'bold')\r\n else\r\n he.style.setProperty('font-weight', '');\r\n\r\n if fsItalic in Font.Style then\r\n he.style.setProperty('font-style', 'italic');\r\n\r\n s := '';\r\n\r\n if fsUnderline in Font.Style then\r\n s := 'underline';\r\n\r\n if fsStrikeOut in Font.Style then\r\n begin\r\n if s <> '' then\r\n s := s + ' ';\r\n s:= s + 'line-through';\r\n end;\r\n\r\n if (s <> '') then\r\n he.style.setProperty('text-decoration', s);\r\n\r\n he.style.setProperty('font-size', IntToStr(Font.Size) + 'pt');\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TControl.SetFocus;\r\nvar\r\n e: TJSHTMLElement;\r\nbegin\r\n if Assigned(ElementHandle) then\r\n begin\r\n e := ElementHandle;\r\n asm\r\n setTimeout(function() {e.focus();}, 1);\r\n end;\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TControl.SetFont(AValue: TFont);\r\nbegin\r\n FFont.Name := AValue.Name;\r\n FFont.Size := AValue.Size;\r\n FFont.Style := AValue.Style;\r\n FFont.Color := AValue.Color;\r\nend;\r\n\r\nprocedure TControl.SetColor(AValue: TColor);\r\nbegin\r\n FColor := AValue;\r\n UpdateElement;\r\nend;\r\n\r\nprocedure TControl.SetCursor(const Value: TCursor);\r\nbegin\r\n FCursor := Value;\r\n UpdateElement;\r\nend;\r\n\r\nfunction TControl.GetID: string;\r\nbegin\r\n Result := FID;\r\nend;\r\n\r\nfunction TControl.GetIsLinked: boolean;\r\nbegin\r\n Result := not FNew;\r\nend;\r\n\r\nfunction TControl.GetElementHandle: TJSHTMLElement;\r\nbegin\r\n Result := nil;\r\n if Assigned(FContainer) and FControlCreated then\r\n Result := TJSHTMLElement(FContainer);\r\nend;\r\n\r\nfunction TControl.GetMouseEventButton(Event: TJSMouseEvent): TMouseButton;\r\nbegin\r\n Result := mbLeft;\r\n case Event.button of\r\n 0: Result := mbLeft;\r\n 1: Result := mbMiddle;\r\n 2: Result := mbRight;\r\n end;\r\nend;\r\n\r\nfunction TControl.GetMouseEventShiftState(Event: TJSMouseEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\nend;\r\n\r\nfunction TControl.GetMouseWheelEventShiftState(\r\n Event: TJSWheelEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\nend;\r\n\r\nfunction TControl.GetOuterHeight: integer;\r\nbegin\r\n Result := FHeight - FBorderWidth;\r\nend;\r\n\r\nfunction TControl.GetOuterWidth: integer;\r\nbegin\r\n Result := FWidth - FBorderWidth;\r\nend;\r\n\r\nfunction TControl.GetKeyboardEventShiftState(Event: TJSKeyboardEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\nend;\r\n\r\nprocedure TControl.BindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n eh := ElementBindHandle;\r\n\r\n eh.addEventListener('wheel',@HandleDoWheel);\r\n eh.addEventListener('click',@HandleDoClick);\r\n eh.addEventListener('dblclick',@HandleDoDblClick);\r\n eh.addEventListener('mousedown',@HandleDoMouseDown);\r\n eh.addEventListener('mouseup',@HandleDoMouseUp);\r\n eh.addEventListener('mousemove',@HandleDoMouseMove);\r\n eh.addEventListener('mouseleave',@HandleDoMouseLeave);\r\n eh.addEventListener('mouseenter',@HandleDoMouseEnter);\r\n eh.addEventListener('keydown',@HandleDoKeyDown);\r\n eh.addEventListener('keyup',@HandleDoKeyUp);\r\n eh.addEventListener('keypress',@HandleDoKeyPress);\r\n eh.addEventListener('focus',@HandleDoEnter);\r\n eh.addEventListener('blur',@HandleDoExit);\r\n\r\n eh.addEventListener('touchstart', @HandleDoTouchStart);\r\n eh.addEventListener('touchmove', @HandleDoTouchMove);\r\n eh.addEventListener('touchend', @HandleDoTouchEnd);\r\n end;\r\nend;\r\n\r\nprocedure TControl.BringToFront;\r\nbegin\r\n// if Assigned(ElementHandle) then\r\n// ElementHandle.style.setProperty('z-index', '999999');\r\nend;\r\n\r\nfunction TControl.GetClientOrigin: TPoint;\r\nvar\r\n r: TJSDomRect;\r\nbegin\r\n Result := Point(0, 0);\r\n if Assigned(ElementHandle) then\r\n begin\r\n r := ElementHandle.getBoundingClientRect;\r\n Result := Point(Round(r.Left), Round(r.Top));\r\n end;\r\nend;\r\n\r\nfunction TControl.GetClientRect: TRect;\r\nbegin\r\n Result := Rect(0, 0, GetWidth, GetHeight);\r\nend;\r\n\r\nfunction TControl.GetKeyCode(AValue: string): Integer;\r\nvar\r\n i: Integer;\r\nbegin\r\n i := -1;\r\n\r\n case AValue of\r\n 'Up': i := 38;\r\n 'Down': i := 40;\r\n 'Left': i := 37;\r\n 'Right': i := 39;\r\n TJSKeyNames.BackSpace: i := 8;\r\n TJSKeyNames.Tab: i := 9;\r\n TJSKeyNames.Enter: i := 13;\r\n TJSKeyNames.Shift: i := 16;\r\n TJSKeyNames.Control: i := 17;\r\n TJSKeyNames.Alt: i := 18;\r\n TJSKeyNames.Pause: i := 19;\r\n TJSKeyNames.CapsLock: i := 20;\r\n TJSKeyNames.Escape: i := 27;\r\n TJSKeyNames.PageUp: i := 33;\r\n TJSKeyNames.PageDown: i := 34;\r\n TJSKeyNames._End: i := 35;\r\n TJSKeyNames.Home: i := 36;\r\n TJSKeyNames.ArrowLeft: i := 37;\r\n TJSKeyNames.ArrowUp: i := 38;\r\n TJSKeyNames.ArrowRight: i := 39;\r\n TJSKeyNames.ArrowDown: i := 40;\r\n TJSKeyNames.Insert: i := 45;\r\n TJSKeyNames.Delete: i := 46;\r\n\r\n TJSKeyNames.F1: i := 112;\r\n TJSKeyNames.F2: i := 113;\r\n TJSKeyNames.F3: i := 114;\r\n TJSKeyNames.F4: i := 115;\r\n TJSKeyNames.F5: i := 116;\r\n TJSKeyNames.F6: i := 117;\r\n TJSKeyNames.F7: i := 118;\r\n TJSKeyNames.F8: i := 119;\r\n TJSKeyNames.F9: i := 120;\r\n TJSKeyNames.F10: i := 121;\r\n TJSKeyNames.F11: i := 122;\r\n TJSKeyNames.F12: i := 123;\r\n TJSKeyNames.F13: i := 124;\r\n TJSKeyNames.F14: i := 125;\r\n TJSKeyNames.F15: i := 126;\r\n TJSKeyNames.F16: i := 127;\r\n TJSKeyNames.F17: i := 128;\r\n TJSKeyNames.F18: i := 129;\r\n TJSKeyNames.F19: i := 130;\r\n TJSKeyNames.F20: i := 131;\r\n else\r\n i := Ord(AValue[1]);\r\n end;\r\n\r\n Result := i;\r\nend;\r\n\r\nfunction TControl.GetLeft: Integer;\r\nbegin\r\n Result := FLeft;\r\n if (Result = -1) and Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n Result := Round(ElementHandle.offsetLeft);\r\nend;\r\n\r\nfunction TControl.GetTop: Integer;\r\nbegin\r\n Result := FTop;\r\n if (Result = -1) and Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n Result := Round(ElementHandle.offsetTop);\r\nend;\r\n\r\nfunction TControl.GetTouchEventShiftState(Event: TJSTouchEvent): TShiftState;\r\nbegin\r\n Result := [];\r\n if Event.shiftKey then\r\n Result := Result + [ssShift];\r\n if Event.ctrlKey then\r\n Result := Result + [ssCtrl];\r\n if Event.altKey then\r\n Result := Result + [ssAlt];\r\nend;\r\n\r\nfunction TControl.GetWebClassName: string;\r\nbegin\r\n Result := ClassName;\r\n Delete(Result, 1, 1);\r\n Result := 'TWeb' + Result;\r\nend;\r\n\r\nfunction TControl.GetWidth: Integer;\r\nbegin\r\n Result := FWidth;\r\n\r\n if (Result = -1) and Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n begin\r\n Result := Round(ElementHandle.offsetWidth);\r\n end;\r\nend;\r\n\r\nfunction TControl.GetHeight: Integer;\r\nbegin\r\n Result := FHeight;\r\n\r\n if (Result = -1) and Assigned(ElementHandle) and not (csLoading in ComponentState) then\r\n begin\r\n Result := Round(ElementHandle.offsetHeight);\r\n end;\r\nend;\r\n\r\nprocedure TControl.KeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.KeyPress(var Key: Char);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.KeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TControl.LayerHandleDoMouseEnter(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if (Event.buttons = 0) and Captured and not FMouseInsideLayer then\r\n begin\r\n ReleaseCapture;\r\n HandleDoMouseUp(Event);\r\n HandleDoMouseLeave(Event);\r\n end;\r\n FMouseInsideLayer := True;\r\n Result := true;\r\nend;\r\n\r\nfunction TControl.LayerHandleDoMouseLeave(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FMouseInsideLayer := False;\r\n Result := true;\r\nend;\r\n\r\nprocedure TControl.Loaded;\r\nvar\r\n i: integer;\r\nbegin\r\n inherited;\r\n \r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].Loaded;\r\n\r\n case Align of\r\n alClient:\r\n begin\r\n if Assigned(Parent) then\r\n SetBounds(0, 0, Parent.FWidth, Parent.FHeight);\r\n end;\r\n end;\r\n\r\n Resize;\r\n\r\n UpdateElement;\r\nend;\r\n\r\nfunction TControl.HandleAllocated: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TControl.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n Click;\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoDblClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n DblClick;\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseDown(Event: TJSMouseEvent): Boolean;\r\nvar\r\n l, t: Single;\r\n p: TControl;\r\n ss: TShiftState;\r\n mb: TMouseButton;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n l := Event.clientX - Left + document.body.scrollLeft + document.documentElement.scrollLeft;\r\n t := Event.clientY - Top + document.body.scrollTop + document.documentElement.scrollTop;\r\n\r\n p := Parent;\r\n while Assigned(p) do\r\n begin\r\n l := l - p.Left;\r\n t := t - p.Top;\r\n p := p.Parent;\r\n end;\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n mb := GetMouseEventButton(Event);\r\n\r\n MouseDown(mb, ss, Trunc(l), Trunc(t));\r\n if Assigned(OnMouseDown) then\r\n OnMouseDown(Self, mb, ss, Trunc(l), Trunc(t));\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseUp(Event: TJSMouseEvent): Boolean;\r\nvar\r\n l, t: Single;\r\n p: TControl;\r\n ss: TShiftState;\r\n mb: TMouseButton;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n l := Event.clientX - Left + document.body.scrollLeft + document.documentElement.scrollLeft;\r\n t := Event.clientY - Top + document.body.scrollTop + document.documentElement.scrollTop;\r\n\r\n p := Parent;\r\n while Assigned(p) do\r\n begin\r\n l := l - p.Left;\r\n t := t - p.Top;\r\n p := p.Parent;\r\n end;\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n mb := GetMouseEventButton(Event);\r\n\r\n MouseUp(mb, ss, Trunc(l), Trunc(t));\r\n if Assigned(OnMouseUp) then\r\n OnMouseUp(Self, mb, ss, Trunc(l), Trunc(t));\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoWheel(Event: TJSWheelEvent): Boolean;\r\nvar\r\n ss: TShiftState;\r\n h: Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n ss := GetMouseWheelEventShiftState(Event);\r\n\r\n h := True;\r\n MouseWheel(ss, Trunc(-Event.deltay), h);\r\n if Assigned(OnMouseWheel) then\r\n OnMouseWheel(Self, ss, Trunc(-Event.deltay), Point(0, 0), h);\r\n Result := h;\r\n FElementEvent := nil;\r\nend;\r\n\r\nprocedure TControl.HandleFontChanged(Sender: TObject);\r\nvar\r\n i: integer;\r\nbegin\r\n if (FUpdateCount = 0) then\r\n begin\r\n ParentFont := false;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[i].ParentFont then\r\n begin\r\n Controls[i].Font.Assign(Font);\r\n Controls[i].FontChanged;\r\n end;\r\n end;\r\n end;\r\n\r\n FontChanged;\r\nend;\r\n\r\nfunction TControl.HandleDoTouchStart(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\n p: TControl;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n\r\n StopPropagation;\r\n if IsFocused then\r\n PreventDefault;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n\r\n l := touch.clientX - Left + document.body.scrollLeft + document.documentElement.scrollLeft;\r\n t := touch.clientY - Top + document.body.scrollTop + document.documentElement.scrollTop;\r\n\r\n p := Parent;\r\n while Assigned(p) do\r\n begin\r\n l := l - p.Left;\r\n t := t - p.Top;\r\n p := p.Parent;\r\n end;\r\n\r\n ss := GetTouchEventShiftState(Event);\r\n\r\n if LinkTouchEvents then\r\n begin\r\n MouseDown(mbLeft, ss, Trunc(l), Trunc(t));\r\n if Assigned(OnMouseDown) then\r\n OnMouseDown(Self, mbLeft, ss, Trunc(l), Trunc(t));\r\n end;\r\n\r\n TouchStart(Trunc(l), Trunc(t));\r\n\r\n if Assigned(OnTouchStart) then\r\n OnTouchStart(Self,Trunc(l), Trunc(t));\r\n end;\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoTouchMove(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\n p: TControl;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n\r\n StopPropagation;\r\n if IsFocused then\r\n PreventDefault;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n\r\n l := touch.clientX - Left + document.body.scrollLeft + document.documentElement.scrollLeft;\r\n t := touch.clientY - Top + document.body.scrollTop + document.documentElement.scrollTop;\r\n\r\n p := Parent;\r\n while Assigned(p) do\r\n begin\r\n l := l - p.Left;\r\n t := t - p.Top;\r\n p := p.Parent;\r\n end;\r\n\r\n ss := GetTouchEventShiftState(Event);\r\n\r\n if LinkTouchEvents then\r\n begin\r\n MouseMove(ss, Trunc(l), Trunc(t));\r\n if Assigned(OnMouseMove) then\r\n OnMouseMove(Self, ss, Trunc(l), Trunc(t));\r\n end;\r\n\r\n TouchMove(Trunc(l), Trunc(t));\r\n if Assigned(OnTouchMove) then\r\n OnTouchMove(Self,Trunc(l), Trunc(t));\r\n end;\r\n FElementEvent := nil;\r\n Result := True;\r\nend;\r\n\r\nfunction TControl.HandleDoTouchEnd(Event: TJSTouchEvent): Boolean;\r\nvar\r\n l,t: single;\r\n touch: TJSTouch;\r\n p: TControl;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n\r\n StopPropagation;\r\n if IsFocused then\r\n PreventDefault;\r\n\r\n if Event.Touches.length > 0 then\r\n begin\r\n touch := Event.touches.Touches[0];\r\n l := touch.clientX - Left + document.body.scrollLeft + document.documentElement.scrollLeft;\r\n t := touch.clientY - Top + document.body.scrollTop + document.documentElement.scrollTop;\r\n\r\n p := Parent;\r\n while Assigned(p) do\r\n begin\r\n l := l - p.Left;\r\n t := t - p.Top;\r\n p := p.Parent;\r\n end;\r\n\r\n ss := GetTouchEventShiftState(Event);\r\n\r\n if LinkTouchEvents then\r\n begin\r\n MouseUp(mbLeft, ss, Trunc(l), Trunc(t));\r\n if Assigned(OnMouseUp) then\r\n OnMouseUp(Self, mbLeft, ss, Trunc(l), Trunc(t));\r\n end;\r\n\r\n TouchEnd(Trunc(l), Trunc(t));\r\n if Assigned(OnTouchEnd) then\r\n OnTouchEnd(Self,Trunc(l), Trunc(t));\r\n end;\r\n FElementEvent := nil;\r\n Result := True;\r\nend;\r\n\r\nprocedure TControl.DragDrop(Source: TObject; X, Y: Integer);\r\nbegin\r\n if Assigned(OnDragDrop) then\r\n OnDragDrop(Self, Source, X, Y);\r\nend;\r\n\r\nprocedure TControl.DragOver(Source: TObject; X, Y: Integer;\r\n State: TDragState; var Accept: Boolean);\r\nbegin\r\n if Assigned(OnDragOver) then\r\n OnDragOver(Self, Source, X, Y, State, Accept);\r\nend;\r\n\r\nprocedure TControl.DoBoundsChange;\r\nvar\r\n b: boolean;\r\n frm: TCustomForm;\r\nbegin\r\n UpdateElementSize;\r\n RecreateCanvas;\r\n\r\n if FIsResizing then\r\n Exit;\r\n\r\n FIsResizing := true;\r\n\r\n InternalResize;\r\n\r\n DoRealign;\r\n\r\n b := false;\r\n\r\n frm := GetParentForm(Self);\r\n if Assigned(frm) then\r\n begin\r\n b := frm.IsResizing;\r\n b := b or (TControl(frm).FUpdateCount > 0);\r\n // b := b or TControl(frm).FIsAligning;\r\n end;\r\n\r\n b := b or (FUpdateCount > 0);\r\n\r\n b := b or FIsAligning;\r\n\r\n if not b then\r\n UpdateChildAnchoring;\r\n\r\n FIsResizing := false;\r\nend;\r\n\r\nprocedure TControl.DoEndDrag(Target: TObject; X, Y: Integer);\r\nbegin\r\n if Assigned(OnEndDrag) then\r\n OnEndDrag(Self, Target, X, Y);\r\nend;\r\n\r\nprocedure TControl.DoStartDrag(var DragObject: TDragObject); \r\nbegin\r\n if Assigned(OnStartDrag) then\r\n OnStartDrag(Self, DragObject);\r\nend;\r\n\r\nfunction TControl.Focused: Boolean;\r\nbegin\r\n Result := FContainer = document.activeElement;\r\nend;\r\n\r\n\r\nprocedure TControl.FontChanged;\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseLeave(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if Captured then\r\n Exit;\r\n\r\n Event.stopPropagation;\r\n DoMouseLeave;\r\n if Assigned(OnMouseLeave) then\r\n OnMouseLeave(Self);\r\n Result := true;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseEnter(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n if Captured then\r\n Exit;\r\n\r\n Event.stopPropagation;\r\n DoMouseEnter;\r\n if Assigned(OnMouseEnter) then\r\n OnMouseEnter(Self);\r\n Result := true;\r\nend;\r\n\r\nfunction TControl.HandleDoMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n l, t: Single;\r\n p: TControl;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n l := Event.clientX - Left + document.body.scrollLeft + document.documentElement.scrollLeft;\r\n t := Event.clientY - Top + document.body.scrollTop + document.documentElement.scrollTop;\r\n\r\n p := Parent;\r\n while Assigned(p) do\r\n begin\r\n l := l - p.Left;\r\n t := t - p.Top;\r\n p := p.Parent;\r\n end;\r\n\r\n ss := GetMouseEventShiftState(Event);\r\n\r\n MouseMove(ss, Trunc(l), Trunc(t));\r\n if Assigned(OnMouseMove) then\r\n OnMouseMove(Self, ss, Trunc(l), Trunc(t));\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoKeyDown(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n k: Word;\r\n ss: TShiftState;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n k := GetKeyCode(Event.Key);\r\n\r\n ss := GetKeyboardEventShiftState(Event);\r\n\r\n KeyDown(k, ss);\r\n if Assigned(OnKeyDown) then\r\n OnKeyDown(Self, k, ss);\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoKeyUp(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n k: Word;\r\n ss: TShiftState;\r\n c: Char;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n k := GetKeyCode(Event.Key);\r\n\r\n\r\n ss := GetKeyboardEventShiftState(Event);\r\n\r\n // #27 is not send as char in the browser\r\n if (k = 27) then\r\n begin\r\n c := #27;\r\n if Assigned(OnKeyPress) then\r\n OnKeyPress(Self, c);\r\n end;\r\n\r\n KeyUp(k, ss);\r\n if Assigned(OnKeyUp) then\r\n OnKeyUp(Self, k, ss);\r\n Result := True;\r\n FelementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoKeyPress(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n c: Char;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n if IsKeyCharacter(Event.Key) then\r\n begin\r\n c := Chr(GetKeyCode(Event.Key));\r\n KeyPress(c);\r\n if Assigned(OnKeyPress) then\r\n OnKeyPress(Self, c);\r\n end;\r\n\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoEnter(Event: TJSFocusEvent): Boolean;\r\nbegin\r\n FElementEvent := Event;\r\n StopPropagation;\r\n\r\n DoEnter;\r\n if Assigned(OnEnter) then\r\n OnEnter(Self);\r\n\r\n Result := True;\r\n FElementEvent := nil;\r\nend;\r\n\r\nfunction TControl.HandleDoExit(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n DoExit;\r\n if Assigned(OnExit) then\r\n OnExit(Self);\r\n Result := True;\r\nend;\r\n\r\nprocedure TControl.SetParent(AValue: TControl);\r\nbegin\r\n if FParent <> AValue then\r\n begin\r\n if Assigned(FParent) then\r\n FParent.UnRegisterParent(Self);\r\n\r\n FPrevParent := FParent;\r\n FParent := AValue;\r\n\r\n if Assigned(FParent) then\r\n FParent.RegisterParent(Self);\r\n\r\n UpdateParent;\r\n UpdateElement;\r\n InitScript;\r\n end;\r\nend;\r\n\r\nprocedure TControl.SetParentComponent(Value: TComponent);\r\nbegin\r\n if (Parent <> Value) and (Value is TControl) then\r\n SetParent(TControl(Value));\r\nend;\r\n\r\nprocedure TControl.Realign;\r\nbegin\r\n AlignControl(Self);\r\nend;\r\n\r\nprocedure TControl.RecreateCanvas;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.RecreateElement;\r\nbegin\r\n if Assigned(Container) then\r\n begin\r\n UnbindEvents;\r\n Container.parentNode.removeChild(Container);\r\n FElement := nil;\r\n CreateControl;\r\n if Assigned(Parent) and Assigned(Parent.Container) then\r\n Parent.Container.appendChild(Container);\r\n end;\r\nend;\r\n\r\nprocedure TControl.RegisterParent(AValue: TControl);\r\nbegin\r\n SetLength(FControls, Length(FControls) + 1);\r\n FControls[Length(FControls) - 1] := AValue;\r\nend;\r\n\r\nprocedure TControl.ReleaseCapture;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n if FCaptured and Assigned(FLayer) then\r\n begin\r\n eh := TJSHTMLElement(FLayer);\r\n eh.removeEventListener('mouseenter',@LayerHandleDoMouseEnter);\r\n eh.removeEventListener('mouseleave',@LayerHandleDoMouseLeave);\r\n eh.removeEventListener('mousedown',@HandleDoMouseDown);\r\n eh.removeEventListener('mouseup',@HandleDoMouseUp);\r\n eh.removeEventListener('mousemove',@HandleDoMouseMove);\r\n document.body.removeChild(eh);\r\n FCaptured := False;\r\n FLayer := nil;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TControl.Resize;\r\nbegin\r\nend;\r\n\r\nprocedure TControl.InitAnchoring;\r\nvar\r\n i: integer;\r\nbegin\r\n FOrigRect := BoundsRect;\r\n\r\n if Assigned(Parent) then\r\n FOrigParentRect := Parent.BoundsRect;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].InitAnchoring;\r\nend;\r\n\r\nprocedure TControl.InjectCSS;\r\nvar\r\n cssname,css: string;\r\n cssmgr: TCSSCodeManager;\r\nbegin\r\n cssname := GetWebClassname;\r\n\r\n css := '';\r\n\r\n cssmgr := GetCSSManager;\r\n\r\n if Assigned(cssmgr) then\r\n css := cssmgr.GetClassCSS(cssname);\r\n\r\n if (css <> '') then\r\n AddControlStyle(css);\r\nend;\r\n\r\nprocedure TControl.InternalResize;\r\nbegin\r\n if csLoading in ComponentState then\r\n Exit;\r\n\r\n Resize;\r\nend;\r\n\r\nprocedure TControl.InternalUpdateParent;\r\nvar\r\n p: TControl;\r\nbegin\r\n p := FPrevParent;\r\n if FNew then\r\n begin\r\n CreateControl;\r\n\r\n if Assigned(Container) then\r\n begin\r\n if Assigned(Parent) and not Assigned(Parent.Container) then\r\n Parent.CreateControl;\r\n\r\n if (Parent <> p) and Assigned(p) and Assigned(p.Container) then\r\n p.Container.removeChild(Container);\r\n\r\n if Assigned(Parent) and Assigned(Parent.Container) then\r\n Parent.Container.appendChild(Container);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.IsFocused: Boolean;\r\nbegin\r\n Result := FContainer = document.activeElement;\r\nend;\r\n\r\nfunction TControl.IsKeyCharacter(AValue: string): Boolean;\r\nbegin\r\n case AValue of\r\n 'Up',\r\n 'Down',\r\n 'Left',\r\n 'Right',\r\n TJSKeyNames.Shift,\r\n TJSKeyNames.Control,\r\n TJSKeyNames.Alt,\r\n TJSKeyNames.Pause,\r\n TJSKeyNames.CapsLock,\r\n TJSKeyNames.PageUp,\r\n TJSKeyNames.PageDown,\r\n TJSKeyNames._End,\r\n TJSKeyNames.Home,\r\n TJSKeyNames.ArrowLeft,\r\n TJSKeyNames.ArrowUp,\r\n TJSKeyNames.ArrowRight,\r\n TJSKeyNames.ArrowDown,\r\n TJSKeyNames.Insert,\r\n TJSKeyNames.Delete,\r\n TJSKeyNames.F1,\r\n TJSKeyNames.F2,\r\n TJSKeyNames.F3,\r\n TJSKeyNames.F4,\r\n TJSKeyNames.F5,\r\n TJSKeyNames.F6,\r\n TJSKeyNames.F7,\r\n TJSKeyNames.F8,\r\n TJSKeyNames.F9,\r\n TJSKeyNames.F10,\r\n TJSKeyNames.F11,\r\n TJSKeyNames.F12,\r\n TJSKeyNames.F13,\r\n TJSKeyNames.F14,\r\n TJSKeyNames.F15,\r\n TJSKeyNames.F16,\r\n TJSKeyNames.F17,\r\n TJSKeyNames.F18,\r\n TJSKeyNames.F19,\r\n TJSKeyNames.F20: Result := False;\r\n else\r\n Result := True;\r\n end;\r\nend;\r\n\r\nprocedure TControl.UnbindEvents;\r\nvar\r\n eh: TJSEventTarget;\r\nbegin\r\n if Assigned(ElementBindHandle) then\r\n begin\r\n eh := ElementBindHandle;\r\n\r\n eh.removeEventListener('wheel',@HandleDoWheel);\r\n eh.removeEventListener('click',@HandleDoClick);\r\n eh.removeEventListener('dblclick',@HandleDoDblClick);\r\n eh.removeEventListener('mousedown',@HandleDoMouseDown);\r\n eh.removeEventListener('mouseup',@HandleDoMouseUp);\r\n eh.removeEventListener('mousemove',@HandleDoMouseMove);\r\n eh.removeEventListener('mouseleave',@HandleDoMouseLeave);\r\n eh.removeEventListener('mouseenter',@HandleDoMouseEnter);\r\n eh.removeEventListener('keydown',@HandleDoKeyDown);\r\n eh.removeEventListener('keyup',@HandleDoKeyUp);\r\n eh.removeEventListener('keypress',@HandleDoKeyPress);\r\n eh.removeEventListener('focus',@HandleDoEnter);\r\n eh.removeEventListener('blur',@HandleDoExit);\r\n\r\n eh.removeEventListener('touchstart', @HandleDoTouchStart);\r\n eh.removeEventListener('touchmove', @HandleDoTouchMove);\r\n eh.removeEventListener('touchend', @HandleDoTouchEnd);\r\n end;\r\nend;\r\n\r\nprocedure TControl.UnRegisterParent(AValue: TControl);\r\nvar\r\n i: Integer;\r\n flg: Boolean;\r\nbegin\r\n flg := false;\r\n\r\n for i := 0 to Length(FControls) - 1 do\r\n begin\r\n if (FControls[i] = AValue) then\r\n begin\r\n flg := True;\r\n end;\r\n\r\n if (flg) and (i < Length(FControls) - 1) then\r\n FControls[i] := FControls[i+1];\r\n end;\r\n\r\n if flg then\r\n SetLength(FControls, Length(FControls) - 1);\r\nend;\r\n\r\nprocedure TControl.UpdateAnchoring;\r\nvar\r\n dxr,dyr: integer;\r\n dxo,dyo: integer;\r\n dxw,dyw: integer;\r\n br,r: TRect;\r\nbegin\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n if not FControlCreated then\r\n Exit;\r\n\r\n if Align <> alNone then\r\n Exit;\r\n\r\n if (OrigRect.Left = -1) and (OrigRect.Top = -1) then\r\n InitAnchoring;\r\n\r\n if Assigned(Parent) and not (Self is TForm) then\r\n begin\r\n r := Parent.BoundsRect;\r\n\r\n dxr := (r.Right - r.Left) - (FOrigParentRect.Right - FOrigParentRect.Left);\r\n dyr := (r.Bottom - r.Top) - (FOrigParentRect.Bottom - FOrigParentRect.Top);\r\n\r\n br := FOrigRect;\r\n\r\n dxo := 0;\r\n dyo := 0;\r\n dxw := 0;\r\n dyw := 0;\r\n\r\n if (akRight in Anchors) then\r\n begin\r\n if (akLeft in Anchors) then\r\n dxw := dxr\r\n else\r\n dxo := dxr;\r\n end;\r\n\r\n if (akBottom in Anchors) then\r\n begin\r\n if (akTop in Anchors) then\r\n dyw := dyr\r\n else\r\n dyo := dyr;\r\n end;\r\n\r\n if (akBottom in Anchors) or (akRight in Anchors) then\r\n SetBounds(br.Left + dxo, br.Top + dyo, br.Right - br.Left + dxw, br.Bottom - br.Top + dyw);\r\n end;\r\n\r\n UpdateChildAnchoring;\r\nend;\r\n\r\nprocedure TControl.UpdateChildAnchoring;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n begin\r\n Controls[i].UpdateAnchoring;\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateChildren(AControl: TControl);\r\nvar\r\n I: Integer;\r\n c: TControl;\r\nbegin\r\n if Assigned(AControl) then\r\n begin\r\n AControl.DoRealign;\r\n if AControl is TCustomControl then\r\n begin\r\n (AControl as TCustomControl).RecreateCanvas;\r\n (AControl as TCustomControl).Invalidate;\r\n end;\r\n\r\n for I := 0 to AControl.ControlCount - 1 do\r\n begin\r\n c := AControl.Controls[I];\r\n UpdateChildren(c);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TControl.PersistinHTML;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].PersistinHTML;\r\nend;\r\n\r\nprocedure TControl.InitFromHTML;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].InitFromHTML;\r\nend;\r\n\r\nprocedure TControl.InitScript;\r\nbegin\r\n // script to initialize any javascript control\r\nend;\r\n\r\nprocedure TControl.PreventDefault;\r\nbegin\r\n if Assigned(ElementEvent) then\r\n ElementEvent.preventDefault;\r\nend;\r\n\r\nprocedure TControl.UpdateElement;\r\nbegin\r\n if FBlockUpdateElement or (FUpdateCount > 0) then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) and (ElementHandle <> ContainerElement) and not IsUpdating then\r\n begin\r\n if not IsLinked then\r\n UpdateElementVisual;\r\n\r\n UpdateElementData;\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateElementData;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n eh := ElementHandle;\r\n\r\n if Visible then\r\n eh.style.setProperty('visibility', '')\r\n else\r\n eh.style.setProperty('visibility', 'hidden');\r\n\r\n if TabStop then\r\n FContainer['tabindex'] := IntToStr(TabOrder + 1)\r\n else\r\n FContainer['tabindex'] := '';\r\n\r\n if Enabled then\r\n FContainer.removeAttribute('disabled')\r\n else\r\n FContainer.setAttribute('disabled','disabled');\r\n\r\n\r\n if ShowHint and (Hint <> '') then\r\n FContainer['title'] := Hint\r\n else\r\n FContainer['title'] := '';\r\nend;\r\n\r\nprocedure TControl.UpdateElementSize;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n if FBlockUpdateElement or (FUpdateCount > 0) then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) and (ElementHandle <> ContainerElement) then\r\n begin\r\n eh := ElementHandle;\r\n\r\n if (ControlPosition = cpAbsolute) then\r\n begin\r\n if FTop <> -1 then\r\n eh.style.setProperty('top', IntToStr(FTop) + 'px')\r\n else\r\n eh.style.setProperty('top', '');\r\n\r\n if FLeft <> -1 then\r\n eh.style.setProperty('left', IntToStr(FLeft) + 'px')\r\n else\r\n eh.style.setProperty('left', '');\r\n end;\r\n\r\n if (FWidthStyle = ssAbsolute) then\r\n begin\r\n if FWidth <> -1 then\r\n eh.style.setProperty('width', IntToStr(GetOuterWidth) + 'px')\r\n else\r\n eh.style.setProperty('width', '');\r\n end;\r\n\r\n if (FWidthStyle = ssAuto) then\r\n begin\r\n eh.style.setProperty('width', '');\r\n end;\r\n\r\n if (FHeightStyle = ssAbsolute) then\r\n begin\r\n if FHeight <> -1 then\r\n eh.style.setProperty('height', IntToStr(GetOuterHeight) + 'px')\r\n else\r\n eh.style.setProperty('height', '');\r\n end;\r\n\r\n if (FHeightStyle = ssAuto) then\r\n begin\r\n eh.style.setProperty('height', '');\r\n end;\r\n\r\n if (FWidthStyle = ssPercent) then\r\n begin\r\n if FWidth <> -1 then\r\n eh.style.setProperty('width', IntToStr(FWidthPercent) + '%')\r\n else\r\n eh.style.setProperty('width', '');\r\n end;\r\n\r\n if (FHeightStyle = ssPercent) then\r\n begin\r\n if FHeight <> -1 then\r\n eh.style.setProperty('height', IntToStr(FHeightPercent) + '%')\r\n else\r\n eh.style.setProperty('height', '');\r\n end;\r\n\r\n if FControlPosition = cpAbsolute then\r\n eh.style.setProperty('position', 'absolute')\r\n else if FControlPosition = cpRelative then\r\n eh.style.setProperty('position', 'relative')\r\n else\r\n eh.style.setProperty('position', '');\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateElementVisual;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n eh := ElementHandle;\r\n\r\n if ParentFont and Assigned(Parent) then\r\n Font.Assign(Parent.Font);\r\n\r\n eh.style.setProperty('overflow', 'hidden');\r\n\r\n case Cursor of\r\n crDefault: eh.style.setProperty('cursor', 'default');\r\n crArrow: eh.style.setProperty('cursor', 'auto');\r\n crNone: eh.style.setProperty('cursor', 'none');\r\n crCross: eh.style.setProperty('cursor', 'crosshair');\r\n crIBeam: eh.style.setProperty('cursor', 'text');\r\n crSizeNESW: eh.style.setProperty('cursor', 'nesw-resize');\r\n crSizeNS: eh.style.setProperty('cursor', 'ns-resize');\r\n crSizeNWSE: eh.style.setProperty('cursor', 'nwse-resize');\r\n crSizeWE: eh.style.setProperty('cursor', 'ew-resize');\r\n crUpArrow: eh.style.setProperty('cursor', '');\r\n crHourGlass: eh.style.setProperty('cursor', 'wait');\r\n crDrag: eh.style.setProperty('cursor', '');\r\n crNoDrop: eh.style.setProperty('cursor', 'no-drop');\r\n crHSplit: eh.style.setProperty('cursor', 'col-resize');\r\n crVSplit: eh.style.setProperty('cursor', 'row-resize');\r\n crMultIDrag: eh.style.setProperty('cursor', '');\r\n crSQLWait: eh.style.setProperty('cursor', 'progress');\r\n crNo: eh.style.setProperty('cursor', 'not-allowed');\r\n crAppStart: eh.style.setProperty('cursor', 'wait');\r\n crHelp: eh.style.setProperty('cursor', 'help');\r\n crHandPoint: eh.style.setProperty('cursor', 'pointer');\r\n crSizeAll: eh.style.setProperty('cursor', 'move');\r\n end;\r\n\r\n if Captured then\r\n TJSHTMLElement(FLayer).style.setProperty('cursor', eh.style.getPropertyValue('cursor'));\r\n\r\n if (ElementClassName <> '') or CanShowFocus then\r\n eh.style.setProperty('outline', '')\r\n else\r\n eh.style.setProperty('outline', 'none');\r\n\r\n UpdateElementSize;\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n\r\n if ElementClassName = '' then\r\n begin\r\n if Enabled then\r\n eh.style.setProperty('color', ColorToHtml(Font.Color));\r\n\r\n SetElementFont(eh, Font);\r\n end\r\n else\r\n begin\r\n eh.style.setProperty('color', '');\r\n eh.style.setProperty('font-family', '');\r\n eh.style.setProperty('font-style', '');\r\n eh.style.setProperty('font-size', '');\r\n end;\r\nend;\r\n\r\nprocedure TControl.UpdateParent;\r\nbegin\r\n InternalUpdateParent;\r\n if (csLoading in ComponentState) and Assigned(Parent) and not (csLoading in Parent.ComponentState) then\r\n Loaded;\r\n UpdateChildren(FPrevParent);\r\n UpdateChildren(Parent);\r\nend;\r\n\r\nprocedure TControl.VisibleChanging;\r\nbegin\r\n\r\nend;\r\n\r\nfunction TControl.GetBoundsRect: TRect;\r\nbegin\r\n Result.Left := Left;\r\n Result.Top := Top;\r\n Result.Right := Left + Width;\r\n Result.Bottom := Top + Height;\r\nend;\r\n\r\nfunction TControl.GetControlsCount: Integer;\r\nbegin\r\n Result := Length(FControls);\r\nend;\r\n\r\nfunction TControl.GetCSSManager: TCSSCodeManager;\r\nvar\r\n frm: TCustomForm;\r\n i: integer;\r\nbegin\r\n Result := nil;\r\n\r\n frm := GetParentForm(Self);\r\n\r\n if Assigned(frm) then\r\n begin\r\n for i := 0 to frm.ComponentCount - 1 do\r\n begin\r\n if frm.Components[i] is TCSSCodeManager then\r\n begin\r\n Result := frm.Components[i] as TCSSCodeManager;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TControl.GetControls(Index: Integer): TControl;\r\nbegin\r\n Result := FControls[Index];\r\nend;\r\n\r\nprocedure TControl.DoEnter;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TControl.DoExit;\r\nbegin\r\n\r\nend;\r\n\r\n{ TCustomControl }\r\n\r\nprocedure TCustomControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n FBorderStyle := bsSingle;\r\n FBorderColor := clSilver;\r\n FPainting := false;\r\n FWidth := 100;\r\n FHeight := 25;\r\n FWidthPercent := 100;\r\n FHeightPercent := 100;\r\n FCustomBorder := false;\r\nend;\r\n\r\nprocedure TCustomControl.BindEvents;\r\nbegin\r\n inherited;\r\n\r\n// document.body.addEventListener('touchstart', @BlockDocumentTouch);\r\n// document.body.addEventListener('touchmove', @BlockDocumentTouch);\r\n// document.body.addEventListener('touchend', @BlockDocumentTouch);\r\nend;\r\n\r\nprocedure TCustomControl.BlockDocumentTouch(Event: TJSTouchEvent);\r\nbegin\r\n// if (Event.target = FElementCanvas) then\r\n// Event.preventDefault();\r\nend;\r\n\r\nprocedure TCustomControl.CreateControl;\r\nbegin\r\n inherited;\r\n RecreateCanvas;\r\nend;\r\n\r\nfunction TCustomControl.CreateElement: TJSElement;\r\nbegin\r\n FElementCanvas := TJSHTMLCanvasElement(document.createElement('CANVAS'));\r\n if csAcceptsControls in ControlStyle then\r\n begin\r\n Result := document.createElement('SPAN');\r\n Result.appendChild(FElementCanvas);\r\n FElementCanvas['id'] := ElementID + '_Canvas';\r\n FElementCanvas['zindex'] := '-1';\r\n end\r\n else\r\n Result := FElementCanvas;\r\nend;\r\n\r\ndestructor TCustomControl.Destroy;\r\nbegin\r\n if Assigned(FCanvas) then\r\n FCanvas.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TCustomControl.GetCanvas: TCanvas;\r\nbegin\r\n if not Assigned(FCanvas) then\r\n CreateControl;\r\n Result := FCanvas;\r\nend;\r\n\r\nfunction TCustomControl.GetCanvasHeightOffset: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TCustomControl.GetCanvasWidthOffset: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TCustomControl.GetPixelRatio: Single;\r\nvar\r\n res: single;\r\nbegin\r\n asm\r\n var ctx = document.createElement(\"canvas\").getContext(\"2d\"),\r\n dpr = window.devicePixelRatio || 1,\r\n bsr = ctx.webkitBackingStorePixelRatio ||\r\n ctx.mozBackingStorePixelRatio ||\r\n ctx.msBackingStorePixelRatio ||\r\n ctx.oBackingStorePixelRatio ||\r\n ctx.backingStorePixelRatio || 1;\r\n res = dpr / bsr\r\n end;\r\n Result := res;\r\nend;\r\n\r\nprocedure TCustomControl.Invalidate;\r\nvar\r\n px: Single;\r\nbegin\r\n inherited;\r\n if Parent = nil then\r\n Exit;\r\n\r\n px := GetPixelRatio;\r\n if (px <> FPixelRatio) then\r\n RecreateCanvas;\r\n\r\n FPixelRatio := GetPixelRatio;\r\n\r\n FPainting := true;\r\n\r\n if Assigned(FCanvas) then\r\n FCanvas.Clear;\r\n\r\n Paint;\r\n FPainting := false;\r\nend;\r\n\r\nprocedure TCustomControl.Loaded;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nfunction TCustomControl.MakeScreenShot: TBitmap;\r\nbegin\r\n Result := TBitmap.Create;\r\n Result.LoadFromCanvas(Canvas);\r\nend;\r\n\r\nprocedure TCustomControl.Paint;\r\nbegin\r\nend;\r\n\r\nprocedure TCustomControl.RecreateCanvas;\r\nvar\r\n px: Single;\r\n el: TJSHTMLCanvasElement;\r\n h, w: Integer;\r\nbegin\r\n if Assigned(FElementCanvas) then\r\n begin\r\n if not FPainting then\r\n begin\r\n el := TJSHTMLCanvasElement(document.getElementByID(GetID+'_Canvas'));\r\n\r\n // it is already found\r\n if Assigned(el) then\r\n begin\r\n FElementCanvas := el;\r\n FCanvas.Free;\r\n FCanvas := nil;\r\n end;\r\n\r\n px := GetPixelRatio;\r\n h := Height - GetCanvasHeightOffset;\r\n w := Width - GetCanvasWidthOffset;\r\n\r\n FElementCanvas.style.setProperty('height', IntToStr(h) + 'px');\r\n FElementCanvas.style.setProperty('width', IntToStr(w) + 'px');\r\n FElementCanvas.height := Round(h * px);\r\n FElementCanvas.width := Round(w * px);\r\n\r\n FElementCanvas.getContextAs2DContext('2d').scale(px, px);\r\n end;\r\n\r\n if not Assigned(FCanvas) then\r\n FCanvas := TCanvas.Create(FElementCanvas);\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.Resize;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TCustomControl.SetBorderColor(AValue: TColor);\r\nbegin\r\n if (FBorderColor <> AValue) then\r\n begin\r\n FBorderColor := AValue;\r\n UpdateElement;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TCustomControl.SetBorderStyle(AValue: TBorderStyle);\r\nbegin\r\n if FBorderStyle <> AValue then\r\n begin\r\n FBorderStyle := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomControl.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n if BorderStyle = bsSingle then // default border style\r\n begin\r\n if CustomBorder then\r\n begin\r\n ElementHandle.style.setProperty('border-style', 'solid');\r\n ElementHandle.style.setProperty('border-width', '1px');\r\n ElementHandle.style.setProperty('border-color', ColorToHTML(BorderColor));\r\n end\r\n else\r\n ElementHandle.style.setProperty('border-style', '')\r\n end\r\n else\r\n ElementHandle.style.setProperty('border-style', 'none');\r\n end;\r\nend;\r\n\r\n{ TScrollingGraphicControl }\r\n\r\nprocedure TScrollingGraphicControl.UpdateElement;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n ElementHandle.style.setProperty('overflow', 'auto');\r\nend;\r\n\r\n\r\nfunction TScrollingGraphicControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\n{ TMargins }\r\n\r\nconstructor TMargins.Create;\r\nbegin\r\n FLeft := 3;\r\n FTop := 3;\r\n FBottom := 3;\r\n FRight := 3;\r\nend;\r\n\r\n{ TControlManager }\r\n\r\nconstructor TControlManager.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FInstanceCount := 0;\r\nend;\r\n\r\nfunction TControlManager.GetInstanceNumber: integer;\r\nbegin\r\n Inc(FInstanceCount);\r\n Result := FInstanceCount;\r\nend;\r\n\r\nprocedure TControlManager.Reset;\r\nbegin\r\n FInstanceCount := 0;\r\nend;\r\n\r\n{ TCSSCodeFragment }\r\n\r\nconstructor TCSSCodeFragment.Create(Collection: TCollection);\r\nbegin\r\n inherited;\r\n FCSS := TStringList.Create;\r\nend;\r\n\r\ndestructor TCSSCodeFragment.Destroy;\r\nbegin\r\n FCSS.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TCSSCodeFragment.SetCSS(const Value: TStringList);\r\nbegin\r\n FCSS.Assign(Value);\r\nend;\r\n\r\n{ TCSSCodeFragments }\r\n\r\nfunction TCSSCodeFragments.Add: TCSSCodeFragment;\r\nbegin\r\n Result := TCSSCodeFragment(inherited Add);\r\nend;\r\n\r\nconstructor TCSSCodeFragments.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TCSSCodeFragment);\r\nend;\r\n\r\nfunction TCSSCodeFragments.GetItemEx(Index: integer): TCSSCodeFragment;\r\nbegin\r\n Result := TCSSCodeFragment(inherited Items[Index]);\r\nend;\r\n\r\nfunction TCSSCodeFragments.Insert(Index: integer): TCSSCodeFragment;\r\nbegin\r\n Result := TCSSCodeFragment(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TCSSCodeFragments.SetItemEx(Index: integer;\r\n const Value: TCSSCodeFragment);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TCSSCodeManager }\r\n\r\nconstructor TCSSCodeManager.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FCSSFragments := TCSSCodeFragments.Create(Self);\r\nend;\r\n\r\ndestructor TCSSCodeManager.Destroy;\r\nbegin\r\n FCSSFragments.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TCSSCodeManager.GetClassCSS(AClassname: string): string;\r\nvar\r\n CSSCodeFragment: TCSSCodeFragment;\r\nbegin\r\n Result := '';\r\n\r\n CSSCodeFragment := GetClassFragment(AClassName);\r\n\r\n if Assigned(CSSCodeFragment) then\r\n Result := CSSCodeFragment.CSS.Text;\r\nend;\r\n\r\nfunction TCSSCodeManager.GetClassFragment(AClassname: string): TCSSCodeFragment;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := nil;\r\n for i := 0 to CSSFragments.Count - 1 do\r\n begin\r\n if CSSFragments.Items[i].ControlClassName = AClassname then\r\n Result := CSSFragments.Items[i];\r\n end;\r\nend;\r\n\r\nprocedure TCSSCodeManager.SetCSSFragments(const Value: TCSSCodeFragments);\r\nbegin\r\n FCSSFragments.Assign(Value);\r\nend;\r\n\r\n{ TjQueryCustomContol }\r\n\r\nfunction TjQueryCustomControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\nprocedure TjQueryCustomControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n FIsInitialized := false;\r\nend;\r\n\r\nfunction TjQueryCustomControl.GetJQID: string;\r\nbegin\r\n Result := '#' + GetID;\r\nend;\r\n\r\nprocedure TjQueryCustomControl.InitJQuery;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TjQueryCustomControl.InitJQueryOnce;\r\nbegin\r\n if IsUpdating then\r\n Exit;\r\n\r\n if FIsInitialized then\r\n Exit;\r\n\r\n FIsInitialized := true;\r\n InitJQuery;\r\nend;\r\n\r\nprocedure TjQueryCustomControl.Loaded;\r\nbegin\r\n inherited;\r\n InitJQueryOnce;\r\nend;\r\n\r\nprocedure TjQueryCustomControl.SetParent(AValue: TControl);\r\nbegin\r\n inherited;\r\n InitJQueryOnce;\r\nend;\r\n\r\ninitialization\r\n ControlManager := TControlManager.Create(nil);\r\n\r\nend.\r\n","unit WEBLib.Lang;\r\n\r\ninterface\r\n\r\ntype\r\n\r\n TUILanguage = (\r\n lNone,\r\n lAfar,\r\n lAbkhazian,\r\n lAvestan,\r\n lAfrikaans,\r\n lAkan,\r\n lAmharic,\r\n lAragonese,\r\n lArabic,\r\n lAssamese,\r\n lAvaric,\r\n lAymara,\r\n lAzerbaijani,\r\n lBashkir,\r\n lBelarusian,\r\n lBulgarian,\r\n lBihari,\r\n lBislama,\r\n lBambara,\r\n lBengali,\r\n lTibetan,\r\n lBreton,\r\n lBosnian,\r\n lCatalan,\r\n lChechen,\r\n lChamorro,\r\n lCorsican,\r\n lCree,\r\n lCzech,\r\n lOldSlavic,\r\n lChuvash,\r\n lWelsh,\r\n lDanish,\r\n lGerman,\r\n lDivehi,\r\n lDzongkha,\r\n lEwe,\r\n lEnglish,\r\n lEsperanto,\r\n lSpanish,\r\n lEstonian,\r\n lBasque,\r\n lPersian,\r\n lFulah,\r\n lFinnish,\r\n lFijian,\r\n lFaroese,\r\n lFrench,\r\n lWesternFrisian,\r\n lIrish,\r\n lGaelic,\r\n lGalician,\r\n lGuarani,\r\n lGujarati,\r\n lManx,\r\n lHausa,\r\n lHebrew,\r\n lHindi,\r\n lHiriMotu,\r\n lCroatian,\r\n lHaitian,\r\n lHungarian,\r\n lArmenian,\r\n lHerero,\r\n lInterlingua,\r\n lIndonesian,\r\n lInterlingue,\r\n lIgbo,\r\n lSichuanYi,\r\n lInupiaq,\r\n lIdo,\r\n lIcelandic,\r\n lItalian,\r\n lInuktitut,\r\n lJapanese,\r\n lJavanese,\r\n lGeorgian,\r\n lKongo,\r\n lKikuyu,\r\n lKuanyama,\r\n lKazakh,\r\n lKalaallisut,\r\n lCentralKhmer,\r\n lKannada,\r\n lKorean,\r\n lKanuri,\r\n lKashmiri,\r\n lKurdish,\r\n lKomi,\r\n lCornish,\r\n lKirghiz,\r\n lLatin,\r\n lLuxembourgish,\r\n lGanda,\r\n lLimburgan,\r\n lLingala,\r\n lLao,\r\n lLithuanian,\r\n lLubaKatanga,\r\n lLatvian,\r\n lMalagasy,\r\n lMarshallese,\r\n lMaori,\r\n lMacedonian,\r\n lMalayalam,\r\n lMongolian,\r\n lMarathi,\r\n lMalay,\r\n lMaltese,\r\n lBurmese,\r\n lNauru,\r\n lNdebele,\r\n lNepali,\r\n lNdonga,\r\n lDutch,\r\n lNorwegian,\r\n lNavajo,\r\n lChichewa,\r\n lOccitan,\r\n lOjibwa,\r\n lOromo,\r\n lOriya,\r\n lOssetian,\r\n lPanjabi,\r\n lPali,\r\n lPolish,\r\n lPushto,\r\n lPortuguese,\r\n lQuechua,\r\n lRomansh,\r\n lRundi,\r\n lRomanian,\r\n lRussian,\r\n lKinyarwanda,\r\n lSanskrit,\r\n lSardinian,\r\n lSindhi,\r\n lNorthernSami,\r\n lSango,\r\n lSinhala,\r\n lSlovak,\r\n lSlovenian,\r\n lSamoan,\r\n lShona,\r\n lSomali,\r\n lAlbanian,\r\n lSerbian,\r\n lSwati,\r\n lSotho,\r\n lSundanese,\r\n lSwedish,\r\n lSwahili,\r\n lTamil,\r\n lTelugu,\r\n lTajik,\r\n lThai,\r\n lTigrinya,\r\n lTurkmen,\r\n lTagalog,\r\n lTswana,\r\n lTonga,\r\n lTurkish,\r\n lTsonga,\r\n lTatar,\r\n lTwi,\r\n lTahitian,\r\n lUighur,\r\n lUkrainian,\r\n lUrdu,\r\n lUzbek,\r\n lVenda,\r\n lVietnamese,\r\n lWalloon,\r\n lWolof,\r\n lXhosa,\r\n lYiddish,\r\n lYoruba,\r\n lZhuang,\r\n lChinese,\r\n lZulu);\r\n\r\nfunction GetLanguageISO639_1Code(ALang: TUILanguage): string;\r\n\r\nimplementation\r\n\r\nfunction GetLanguageISO639_1Code(ALang: TUILanguage): string;\r\nbegin\r\n case ALang of\r\n lNone: Result := '';\r\n lAfar: Result := 'aa';\r\n lAbkhazian: Result := 'ab';\r\n lAvestan: Result := 'ae';\r\n lAfrikaans: Result := 'af';\r\n lAkan: Result := 'ak';\r\n lAmharic: Result := 'am';\r\n lAragonese: Result := 'an';\r\n lArabic: Result := 'ar';\r\n lAssamese: Result := 'as';\r\n lAvaric: Result := 'av';\r\n lAymara: Result := 'ay';\r\n lAzerbaijani: Result := 'az';\r\n lBashkir: Result := 'ba';\r\n lBelarusian: Result := 'be';\r\n lBulgarian: Result := 'bg';\r\n lBihari: Result := 'bh';\r\n lBislama: Result := 'bi';\r\n lBambara: Result := 'bm';\r\n lBengali: Result := 'bn';\r\n lTibetan: Result := 'bo';\r\n lBreton: Result := 'br';\r\n lBosnian: Result := 'bd';\r\n lCatalan: Result := 'ca';\r\n lChechen: Result := 'ce';\r\n lChamorro: Result := 'ch';\r\n lCorsican: Result := 'co';\r\n lCree: Result := 'cr';\r\n lCzech: Result := 'cs';\r\n lOldSlavic: Result := 'cu';\r\n lChuvash: Result := 'cv';\r\n lWelsh: Result := 'cy';\r\n lDanish: Result := 'da';\r\n lGerman: Result := 'de';\r\n lDivehi: Result := 'dv';\r\n lDzongkha: Result := 'dz';\r\n lEwe: Result := 'ee';\r\n lEnglish: Result := 'en';\r\n lEsperanto: Result := 'eo';\r\n lSpanish: Result := 'es';\r\n lEstonian: Result := 'et';\r\n lBasque: Result := 'eu';\r\n lPersian: Result := 'fa';\r\n lFulah: Result := 'ff';\r\n lFinnish: Result := 'fi';\r\n lFijian: Result := 'fj';\r\n lFaroese: Result := 'fo';\r\n lFrench: Result := 'fr';\r\n lWesternFrisian: Result := 'fy';\r\n lIrish: Result := 'ga';\r\n lGaelic: Result := 'gd';\r\n lGalician: Result := 'gl';\r\n lGuarani: Result := 'gn';\r\n lGujarati: Result := 'gu';\r\n lManx: Result := 'gv';\r\n lHausa: Result := 'ha';\r\n lHebrew: Result := 'he';\r\n lHindi: Result := 'hi';\r\n lHiriMotu: Result := 'ho';\r\n lCroatian: Result := 'hr';\r\n lHaitian: Result := 'ht';\r\n lHungarian: Result := 'hu';\r\n lArmenian: Result := 'hy';\r\n lHerero: Result := 'hz';\r\n lInterlingua: Result := 'ia';\r\n lIndonesian: Result := 'id';\r\n lInterlingue: Result := 'ie';\r\n lIgbo: Result := 'ig';\r\n lSichuanYi: Result := 'ii';\r\n lInupiaq: Result := 'ik';\r\n lIdo: Result := 'id';\r\n lIcelandic: Result := 'is';\r\n lItalian: Result := 'it';\r\n lInuktitut: Result := 'iu';\r\n lJapanese: Result := 'ja';\r\n lJavanese: Result := 'jv';\r\n lGeorgian: Result := 'ka';\r\n lKongo: Result := 'kg';\r\n lKikuyu: Result := 'ki';\r\n lKuanyama: Result := 'kj';\r\n lKazakh: Result := 'kk';\r\n lKalaallisut: Result := 'kl';\r\n lCentralKhmer: Result := 'km';\r\n lKannada: Result := 'kn';\r\n lKorean: Result := 'ko';\r\n lKanuri: Result := 'kr';\r\n lKashmiri: Result := 'ks';\r\n lKurdish: Result := 'ku';\r\n lKomi: Result := 'kv';\r\n lCornish: Result := 'kw';\r\n lKirghiz: Result := 'ky';\r\n lLatin: Result := 'la';\r\n lLuxembourgish: Result := 'lb';\r\n lGanda: Result := 'lg';\r\n lLimburgan: Result := 'li';\r\n lLingala: Result := 'ln';\r\n lLao: Result := 'lo';\r\n lLithuanian: Result := 'lt';\r\n lLubaKatanga: Result := 'lu';\r\n lLatvian: Result := 'lv';\r\n lMalagasy: Result := 'mg';\r\n lMarshallese: Result := 'mh';\r\n lMaori: Result := 'mi';\r\n lMacedonian: Result := 'mk';\r\n lMalayalam: Result := 'ml';\r\n lMongolian: Result := 'mn';\r\n lMarathi: Result := 'mr';\r\n lMalay: Result := 'ms';\r\n lMaltese: Result := 'mt';\r\n lBurmese: Result := 'my';\r\n lNauru: Result := 'na';\r\n lNdebele: Result := 'nb';\r\n lNepali: Result := 'nd';\r\n lNdonga: Result := 'ng';\r\n lDutch: Result := 'nl';\r\n lNorwegian: Result := 'no';\r\n lNavajo: Result := 'nv';\r\n lChichewa: Result := 'ny';\r\n lOccitan: Result := 'oc';\r\n lOjibwa: Result := 'oj';\r\n lOromo: Result := 'om';\r\n lOriya: Result := 'or';\r\n lOssetian: Result := 'os';\r\n lPanjabi: Result := 'pa';\r\n lPali: Result := 'pi';\r\n lPolish: Result := 'pl';\r\n lPushto: Result := 'ps';\r\n lPortuguese: Result := 'pt';\r\n lQuechua: Result := 'qu';\r\n lRomansh: Result := 'rm';\r\n lRundi: Result := 'rn';\r\n lRomanian: Result := 'ro';\r\n lRussian: Result := 'ru';\r\n lKinyarwanda: Result := 'rw';\r\n lSanskrit: Result := 'sa';\r\n lSardinian: Result := 'sc';\r\n lSindhi: Result := 'sd';\r\n lNorthernSami: Result := 'se';\r\n lSango: Result := 'sg';\r\n lSinhala: Result := 'si';\r\n lSlovak: Result := 'sk';\r\n lSlovenian: Result := 'sl';\r\n lSamoan: Result := 'sm';\r\n lShona: Result := 'sn';\r\n lSomali: Result := 'so';\r\n lAlbanian: Result := 'sq';\r\n lSerbian: Result := 'sr';\r\n lSwati: Result := 'ss';\r\n lSotho: Result := 'st';\r\n lSundanese: Result := 'su';\r\n lSwedish: Result := 'sv';\r\n lSwahili: Result := 'sw';\r\n lTamil: Result := 'ta';\r\n lTelugu: Result := 'te';\r\n lTajik: Result := 'tg';\r\n lThai: Result := 'th';\r\n lTigrinya: Result := 'ti';\r\n lTurkmen: Result := 'tk';\r\n lTagalog: Result := 'tl';\r\n lTswana: Result := 'tn';\r\n lTonga: Result := 'to';\r\n lTurkish: Result := 'tr';\r\n lTsonga: Result := 'ts';\r\n lTatar: Result := 'tt';\r\n lTwi: Result := 'tw';\r\n lTahitian: Result := 'ty';\r\n lUighur: Result := 'ug';\r\n lUkrainian: Result := 'uk';\r\n lUrdu: Result := 'ur';\r\n lUzbek: Result := 'uz';\r\n lVenda: Result := 've';\r\n lVietnamese: Result := 'vi';\r\n lWalloon: Result := 'wa';\r\n lWolof: Result := 'wo';\r\n lXhosa: Result := 'xh';\r\n lYiddish: Result := 'yi';\r\n lYoruba: Result := 'yo';\r\n lZhuang: Result := 'za';\r\n lChinese: Result := 'zh';\r\n lZulu: Result := 'zu';\r\n end;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.ExtCtrls;\r\n\r\n{$modeswitch externalclass}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, Types, WEBLib.Controls, WEBLib.StdCtrls, WEBLib.Graphics,\r\n Web;\r\n\r\ntype\r\n TCustomLinkLabel = class(TCustomLabel)\r\n private\r\n FDisplText: string;\r\n FCaption: string;\r\n FOnLinkClick: TLinkClickEvent;\r\n FWidthStyle: TSizeStyle;\r\n FHeightPercent: TPercentSize;\r\n FHeightStyle: TSizeStyle;\r\n FWidthPercent: TPercentSize;\r\n procedure SetHeightPercent(const Value: TPercentSize); reintroduce;\r\n procedure SetHeightStyle(const Value: TSizeStyle); reintroduce;\r\n procedure SetWidthPercent(const Value: TPercentSize); reintroduce;\r\n procedure SetWidthStyle(const Value: TSizeStyle); reintroduce;\r\n protected\r\n function GetOuterWidth: integer; override;\r\n function GetOuterHeight: integer; override;\r\n function GetDisplayText: string; override;\r\n\r\n procedure SetCaption(AValue: string); override;\r\n procedure BindEvents; override;\r\n function DoLinkClick(Event: TJSMouseEvent): boolean;\r\n property Caption;\r\n public\r\n constructor Create(AOwner: TComponent); overload; override;\r\n published\r\n property Align;\r\n property Alignment;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property Color;\r\n property EllipsisPosition;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Font;\r\n property Height;\r\n property Hint;\r\n property Layout;\r\n property Left;\r\n property Margins;\r\n property ShowHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property WordWrap;\r\n\r\n property HeightStyle: TSizeStyle read FHeightStyle write SetHeightStyle default ssAbsolute;\r\n property WidthStyle: TSizeStyle read FWidthStyle write SetWidthStyle default ssAbsolute;\r\n property HeightPercent: TPercentSize read FHeightPercent write SetHeightPercent default 100;\r\n property WidthPercent: TPercentSize read FWidthPercent write SetWidthPercent default 100;\r\n\r\n property OnClick;\r\n property OnDblClick;\r\n property OnLinkClick: TLinkClickEvent read FOnLinkClick write FOnLinkClick;\r\n end;\r\n\r\n TLinkLabel = class(TCustomLinkLabel)\r\n published\r\n property Caption;\r\n end;\r\n\r\n TWebLinkLabel = class(TLinkLabel);\r\n\r\n TTrackBar = class(TCustomInput)\r\n private\r\n FMax: integer;\r\n FMin: integer;\r\n FPosition: integer;\r\n FOnChange: TNotifyEvent;\r\n protected\r\n function GetElementInputHandle: TJSHTMLInputElement;\r\n function GetInputType: string; override;\r\n function DoHandleChange(Event: TEventListenerEvent): Boolean;\r\n procedure BindEvents; override;\r\n procedure SetMax(AValue: integer);\r\n procedure SetMin(AValue: integer);\r\n procedure SetPosition(AValue: integer);\r\n function GetPosition: integer;\r\n procedure DoUpdate;\r\n procedure Change; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n property ElementInputHandle: TJSHTMLInputElement read GetElementInputHandle;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Height;\r\n property Left;\r\n property Margins;\r\n property Max: integer read FMax write SetMax;\r\n property Min: integer read FMin write SetMin;\r\n property Position: integer read GetPosition write SetPosition;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TWebTrackBar = class(TTrackBar);\r\n\r\n TTimer = class(TCustomControl)\r\n private\r\n FInterval: integer;\r\n FTimerID: integer;\r\n FOnTimer: TNotifyEvent;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure SetEnabled(Value: Boolean); override;\r\n procedure SetInterval(AValue: integer);\r\n\r\n procedure DoTimer;\r\n procedure DoUpdateTimer;\r\n procedure DoClearTimer;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property Enabled;\r\n property Interval: integer read FInterval write SetInterval;\r\n property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;\r\n end;\r\n\r\n TWebTimer = class(TTimer);\r\n\r\n TGeolocationEvent = procedure(Sender: TObject; Lat,Lon,Alt:double) of object;\r\n\r\n TGeoLocation = class(TCustomControl)\r\n private\r\n FOnGeolocation: TGeolocationEvent;\r\n protected\r\n procedure DoHandleGeolocation(APosition: TJSPosition);\r\n public\r\n function HasGeolocation: boolean;\r\n procedure GetGeolocation;\r\n published\r\n property OnGeolocation: TGeolocationEvent read FOnGeolocation write FOnGeolocation;\r\n end;\r\n\r\n TWebGeoLocation = class(TGeoLocation);\r\n\r\n TPaintBox = class(TGraphicControl)\r\n private\r\n FOnPaint: TNotifyEvent;\r\n protected\r\n procedure Paint; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Height;\r\n property Left;\r\n property Margins;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseMove;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;\r\n property OnTouchStart;\r\n property OnTouchMove;\r\n property OnTouchEnd;\r\n end;\r\n\r\n TWebPaintBox = class(TPaintBox);\r\n\r\n TURLPicture = class(TPersistent)\r\n private\r\n FOnChange: TNotifyEvent;\r\n FFilename: string;\r\n protected\r\n public\r\n procedure LoadFromFile(AFileName: string);\r\n property Filename: string read FFilename;\r\n published\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TCustomImageControl = class(TCustomControl)\r\n private\r\n FURL: string;\r\n FPicture: TURLPicture;\r\n FAutoSize: boolean;\r\n procedure SetURL(AURL: string);\r\n protected\r\n function HandleDoDrag(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragEnd(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragExit(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragOver(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragStart(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDrop(aEvent: TJSDragEvent): boolean; virtual;\r\n\r\n procedure SetPicture(const Value: TURLPicture);\r\n procedure PictureChanged(Sender: TObject);\r\n procedure BindEvents; override;\r\n function CreateElement: TJSElement; override;\r\n property Picture: TURLPicture read FPicture write SetPicture;\r\n property URL: string read FURL write SetURL;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize: boolean read FAutoSize write FAutoSize;\r\n property Hint;\r\n property ShowHint;\r\n property Visible;\r\n end;\r\n\r\n TImageControl = class(TCustomImageControl)\r\n published\r\n property Picture;\r\n property URL;\r\n end;\r\n\r\n TWebImageControl = class(TImageControl);\r\n\r\n TCustomPanel = class(TCustomControl)\r\n private\r\n FAutoSize: Boolean;\r\n FCaption: string;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure SetBorderStyle(AValue: TBorderStyle); override;\r\n procedure SetAutoSize(AValue: boolean);\r\n procedure UpdateElementVisual; override;\r\n property AutoSize: boolean read FAutoSize write SetAutoSize;\r\n property Caption: string read FCaption write FCaption;\r\n public\r\n procedure CreateInitialize; override;\r\n end;\r\n\r\n TPanel = class(TCustomPanel)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoSize;\r\n property BorderColor;\r\n property BorderStyle;\r\n property Caption;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property ShowHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n end;\r\n\r\n TDivPanel = class(TPanel)\r\n protected\r\n function CreateElement: TJSElement; override;\r\n end;\r\n\r\n TWebPanel = class(TPanel);\r\n\r\n TCustomGroupBox = class(TCustomControl)\r\n private\r\n FCaption: string;\r\n FCaptionSpan: TJSHTMLElement;\r\n FControlSpan: TJSHTMLElement;\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElementData; override;\r\n procedure UpdateElementVisual; override;\r\n property Caption: string read FCaption write FCaption;\r\n public\r\n procedure CreateInitialize; override;\r\n end;\r\n\r\n TGroupBox = class(TCustomGroupBox)\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property Caption;\r\n property Color;\r\n property ElementClassName;\r\n property ElementID;\r\n property Enabled;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property ShowHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n end;\r\n\r\n TWebGroupBox = class(TGroupBox);\r\n\r\n TScrollBox = class(TCustomPanel)\r\n private\r\n FAutoScroll: boolean;\r\n function GetScrollLeft: integer;\r\n function GetScrollTop: integer;\r\n procedure SetScrollLeft(const Value: integer);\r\n procedure SetScrollTop(const Value: integer);\r\n protected\r\n procedure UpdateElement; override;\r\n procedure SetAutoScroll(AValue: boolean);\r\n public\r\n procedure CreateInitialize; override;\r\n property ScrollLeft: integer read GetScrollLeft write SetScrollLeft;\r\n property ScrollTop: integer read GetScrollTop write SetScrollTop;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoScroll: boolean read FAutoScroll write SetAutoScroll;\r\n property BorderStyle;\r\n property ElementClassName;\r\n property ElementID;\r\n property Height;\r\n property Hint;\r\n property Left;\r\n property ShowHint;\r\n property Top;\r\n property Visible;\r\n property Width;\r\n property OnClick;\r\n property OnDblClick;\r\n end;\r\n\r\n TWebScrollBox = class(TScrollBox);\r\n\r\n TCustomDragControl = class(TCustomControl)\r\n private\r\n FText: string;\r\n procedure SetText(const AValue: string);\r\n protected\r\n function HandleDoDrag(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragEnd(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragExit(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragOver(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDragStart(aEvent: TJSDragEvent): boolean; virtual;\r\n function HandleDoDrop(aEvent: TJSDragEvent): boolean; virtual;\r\n\r\n procedure BindEvents; override;\r\n procedure Paint; override;\r\n published\r\n property Text: string read FText write SetText;\r\n end;\r\n\r\n TSplitter = class(TCustomControl)\r\n private\r\n FLayer: TJSElement;\r\n FFirstMove: boolean;\r\n FSplitControl: TControl;\r\n FSizing: boolean;\r\n FSizingX,FSizingY: double;\r\n FOriginalWidth,FOriginalHeight: integer;\r\n FGripColor: TColor;\r\n FOnMoved: TNotifyEvent;\r\n FOnMove: TNotifyEvent;\r\n procedure SetGripColor(const Value: TColor);\r\n protected\r\n function HandleDocDoMouseMove(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleDocDoMouseUp(Event: TJSMouseEvent): Boolean; virtual;\r\n procedure DoMouseEnter; override;\r\n\r\n procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;\r\n procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;\r\n procedure Paint; override;\r\n public\r\n procedure CreateInitialize; override;\r\n published\r\n property GripColor: TColor read FGripColor write SetGripColor;\r\n property OnClick;\r\n property OnMove: TNotifyEvent read FOnMove write FOnMove;\r\n property OnMoved: TNotifyEvent read FOnMoved write FOnMoved;\r\n end;\r\n\r\n TWebSplitter = class(TSplitter);\r\n\r\n TVerticalAlignment = (vaTop, vaCenter, vaBottom);\r\n TGridPanelExpandStyle = (esAddRows, esAddColumns);\r\n\r\n TGridPanelRow = class(TCollectionItem)\r\n private\r\n FSizeStyle: TSizeStyle;\r\n FValue: integer;\r\n FMarginBottom: integer;\r\n FMarginTop: integer;\r\n FAlignment: TVerticalAlignment;\r\n FElementClassName: string;\r\n protected\r\n function HeightAttribute: string;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Alignment: TVerticalAlignment read FAlignment write FAlignment;\r\n property ElementClassName: string read FElementClassName write FElementClassName;\r\n property MarginTop: integer read FMarginTop write FMarginTop;\r\n property MarginBottom: integer read FMarginBottom write FMarginBottom;\r\n property SizeStyle: TSizeStyle read FSizeStyle write FSizeStyle;\r\n property Value: integer read FValue write FValue;\r\n end;\r\n\r\n TGridPanelRows = class(TOwnedCollection)\r\n private\r\n function GetItem(Index: integer): TGridPanelRow; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TGridPanelRow); reintroduce;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TGridPanelRow; reintroduce;\r\n function Insert(Index: integer): TGridPanelRow; reintroduce;\r\n property Items[Index: integer]: TGridPanelRow read GetItem write SetItem;\r\n end;\r\n\r\n TGridPanelColumn = class(TCollectionItem)\r\n private\r\n FSizeStyle: TSizeStyle;\r\n FValue: integer;\r\n FMarginLeft: integer;\r\n FAlignment: TAlignment;\r\n FMarginRight: integer;\r\n FElementClassName: string;\r\n protected\r\n function WidthAttribute: string;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Alignment: TAlignment read FAlignment write FAlignment;\r\n property ElementClassName: string read FElementClassName write FElementClassName;\r\n property MarginLeft: integer read FMarginLeft write FMarginLeft;\r\n property MarginRight: integer read FMarginRight write FMarginRight;\r\n property SizeStyle: TSizeStyle read FSizeStyle write FSizeStyle;\r\n property Value: integer read FValue write FValue;\r\n end;\r\n\r\n TGridPanelColumns = class(TOwnedCollection)\r\n private\r\n function GetItem(Index: integer): TGridPanelColumn; reintroduce;\r\n procedure SetItem(Index: integer; const Value: TGridPanelColumn); reintroduce;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TGridPanelColumn; reintroduce;\r\n function Insert(Index: integer): TGridPanelColumn; reintroduce;\r\n property Items[Index: integer]: TGridPanelColumn read GetItem write SetItem;\r\n end;\r\n\r\n TControlCollectionItem = class(TCollectionItem)\r\n private\r\n FControl: TWinControl;\r\n FRow: integer;\r\n FColumn: integer;\r\n\r\n published\r\n property Column: integer read FColumn write FColumn;\r\n property Row: integer read FRow write FRow;\r\n property Control: TWinControl read FControl write FControl;\r\n end;\r\n\r\n TControlCollection = class(TOwnedCollection)\r\n private\r\n function GetItem(Index: Integer): TControlCollectionItem; reintroduce;\r\n procedure SetItem(Index: Integer; const Value: TControlCollectionItem); reintroduce;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n function Add: TControlCollectionItem; reintroduce;\r\n function Insert(Index: Integer): TControlCollectionItem; reintroduce;\r\n property Items[Index: Integer]: TControlCollectionItem read GetItem write SetItem;\r\n end;\r\n\r\n TGridPanel = class(TCustomControl)\r\n private\r\n FUpdateTable: boolean;\r\n FRowCollection: TGridPanelRows;\r\n FColumnCollection: TGridPanelColumns;\r\n FControlCollection: TControlCollection;\r\n FGridLineWidth: integer;\r\n FGridLineColor: TColor;\r\n FExpandStyle: TGridPanelExpandStyle;\r\n procedure SetColumnCollection(const Value: TGridPanelColumns);\r\n procedure SetRowCollection(const Value: TGridPanelRows);\r\n procedure SetControlCollection(const Value: TControlCollection);\r\n protected\r\n function CreateTable: TJSElement; virtual;\r\n procedure UpdateTable;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property ControlCollection: TControlCollection read FControlCollection write SetControlCollection;\r\n property ColumnCollection: TGridPanelColumns read FColumnCollection write SetColumnCollection;\r\n property ExpandStyle: TGridPanelExpandStyle read FExpandStyle write FExpandStyle;\r\n property GridLineWidth: integer read FGridLineWidth write FGridLineWidth;\r\n property GridLineColor: TColor read FGridLineColor write FGridLineColor;\r\n property RowCollection: TGridPanelRows read FRowCollection write SetRowCollection;\r\n property Visible;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseMove;\r\n property OnMouseDown;\r\n property OnMouseUp;\r\n end;\r\n\r\n TWebGridPanel = class(TGridPanel);\r\n\r\n TMultiMediaType = (mtVideo, mtAudio);\r\n\r\n TMultiMediaVolume = 0..100;\r\n\r\n TMultimediaPlayer = class(TCustomControl)\r\n private\r\n FURL: string;\r\n FMultimediaType: TMultimediaType;\r\n FAutoPlay: boolean;\r\n FControls: boolean;\r\n FMuted: boolean;\r\n FLoop: boolean;\r\n FVolume: TMultiMediaVolume;\r\n FPlaybackRate: double;\r\n procedure SetAutoPlay(const Value: boolean);\r\n procedure SetControls(const Value: boolean);\r\n procedure SetMuted(const Value: boolean);\r\n procedure SetLoop(const Value: boolean);\r\n procedure SetURL(const Value: string);\r\n procedure SetVolume(const Value: TMultiMediaVolume);\r\n function GetCurrentTime: double;\r\n procedure SetCurrentTime(const Value: double);\r\n function GetDuration: double;\r\n function GetEnded: boolean;\r\n function GetPaused: boolean;\r\n procedure SetPlaybackRate(const Value: double);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure Play;\r\n procedure Pause;\r\n procedure ReLoad;\r\n property CurrentTime: double read GetCurrentTime write SetCurrentTime;\r\n property Duration: double read GetDuration;\r\n property Ended: boolean read GetEnded;\r\n property Paused: boolean read GetPaused;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property AutoPlay: boolean read FAutoPlay write SetAutoPlay;\r\n property Controls: boolean read FControls write SetControls;\r\n property Loop: boolean read FLoop write SetLoop;\r\n property MultimediaType: TMultimediaType read FMultiMediaType write FMultiMediaType;\r\n property Muted: boolean read FMuted write SetMuted;\r\n property PlaybackRate: double read FPlaybackRate write SetPlaybackRate;\r\n property URL: string read FURL write SetURL;\r\n property Volume: TMultiMediaVolume read FVolume write SetVolume;\r\n property Visible;\r\n end;\r\n\r\n TWebMultiMediaPlayer = class(TMultiMediaPlayer);\r\n\r\n THTMLContainer = class(TCustomControl)\r\n private\r\n FHTML: TStringList;\r\n FScrollStyle: TScrollStyle;\r\n procedure SetHTML(const Value: TStringList);\r\n protected\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n procedure HTMLChanged(Sender: TObject); virtual;\r\n public\r\n constructor Create(AOwner: TComponent); reintroduce;\r\n destructor Destroy; override;\r\n published\r\n property Align;\r\n property AlignWithMargins;\r\n property Anchors;\r\n property HTML: TStringList read FHTML write SetHTML;\r\n property ScrollStyle: TScrollStyle read FScrollStyle write FScrollStyle;\r\n property Visible;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnMouseDown;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n end;\r\n\r\n TWebHTMLContainer = class(THTMLContainer);\r\n\r\n\r\nimplementation\r\n\r\nvar\r\n geolocation : TJSGeoLocation; external name 'navigator.geolocation';\r\n\r\n\r\n{ TCustomLinkLabel }\r\n\r\nprocedure TCustomLinkLabel.SetCaption(AValue: string);\r\nvar\r\n iopen, iopena, iopeni, iopenend, iopenendt, iclose: integer;\r\n scaption, shref, stext, sanchor, sid, stype: string;\r\n anchor, span, contentelement: TJSElement;\r\nbegin\r\n FCaption := AValue;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n contentelement := ContentHandle;\r\n\r\n if ElementID <> '' then\r\n contentelement := document.getElementById(ElementID);\r\n\r\n\r\n contentelement.innerHTML := '';\r\n\r\n scaption := FCaption;\r\n\r\n sanchor := ' 0) or (pos(sid, scaption) > 0)) then\r\n begin\r\n while (Pos(sanchor, scaption) > 0) or (Pos(sid, scaption) > 0) do\r\n begin\r\n //find first link in string\r\n iopena := pos(sanchor, scaption);\r\n iopeni := pos(sid, scaption);\r\n\r\n if ((iopena < iopeni) or (iopeni <= 0)) and (iopena > 0) then\r\n begin\r\n stype := '#url#';\r\n iopen := iopena + length(sanchor);\r\n end\r\n else\r\n begin\r\n stype := '#id#';\r\n iopen := iopeni + length(sid);\r\n end;\r\n\r\n iopenend := pos('\">', scaption);\r\n iopenendt := pos('\" ', scaption);\r\n if (iopenendt > 0) and (iopenendt < iopenend) then\r\n iopenend := iopenendt;\r\n\r\n iclose := pos('', scaption);\r\n shref := copy(scaption, iopen, iopenend - iopen);\r\n\r\n iopenend := pos('\">', scaption);\r\n iclose := pos('', scaption);\r\n stext := copy(scaption, iopenend + 2, iclose - (iopenend + 2));\r\n\r\n //add prefix text\r\n span := document.createElement('SPAN');\r\n span.innerHTML := copy(scaption, 0, iopen);\r\n contentelement.appendChild(span);\r\n\r\n //add link\r\n anchor := document.createElement('A');\r\n anchor['href'] := '#';\r\n anchor['id'] := stype + shref;\r\n anchor.innerHTML := stext;\r\n TJSHTMLElement(anchor).onclick := DoLinkClick;\r\n contentelement.appendChild(anchor);\r\n\r\n //remove prefix + link\r\n Delete(scaption, 1, Pos('', scaption) + 3);\r\n end;\r\n\r\n //suffix text\r\n span := document.createElement('SPAN');\r\n span.innerHTML := scaption;\r\n contentelement.appendChild(span);\r\n FDisplText := scaption;\r\n end\r\n else\r\n begin\r\n FDisplText := StringReplace(AValue, '> <', '> <', [rfReplaceAll]);\r\n contentelement.innerHTML := FDisplText;\r\n end;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetHeightPercent(const Value: TPercentSize);\r\nbegin\r\n FHeightPercent := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetHeightStyle(const Value: TSizeStyle);\r\nbegin\r\n FHeightStyle := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetWidthPercent(const Value: TPercentSize);\r\nbegin\r\n FWidthPercent := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.SetWidthStyle(const Value: TSizeStyle);\r\nbegin\r\n FWidthStyle := Value;\r\nend;\r\n\r\nprocedure TCustomLinkLabel.BindEvents;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nconstructor TCustomLinkLabel.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FWidthStyle := ssAbsolute;\r\n FWidthPercent := 100;\r\n FHeightStyle := ssAbsolute;\r\n FHeightPercent := 100;\r\n Transparent := false;\r\nend;\r\n\r\nfunction TCustomLinkLabel.DoLinkClick(Event: TJSMouseEvent): boolean;\r\nvar\r\n slink, stype, svalue: string;\r\n ltype: TSysLinkType;\r\nbegin\r\n svalue := event.target['id'];\r\n stype := '#url#';\r\n ltype := sltURL;\r\n\r\n if not (pos(stype, svalue) > 0) then\r\n begin\r\n stype := '#id#';\r\n ltype := sltID;\r\n end;\r\n\r\n slink := StringReplace(svalue, stype, '', []);\r\n\r\n if Assigned(FOnLinkClick) then\r\n FOnLinkClick(Self, slink, ltype);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomLinkLabel.GetDisplayText: string;\r\nbegin\r\n Result := FDisplText;\r\nend;\r\n\r\nfunction TCustomLinkLabel.GetOuterHeight: integer;\r\nbegin\r\n Result := Height;\r\n if AutoSize then\r\n Result := Result + 4;\r\nend;\r\n\r\nfunction TCustomLinkLabel.GetOuterWidth: integer;\r\nbegin\r\n Result := Width;\r\n if AutoSize then\r\n Result := Result + 4;\r\nend;\r\n\r\n{ TTrackBar }\r\n\r\nfunction TTrackBar.GetElementInputHandle: TJSHTMLInputElement;\r\nbegin\r\n Result := TJSHTMLInputElement(Container);\r\nend;\r\n\r\nfunction TTrackBar.GetInputType: string;\r\nbegin\r\n Result := 'range';\r\nend;\r\n\r\nprocedure TTrackBar.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nfunction TTrackBar.DoHandleChange(Event: TEventListenerEvent): Boolean;\r\nbegin\r\n Change;\r\n Result := True;\r\nend;\r\n\r\nprocedure TTrackBar.BindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.oninput := DoHandleChange;\r\n end;\r\nend;\r\n\r\nprocedure TTrackBar.CreateInitialize;\r\nbegin\r\n inherited;\r\n FMax := 100;\r\n FMin := 0;\r\n FPosition := 0;\r\nend;\r\n\r\nprocedure TTrackBar.SetMax(AValue: integer);\r\nbegin\r\n FMax := AValue;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TTrackBar.SetMin(AValue: integer);\r\nbegin\r\n FMin := AValue;\r\n DoUpdate;\r\nend;\r\n\r\nprocedure TTrackBar.DoUpdate;\r\nbegin\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n Container['max'] := IntToStr(FMax);\r\n Container['min'] := IntToStr(FMin);\r\n Container['value'] := IntToStr(FPosition);\r\nend;\r\n\r\nprocedure TTrackBar.SetPosition(AValue: integer);\r\nbegin\r\n FPosition := AValue;\r\n DoUpdate;\r\nend;\r\n\r\nfunction TTrackBar.GetPosition: integer;\r\nvar\r\n s: string;\r\nbegin\r\n Result := FPosition;\r\n\r\n if not Assigned(Container) then\r\n Exit;\r\n\r\n s := TJSHTMLInputElement(Container).value;\r\n if (s <> '') then\r\n Result := StrToInt(s);\r\nend;\r\n\r\n{ TTimer }\r\n\r\nprocedure TTimer.CreateInitialize;\r\nbegin\r\n inherited;\r\n FInterval := 1000;\r\n FTimerID := -1;\r\n Enabled := True;\r\nend;\r\n\r\nfunction TTimer.CreateElement: TJSElement;\r\nbegin\r\n Result := nil;\r\n DoUpdateTimer;\r\nend;\r\n\r\nprocedure TTimer.SetEnabled(Value: boolean);\r\nbegin\r\n inherited SetEnabled(Value);\r\n DoUpdateTimer;\r\nend;\r\n\r\nprocedure TTimer.SetInterval(AValue: integer);\r\nbegin\r\n FInterval := AValue;\r\n DoUpdateTimer;\r\nend;\r\n\r\nprocedure TTimer.DoTimer;\r\nbegin\r\n if Assigned(FOnTimer) then\r\n FOnTimer(Self);\r\nend;\r\n\r\nprocedure TTimer.DoClearTimer;\r\nbegin\r\n window.ClearInterval(FTimerID);\r\nend;\r\n\r\nprocedure TTimer.DoUpdateTimer;\r\nbegin\r\n DoClearTimer;\r\n\r\n if Enabled then\r\n FTimerID := window.setInterval(@DoTimer, FInterval);\r\nend;\r\n\r\n{ TPaintBox }\r\n\r\nprocedure TPaintBox.Paint;\r\nbegin\r\n inherited;\r\n if Assigned(OnPaint) then\r\n OnPaint(Self);\r\nend;\r\n\r\n{ TScrollBox }\r\n\r\nprocedure TScrollBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAutoScroll := true;\r\nend;\r\n\r\nprocedure TScrollBox.UpdateElement;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) and not IsUpdating then\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'auto');\r\n ElementHandle.style.setProperty('display', 'inline-block');\r\n end;\r\nend;\r\n\r\nfunction TScrollBox.GetScrollLeft: integer;\r\nbegin\r\n Result := ElementHandle.scrollLeft;\r\nend;\r\n\r\nfunction TScrollBox.GetScrollTop: integer;\r\nbegin\r\n Result := ElementHandle.scrollTop;\r\nend;\r\n\r\nprocedure TScrollBox.SetAutoScroll(AValue: boolean);\r\nbegin\r\n FAutoScroll := AValue;\r\nend;\r\n\r\nprocedure TScrollBox.SetScrollLeft(const Value: integer);\r\nbegin\r\n ElementHandle.scrollLeft := Value;\r\nend;\r\n\r\nprocedure TScrollBox.SetScrollTop(const Value: integer);\r\nbegin\r\n ElementHandle.scrollTop := Value;\r\nend;\r\n\r\n{ TCustomImageControl }\r\n\r\nprocedure TCustomImageControl.BindEvents;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n Container['draggable'] := 'true';\r\n Container['droppable'] := 'true';\r\n ElementHandle.ondrag := HandleDoDrag;\r\n ElementHandle.ondragend := HandleDoDragEnd;\r\n ElementHandle.ondragexit := HandleDoDragExit;\r\n ElementHandle.ondragover := HandleDoDragOver;\r\n ElementHandle.ondragstart := HandleDoDragStart;\r\n ElementHandle.ondrop := HandleDoDrop;\r\n end;\r\nend;\r\n\r\nprocedure TCustomImageControl.CreateInitialize;\r\nbegin\r\n inherited;\r\n FPicture := TURLPicture.Create;\r\n FPicture.OnChange := PictureChanged;\r\n Color := clNone;\r\n TabStop := false;\r\nend;\r\n\r\ndestructor TCustomImageControl.Destroy;\r\nbegin\r\n FPicture.Free;\r\n inherited Destroy;\r\nend;\r\n\r\n\r\nfunction TCustomImageControl.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('IMG');\r\nend;\r\n\r\nfunction TCustomImageControl.HandleDoDrag(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n //\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomImageControl.HandleDoDragEnd(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n //\r\n Result := true;\r\nend;\r\n\r\n\r\nfunction TCustomImageControl.HandleDoDragExit(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n //\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomImageControl.HandleDoDragOver(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n //\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomImageControl.HandleDoDragStart(aEvent: TJSDragEvent): boolean;\r\nvar\r\n obj: TDragObject;\r\n\r\nbegin\r\n AEvent.dataTransfer.effectAllowed := 'copy';\r\n AEvent.dataTransfer.dropEffect := 'copy';\r\n AEvent.dataTransfer.setData('text', 'Hello World');\r\n\r\n DoStartDrag(obj);\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomImageControl.HandleDoDrop(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n DragDrop(nil, aEvent.clientX, aEvent.clientY);\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomImageControl.SetURL(AURL: string);\r\nbegin\r\n Container['src'] := AURL;\r\nend;\r\n\r\nprocedure TCustomImageControl.SetPicture(const Value: TURLPicture);\r\nbegin\r\n FPicture.Assign(Value);\r\nend;\r\n\r\nprocedure TCustomImageControl.PictureChanged(Sender: TObject);\r\nbegin\r\n SetURL(Picture.FileName);\r\nend;\r\n\r\n{ TCustomDragControl }\r\n\r\nprocedure TCustomDragControl.BindEvents;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n Container['draggable'] := 'true';\r\n ElementHandle.ondragend := HandleDoDragEnd;\r\n ElementHandle.ondragexit := HandleDoDragExit;\r\n ElementHandle.ondragover := HandleDoDragOver;\r\n ElementHandle.ondragstart := HandleDoDragStart;\r\n ElementHandle.ondrop := HandleDoDrop;\r\n end;\r\nend;\r\n\r\nfunction TCustomDragControl.HandleDoDrag(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n //OutputDebugString('do drag');\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomDragControl.HandleDoDragEnd(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n DoEndDrag(Self, aEvent.clientX, aEvent.clientY);\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomDragControl.HandleDoDragExit(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n //OutputDebugString('do drag exit');\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomDragControl.HandleDoDragOver(aEvent: TJSDragEvent): boolean;\r\nvar\r\n Accept: boolean;\r\nbegin\r\n aEvent.preventDefault();\r\n //OutputDebugString('do drag over');\r\n Accept := true;\r\n DragOver(Self, aEvent.clientX, aEvent.clientY, dsDragMove, Accept);\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomDragControl.HandleDoDragStart(aEvent: TJSDragEvent): boolean;\r\nvar\r\n obj: TDragObject;\r\nbegin\r\n aEvent.dataTransfer.setData('text', Text);\r\n DoStartDrag(obj);\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomDragControl.HandleDoDrop(aEvent: TJSDragEvent): boolean;\r\nbegin\r\n aEvent.preventDefault();\r\n Text := aEvent.dataTransfer.getData('text');\r\n DragDrop(Self, aEvent.clientX, aEvent.clientY);\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomDragControl.Paint;\r\nbegin\r\n Canvas.Pen.Color := clRed;\r\n Canvas.Pen.Width := 1;\r\n Canvas.Pen.Style := psSolid;\r\n Canvas.Brush.Style := bsSolid;\r\n Canvas.Brush.Color := clYellow;\r\n Canvas.Rectangle(ClientRect);\r\n\r\n Canvas.TextOut(10,10,FText);\r\nend;\r\n\r\nprocedure TCustomDragControl.SetText(const AValue: string);\r\nbegin\r\n if (FText <> AValue) then\r\n begin\r\n FText := AValue;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\n{ TSplitter }\r\n\r\nprocedure TSplitter.CreateInitialize;\r\n begin\r\n inherited;\r\n Cursor := crHSplit;\r\n Width := 6;\r\n Height := 100;\r\n Align := alLeft;\r\n FSplitControl := nil;\r\n GripColor := clWhite;\r\n end;\r\n\r\n procedure TSplitter.Paint;\r\n var\r\n xofs,dx: integer;\r\n yofs,dy: integer;\r\n i: integer;\r\n begin\r\n Canvas.Brush.Color := Color;\r\n Canvas.Pen.Color := Color;\r\n Canvas.Brush.Style := bsSolid;\r\n Canvas.Rectangle(ClientRect);\r\n\r\n if (Align in [alLeft, alRight]) then\r\n begin\r\n dx := 0;\r\n dy := 6;\r\n yofs := (Height div 2) - 9;\r\n xofs := (Width div 2);\r\n end;\r\n\r\n if (Align in [alTop, alBottom]) then\r\n begin\r\n dx := 6;\r\n dy := 0;\r\n xofs := (Width div 2) - 9;\r\n yofs := (Height div 2) - 1;\r\n end;\r\n\r\n Canvas.Brush.Color := GripColor;\r\n Canvas.Pen.Color := GripColor;\r\n\r\n for i := 0 to 2 do\r\n begin\r\n Canvas.Rectangle(xofs, yofs, xofs + 2, yofs + 2);\r\n xofs := xofs + dx;\r\n yofs := yofs + dy;\r\n end;\r\n end;\r\n\r\nprocedure TSplitter.SetGripColor(const Value: TColor);\r\nbegin\r\n if (FGripColor <> Value) then\r\n begin\r\n FGripColor := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TSplitter.MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);\r\nbegin\r\n inherited;\r\n FSizing := false;\r\n FSplitControl := nil;\r\n ReleaseCapture;\r\nend;\r\n\r\nprocedure TSplitter.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);\r\nvar\r\n r,rc: TRect;\r\n i: integer;\r\n c: TControl;\r\n eh: TJSHTMLElement;\r\nbegin\r\n inherited;\r\n\r\n FSizing := true;\r\n\r\n r := Rect(Left, Top, Left + Width, Top + Height);\r\n\r\n if Assigned(Parent) then\r\n begin\r\n for i := 0 to Parent.ControlCount - 1 do\r\n begin\r\n c := Parent.Controls[i];\r\n\r\n if (c.Align = Align) and (c <> Self) then\r\n begin\r\n rc := Rect(c.Left, c.Top, c.Left + c.Width, c.Top + c.Height);\r\n\r\n //OutputDebugString(c.GetID+':'+inttostr(rc.Right)+':'+inttostr(r.Left));\r\n\r\n if (Align = alLeft) and (rc.Right - r.Left < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalWidth := FSplitControl.Width;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('left:'+c.GetID);\r\n end;\r\n\r\n if (Align = alRight) and (rc.Left - r.Right < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalWidth := FSplitControl.Width;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('left:'+c.GetID);\r\n end;\r\n\r\n if (Align = alTop) and (rc.Bottom - r.Top < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalHeight := FSplitControl.Height;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('top:'+c.GetID);\r\n end;\r\n\r\n if (Align = alBottom) and (rc.Top - r.Bottom < 4) then\r\n begin\r\n FSplitControl := c;\r\n FOriginalHeight := FSplitControl.Height;\r\n FSizing := true;\r\n FSizingX := X;\r\n FSizingY := Y;\r\n break;\r\n //OutputDebugString('top:'+c.GetID);\r\n end;\r\n\r\n end;\r\n end;\r\n end;\r\n\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\n\r\n if (Align in [alLeft, alRight]) then\r\n eh.style.setProperty('cursor', 'col-resize');\r\n\r\n if (Align in [alTop, alBottom]) then\r\n eh.style.setProperty('cursor', 'row-resize');\r\n\r\n FFirstMove := true;\r\n\r\n eh.addEventListener('mousemove',@HandleDocDoMouseMove);\r\n eh.addEventListener('mouseup',@HandleDocDoMouseUp);\r\n\r\n //Capture;\r\nend;\r\n\r\n\r\nprocedure TSplitter.DoMouseEnter;\r\nbegin\r\n inherited;\r\n if (Align in [alLeft, alRight]) then\r\n Cursor := crHSplit;\r\n\r\n if (Align in [alTop, alBottom]) then\r\n Cursor := crVSplit;\r\nend;\r\n\r\nfunction TSplitter.HandleDocDoMouseMove(Event: TJSMouseEvent): Boolean;\r\nvar\r\n dx,dy: integer;\r\nbegin\r\n\r\n if FSizing and Assigned(FSplitControl) then\r\n begin\r\n if FFirstMove then\r\n begin\r\n FSizingX := Event.clientX;\r\n FSizingY := Event.clientY;\r\n FFirstMove := false;\r\n end\r\n else\r\n begin\r\n dx := Round(Event.clientX - FSizingX);\r\n dy := Round(Event.clientY - FSizingY);\r\n\r\n if Align = alLeft then\r\n FSplitControl.Width := FOriginalWidth + dx;\r\n\r\n if Align = alRight then\r\n FSplitControl.Width := FOriginalWidth - dx;\r\n\r\n if Align = alTop then\r\n FSplitControl.Height := FOriginalHeight + dy;\r\n\r\n if Align = alBottom then\r\n FSplitControl.Height := FOriginalHeight - dy;\r\n\r\n DoRealign;\r\n\r\n if Assigned(OnMove) then\r\n OnMove(Self);\r\n\r\n end;\r\n end;\r\n Result := true;\r\nend;\r\n\r\nfunction TSplitter.HandleDocDoMouseUp(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n FSizing := false;\r\n FSplitControl := nil;\r\n FFirstMove := true;\r\n FLayer.parentNode.removeChild(FLayer);\r\n Result := true;\r\n if Assigned(OnMoved) then\r\n OnMoved(Self);\r\nend;\r\n\r\n{ TDivPanel }\r\n\r\nfunction TDivPanel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\n{ TCustomPanel }\r\n\r\nprocedure TCustomPanel.CreateInitialize;\r\nbegin\r\n inherited;\r\n FAutoSize := False;\r\n Color := clBtnFace;\r\n TabStop := False;\r\n CustomBorder := true;\r\nend;\r\n\r\nfunction TCustomPanel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\nprocedure TCustomPanel.SetAutoSize(AValue: boolean);\r\nbegin\r\n if FAutoSize <> AValue then\r\n begin\r\n FAutoSize := AValue;\r\n if FAutoSize then\r\n begin\r\n Width := -1;\r\n Height := -1;\r\n end;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomPanel.SetBorderStyle(AValue: TBorderStyle);\r\nbegin\r\n inherited;\r\n UpdateElement\r\nend;\r\n\r\nprocedure TCustomPanel.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if AutoSize then\r\n begin\r\n ElementHandle.style.setProperty('overflow', '');\r\n ElementHandle.style.setProperty('white-space', 'normal');\r\n ElementHandle.style.setProperty('display', 'inline');\r\n end\r\n else\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'hidden');\r\n ElementHandle.style.setProperty('white-space', 'nowrap');\r\n ElementHandle.style.setProperty('display', 'inline-block');\r\n end;\r\n (*\r\n if BorderStyle = bsSingle then\r\n begin\r\n ElementHandle.style.setProperty('border-style', 'solid');\r\n ElementHandle.style.setProperty('border-width', '1px');\r\n ElementHandle.style.setProperty('border-color', 'lightgray');\r\n end\r\n else\r\n begin\r\n ElementHandle.style.setProperty('border-style', 'none');\r\n ElementHandle.style.setProperty('border-width', '');\r\n ElementHandle.style.setProperty('border-color', '');\r\n end;\r\n *)\r\n ElementHandle.style.setProperty('background-color', ColorToHTML(Color));\r\n end;\r\nend;\r\n\r\n\r\n{ TURLPicture }\r\n\r\nprocedure TURLPicture.LoadFromFile(AFileName: string);\r\nbegin\r\n FFilename := AFileName;\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\n\r\n{ TGeoLocation }\r\n\r\nprocedure TGeoLocation.DoHandleGeolocation(APosition: TJSPosition);\r\nbegin\r\n if Assigned(OnGeolocation) then\r\n OnGeolocation(Self, APosition.Coords.Latitude, APosition.Coords.Longitude, APosition.Coords.Altitude);\r\nend;\r\n\r\nprocedure TGeoLocation.GetGeolocation;\r\nbegin\r\n if Assigned(geolocation) then\r\n begin\r\n geolocation.getCurrentPosition(TJSGeoLocationCallback(@DoHandleGeoLocation));\r\n end;\r\nend;\r\n\r\nfunction TGeoLocation.HasGeolocation: boolean;\r\nbegin\r\n Result := Assigned(geolocation);\r\nend;\r\n\r\n{ TGridPanelRows }\r\n\r\nfunction TGridPanelRows.Add: TGridPanelRow;\r\nbegin\r\n Result := TGridPanelRow(inherited Add);\r\nend;\r\n\r\nconstructor TGridPanelRows.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TGridPanelRow);\r\nend;\r\n\r\nfunction TGridPanelRows.GetItem(Index: integer): TGridPanelRow;\r\nbegin\r\n Result := TGridPanelRow(inherited Items[Index]);\r\nend;\r\n\r\nfunction TGridPanelRows.Insert(Index: integer): TGridPanelRow;\r\nbegin\r\n Result := TGridPanelRow(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TGridPanelRows.SetItem(Index: integer; const Value: TGridPanelRow);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TGridPanelColumns }\r\n\r\nfunction TGridPanelColumns.Add: TGridPanelColumn;\r\nbegin\r\n Result := TGridPanelColumn(inherited Add);\r\nend;\r\n\r\nconstructor TGridPanelColumns.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TGridPanelColumn);\r\nend;\r\n\r\nfunction TGridPanelColumns.GetItem(Index: integer): TGridPanelColumn;\r\nbegin\r\n Result := TGridPanelColumn(inherited Items[Index]);\r\nend;\r\n\r\nfunction TGridPanelColumns.Insert(Index: integer): TGridPanelColumn;\r\nbegin\r\n Result := TGridPanelColumn(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TGridPanelColumns.SetItem(Index: integer;\r\n const Value: TGridPanelColumn);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TGridPanel }\r\n\r\nfunction TGridPanel.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\nend;\r\n\r\nprocedure TGridPanel.CreateInitialize;\r\nbegin\r\n inherited;\r\n FUpdateTable := true;\r\n FRowCollection := TGridPanelRows.Create(Self);\r\n FColumnCollection := TGridPanelColumns.Create(Self);\r\n FControlCollection := TControlCollection.Create(Self);\r\nend;\r\n\r\nfunction TGridPanel.CreateTable: TJSElement;\r\nvar\r\n tbl,tblbody,row,cell: TJSElement;\r\n i,j: integer;\r\n ps: string;\r\nbegin\r\n tbl := document.createElement('table');\r\n\r\n tbl.setAttribute('width','100%');\r\n tbl.setAttribute('height','100%');\r\n\r\n if ElementClassName <> '' then\r\n tbl.setAttribute('class', ElementClassName);\r\n\r\n if (GridLineColor <> clNone) and (GridLineWidth > 0) then\r\n ps := IntToStr(GridLineWidth)+'px solid '+ ColorToHTML(GridLineColor)\r\n else\r\n ps := '0px';\r\n\r\n TJSHTMLElement(tbl).style.setProperty('border', ps);\r\n TJSHTMLElement(tbl).style.setProperty('border-collapse','collapse');\r\n\r\n if (Color <> clNone) then\r\n TJSHTMLElement(tbl).style.setProperty('background-color', ColorToHTML(Color));\r\n\r\n tblBody := document.createElement('tbody');\r\n\r\n // cells creation\r\n for j := 0 to RowCollection.Count - 1 do\r\n begin\r\n row := document.createElement('tr');\r\n TJSHTMLElement(row).style.setProperty('border', ps);\r\n\r\n if RowCollection.Items[j].MarginTop <> 0 then\r\n TJSHTMLElement(row).style.setProperty('margin-top', IntToStr(RowCollection.Items[j].MarginTop));\r\n\r\n if RowCollection.Items[j].MarginBottom <> 0 then\r\n TJSHTMLElement(row).style.setProperty('margin-bottom', IntToStr(RowCollection.Items[j].MarginBottom));\r\n\r\n if (RowCollection.Items[j].ElementClassName <> '') then\r\n begin\r\n TJSHTMLElement(row).setAttribute('class', RowCollection.Items[j].ElementClassName);\r\n end;\r\n\r\n case RowCollection.Items[j].Alignment of\r\n vaCenter: TJSHTMLElement(row).setAttribute('valign','middle');\r\n vaBottom: TJSHTMLElement(row).setAttribute('valign','bottom');\r\n end;\r\n\r\n TJSHTMLElement(row).style.setProperty('border', ps);\r\n row.setAttribute('height', RowCollection.Items[j].HeightAttribute);\r\n\r\n for i := 0 to ColumnCollection.Count - 1 do\r\n begin\r\n cell := document.createElement('td');\r\n TJSHTMLElement(cell).style.setProperty('border', ps);\r\n\r\n if ColumnCollection.Items[i].MarginLeft <> 0 then\r\n TJSHTMLElement(cell).style.setProperty('margin-left', IntToStr(ColumnCollection.Items[i].MarginLeft));\r\n\r\n if ColumnCollection.Items[i].MarginRight <> 0 then\r\n TJSHTMLElement(cell).style.setProperty('margin-right', IntToStr(ColumnCollection.Items[i].MarginRight));\r\n\r\n if (ColumnCollection.Items[i].ElementClassName <> '') then\r\n begin\r\n TJSHTMLElement(cell).setAttribute('class', ColumnCollection.Items[i].ElementClassName);\r\n end;\r\n\r\n case ColumnCollection.Items[i].Alignment of\r\n taCenter: TJSHTMLElement(cell).setAttribute('align','center');\r\n taRightJustify: TJSHTMLElement(cell).setAttribute('align','right');\r\n end;\r\n\r\n cell.setAttribute('id', Name+'R'+IntToStr(j)+'C'+IntToStr(i));\r\n\r\n if j = 0 then\r\n begin\r\n cell.setAttribute('width',ColumnCollection.Items[i].WidthAttribute);\r\n end;\r\n\r\n //cellText := document.createTextNode('cell is row '+IntToStr(j)+', column '+IntToStr(i));\r\n //cell.appendChild(cellText);\r\n row.appendChild(cell);\r\n end;\r\n tblBody.appendChild(row);\r\n end;\r\n\r\n // append the inside the \r\n tbl.appendChild(tblBody);\r\n Result := tbl;\r\nend;\r\n\r\nprocedure TGridPanel.UpdateTable;\r\nvar\r\n i,j,k: integer;\r\n fragment: TJSDocumentFragment;\r\n ctrlid,destid: string;\r\n control: TWinControl;\r\n el: TJSElement;\r\n\r\nbegin\r\n i := 0;\r\n j := 0;\r\n\r\n for k := 0 to ControlCollection.Count - 1 do\r\n begin\r\n if Assigned(ControlCollection.Items[k].Control) then\r\n begin\r\n fragment := document.createDocumentFragment();\r\n control := ControlCollection.Items[k].Control;\r\n control.ControlPosition := cpRelative;\r\n ctrlid := control.GetID;\r\n\r\n if control.Align = alLeft then\r\n begin\r\n control.HeightStyle := ssPercent;\r\n control.Height := 100;\r\n if Assigned(control.ElementHandle) then\r\n TJSHTMLElement(control.ElementHandle).style.setProperty('float','left');\r\n end;\r\n\r\n if control.Align = alRight then\r\n begin\r\n control.HeightStyle := ssPercent;\r\n control.Height := 100;\r\n if Assigned(control.ElementHandle) then\r\n TJSHTMLElement(control.ElementHandle).style.setProperty('float','right');\r\n end;\r\n\r\n if (control.Align in [alTop, alBottom]) then\r\n begin\r\n control.WidthStyle := ssPercent;\r\n control.Width := 100;\r\n end;\r\n\r\n if control.Align = alClient then\r\n begin\r\n control.WidthStyle := ssPercent;\r\n control.HeightStyle := ssPercent;\r\n control.Width := 100;\r\n control.Height:= 100;\r\n end;\r\n\r\n fragment.appendChild(document.getElementById(ctrlid));\r\n\r\n destid := Name + 'R'+ inttostr(j) + 'C' + inttostr(i);\r\n\r\n inc(i);\r\n if i = ColumnCollection.Count then\r\n begin\r\n i := 0;\r\n inc(j);\r\n end;\r\n\r\n el := document.getElementById(destid);\r\n el.appendChild(fragment);\r\n\r\n if control.Align = alTop then\r\n TJSHTMLElement(el).style.setProperty('vertical-align','top');\r\n\r\n if control.Align = alBottom then\r\n TJSHTMLElement(el).style.setProperty('vertical-align','bottom');\r\n end;\r\n end;\r\nend;\r\n\r\ndestructor TGridPanel.Destroy;\r\nbegin\r\n FRowCollection.Free;\r\n FColumnCollection.Free;\r\n FControlCollection.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TGridPanel.SetColumnCollection(const Value: TGridPanelColumns);\r\nbegin\r\n FColumnCollection.Assign(Value);\r\nend;\r\n\r\nprocedure TGridPanel.SetControlCollection(const Value: TControlCollection);\r\nbegin\r\n FControlCollection.Assign(Value);\r\nend;\r\n\r\nprocedure TGridPanel.SetRowCollection(const Value: TGridPanelRows);\r\nbegin\r\n FRowCollection.Assign(Value);\r\nend;\r\n\r\nprocedure TGridPanel.UpdateElement;\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) and not IsUpdating then\r\n begin\r\n\r\n if FUpdateTable and Assigned(Container) then\r\n begin\r\n TJSElement(Container).appendChild(CreateTable);\r\n UpdateTable;\r\n FUpdateTable := false;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TGridPanelColumn }\r\n\r\nprocedure TGridPanelColumn.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TGridPanelColumn) then\r\n begin\r\n FAlignment := (Source as TGridPanelColumn).Alignment;\r\n FSizeStyle := (Source as TGridPanelColumn).SizeStyle;\r\n FElementClassName := (Source as TGridPanelColumn).ElementClassName;\r\n FValue := (Source as TGridPanelColumn).Value;\r\n FMarginLeft := (Source as TGridPanelColumn).MarginLeft;\r\n FMarginRight := (Source as TGridPanelColumn).MarginRight;\r\n end;\r\nend;\r\n\r\nfunction TGridPanelColumn.WidthAttribute: string;\r\nbegin\r\n Result := '';\r\n case SizeStyle of\r\n ssPercent: Result := IntTostr(Value)+'%';\r\n ssAbsolute: Result := IntTostr(Value)+'px';\r\n end;\r\nend;\r\n\r\n{ TGridPanelRow }\r\n\r\nprocedure TGridPanelRow.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TGridPanelRow) then\r\n begin\r\n FAlignment := (Source as TGridPanelRow).Alignment;\r\n FSizeStyle := (Source as TGridPanelRow).SizeStyle;\r\n FElementClassName := (Source as TGridPanelRow).ElementClassName;\r\n FValue := (Source as TGridPanelRow).Value;\r\n FMarginTop := (Source as TGridPanelRow).MarginTop;\r\n FMarginBottom := (Source as TGridPanelRow).MarginBottom;\r\n end;\r\nend;\r\n\r\nfunction TGridPanelRow.HeightAttribute: string;\r\nbegin\r\n Result := '';\r\n case SizeStyle of\r\n ssPercent: Result := IntTostr(Value)+'%';\r\n ssAbsolute: Result := IntTostr(Value)+'px';\r\n end;\r\nend;\r\n\r\n{ TControlCollection }\r\n\r\nfunction TControlCollection.Add: TControlCollectionItem;\r\nbegin\r\n Result := TControlCollectionItem(inherited Add);\r\nend;\r\n\r\nconstructor TControlCollection.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner, TControlCollectionItem);\r\nend;\r\n\r\nfunction TControlCollection.GetItem(Index: Integer): TControlCollectionItem;\r\nbegin\r\n Result := TControlCollectionItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TControlCollection.Insert(Index: Integer): TControlCollectionItem;\r\nbegin\r\n Result := TControlCollectionItem(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TControlCollection.SetItem(Index: Integer;\r\n const Value: TControlCollectionItem);\r\nbegin\r\n Items[Index] := Value;\r\nend;\r\n\r\n{ TWebMultimediaPlayer }\r\n\r\nfunction TMultimediaPlayer.CreateElement: TJSElement;\r\nvar\r\n src: TJSElement;\r\nbegin\r\n if MultimediaType = mtVideo then\r\n Result := document.createElement('VIDEO')\r\n else\r\n Result := document.createElement('AUDIO');\r\n\r\n src := document.createElement('SOURCE');\r\n Result.appendChild(src);\r\nend;\r\n\r\nprocedure TMultimediaPlayer.CreateInitialize;\r\nbegin\r\n inherited;\r\n FVolume := 100;\r\n FPlaybackRate := 1;\r\n FMuted := false;\r\n FAutoPlay := false;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetCurrentTime: double;\r\nvar\r\n el: TJSElement;\r\n i: double;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n i = el.currentTime;\r\n end;\r\n end;\r\n\r\n Result := i;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetDuration: double;\r\nvar\r\n el: TJSElement;\r\n i: double;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n i = el.duration;\r\n end;\r\n end;\r\n Result := i;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetEnded: boolean;\r\nvar\r\n el: TJSElement;\r\n e: boolean;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n e = el.ended;\r\n end;\r\n end;\r\n\r\n Result := e;\r\nend;\r\n\r\nfunction TMultimediaPlayer.GetPaused: boolean;\r\nvar\r\n el: TJSElement;\r\n e: boolean;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n e = el.paused;\r\n end;\r\n end;\r\n\r\n Result := e;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.Pause;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n begin\r\n asm\r\n el.pause();\r\n end;\r\n end;\r\n\r\nend;\r\n\r\nprocedure TMultimediaPlayer.Play;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n asm\r\n el.play();\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.ReLoad;\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n asm\r\n el.load();\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetAutoPlay(const Value: boolean);\r\nbegin\r\n if (FAutoPlay <> Value) then\r\n begin\r\n FAutoPlay := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetControls(const Value: boolean);\r\nbegin\r\n if (FControls <> Value) then\r\n begin\r\n FControls := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetCurrentTime(const Value: double);\r\nvar\r\n el: TJSElement;\r\nbegin\r\n el := ElementHandle;\r\n if Assigned(el) then\r\n asm\r\n el.currentTime = Value;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetLoop(const Value: boolean);\r\nbegin\r\n if (FLoop <> Value) then\r\n begin\r\n FLoop := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetMuted(const Value: boolean);\r\nbegin\r\n if (FMuted <> Value) then\r\n begin\r\n FMuted := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetPlaybackRate(const Value: double);\r\nbegin\r\n if (FPlaybackRate <> Value) then\r\n begin\r\n FPlaybackRate := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetURL(const Value: string);\r\nbegin\r\n if (FURL <> Value) then\r\n begin\r\n FURL := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TMultimediaPlayer.SetVolume(const Value: TMultiMediaVolume);\r\nbegin\r\n if (FVolume <> Value) then\r\n begin\r\n FVolume := Value;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TMultimediaPlayer.UpdateElement;\r\nvar\r\n el: TJSNode;\r\n vid: TJSElement;\r\n\r\n function booltoattr(b: boolean): string;\r\n begin\r\n if b then\r\n result := 'true'\r\n else\r\n result := 'false';\r\n end;\r\n\r\nbegin\r\n inherited;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n vid := TJSElement(ElementHandle);\r\n asm\r\n vid.controls = this.FControls;\r\n vid.playbackRate = this.FPlaybackRate;\r\n vid.muted = this.FMuted;\r\n end;\r\n\r\n //ElementHandle.setAttribute('controls',booltoattr(FControls));\r\n ElementHandle.setAttribute('autoplay',booltoattr(FAutoplay));\r\n ElementHandle.setAttribute('muted',booltoattr(FMuted));\r\n ElementHandle.setAttribute('volume',Format('%.2f',[FVolume/100]));\r\n\r\n el := ElementHandle.firstChild;\r\n if Assigned(el) then\r\n begin\r\n (el as TJSElement).setAttribute('src',url);\r\n (el as TJSElement).setAttribute('type','video/mp4');\r\n end;\r\n end;\r\nend;\r\n\r\n{$HINTS ON}\r\n\r\n{ TCustomGroupBox }\r\n\r\nfunction TCustomGroupBox.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('SPAN');\r\n\r\n FControlSpan := TJSHTMLElement(document.createElement('SPAN'));\r\n FCaptionSpan := TJSHTMLElement(document.createElement('SPAN'));\r\n\r\n Result.appendChild(FControlSpan);\r\n Result.appendChild(FCaptionSpan);\r\nend;\r\n\r\nprocedure TCustomGroupBox.CreateInitialize;\r\nbegin\r\n inherited;\r\n Color := clBtnFace;\r\nend;\r\n\r\nprocedure TCustomGroupBox.UpdateElementData;\r\nbegin\r\n inherited;\r\n if Assigned(FCaptionSpan) then\r\n begin\r\n FCaptionSpan.innerHTML := FCaption;\r\n end;\r\nend;\r\n\r\nprocedure TCustomGroupBox.UpdateElementVisual;\r\nbegin\r\n inherited;\r\n if Assigned(ElementHandle) then\r\n begin\r\n ElementHandle.style.setProperty('overflow', 'visible');\r\n\r\n ElementHandle.style.setProperty('white-space', 'nowrap');\r\n ElementHandle.style.setProperty('display', 'inline-block');\r\n\r\n ElementHandle.style.setProperty('webkit-user-select', 'none');\r\n ElementHandle.style.setProperty('moz-user-select', 'none');\r\n ElementHandle.style.setProperty('khtml-user-select', 'none');\r\n ElementHandle.style.setProperty('ms-user-select', 'none');\r\n ElementHandle.style.setProperty('user-select', 'none');\r\n\r\n ElementHandle.style.setProperty('background-color', ColorToHTML(Color));\r\n ElementHandle.style.setProperty('border-bottom','1px solid lightgray');\r\n\r\n FCaptionSpan.style.setProperty('left','8px');\r\n FCaptionSpan.style.setProperty('top','0px');\r\n FCaptionSpan.style.setProperty('position','absolute');\r\n FCaptionSpan.style.setProperty('background-color', ColorToHTML(Color));\r\n FCaptionSpan.style.setProperty('zindex','100');\r\n\r\n FControlSpan.style.setProperty('display','inline-block');\r\n FControlSpan.style.setProperty('width','100%');\r\n FControlSpan.style.setProperty('height','98%');\r\n FControlSpan.style.setProperty('margin-top','8px');\r\n FControlSpan.style.setProperty('border-style', 'solid');\r\n FControlSpan.style.setProperty('border-width', '1px');\r\n FControlSpan.style.setProperty('border-color', 'lightgray');\r\n FControlSpan.style.setProperty('background-color', ColorToHTML(Color));\r\n end;\r\nend;\r\n\r\n{ THTMLContainer }\r\n\r\nconstructor THTMLContainer.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n FHTML := TStringList.Create;\r\n FHTML.OnChange := HTMLChanged;\r\n FScrollStyle := ssBoth;\r\nend;\r\n\r\nfunction THTMLContainer.CreateElement: TJSElement;\r\nbegin\r\n Result := document.createElement('DIV');\r\nend;\r\n\r\ndestructor THTMLContainer.Destroy;\r\nbegin\r\n FHTML.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure THTMLContainer.HTMLChanged(Sender: TObject);\r\nbegin\r\n UpdateElement;\r\nend;\r\n\r\nprocedure THTMLContainer.SetHTML(const Value: TStringList);\r\nbegin\r\n FHTML.Assign(Value);\r\nend;\r\n\r\nprocedure THTMLContainer.UpdateElement;\r\nbegin\r\n inherited;\r\n if not IsUpdating and Assigned(ElementHandle) then\r\n begin\r\n Container.innerHTML := FHTML.Text;\r\n\r\n case ScrollStyle of\r\n ssBoth: ElementHandle.style.setProperty('overflow','scroll');\r\n ssNone: ElementHandle.style.setProperty('overflow','');\r\n ssVertical: ElementHandle.style.setProperty('overflow-y','scroll');\r\n ssHorizontal: ElementHandle.style.setProperty('overflow-x','scroll');\r\n end;\r\n\r\n end;\r\n\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.WebTools;\r\n\r\ninterface\r\n\r\nfunction DoubleToHTML(d: double): string;\r\n\r\nprocedure OutputDebugString(const s: string);\r\nfunction GetTickCount: longint;\r\nfunction GetQueryParam(AName: string): string;\r\nfunction HasQueryParam(AName: string; var AValue: string): boolean;\r\n\r\nfunction GetLocaleShortDateFormat(ALocale: string = ''): string;\r\nfunction GetLocaleLongDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nfunction GetLocaleShortDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nfunction GetLocaleLongMonthName(Month: integer; ALocale: string = ''): string;\r\nfunction GetLocaleShortMonthName(Month: integer; ALocale: string = ''): string;\r\nfunction GetLocaleDecimalSeparator: string;\r\nfunction GetBrowserLocale: string;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils;\r\n\r\nfunction DoubleToHTML(d: double): string;\r\nbegin\r\n Result := Format('%g',[d]);\r\n StringReplace(Result, ',','.',[rfReplaceAll]);\r\nend;\r\n\r\nprocedure OutputDebugString(const s: string);\r\nbegin\r\n asm\r\n console.log(s);\r\n end;\r\nend;\r\n\r\nfunction GetTickCount: longint;\r\nvar\r\n n: longint;\r\nbegin\r\n asm\r\n var d = new Date();\r\n n = d.getTime();\r\n end;\r\n\r\n Result := n;\r\nend;\r\n\r\nfunction HasQueryParam(AName: string; var AValue: string): boolean;\r\nvar\r\n found: boolean;\r\n s: string;\r\nbegin\r\n s := '';\r\n asm\r\n var query = window.location.search.substring(1);\r\n var res = \"\";\r\n found = false;\r\n var vars = query.split('&');\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split('=');\r\n if (decodeURIComponent(pair[0]) == AName) {\r\n res = decodeURIComponent(pair[1]);\r\n console.log(res);\r\n found = true;\r\n }\r\n }\r\n s = res;\r\n end;\r\n\r\n AValue := s;\r\n Result := found;\r\nend;\r\n\r\nfunction GetQueryParam(AName: string): string;\r\nvar\r\n res: string;\r\nbegin\r\n HasQueryParam(AName,res);\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction GetLocaleShortDateFormat(ALocale: string = ''): string;\r\nvar\r\n res: string;\r\n\r\nbegin\r\n asm\r\n var formats = {\r\n \"ar-SA\" : \"dd/MM/yy\",\r\n \"bg-BG\" : \"dd.M.yyyy\",\r\n \"ca-ES\" : \"dd/MM/yyyy\",\r\n \"zh-TW\" : \"yyyy/M/d\",\r\n \"cs-CZ\" : \"d.M.yyyy\",\r\n \"da-DK\" : \"dd-MM-yyyy\",\r\n \"de-DE\" : \"dd.MM.yyyy\",\r\n \"el-GR\" : \"d/M/yyyy\",\r\n \"en-US\" : \"M/d/yyyy\",\r\n \"fi-FI\" : \"d.M.yyyy\",\r\n \"fr-FR\" : \"dd/MM/yyyy\",\r\n \"he-IL\" : \"dd/MM/yyyy\",\r\n \"hu-HU\" : \"yyyy. MM. dd.\",\r\n \"is-IS\" : \"d.M.yyyy\",\r\n \"it-IT\" : \"dd/MM/yyyy\",\r\n \"ja-JP\" : \"yyyy/MM/dd\",\r\n \"ko-KR\" : \"yyyy-MM-dd\",\r\n \"nl-NL\" : \"d-M-yyyy\",\r\n \"nb-NO\" : \"dd.MM.yyyy\",\r\n \"pl-PL\" : \"yyyy-MM-dd\",\r\n \"pt-BR\" : \"d/M/yyyy\",\r\n \"ro-RO\" : \"dd.MM.yyyy\",\r\n \"ru-RU\" : \"dd.MM.yyyy\",\r\n \"hr-HR\" : \"d.M.yyyy\",\r\n \"sk-SK\" : \"d. M. yyyy\",\r\n \"sq-AL\" : \"yyyy-MM-dd\",\r\n \"sv-SE\" : \"yyyy-MM-dd\",\r\n \"th-TH\" : \"d/M/yyyy\",\r\n \"tr-TR\" : \"dd.MM.yyyy\",\r\n \"ur-PK\" : \"dd/MM/yyyy\",\r\n \"id-ID\" : \"dd/MM/yyyy\",\r\n \"uk-UA\" : \"dd.MM.yyyy\",\r\n \"be-BY\" : \"dd.MM.yyyy\",\r\n \"sl-SI\" : \"d.M.yyyy\",\r\n \"et-EE\" : \"d.MM.yyyy\",\r\n \"lv-LV\" : \"yyyy.MM.dd.\",\r\n \"lt-LT\" : \"yyyy.MM.dd\",\r\n \"fa-IR\" : \"MM/dd/yyyy\",\r\n \"vi-VN\" : \"dd/MM/yyyy\",\r\n \"hy-AM\" : \"dd.MM.yyyy\",\r\n \"az-Latn-AZ\" : \"dd.MM.yyyy\",\r\n \"eu-ES\" : \"yyyy/MM/dd\",\r\n \"mk-MK\" : \"dd.MM.yyyy\",\r\n \"af-ZA\" : \"yyyy/MM/dd\",\r\n \"ka-GE\" : \"dd.MM.yyyy\",\r\n \"fo-FO\" : \"dd-MM-yyyy\",\r\n \"hi-IN\" : \"dd-MM-yyyy\",\r\n \"ms-MY\" : \"dd/MM/yyyy\",\r\n \"kk-KZ\" : \"dd.MM.yyyy\",\r\n \"ky-KG\" : \"dd.MM.yy\",\r\n \"sw-KE\" : \"M/d/yyyy\",\r\n \"uz-Latn-UZ\" : \"dd/MM yyyy\",\r\n \"tt-RU\" : \"dd.MM.yyyy\",\r\n \"pa-IN\" : \"dd-MM-yy\",\r\n \"gu-IN\" : \"dd-MM-yy\",\r\n \"ta-IN\" : \"dd-MM-yyyy\",\r\n \"te-IN\" : \"dd-MM-yy\",\r\n \"kn-IN\" : \"dd-MM-yy\",\r\n \"mr-IN\" : \"dd-MM-yyyy\",\r\n \"sa-IN\" : \"dd-MM-yyyy\",\r\n \"mn-MN\" : \"yy.MM.dd\",\r\n \"gl-ES\" : \"dd/MM/yy\",\r\n \"kok-IN\" : \"dd-MM-yyyy\",\r\n \"syr-SY\" : \"dd/MM/yyyy\",\r\n \"dv-MV\" : \"dd/MM/yy\",\r\n \"ar-IQ\" : \"dd/MM/yyyy\",\r\n \"zh-CN\" : \"yyyy/M/d\",\r\n \"de-CH\" : \"dd.MM.yyyy\",\r\n \"en-GB\" : \"dd/MM/yyyy\",\r\n \"es-MX\" : \"dd/MM/yyyy\",\r\n \"fr-BE\" : \"d/MM/yyyy\",\r\n \"it-CH\" : \"dd.MM.yyyy\",\r\n \"nl-BE\" : \"d/MM/yyyy\",\r\n \"nn-NO\" : \"dd.MM.yyyy\",\r\n \"pt-PT\" : \"dd-MM-yyyy\",\r\n \"sr-Latn-CS\" : \"d.M.yyyy\",\r\n \"sv-FI\" : \"d.M.yyyy\",\r\n \"az-Cyrl-AZ\" : \"dd.MM.yyyy\",\r\n \"ms-BN\" : \"dd/MM/yyyy\",\r\n \"uz-Cyrl-UZ\" : \"dd.MM.yyyy\",\r\n \"ar-EG\" : \"dd/MM/yyyy\",\r\n \"zh-HK\" : \"d/M/yyyy\",\r\n \"de-AT\" : \"dd.MM.yyyy\",\r\n \"en-AU\" : \"d/MM/yyyy\",\r\n \"es-ES\" : \"dd/MM/yyyy\",\r\n \"fr-CA\" : \"yyyy-MM-dd\",\r\n \"sr-Cyrl-CS\" : \"d.M.yyyy\",\r\n \"ar-LY\" : \"dd/MM/yyyy\",\r\n \"zh-SG\" : \"d/M/yyyy\",\r\n \"de-LU\" : \"dd.MM.yyyy\",\r\n \"en-CA\" : \"dd/MM/yyyy\",\r\n \"es-GT\" : \"dd/MM/yyyy\",\r\n \"fr-CH\" : \"dd.MM.yyyy\",\r\n \"ar-DZ\" : \"dd-MM-yyyy\",\r\n \"zh-MO\" : \"d/M/yyyy\",\r\n \"de-LI\" : \"dd.MM.yyyy\",\r\n \"en-NZ\" : \"d/MM/yyyy\",\r\n \"es-CR\" : \"dd/MM/yyyy\",\r\n \"fr-LU\" : \"dd/MM/yyyy\",\r\n \"ar-MA\" : \"dd-MM-yyyy\",\r\n \"en-IE\" : \"dd/MM/yyyy\",\r\n \"es-PA\" : \"MM/dd/yyyy\",\r\n \"fr-MC\" : \"dd/MM/yyyy\",\r\n \"ar-TN\" : \"dd-MM-yyyy\",\r\n \"en-ZA\" : \"yyyy/MM/dd\",\r\n \"es-DO\" : \"dd/MM/yyyy\",\r\n \"ar-OM\" : \"dd/MM/yyyy\",\r\n \"en-JM\" : \"dd/MM/yyyy\",\r\n \"es-VE\" : \"dd/MM/yyyy\",\r\n \"ar-YE\" : \"dd/MM/yyyy\",\r\n \"en-029\" : \"MM/dd/yyyy\",\r\n \"es-CO\" : \"dd/MM/yyyy\",\r\n \"ar-SY\" : \"dd/MM/yyyy\",\r\n \"en-BZ\" : \"dd/MM/yyyy\",\r\n \"es-PE\" : \"dd/MM/yyyy\",\r\n \"ar-JO\" : \"dd/MM/yyyy\",\r\n \"en-TT\" : \"dd/MM/yyyy\",\r\n \"es-AR\" : \"dd/MM/yyyy\",\r\n \"ar-LB\" : \"dd/MM/yyyy\",\r\n \"en-ZW\" : \"M/d/yyyy\",\r\n \"es-EC\" : \"dd/MM/yyyy\",\r\n \"ar-KW\" : \"dd/MM/yyyy\",\r\n \"en-PH\" : \"M/d/yyyy\",\r\n \"es-CL\" : \"dd-MM-yyyy\",\r\n \"ar-AE\" : \"dd/MM/yyyy\",\r\n \"es-UY\" : \"dd/MM/yyyy\",\r\n \"ar-BH\" : \"dd/MM/yyyy\",\r\n \"es-PY\" : \"dd/MM/yyyy\",\r\n \"ar-QA\" : \"dd/MM/yyyy\",\r\n \"es-BO\" : \"dd/MM/yyyy\",\r\n \"es-SV\" : \"dd/MM/yyyy\",\r\n \"es-HN\" : \"dd/MM/yyyy\",\r\n \"es-NI\" : \"dd/MM/yyyy\",\r\n \"es-PR\" : \"dd/MM/yyyy\",\r\n \"am-ET\" : \"d/M/yyyy\",\r\n \"tzm-Latn-DZ\" : \"dd-MM-yyyy\",\r\n \"iu-Latn-CA\" : \"d/MM/yyyy\",\r\n \"sma-NO\" : \"dd.MM.yyyy\",\r\n \"mn-Mong-CN\" : \"yyyy/M/d\",\r\n \"gd-GB\" : \"dd/MM/yyyy\",\r\n \"en-MY\" : \"d/M/yyyy\",\r\n \"prs-AF\" : \"dd/MM/yy\",\r\n \"bn-BD\" : \"dd-MM-yy\",\r\n \"wo-SN\" : \"dd/MM/yyyy\",\r\n \"rw-RW\" : \"M/d/yyyy\",\r\n \"qut-GT\" : \"dd/MM/yyyy\",\r\n \"sah-RU\" : \"MM.dd.yyyy\",\r\n \"gsw-FR\" : \"dd/MM/yyyy\",\r\n \"co-FR\" : \"dd/MM/yyyy\",\r\n \"oc-FR\" : \"dd/MM/yyyy\",\r\n \"mi-NZ\" : \"dd/MM/yyyy\",\r\n \"ga-IE\" : \"dd/MM/yyyy\",\r\n \"se-SE\" : \"yyyy-MM-dd\",\r\n \"br-FR\" : \"dd/MM/yyyy\",\r\n \"smn-FI\" : \"d.M.yyyy\",\r\n \"moh-CA\" : \"M/d/yyyy\",\r\n \"arn-CL\" : \"dd-MM-yyyy\",\r\n \"ii-CN\" : \"yyyy/M/d\",\r\n \"dsb-DE\" : \"d. M. yyyy\",\r\n \"ig-NG\" : \"d/M/yyyy\",\r\n \"kl-GL\" : \"dd-MM-yyyy\",\r\n \"lb-LU\" : \"dd/MM/yyyy\",\r\n \"ba-RU\" : \"dd.MM.yy\",\r\n \"nso-ZA\" : \"yyyy/MM/dd\",\r\n \"quz-BO\" : \"dd/MM/yyyy\",\r\n \"yo-NG\" : \"d/M/yyyy\",\r\n \"ha-Latn-NG\" : \"d/M/yyyy\",\r\n \"fil-PH\" : \"M/d/yyyy\",\r\n \"ps-AF\" : \"dd/MM/yy\",\r\n \"fy-NL\" : \"d-M-yyyy\",\r\n \"ne-NP\" : \"M/d/yyyy\",\r\n \"se-NO\" : \"dd.MM.yyyy\",\r\n \"iu-Cans-CA\" : \"d/M/yyyy\",\r\n \"sr-Latn-RS\" : \"d.M.yyyy\",\r\n \"si-LK\" : \"yyyy-MM-dd\",\r\n \"sr-Cyrl-RS\" : \"d.M.yyyy\",\r\n \"lo-LA\" : \"dd/MM/yyyy\",\r\n \"km-KH\" : \"yyyy-MM-dd\",\r\n \"cy-GB\" : \"dd/MM/yyyy\",\r\n \"bo-CN\" : \"yyyy/M/d\",\r\n \"sms-FI\" : \"d.M.yyyy\",\r\n \"as-IN\" : \"dd-MM-yyyy\",\r\n \"ml-IN\" : \"dd-MM-yy\",\r\n \"en-IN\" : \"dd-MM-yyyy\",\r\n \"or-IN\" : \"dd-MM-yy\",\r\n \"bn-IN\" : \"dd-MM-yy\",\r\n \"tk-TM\" : \"dd.MM.yy\",\r\n \"bs-Latn-BA\" : \"d.M.yyyy\",\r\n \"mt-MT\" : \"dd/MM/yyyy\",\r\n \"sr-Cyrl-ME\" : \"d.M.yyyy\",\r\n \"se-FI\" : \"d.M.yyyy\",\r\n \"zu-ZA\" : \"yyyy/MM/dd\",\r\n \"xh-ZA\" : \"yyyy/MM/dd\",\r\n \"tn-ZA\" : \"yyyy/MM/dd\",\r\n \"hsb-DE\" : \"d. M. yyyy\",\r\n \"bs-Cyrl-BA\" : \"d.M.yyyy\",\r\n \"tg-Cyrl-TJ\" : \"dd.MM.yy\",\r\n \"sr-Latn-BA\" : \"d.M.yyyy\",\r\n \"smj-NO\" : \"dd.MM.yyyy\",\r\n \"rm-CH\" : \"dd/MM/yyyy\",\r\n \"smj-SE\" : \"yyyy-MM-dd\",\r\n \"quz-EC\" : \"dd/MM/yyyy\",\r\n \"quz-PE\" : \"dd/MM/yyyy\",\r\n \"hr-BA\" : \"d.M.yyyy.\",\r\n \"sr-Latn-ME\" : \"d.M.yyyy\",\r\n \"sma-SE\" : \"yyyy-MM-dd\",\r\n \"en-SG\" : \"d/M/yyyy\",\r\n \"ug-CN\" : \"yyyy-M-d\",\r\n \"sr-Cyrl-BA\" : \"d.M.yyyy\",\r\n \"es-US\" : \"M/d/yyyy\"\r\n };\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = formats[loc] || 'dd/MM/yyyy';\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleLongDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(Date.UTC(2017, 0, 1)); // Sunday\r\n baseDate.setDate(baseDate.getDate() + DayOfWeek - 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { weekday: 'long' });\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleShortDayName(DayOfWeek: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(Date.UTC(2017, 0, 1)); // Sunday\r\n baseDate.setDate(baseDate.getDate() + DayOfWeek - 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { weekday: 'short' });\r\n end;\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleLongMonthName(Month: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(Date.UTC(2017, 0, 1)); // January\r\n baseDate.setMonth(baseDate.getMonth() + Month - 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { month: 'long' });\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleShortMonthName(Month: integer; ALocale: string = ''): string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var baseDate = new Date(Date.UTC(2017, 0, 1)); // January\r\n baseDate.setMonth(baseDate.getMonth() + Month - 1);\r\n\r\n var loc = \"\";\r\n if (ALocale == '') { loc = navigator.language; }\r\n else { loc = ALocale; }\r\n\r\n res = baseDate.toLocaleDateString(loc, { month: 'short' });\r\n end;\r\n\r\n Result := res;\r\nend;\r\n\r\nfunction GetLocaleDecimalSeparator: string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n var n = 1.1;\r\n n = n.toLocaleString().substring(1, 2);\r\n res = n;\r\n end;\r\n Result := res;\r\nend;\r\n\r\n\r\nfunction GetBrowserLocale: string;\r\nvar\r\n res: string;\r\nbegin\r\n asm\r\n res = navigator.language\r\n end;\r\n Result := res;\r\nend;\r\n\r\n\r\n\r\nend.\r\n\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Dialogs;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Controls, Web, SysUtils, WEBLib.ExtCtrls, WebLib.WebTools;\r\n\r\ntype\r\n TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);\r\n TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,\r\n mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);\r\n TMsgDlgButtons = set of TMsgDlgBtn;\r\n\r\n TDialogResult = Integer;\r\n TDialogResultProc = reference to procedure(AValue: TDialogResult);\r\n\r\n TMessageDlg = class(TCustomControl)\r\n private\r\n FOpacity: double;\r\n FLayer: TJSElement;\r\n FDlg: TJSElement;\r\n FMessage: string;\r\n FMsgDlgType: TMSgDlgType;\r\n FOnButtonClick: TNotifyEvent;\r\n FOnClose: TNotifyEvent;\r\n FButtons: TMsgDlgButtons;\r\n FDialogProc: TDialogResultProc;\r\n FDialogResult: TDialogResult;\r\n protected\r\n procedure BindEvents; override;\r\n procedure SetDialogResult(const Value: TDialogResult);\r\n function CreateButton(Caption: string): TJSHTMLElement;\r\n function HandleButtonClick(Event: TJSMouseEvent): Boolean; virtual;\r\n function HandleKeyDown(Event: TJSKeyBoardEvent): Boolean; virtual;\r\n public\r\n procedure CreateInitialize; override;\r\n procedure Close;\r\n property DialogResult: TDialogResult read FDialogResult write SetDialogResult;\r\n procedure Show;\r\n function ShowDialog: Integer; overload; virtual;\r\n function ShowDialog(Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AProc: TDialogResultProc = nil): TDialogResult; overload; virtual;\r\n published\r\n property Opacity: double read FOpacity write FOpacity;\r\n\r\n property OnButtonClick: TNotifyEvent read FOnButtonClick write FOnButtonClick;\r\n property OnClose: TNotifyEvent read FOnClose write FOnClose;\r\n end;\r\n\r\n TWaitMessage = class(TCustomControl)\r\n private\r\n FLayer: TJSElement;\r\n FPicture: TURLPicture;\r\n FOpacity: double;\r\n procedure SetPicture(const Value: TURLPicture);\r\n public\r\n procedure CreateInitialize; override;\r\n destructor Destroy; override;\r\n\r\n procedure Show;\r\n procedure Hide;\r\n published\r\n property Opacity: double read FOpacity write FOpacity;\r\n property Picture: TURLPicture read FPicture write SetPicture;\r\n end;\r\n\r\n\r\nprocedure MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AResultProc: TDialogResultProc = nil);\r\nprocedure ShowMessage(const AMsg: string);\r\nfunction InputBox(const ACaption, APrompt, ADefault: string): string;\r\nfunction InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; overload;\r\nfunction Confirm(const Value: string): boolean;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Forms;\r\n\r\nvar\r\n WebLibDlg: TMessageDlg;\r\n\r\nprocedure ShowMessage(const AMsg: string);\r\nbegin\r\n asm\r\n alert(AMsg);\r\n end;\r\nend;\r\n\r\nfunction InputBox(const ACaption, APrompt, ADefault: string): string;\r\nvar\r\n retvalue: string;\r\nbegin\r\n//\r\n asm\r\n retvalue = prompt(APrompt, ADefault);\r\n if (retvalue == null) {\r\n retvalue = \"\";\r\n }\r\n end;\r\n\r\n Result := retvalue;\r\nend;\r\n\r\nfunction InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; overload;\r\nvar\r\n retvalue: boolean;\r\n s: string;\r\nbegin\r\n retvalue := true;\r\n s := Value;\r\n\r\n asm\r\n var text = s;\r\n s = prompt(APrompt, text);\r\n if (s == null) {\r\n retvalue = false;\r\n }\r\n end;\r\n\r\n if retvalue then\r\n Value := s;\r\n\r\n Result := retvalue;\r\nend;\r\n\r\nfunction Confirm(const Value: string): boolean;\r\nvar\r\n res: boolean;\r\nbegin\r\n asm\r\n res = confirm(Value);\r\n end;\r\n Result := res;\r\nend;\r\n\r\nprocedure MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AResultProc: TDialogResultProc = nil);\r\nbegin\r\n if not Assigned(WebLibDlg) then\r\n WebLibDlg := TMessageDlg.Create(nil);\r\n\r\n WebLibDlg.ShowDialog(Msg, DlgType, Buttons, AResultProc);\r\nend;\r\n\r\n{ TMessageDlg }\r\n\r\nprocedure TMessageDlg.CreateInitialize;\r\nbegin\r\n inherited;\r\n FOpacity := 0.2;\r\n FMessage := '';\r\n FMsgDlgType := mtInformation;\r\nend;\r\n\r\nprocedure TMessageDlg.BindEvents;\r\nbegin\r\n//\r\nend;\r\n\r\nfunction TMessageDlg.ShowDialog: integer;\r\nbegin\r\n Result := mrNone;\r\n Show;\r\nend;\r\n\r\nfunction TMessageDlg.ShowDialog(Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AProc: TDialogResultProc = nil): TDialogResult;\r\nbegin\r\n Result := mrNone;\r\n FButtons := Buttons;\r\n FMessage := Msg;\r\n FMsgDlgType := DlgType;\r\n FDialogProc := AProc;\r\n DialogResult := mrNone;\r\n Show;\r\nend;\r\n\r\nfunction TMessageDlg.CreateButton(Caption: string): TJSHTMLElement;\r\nbegin\r\n Result := TJSHTMLElement(document.createElement('BUTTON'));\r\n Result.innerHTML := Caption;\r\n Result.style.setProperty('width', '100px');\r\n Result.style.setProperty('margin-left', '5px');\r\n Result.id := Caption;\r\n Result.addEventListener('click', @HandleButtonClick);\r\n Result.addEventListener('keydown', @HandleKeyDown);\r\n\r\n asm\r\n setTimeout(function() {Result.focus();}, 1);\r\n end;\r\nend;\r\n\r\nprocedure TMessageDlg.Show;\r\nvar\r\n title, msg, icon, content, bar, edlg, eh, cancel: TJSHTMLElement;\r\n MsgSymbol, MsgColor, MsgTitle, BorderColor, BarBGColor, BarHeight, Padding: string;\r\nbegin\r\n Application.PushForm(Application.MainForm);\r\n\r\n Padding := '5';\r\n BarHeight := '26';\r\n BarBGColor := '#f1f1f1';\r\n BorderColor := '#ababab';\r\n MsgSymbol := 'error_outline';\r\n MsgColor := 'black';\r\n MsgTitle := '';\r\n\r\n case FMsgDlgType of\r\n mtWarning: begin MsgSymbol := 'warning'; MsgColor := 'orange'; MsgTitle := 'Warning'; end;\r\n mtError: begin MsgSymbol := 'cancel'; MsgColor := 'red'; MsgTitle := 'Error'; end;\r\n mtInformation: begin MsgSymbol := 'info'; MsgColor := 'blue'; MsgTitle := 'Information'; end;\r\n mtConfirmation: begin MsgSymbol := 'help'; MsgColor := 'blue'; MsgTitle := 'Confirm'; end;\r\n mtCustom: begin MsgSymbol := ''; MsgColor := ''; MsgTitle := 'Custom'; end;\r\n end;\r\n\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n FLayer['tabindex'] := '0';\r\n FLayer.addEventListener('keydown', @HandleKeyDown);\r\n\r\n FDlg := document.createElement('DIV');\r\n document.body.appendChild(FDlg);\r\n edlg := TJSHTMLElement(FDlg);\r\n edlg.style.setProperty('background-color', 'white');\r\n edlg.style.setProperty('cursor', 'default');\r\n edlg.style.setProperty('border', '1px solid ' + BorderColor);\r\n edlg.style.setProperty('position', 'fixed');\r\n edlg.style.setProperty('font-family', 'Arial');\r\n edlg.style.setProperty('font-size', '10pt');\r\n edlg.style.setProperty('min-width', '250px');\r\n edlg.style.setProperty('min-height', '125px');\r\n edlg.style.setProperty('max-width', '100%');\r\n edlg.style.setProperty('max-height', '100%');\r\n edlg.style.setProperty('top', '50%');\r\n edlg.style.setProperty('left', '50%');\r\n edlg.style.setProperty('transform', 'translate(-50%, -50%)');\r\n\r\n cancel := TJSHTMLElement(document.createElement('DIV'));\r\n cancel.innerHTML := 'clear';\r\n cancel.id := 'Cancel';\r\n cancel.style.setProperty('position', 'fixed');\r\n cancel.style.setProperty('top', '0');\r\n cancel.style.setProperty('right', '0');\r\n cancel.style.setProperty('padding', Padding + 'px');\r\n cancel.style.setProperty('height', BarHeight + 'px');\r\n cancel.style.setProperty('line-height', BarHeight + 'px');\r\n cancel.addEventListener('click', @HandleButtonClick);\r\n edlg.appendChild(cancel);\r\n\r\n title := TJSHTMLElement(document.createElement('DIV'));\r\n title.innerHTML := MsgTitle;\r\n title.style.setProperty('padding', Padding + 'px');\r\n title.style.setProperty('height', BarHeight + 'px');\r\n title.style.setProperty('line-height', BarHeight + 'px');\r\n title.style.setProperty('border-bottom', '1px solid ' + BorderColor);\r\n edlg.appendChild(title);\r\n\r\n msg := TJSHTMLElement(document.createElement('DIV'));\r\n msg.style.setProperty('padding', Padding + 'px');\r\n msg.style.setProperty('height', 'auto');\r\n msg.style.setProperty('min-height', '50px');\r\n msg.style.setProperty('border-bottom', '1px solid ' + BorderColor);\r\n\r\n if FMsgDlgType <> mtCustom then\r\n begin\r\n icon := TJSHTMLElement(document.createElement('DIV'));\r\n icon.innerHTML := '' + MsgSymbol + '';\r\n icon.style.setProperty('display', 'inline-block');\r\n icon.style.setProperty('float', 'left');\r\n icon.style.setProperty('padding-right', '15px');\r\n msg.appendChild(icon);\r\n end;\r\n\r\n content := TJSHTMLElement(document.createElement('DIV'));\r\n content.innerHTML := FMessage;\r\n content.style.setProperty('height','auto');\r\n content.style.setProperty('min-height','50px');\r\n content.style.setProperty('white-space','pre-wrap');\r\n\r\n msg.appendChild(content);\r\n\r\n edlg.appendChild(msg);\r\n\r\n bar := TJSHTMLElement(document.createElement('DIV'));\r\n bar.style.setProperty('background-color', BarBGColor);\r\n bar.style.setProperty('padding', Padding + 'px');\r\n bar.style.setProperty('min-height', BarHeight + 'px');\r\n bar.style.setProperty('height', 'auto');\r\n bar.style.setProperty('line-height', BarHeight + 'px');\r\n bar.style.setProperty('text-align', 'right');\r\n edlg.appendChild(bar);\r\n\r\n if FButtons = [] then\r\n bar.appendChild(CreateButton('OK'))\r\n else\r\n begin\r\n if mbYes in FButtons then\r\n bar.appendChild(CreateButton('Yes'));\r\n\r\n if mbNo in FButtons then\r\n bar.appendChild(CreateButton('No'));\r\n\r\n if mbOK in FButtons then\r\n bar.appendChild(CreateButton('OK'));\r\n\r\n if mbCancel in FButtons then\r\n bar.appendChild(CreateButton('Cancel'));\r\n\r\n if mbAbort in FButtons then\r\n bar.appendChild(CreateButton('Abort'));\r\n\r\n if mbRetry in FButtons then\r\n bar.appendChild(CreateButton('Retry'));\r\n\r\n if mbIgnore in FButtons then\r\n bar.appendChild(CreateButton('Ignore'));\r\n\r\n if mbAll in FButtons then\r\n bar.appendChild(CreateButton('All'));\r\n\r\n if mbNoToAll in FButtons then\r\n bar.appendChild(CreateButton('NoToAll'));\r\n\r\n if mbYesToAll in FButtons then\r\n bar.appendChild(CreateButton('YesToAll'));\r\n\r\n if mbHelp in FButtons then\r\n bar.appendChild(CreateButton('Help'));\r\n\r\n if mbClose in FButtons then\r\n bar.appendChild(CreateButton('Close'));\r\n end;\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.style.setProperty('background-color', 'black');\r\n eh.style.setProperty('opacity', DoubleToHTML(Opacity));\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\nend;\r\n\r\nprocedure TMessageDlg.SetDialogResult(const Value: TDialogResult);\r\nbegin\r\n FDialogResult := Value;\r\n if (FDialogResult <> mrNone) then\r\n Close;\r\nend;\r\n\r\nprocedure TMessageDlg.Close;\r\nbegin\r\n document.body.removeChild(FLayer);\r\n document.body.removeChild(FDlg);\r\n\r\n// Application.PopForm;\r\n\r\n if Assigned(OnClose) then\r\n OnClose(Self);\r\n\r\n if Assigned(FDialogProc) then\r\n FDialogProc(FDialogResult);\r\nend;\r\n\r\nfunction TMessageDlg.HandleButtonClick(Event: TJSMouseEvent): Boolean;\r\nvar\r\n id: string;\r\nbegin\r\n DialogResult := mrNone;\r\n\r\n id := event.target['id'];\r\n\r\n if id = 'Yes' then\r\n DialogResult := mrYes\r\n else if id = 'No' then\r\n DialogResult := mrNo\r\n else if id = 'OK' then\r\n DialogResult := mrOK\r\n else if id = 'Cancel' then\r\n DialogResult := mrCancel\r\n else if id = 'Abort' then\r\n DialogResult := mrAbort\r\n else if id = 'Retry' then\r\n DialogResult := mrRetry\r\n else if id = 'Ignore' then\r\n DialogResult := mrIgnore\r\n else if id = 'All' then\r\n DialogResult := mrAll\r\n else if id = 'NoToAll' then\r\n DialogResult := mrNoToAll\r\n else if id = 'YesToAll' then\r\n DialogResult := mrYesToAll\r\n else if id = 'Help' then\r\n DialogResult := mrHelp\r\n else if id = 'Close' then\r\n DialogResult := mrClose;\r\n\r\n if Assigned(OnButtonClick) then\r\n OnButtonClick(Self);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TMessageDlg.HandleKeyDown(Event: TJSKeyBoardEvent): Boolean;\r\nvar\r\n k: Word;\r\nbegin\r\n k := GetKeyCode(Event.Key);\r\n if not Assigned(k) then\r\n Exit;\r\n if k = VK_ESCAPE then\r\n DialogResult := mrCancel;\r\n Result := true;\r\nend;\r\n\r\n{ TWaitMessage }\r\n\r\nprocedure TWaitMessage.CreateInitialize;\r\nbegin\r\n inherited;\r\n FOpacity := 0.2;\r\n FPicture := TURLPicture.Create;\r\n\r\nend;\r\n\r\ndestructor TWaitMessage.Destroy;\r\nbegin\r\n FPicture.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TWaitMessage.Hide;\r\nbegin\r\n document.body.removeChild(FLayer);\r\nend;\r\n\r\nprocedure TWaitMessage.SetPicture(const Value: TURLPicture);\r\nbegin\r\n FPicture.Assign(Value);\r\nend;\r\n\r\nprocedure TWaitMessage.Show;\r\nvar\r\n eh,img,dv: TJSHTMLElement;\r\n el: TJSElement;\r\nbegin\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n FLayer['tabindex'] := '0';\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.style.setProperty('background-color', 'black');\r\n eh.style.setProperty('opacity', DoubleToHTML(Opacity));\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\n\r\n el := document.createElement('DIV');\r\n dv := TJSHTMLElement(el);\r\n FLayer.appendChild(el);\r\n dv.style.SetProperty('position','relative');\r\n dv.style.SetProperty('width','100%');\r\n dv.style.SetProperty('height','100%');\r\n\r\n el := document.createElement('IMG');\r\n img := TJSHTMLElement(el);\r\n dv.appendChild(img);\r\n img['src'] := FPicture.FileName;\r\n img.style.setProperty('position','absolute');\r\n img.style.setProperty('top', '0');\r\n img.style.setProperty('left', '0');\r\n img.style.setProperty('right', '0');\r\n img.style.setProperty('bottom', '0');\r\n img.style.setProperty('margin', 'auto');\r\nend;\r\n\r\ninitialization\r\n WebLibDlg := nil;\r\n\r\nend.","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.Forms;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, SysUtils, WEBLib.Graphics, WEBLib.Controls, WEBLib.Modules, WEBLib.Lang,\r\n Web\r\n {$IFDEF SINGLEINSTANCE}\r\n , JS, WEBLib.WebSocketClient\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n idOK = 1;\r\n idCancel = 2;\r\n idAbort = 3;\r\n idRetry = 4;\r\n idIgnore = 5;\r\n idYes = 6;\r\n idNo = 7;\r\n idClose = 8;\r\n idHelp = 9;\r\n idTryAgain = 10;\r\n idContinue = 11;\r\n mrNone = 0;\r\n mrOk = idOk;\r\n mrCancel = idCancel;\r\n mrAbort = idAbort;\r\n mrRetry = idRetry;\r\n mrIgnore = idIgnore;\r\n mrYes = idYes;\r\n mrNo = idNo;\r\n mrClose = idClose;\r\n mrHelp = idHelp;\r\n mrTryAgain = idTryAgain;\r\n mrContinue = idContinue;\r\n mrAll = mrContinue + 1;\r\n mrNoToAll = mrAll + 1;\r\n mrYesToAll = mrNoToAll + 1;\r\n\r\ntype\r\n TCustomForm = class;\r\n TCloseAction = (caNone, caHide, caFree, caMinimize);\r\n TModalResult = Integer;\r\n TFormStyle = (fsNormal, fsStayOnTop);\r\n TNavigationTarget = (ntBlank, ntPage);\r\n\r\n TOnPaintEvent = TNotifyEvent;\r\n TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;\r\n TCloseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;\r\n\r\n TModalResultProc = reference to procedure(AValue: TModalResult);\r\n TFormCreatedProc = reference to procedure(AForm: TObject);\r\n\r\n TWindowState = (wsNormal, wsMinimized, wsMaximized);\r\n\r\n TCustomForm = class(TWinControl)\r\n private\r\n FLayer: TJSElement;\r\n FPopup: Boolean;\r\n FFormFileName: string;\r\n FFormContent: string;\r\n FFormContainer: string;\r\n FFormElement: string;\r\n FFormStyle: TFormStyle;\r\n FOnCreate: TNotifyEvent;\r\n FOnResize: TNotifyEvent;\r\n FOnShow: TNotifyEvent;\r\n FModalResult: TModalResult;\r\n FOnPaint: TOnPaintEvent;\r\n FOnDeactivate: TNotifyEvent;\r\n FOnCloseQuery: TCloseQueryEvent;\r\n FOnClose: TCloseEvent;\r\n FModalProc: TModalResultProc;\r\n FCreatedProc: TFormCreatedProc;\r\n FWindowState: TWindowState;\r\n FCaption: string;\r\n FIsResizing: boolean;\r\n FOnScroll: TNotifyEvent;\r\n FOnUnload: TNotifyEvent;\r\n function DoResize(Event: TEventListenerEvent): boolean; virtual;\r\n function DoLoaded(Event: TEventListenerEvent): boolean; virtual;\r\n function DoScroll(Event: TEventListenerEvent): boolean; virtual;\r\n function DoUnload(Event: TEventListenerEvent): boolean; virtual;\r\n procedure SetModalResult(const Value: TModalResult);\r\n function GetFormStyle: TFormStyle;\r\n procedure SetFormStyle(const Value: TFormStyle);\r\n function GetCanvas: TCanvas;\r\n procedure SetCaption(const AValue: string);\r\n protected\r\n procedure Resize; reintroduce; virtual;\r\n procedure Loaded; override;\r\n procedure DoClose(var CloseAction: TCloseAction); virtual;\r\n procedure BindEvents; override;\r\n procedure UnbindEvents; override;\r\n procedure DoExit; override;\r\n procedure DoCreate; virtual;\r\n procedure DoShow; virtual;\r\n procedure Paint; virtual;\r\n function HandleDoClick(Event: TJSMouseEvent): Boolean; reintroduce; virtual;\r\n function GetWidth: Integer; override;\r\n function GetHeight: Integer; override;\r\n function GetLeft: Integer; override;\r\n function GetTop: Integer; override;\r\n function CreateElement: TJSElement; override;\r\n procedure UpdateElement; override;\r\n function ContainerElement: TJSElement; override;\r\n function FormContainerElement: TJSElement; virtual;\r\n function GetElementBindHandle: TJSEventTarget; override;\r\n function GetElementHandle: TJSHTMLElement; override;\r\n function CloseQuery: Boolean; virtual;\r\n procedure LoadDFMValues; virtual;\r\n procedure Init; virtual;\r\n property FormContent: string read FFormContent write FFormContent;\r\n property FormFileName: string read FFormFileName write FFormFileName;\r\n property WindowState: TWindowState read FWindowState write FWindowState;\r\n function IsFocused: Boolean; override;\r\n public\r\n procedure CreateInitialize; override;\r\n constructor Create(id: string); overload; override;\r\n constructor Create(AOwner: TComponent); overload; override;\r\n constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); overload; virtual;\r\n constructor CreateNew(AFileName: string); overload; virtual;\r\n constructor CreateNew; overload; virtual;\r\n constructor CreateNew(AProc: TFormCreatedProc); overload; virtual;\r\n constructor CreateNew(AElementID: string; AProc: TFormCreatedProc); overload; virtual;\r\n\r\n destructor Destroy; override;\r\n procedure Close; virtual;\r\n procedure PreventDefault; reintroduce;\r\n property ModalResult: TModalResult read FModalResult write SetModalResult;\r\n property Canvas: TCanvas read GetCanvas;\r\n procedure Show;\r\n function ShowModal: Integer; overload; virtual;\r\n function ShowModal(AProc: TModalResultProc): TModalResult; overload; virtual;\r\n property Caption: string read FCaption write SetCaption;\r\n property Color;\r\n property FormContainer: string read FFormContainer write FFormContainer;\r\n property FormStyle: TFormStyle read GetFormStyle write SetFormStyle;\r\n property IsResizing: boolean read FIsResizing;\r\n property Popup: boolean read FPopup write FPopup;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnClose: TCloseEvent read FOnClose write FOnClose;\r\n property OnCloseQuery: TCloseQueryEvent read FOnCloseQuery write FOnCloseQuery;\r\n property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;\r\n property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate;\r\n property OnPaint: TOnPaintEvent read FOnPaint write FOnPaint;\r\n property OnResize: TNotifyEvent read FOnResize write FOnResize;\r\n property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;\r\n property OnShow: TNotifyEvent read FOnShow write FOnShow;\r\n property OnUnload: TNotifyEvent read FOnUnload write FOnUnload;\r\n end;\r\n\r\n TFormClass = class of TForm;\r\n TForm = class(TCustomForm)\r\n published\r\n property Caption;\r\n property Color;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnResize;\r\n property OnShow;\r\n property OnScroll;\r\n property OnPaint;\r\n property FormStyle;\r\n property OnDeactivate;\r\n property OnClose;\r\n property OnCloseQuery;\r\n property OnTouchStart;\r\n property OnTouchMove;\r\n property OnTouchEnd;\r\n property OnUnload;\r\n end;\r\n TWebForm = TForm;\r\n\r\n TApplication = class(TControl)\r\n private\r\n FMainFormOnTaskBar: Boolean;\r\n FLastReq: TJSXMLHttpRequest;\r\n {$IFDEF SINGLEINSTANCE}\r\n FWebSocket: TSocketClient;\r\n {$ENDIF}\r\n FMainForm: TCustomForm;\r\n FFormStack: TList;\r\n FParameters: TStrings;\r\n FIsRedirect: boolean;\r\n FLanguage: TUILanguage;\r\n FOnImageCacheReady: TNotifyEvent;\r\n function DoFormLoad(Event: TEventListenerEvent): boolean;\r\n function DoFormAbort(Event: TEventListenerEvent): boolean;\r\n procedure SetLanguage(const Value: TUILanguage);\r\n {$IFDEF SINGLEINSTANCE}\r\n procedure DoGetDataReceived(Sender: TObject; Origin: string; Data: TJSObject);\r\n procedure DoGetConnected(Sender: TObject);\r\n {$ENDIF}\r\n protected\r\n function GetFormExtension: string;\r\n procedure ReloadForm;\r\n public\r\n procedure PushForm(AForm: TCustomForm);\r\n function PopForm: TCustomForm;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function CreateNewForm(AInstanceClass: TFormClass): TCustomForm;\r\n procedure CreateForm(AInstanceClass: TFormClass; var AReference); overload;\r\n procedure CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference); overload;\r\n procedure CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference; AProc: TFormCreatedProc); overload;\r\n procedure CreateForm(AInstanceClass: TDataModuleClass; var AReference); overload;\r\n procedure LoadForm(AForm: TCustomForm; AFormFile: string); virtual;\r\n procedure Initialize;\r\n procedure InitFormatSettings(const BrowserLocale: string);\r\n procedure Run;\r\n procedure Navigate(const AURL: string; ATarget: TNavigationTarget = ntBlank);\r\n property MainForm: TCustomForm read FMainForm;\r\n property MainFormOnTaskBar: boolean read FMainFormOnTaskBar write FMainFormOnTaskBar;\r\n property Parameters: TStrings read FParameters;\r\n property Language: TUILanguage read FLanguage write SetLanguage;\r\n property OnImageCacheReady: TNotifyEvent read FOnImageCacheReady write FOnImageCacheReady;\r\n end;\r\n\r\nfunction GetParentForm(AControl: TControl): TCustomForm;\r\nprocedure Log(v: JSValue); overload;\r\nprocedure Log(arr: array of JSValue); overload;\r\n\r\nvar\r\n Application: TApplication;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Dialogs, WEBLib.WebTools;\r\n\r\nconst\r\n cBodyTag = 'body';\r\n cHTMLExt = '.html';\r\n\r\nprocedure Log(v: JSValue);\r\nbegin\r\n asm\r\n console.log(v);\r\n end;\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure Log(arr: array of JSValue);\r\nvar\r\n i: integer;\r\n s,su: string;\r\nbegin\r\n s := '[';\r\n for i := 0 to length(arr) - 1 do\r\n begin\r\n asm\r\n function isPrimitive(test) {\r\n return (test !== Object(test));\r\n };\r\n\r\n if (isPrimitive(arr[i])) {\r\n var su = arr[i].toString();\r\n if (s != \"[\") { s = s + \",\"; }\r\n s = s + su;\r\n }\r\n else\r\n {\r\n console.log(arr[i]);\r\n if (s != \"[\") { s = s + \",\"; }\r\n s = s + \"#object\";\r\n }\r\n end;\r\n end;\r\n\r\n s := s + ']';\r\n\r\n log(s);\r\nend;\r\n{$HINTS ON}\r\n\r\nfunction GetParentForm(AControl: TControl): TCustomForm;\r\nvar\r\n FOwner: TComponent;\r\nbegin\r\n Result := nil;\r\n\r\n FOwner := AControl;\r\n\r\n while Assigned(FOwner) and not (FOwner is TCustomForm) do\r\n begin\r\n FOwner := FOwner.Owner;\r\n end;\r\n\r\n if Assigned(FOwner) and (FOwner is TCustomForm) then\r\n Result := (FOwner as TCustomForm);\r\nend;\r\n\r\n\r\n{ TCustomForm }\r\n\r\nprocedure TCustomForm.BindEvents;\r\nbegin\r\n inherited;\r\n TJSEventTarget(window).addEventListener('resize', @DoResize);\r\n TJSEventTarget(window).addEventListener('load', @DoLoaded);\r\n TJSEventTarget(document).addEventListener('scroll', @DoScroll);\r\n TJSEventTarget(window).addEventListener('unload', @DoUnload);\r\nend;\r\n\r\nprocedure ReleaseForm(AForm: TCustomForm);\r\nbegin\r\n AForm.Free;\r\n AForm := nil;\r\nend;\r\n\r\nprocedure TCustomForm.Close;\r\nvar\r\n lAction: TCloseAction;\r\nbegin\r\n if CloseQuery then\r\n begin\r\n ClearControls;\r\n UnbindEvents;\r\n\r\n lAction := caHide;\r\n\r\n if Assigned(OnClose) then\r\n OnClose(Self, lAction);\r\n\r\n if lAction <> caNone then\r\n begin\r\n if (FormFileName = '') then\r\n begin\r\n if Assigned(FLayer) then\r\n begin\r\n FormContainerElement.removeChild(FLayer);\r\n FLayer := nil;\r\n end;\r\n\r\n if FFormElement <> '' then\r\n begin\r\n Container.innerHTML := '';\r\n Container := nil;\r\n end\r\n else\r\n if Assigned(Container) then\r\n begin\r\n FormContainerElement.removeChild(Container);\r\n Container := nil;\r\n end;\r\n end\r\n else\r\n begin\r\n if FFormElement <> '' then\r\n begin\r\n Container.innerHTML := '';\r\n Container := nil;\r\n end\r\n end;\r\n\r\n if FFormElement = '' then\r\n Application.PopForm;\r\n\r\n DoClose(lAction);\r\n if (lAction = caFree) and not (csDestroying in ComponentState) then\r\n ReleaseForm(Self);\r\n\r\n Visible := False;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.CloseQuery: Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FOnCloseQuery) then\r\n FOnCloseQuery(Self, Result);\r\nend;\r\n\r\nfunction TCustomForm.ContainerElement: TJSElement;\r\nbegin\r\n Result := FormContainerElement;\r\nend;\r\n\r\nconstructor TCustomForm.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FFormFileName := '';\r\n FPopup := True;\r\nend;\r\n\r\nfunction TCustomForm.CreateElement: TJSElement;\r\nvar\r\n eh: TJSHTMLElement;\r\nbegin\r\n if FPopup then\r\n begin\r\n Result := document.createElement('SPAN');\r\n FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FLayer);\r\n\r\n eh := TJSHTMLElement(FLayer);\r\n eh.addEventListener('click', @HandleDoClick);\r\n\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\n end\r\n else\r\n begin\r\n Result := FormContainerElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.LoadDFMValues;\r\nbegin\r\nend;\r\n\r\nprocedure TCustomForm.Init;\r\nbegin\r\nend;\r\n\r\nfunction TCustomForm.IsFocused: Boolean;\r\nbegin\r\n // form is not focused only controls\r\n Result := false;\r\nend;\r\n\r\nprocedure TCustomForm.Resize;\r\nvar\r\n i: integer;\r\nbegin\r\n FIsResizing := true;\r\n\r\n AlignControl(Self);\r\n\r\n if Assigned(FOnResize) then\r\n FOnResize(Self);\r\n\r\n FIsResizing := false;\r\n\r\n if not IsUpdating then\r\n begin\r\n if (OrigRect.Left = -1) and (OrigRect.Top = -1) then\r\n InitAnchoring;\r\n\r\n for i := 0 to ControlCount - 1 do\r\n Controls[i].UpdateAnchoring;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetCaption(const AValue: string);\r\nbegin\r\n if FCaption <> AValue then\r\n begin\r\n FCaption := AValue;\r\n UpdateElement;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.SetFormStyle(const Value: TFormStyle);\r\nbegin\r\n FFormStyle := Value;\r\nend;\r\n\r\nprocedure TCustomForm.SetModalResult(const Value: TModalResult);\r\nbegin\r\n FModalResult := Value;\r\n if (FModalResult <> mrNone) then\r\n Close;\r\nend;\r\n\r\nprocedure TCustomForm.Show;\r\nbegin\r\n\r\n if (FormFileName = '') then\r\n begin\r\n document.body.appendChild(Container);\r\n end;\r\n\r\n Visible := True;\r\n\r\n DoShow;\r\nend;\r\n\r\nfunction TCustomForm.ShowModal: Integer;\r\nbegin\r\n Result := mrNone;\r\n Show;\r\nend;\r\n\r\nfunction TCustomForm.ShowModal(AProc: TModalResultProc): TModalResult;\r\nbegin\r\n Result := mrNone;\r\n FModalProc := AProc;\r\n ModalResult := mrNone;\r\n Show;\r\nend;\r\n\r\nprocedure TCustomForm.UnbindEvents;\r\nbegin\r\n inherited;\r\n if Assigned(FLayer) then\r\n FLayer.removeEventListener('click', @HandleDoClick);\r\n\r\n TJSEventTarget(window).removeEventListener('resize', @DoResize);\r\n TJSEventTarget(window).removeEventListener('load', @DoLoaded);\r\n TJSEventTarget(document).removeEventListener('scroll', @DoScroll);\r\n TJSEventTarget(window).removeEventListener('unload', @DoUnload);\r\nend;\r\n\r\nprocedure TCustomForm.UpdateElement;\r\nvar\r\n clr: string;\r\n i: integer;\r\nbegin\r\n inherited;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n if Assigned(ElementHandle) then\r\n begin\r\n if FCaption <> '' then\r\n window.document.title := FCaption;\r\n\r\n clr := ColorToHtml(Color);\r\n\r\n TJSHTMLElement(ElementHandle).style.setProperty('background-Color',clr);\r\n\r\n for i := 0 to ComponentCount - 1 do\r\n begin\r\n if Components[i] is TCSSCodeManager then\r\n begin\r\n\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.Loaded;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TCustomForm.Paint;\r\nbegin\r\n //\r\nend;\r\n\r\nprocedure TCustomForm.PreventDefault;\r\nbegin\r\n ElementEvent.preventDefault();\r\nend;\r\n\r\nfunction TCustomForm.DoResize(Event: TEventListenerEvent): boolean;\r\nbegin\r\n CreateControl;\r\n Resize;\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.GetCanvas: TCanvas;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nfunction TCustomForm.GetElementBindHandle: TJSEventTarget;\r\nbegin\r\n Result := TJSEventTarget(window);\r\nend;\r\n\r\nfunction TCustomForm.GetElementHandle: TJSHTMLElement;\r\nbegin\r\n if FPopup then\r\n Result := inherited GetElementHandle\r\n else\r\n Result := TJSHTMLElement(FormContainerElement);\r\nend;\r\n\r\nfunction TCustomForm.GetFormStyle: TFormStyle;\r\nbegin\r\n Result := FFormStyle;\r\nend;\r\n\r\nfunction TCustomForm.GetHeight: Integer;\r\nvar\r\n d: integer;\r\n s: string;\r\n css: TJSCSSStyleDeclaration;\r\n el: TJSHTMLElement;\r\n dr: TJSDOMRect;\r\nbegin\r\n if (FFormElement <> '') then\r\n begin\r\n el := TJSHTMLElement(document.getElementById(FFormElement));\r\n if Assigned(el) then\r\n begin\r\n dr := el.getBoundingClientRect;\r\n Result := Round(dr.bottom - dr.top);\r\n Exit;\r\n end\r\n end;\r\n\r\n if (ElementHandle = document.body) then\r\n begin\r\n css := window.getComputedStyle(ElementHandle);\r\n s := css.getPropertyValue('margin-top');\r\n s := Copy(s,1,Length(s)- 2);\r\n d := StrToInt(s) - 2; // div 2;\r\n Result := window.innerHeight - d\r\n end\r\n else\r\n begin\r\n if FPopup then\r\n Result := inherited GetHeight\r\n else\r\n begin\r\n Result := Round(ElementHandle.offsetHeight);\r\n if Result = 0 then\r\n Result:= window.innerHeight;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.GetLeft: Integer;\r\nbegin\r\n if FPopup then\r\n Result := inherited GetLeft\r\n else\r\n Result := Round(ElementHandle.offsetLeft);\r\nend;\r\n\r\nfunction TCustomForm.GetTop: Integer;\r\nbegin\r\n if FPopup then\r\n Result := inherited GetTop\r\n else\r\n Result := Round(ElementHandle.offsetTop);\r\nend;\r\n\r\nfunction TCustomForm.GetWidth: Integer;\r\nvar\r\n d: integer;\r\n dr: TJSDOMRect;\r\n s: string;\r\n el: TJSHTMLElement;\r\n css: TJSCSSStyleDeclaration;\r\nbegin\r\n if (FFormElement <> '') then\r\n begin\r\n el := TJSHTMLElement(document.getElementById(FFormElement));\r\n if Assigned(el) then\r\n begin\r\n dr := el.getBoundingClientRect;\r\n Result := Round(dr.right - dr.left);\r\n Exit;\r\n end\r\n end;\r\n\r\n if (ElementHandle = document.body) then\r\n begin\r\n css := window.getComputedStyle(ElementHandle);\r\n s := css.getPropertyValue('margin-left');\r\n s := Copy(s,1,Length(s) - 2);\r\n d := StrToInt(s) - 2;\r\n\r\n Result := window.innerWidth - d + 4;\r\n end\r\n else\r\n begin\r\n if FPopup then\r\n Result := inherited GetWidth\r\n else\r\n begin\r\n Result := Round(ElementHandle.offsetWidth);\r\n if Result = 0 then\r\n Result := window.innerWidth;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.HandleDoClick(Event: TJSMouseEvent): Boolean;\r\nbegin\r\n Event.stopPropagation;\r\n Close;\r\n Result := True;\r\nend;\r\n\r\nprocedure TCustomForm.DoClose(var CloseAction: TCloseAction);\r\nbegin\r\n if Assigned(FModalProc) and (CloseAction <> caNone) then\r\n begin\r\n FModalProc(FModalResult);\r\n FModalProc := nil;\r\n end;\r\nend;\r\n\r\nprocedure TCustomForm.DoCreate;\r\nbegin\r\n BeginUpdate;\r\n LoadDFMValues;\r\n\r\n Loaded;\r\n\r\n if Assigned(OnCreate) then\r\n OnCreate(Self);\r\n\r\n EndUpdate;\r\n\r\n AlignControl(Self);\r\n\r\n if Assigned(OnShow) then\r\n OnShow(Self);\r\nend;\r\n\r\nprocedure TCustomForm.DoExit;\r\nbegin\r\n inherited;\r\n if FPopup then\r\n Close;\r\nend;\r\n\r\nfunction TCustomForm.DoScroll(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnScroll) then\r\n OnScroll(Self);\r\n\r\n Result := true;\r\nend;\r\n\r\nprocedure TCustomForm.DoShow;\r\nbegin\r\n if Assigned(OnShow) then\r\n OnShow(Self);\r\nend;\r\n\r\nfunction TCustomForm.DoUnload(Event: TEventListenerEvent): boolean;\r\nbegin\r\n if Assigned(OnUnload) then\r\n OnUnload(Self);\r\n Result := true;\r\nend;\r\n\r\nfunction TCustomForm.FormContainerElement: TJSElement;\r\nbegin\r\n if FormContainer <> '' then\r\n begin\r\n ElementID := FormContainer;\r\n Result := document.getElementById(FormContainer);\r\n if not Assigned(Result) then\r\n Result := document.body;\r\n end\r\n else\r\n begin\r\n Result := document.body;\r\n end;\r\nend;\r\n\r\nfunction TCustomForm.DoLoaded(Event: TEventListenerEvent): boolean;\r\nbegin\r\n Resize;\r\n InitAnchoring;\r\n Result := true;\r\nend;\r\n\r\ndestructor TCustomForm.Destroy;\r\nbegin\r\n if Visible then\r\n Close;\r\n\r\n inherited;\r\n\r\n if Assigned(FLayer) then\r\n begin\r\n FormContainerElement.removeChild(FLayer);\r\n FLayer := nil;\r\n end;\r\nend;\r\n\r\nconstructor TCustomForm.Create(id: string);\r\nbegin\r\n inherited Create(id);\r\n FFormElement := '';\r\n FModalResult := mrNone;\r\n FFormStyle := fsNormal;\r\n DoCreate;\r\nend;\r\n\r\nprocedure TCustomForm.CreateInitialize;\r\nbegin\r\n inherited;\r\n FModalResult := mrNone;\r\n FFormStyle := fsNormal;\r\n Color := clWhite;\r\n\r\n TJSEventTarget(window).addEventListener('load', @DoLoaded);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AOwner: TComponent; Dummy: Integer = 0);\r\nbegin\r\n Create(AOwner);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew;\r\nvar\r\n AFileName: string;\r\nbegin\r\n AFileName := ClassType.UnitName + cHTMLExt;\r\n inherited Create(cBodyTag);\r\n FormFileName := AFileName;\r\n Application.LoadForm(Self, AFileName);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AFileName: string);\r\nbegin\r\n inherited Create(cBodyTag);\r\n FormFileName := AFileName;\r\n Application.LoadForm(Self, AFileName);\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AProc: TFormCreatedProc);\r\nbegin\r\n FCreatedProc := AProc;\r\n CreateNew;\r\nend;\r\n\r\nconstructor TCustomForm.CreateNew(AElementID: string; AProc: TFormCreatedProc);\r\nvar\r\n AFileName: string;\r\nbegin\r\n inherited Create(AElementID);\r\n FCreatedProc := AProc;\r\n FFormElement := AElementID;\r\n AFileName := ClassType.UnitName + cHTMLExt;\r\n Application.LoadForm(Self, AFileName);\r\nend;\r\n\r\n\r\n{ TApplication }\r\n\r\nfunction TApplication.CreateNewForm(AInstanceClass: TFormClass): TCustomForm;\r\nbegin\r\n Result := AInstanceClass.Create(cBodyTag);\r\n //\r\nend;\r\n\r\nprocedure TApplication.LoadForm(AForm: TCustomForm; AFormFile: string);\r\nbegin\r\n if Assigned(FMainForm) then\r\n PushForm(FMainForm);\r\n\r\n FMainForm := AForm;\r\n FLastReq := TJSXMLHttpRequest.new;\r\n FLastReq.addEventListener('load',@DoFormLoad);\r\n FLastReq.addEventListener('abort',@DoFormAbort);\r\n FLastReq.open('GET', AFormFile);\r\n FLastReq.setRequestHeader('Cache-Control', 'no-cache');\r\n FLastReq.send;\r\nend;\r\n\r\nprocedure TApplication.Navigate(const AURL: string; ATarget: TNavigationTarget );\r\nbegin\r\n if ATarget = ntBlank then\r\n window.open(AURL, '_blank')\r\n else\r\n window.location.href := AURL;\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference);\r\nbegin\r\n CreateForm(AInstanceClass, AElementID, AReference, nil);\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFormClass; AElementID: string; var AReference; AProc: TFormCreatedProc);\r\nvar\r\n lFileName: string;\r\n\r\n function DoStatusCreate(Event: TEventListenerEvent): boolean;\r\n var\r\n el: TJSHTMLElement;\r\n AForm: TForm;\r\n begin\r\n // HTML of the form being loaded\r\n el := TJSHTMLElement(document.getElementById(AElementID));\r\n el.innerHTML := FLastReq.responseText;\r\n\r\n //if Assigned(FMainForm) then\r\n // PushForm(FMainForm);\r\n\r\n AForm := AInstanceClass.Create(AElementID);\r\n AForm.FormFileName := lFileName;\r\n AForm.FormContainer := AElementID;\r\n AForm.FFormElement := AElementID;\r\n AForm.CreateControl;\r\n AForm.Container := el;\r\n AForm.Init;\r\n AReference := AForm;\r\n if Assigned(AProc) then\r\n AProc(AForm);\r\n\r\n Result := true;\r\n end;\r\n\r\nbegin\r\n if FIsRedirect then\r\n Exit;\r\n\r\n lFileName := AInstanceClass.UnitName + GetFormExtension;\r\n FLastReq := TJSXMLHttpRequest.new;\r\n FLastReq.addEventListener('load', @DoStatusCreate);\r\n FLastReq.open('GET', lFileName);\r\n FLastReq.setRequestHeader('Cache-Control', 'no-cache');\r\n FLastReq.send;\r\nend;\r\n\r\nprocedure TApplication.ReloadForm;\r\nvar\r\n lFileName: string;\r\n\r\n function DoStatusCreate(Event: TEventListenerEvent): boolean;\r\n var\r\n i: integer;\r\n ctl: TControl;\r\n s: string;\r\n sl: TStringList;\r\n\r\n begin\r\n sl := TStringList.Create;\r\n\r\n // persist control state\r\n for i := FMainForm.ControlCount - 1 downto 0 do\r\n begin\r\n ctl := FMainForm.Controls[i];\r\n ctl.PersistInHTML;\r\n ctl.ElementHandle.Id := ctl.Name;\r\n s := ctl.Name +'='+ctl.ElementHandle.outerHTML;\r\n sl.Add(s);\r\n end;\r\n\r\n for i := FMainForm.ControlCount - 1 downto 0 do\r\n begin\r\n ctl := FMainForm.Controls[i];\r\n FMainForm.RemoveComponent(ctl);\r\n ctl.Free;\r\n end;\r\n\r\n FMainForm.ClearControls;\r\n FMainForm.UnbindEvents;\r\n\r\n // HTML of the form being loaded\r\n document.body.innerHTML := FLastReq.responseText;\r\n\r\n FMainForm.CreateControl;\r\n FMainForm.DoCreate;\r\n FMainForm.Init;\r\n\r\n // persist control state\r\n for i := FMainForm.ControlCount - 1 downto 0 do\r\n begin\r\n ctl := FMainForm.Controls[i];\r\n s := sl.Values[ctl.Name];\r\n ctl.ElementHandle.outerHTML := s;\r\n ctl.Container := document.getElementById(ctl.Name);\r\n ctl.BindEvents;\r\n end;\r\n\r\n sl.Free;\r\n\r\n Result := true;\r\n end;\r\n\r\nbegin\r\n lFileName := FMainForm.UnitName + GetFormExtension;\r\n\r\n FLastReq := TJSXMLHttpRequest.new;\r\n FLastReq.addEventListener('load', @DoStatusCreate);\r\n FLastReq.open('GET', lFileName);\r\n FLastReq.setRequestHeader('Cache-Control', 'no-cache');\r\n FLastReq.send;\r\nend;\r\n\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TFormClass; var AReference);\r\nvar\r\n lFileName: string;\r\n\r\n function DoStatusCreate(Event: TEventListenerEvent): boolean;\r\n begin\r\n // HTML of the form being loaded\r\n document.body.innerHTML := FLastReq.responseText;\r\n\r\n if Assigned(FMainForm) then\r\n PushForm(FMainForm);\r\n\r\n FMainForm := AInstanceClass.Create(cBodyTag);\r\n FMainForm.FormFileName := lFileName;\r\n FMainForm.CreateControl;\r\n FMainForm.Init;\r\n AReference := FMainForm;\r\n Result := true;\r\n end;\r\n\r\nbegin\r\n if FIsRedirect then\r\n Exit;\r\n\r\n lFileName := AInstanceClass.UnitName + GetFormExtension;\r\n FLastReq := TJSXMLHttpRequest.new;\r\n FLastReq.addEventListener('load', @DoStatusCreate);\r\n FLastReq.open('GET', lFileName);\r\n FLastReq.setRequestHeader('Cache-Control', 'no-cache');\r\n FLastReq.send;\r\nend;\r\n\r\nprocedure TApplication.CreateForm(AInstanceClass: TDataModuleClass; var AReference);\r\nvar\r\n lModule: TDataModule;\r\nbegin\r\n lModule := AInstanceClass.Create(Self);\r\n AReference := lModule;\r\nend;\r\n\r\nfunction TApplication.DoFormLoad(Event: TEventListenerEvent): boolean;\r\nvar\r\n eh,span: TJSHTMLElement;\r\n l,t,w,h: integer;\r\nbegin\r\n span := nil;\r\n\r\n if not FMainForm.Popup then\r\n begin\r\n if FMainForm.FFormElement <> '' then\r\n begin\r\n eh := TJSHTMLElement(document.getElementById(FMainForm.FFormElement));\r\n if Assigned(eh) then\r\n begin\r\n eh.innerHTML := FLastReq.responseText;\r\n eh.style.setProperty('background-color',ColorToHTML(FMainForm.Color));\r\n //eh.style.setProperty('border','1px Black solid');\r\n end;\r\n end\r\n else\r\n document.body.innerHTML := FLastReq.responseText;\r\n end\r\n else\r\n begin\r\n FMainForm.ClearControls;\r\n FMainForm.FLayer := document.createElement('SPAN');\r\n document.body.appendChild(FMainForm.FLayer);\r\n\r\n eh := TJSHTMLElement(FMainForm.FLayer);\r\n eh.style.setProperty('top', '0');\r\n eh.style.setProperty('left', '0');\r\n eh.style.setProperty('right', '0');\r\n eh.style.setProperty('bottom', '0');\r\n\r\n eh.style.setProperty('webkit-user-select', 'none');\r\n eh.style.setProperty('moz-user-select', 'none');\r\n eh.style.setProperty('khtml-user-select', 'none');\r\n eh.style.setProperty('ms-user-select', 'none');\r\n eh.style.setProperty('user-select', 'none');\r\n eh.style.setProperty('position', 'absolute');\r\n\r\n span := TJSHTMLElement(document.createElement('SPAN'));\r\n span.style.setProperty('box-shadow','5px 5px 5px gray');\r\n\r\n eh.appendChild(span);\r\n span.innerHTML := FLastReq.responseText;\r\n\r\n FMainForm.Container := span;\r\n end;\r\n\r\n FMainForm.Init;\r\n FMainForm.LoadDFMValues;\r\n\r\n if Assigned(span) and (FMainForm.FormContainer = '') then\r\n begin\r\n span.style.setProperty('position', 'absolute');\r\n\r\n l := Round((window.innerWidth - FMainForm.Width)/2);\r\n t := Round((window.innerHeight - FMainForm.Height)/2);\r\n w := FMainForm.Width;\r\n h := FMainForm.Height;\r\n\r\n span.style.setProperty('background-color',ColorToHTML(FMainForm.Color));\r\n span.style.setProperty('border','1px Black solid');\r\n\r\n span.style.setProperty('top',IntTostr(t)+'px');\r\n span.style.setProperty('left',IntToStr(l)+'px');\r\n span.style.setProperty('width',IntToStr(w)+'px');\r\n span.style.setProperty('height',IntToStr(h)+'px');\r\n end;\r\n\r\n if Assigned(FMainForm.FCreatedProc) then\r\n FMainForm.FCreatedProc(FMainForm);\r\n\r\n FMainForm.FCreatedProc := nil;\r\n\r\n if Assigned(FMainForm.OnCreate) then\r\n FMainForm.OnCreate(FMainForm);\r\n\r\n Result := true;\r\nend;\r\n\r\nfunction TApplication.GetFormExtension: string;\r\nbegin\r\n if Language <> lNone then\r\n Result := '_' + GetLanguageISO639_1Code(Language) + cHTMLExt\r\n else\r\n Result := cHTMLExt;\r\n\r\nend;\r\n\r\n{$IFDEF SINGLEINSTANCE}\r\nprocedure TApplication.DoGetDataReceived(Sender: TObject; Origin: string;\r\n Data: TJSObject);\r\nbegin\r\n if Data.toString = '#reload' then\r\n begin\r\n asm\r\n location.reload();\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TApplication.DoGetConnected(Sender: TObject);\r\nvar\r\n url,agent:string;\r\nbegin\r\n url := window.location.href;\r\n agent := window.navigator.useragent;\r\n\r\n if Pos('Edge', agent) > 0 then\r\n agent := 'Edge'\r\n else if Pos('Opera', agent) > 0 then\r\n agent := 'Opera'\r\n else if Pos('OPR', agent) > 0 then\r\n agent := 'Opera'\r\n else if Pos('Chrome', agent) > 0 then\r\n agent := 'Chrome'\r\n else if Pos('Safari', agent) > 0 then\r\n agent := 'Safari'\r\n else if Pos('Firefox', agent) > 0 then\r\n agent := 'Firefox'\r\n else if Pos('Trident', agent) > 0 then\r\n agent := 'MSIE'\r\n else\r\n agent := '';\r\n\r\n FWebSocket.Send(url + ';' + agent);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TApplication.DoFormAbort(Event: TEventListenerEvent): boolean;\r\nbegin\r\n ShowMessage('Failed to load form HTML template file');\r\n Result := true;\r\nend;\r\n\r\n\r\nprocedure TApplication.InitFormatSettings(const BrowserLocale: string);\r\nvar\r\n timestr: string;\r\n i: integer;\r\n locale: string;\r\nbegin\r\n locale := BrowserLocale;\r\n\r\n FormatSettings.ShortDateFormat := GetLocaleShortDateFormat(locale);\r\n\r\n if (Pos('/',FormatSettings.ShortDateFormat) > 0) then\r\n FormatSettings.DateSeparator := '/';\r\n\r\n if (Pos('.',FormatSettings.ShortDateFormat) > 0) then\r\n FormatSettings.DateSeparator := '.';\r\n\r\n if (Pos('-',FormatSettings.ShortDateFormat) > 0) then\r\n FormatSettings.DateSeparator := '-';\r\n\r\n asm\r\n var event = new Date('Jan 1, 1980 06:07:08 GMT+00:00');\r\n var loc = \"\";\r\n if (locale == \"\") { loc = navigator.language; } else\r\n { loc = locale; }\r\n timestr = event.toLocaleTimeString(loc);\r\n end;\r\n\r\n if pos(':',timestr) > 0 then\r\n FormatSettings.TimeSeparator := ':';\r\n\r\n if pos('-',timestr) > 0 then\r\n FormatSettings.TimeSeparator := '.';\r\n\r\n if pos('-',timestr) > 0 then\r\n FormatSettings.TimeSeparator := '-';\r\n\r\n for i := 1 to 7 do\r\n begin\r\n ShortDayNames[i] := GetLocaleShortDayName(i,locale);\r\n LongDayNames[i] := GetLocaleLongDayName(i,locale);\r\n end;\r\n\r\n for i := 1 to 12 do\r\n begin\r\n ShortMonthNames[i] := GetLocaleShortMonthName(i,locale);\r\n LongMonthNames[i] := GetLocaleLongMonthName(i,locale);\r\n end;\r\n\r\n FormatSettings.DecimalSeparator := GetLocaleDecimalSeparator;\r\n\r\n if FormatSettings.DecimalSeparator = '.' then\r\n FormatSettings.ThousandSeparator := ','\r\n else\r\n FormatSettings.ThousandSeparator := '.';\r\nend;\r\n\r\n{$HINTS OFF}\r\nprocedure TApplication.Initialize;\r\nvar\r\n query,token: string;\r\nbegin\r\n FParameters.Clear;\r\n query := window.location.href;\r\n\r\n InitFormatSettings(GetBrowserLocale);\r\n\r\n FParameters.Delimiter := '&';\r\n FParameters.StrictDelimiter := true;\r\n FParameters.DelimitedText := query;\r\n\r\n if FParameters.IndexOfName('code') <> -1 then\r\n begin\r\n FIsRedirect := true;\r\n token := FParameters.Values['code'];\r\n asm\r\n window.opener.processAuthData(token);\r\n end;\r\n \twindow.close();\r\n end;\r\n\r\n if FParameters.IndexOfName('access_token') <> -1 then\r\n begin\r\n FIsRedirect := true;\r\n token := FParameters.Values['access_token'];\r\n asm\r\n window.opener.processAuthData(token);\r\n end;\r\n \twindow.close();\r\n end;\r\nend;\r\n{$HINTS ON}\r\n\r\nprocedure TApplication.Run;\r\nbegin\r\nend;\r\n\r\nprocedure TApplication.SetLanguage(const Value: TUILanguage);\r\nbegin\r\n FLanguage := Value;\r\n ReloadForm;\r\nend;\r\n\r\nconstructor TApplication.Create(AOwner: TComponent);\r\nbegin\r\n FFormStack := TList.Create;\r\n FParameters := TStringList.Create;\r\n FMainForm := nil;\r\n FIsRedirect := false;\r\n {$IFDEF SINGLEINSTANCE}\r\n FWebSocket := TSocketClient.Create(Self);\r\n FWebSocket.Port := DefaultPort;\r\n FWebSocket.OnDataReceived := @DoGetDataReceived;\r\n FWebSocket.OnConnect := @DoGetConnected;\r\n FWebSocket.Connect;\r\n {$ENDIF}\r\n\r\n {$IFDEF FREEWARE}\r\n asm\r\n alert('TMS WEB Core Trial Version');\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TApplication.Destroy;\r\nbegin\r\n {$IFDEF SINGLEINSTANCE}\r\n FWebSocket.Free;\r\n {$ENDIF}\r\n FFormStack.Free;\r\n FParameters.Free;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TApplication.PushForm(AForm: TCustomForm);\r\nvar\r\n i: integer;\r\nbegin\r\n // persist all control settings in HTML to be saved\r\n for i := 0 to AForm.ControlCount - 1 do\r\n begin\r\n AForm.Controls[i].PersistInHTML;\r\n end;\r\n\r\n // save with form\r\n AForm.FormContent := document.body.innerHTML;\r\n\r\n for i := 0 to AForm.ControlCount - 1 do\r\n begin\r\n AForm.Controls[i].DisableTab;\r\n end;\r\n\r\n FFormStack.Add(AForm);\r\nend;\r\n\r\nfunction TApplication.PopForm: TCustomForm;\r\nvar\r\n i: integer;\r\n frm: string;\r\nbegin\r\n if (FFormStack.Count > 0) then\r\n begin\r\n\r\n Result := TCustomForm(FFormStack.Items[FFormStack.Count - 1]);\r\n frm := Result.FormContent;\r\n FFormStack.Delete(FFormStack.Count - 1);\r\n\r\n // restore document\r\n document.body.innerHTML := frm;\r\n\r\n Result.InitFromHTML;\r\n\r\n // rebind form events\r\n Result.BindEvents;\r\n\r\n // rehook controls\r\n for i := 0 to Result.ControlCount - 1 do\r\n Result.Controls[i].HookElement;\r\n\r\n for i := 0 to Result.ControlCount - 1 do\r\n begin\r\n Result.Controls[i].RecreateCanvas;\r\n Result.Controls[i].InternalResize;\r\n end;\r\n\r\n Application.FMainForm := Result;\r\n end;\r\nend;\r\n\r\ninitialization\r\n Application := TApplication.Create(nil);\r\n\r\nend.\r\n","{$mode objfpc}\r\n{$h+}\r\n{\r\n This file is part of the Free Pascal run time library.\r\n Copyright (c) 1999-2000 by the Free Pascal development team\r\n\r\n Delphi/Kylix compatibility unit, provides Date/Time handling routines.\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\nunit DateUtils;\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Math;\r\n\r\n{ ---------------------------------------------------------------------\r\n Various constants\r\n ---------------------------------------------------------------------}\r\n\r\nconst\r\n DaysPerWeek = 7;\r\n WeeksPerFortnight = 2;\r\n MonthsPerYear = 12;\r\n YearsPerDecade = 10;\r\n YearsPerCentury = 100;\r\n YearsPerMillennium = 1000;\r\n\r\n // ISO day numbers.\r\n DayMonday = 1;\r\n DayTuesday = 2;\r\n DayWednesday = 3;\r\n DayThursday = 4;\r\n DayFriday = 5;\r\n DaySaturday = 6;\r\n DaySunday = 7;\r\n\r\n // Fraction of a day\r\n OneHour = TDateTime(1)/HoursPerDay;\r\n OneMinute = TDateTime(1)/MinsPerDay;\r\n OneSecond = TDateTime(1)/SecsPerDay;\r\n OneMillisecond = TDateTime(1)/MSecsPerDay;\r\n\r\n { This is actual days per year but you need to know if it's a leap year}\r\n DaysPerYear: array [Boolean] of Word = (365, 366);\r\n\r\n { Used in RecodeDate, RecodeTime and RecodeDateTime for those datetime }\r\n { fields you want to leave alone }\r\n RecodeLeaveFieldAsIs = 65535;\r\n\r\n{ ---------------------------------------------------------------------\r\n Global variables used in this unit\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n\r\n { Average over a 4 year span. Valid for next 100 years }\r\n ApproxDaysPerMonth: Double = 30.4375;\r\n ApproxDaysPerYear: Double = 365.25;\r\n\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Simple trimming functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateOf(const AValue: TDateTime): TDateTime;\r\nFunction TimeOf(const AValue: TDateTime): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Identification functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction IsInLeapYear(const AValue: TDateTime): Boolean;\r\nFunction IsPM(const AValue: TDateTime): Boolean;\r\nFunction IsValidDate(const AYear, AMonth, ADay: Word): Boolean;\r\nFunction IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;\r\nFunction IsValidDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;\r\nFunction IsValidDateDay(const AYear, ADayOfYear: Word): Boolean;\r\nFunction IsValidDateWeek(const AYear, AWeekOfYear, ADayOfWeek: Word): Boolean;\r\nFunction IsValidDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Enumeration functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WeeksInYear(const AValue: TDateTime): Word;\r\nFunction WeeksInAYear(const AYear: Word): Word;\r\nFunction DaysInYear(const AValue: TDateTime): Word;\r\nFunction DaysInAYear(const AYear: Word): Word;\r\nFunction DaysInMonth(const AValue: TDateTime): Word;\r\nFunction DaysInAMonth(const AYear, AMonth: Word): Word;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Variations on current date/time.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction Today: TDateTime;\r\nFunction Yesterday: TDateTime;\r\nFunction Tomorrow: TDateTime;\r\nFunction IsToday(const AValue: TDateTime): Boolean;\r\nFunction IsSameDay(const AValue, ABasis: TDateTime): Boolean;\r\nfunction IsSameMonth(const Avalue, ABasis: TDateTime): Boolean;\r\nFunction PreviousDayOfWeek (DayOfWeek : Word) : Word;\r\n\r\n{ ---------------------------------------------------------------------\r\n Extraction functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction YearOf(const AValue: TDateTime): Word;\r\nFunction MonthOf(const AValue: TDateTime): Word;\r\nFunction WeekOf(const AValue: TDateTime): Word;\r\nFunction DayOf(const AValue: TDateTime): Word;\r\nFunction HourOf(const AValue: TDateTime): Word;\r\nFunction MinuteOf(const AValue: TDateTime): Word;\r\nFunction SecondOf(const AValue: TDateTime): Word;\r\nFunction MilliSecondOf(const AValue: TDateTime): Word;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheYear(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheYear(const AValue: TDateTime): TDateTime;\r\nFunction StartOfAYear(const AYear: Word): TDateTime;\r\nFunction EndOfAYear(const AYear: Word): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheMonth(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheMonth(const AValue: TDateTime): TDateTime;\r\nFunction StartOfAMonth(const AYear, AMonth: Word): TDateTime;\r\nFunction EndOfAMonth(const AYear, AMonth: Word): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction StartOfTheWeek(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheWeek(const AValue: TDateTime): TDateTime;\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // ADayOFWeek 1\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // const ADayOfWeek: Word = 7\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheDay(const AValue: TDateTime): TDateTime;\r\nFunction EndOfTheDay(const AValue: TDateTime): TDateTime;\r\nFunction StartOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;\r\nFunction StartOfADay(const AYear, ADayOfYear: Word): TDateTime; overload;\r\nFunction EndOfADay(const AYear, AMonth, ADay: Word): TDateTime; overload;\r\nFunction EndOfADay(const AYear, ADayOfYear: Word): TDateTime; overload;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MonthOfTheYear(const AValue: TDateTime): Word;\r\nFunction WeekOfTheYear(const AValue: TDateTime): Word; overload;\r\nFunction WeekOfTheYear(const AValue: TDateTime; out AYear: Word): Word; overload;\r\nFunction DayOfTheYear(const AValue: TDateTime): Word;\r\nFunction HourOfTheYear(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheYear(const AValue: TDateTime): LongWord;\r\nFunction SecondOfTheYear(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheYear(const AValue: TDateTime): NativeLargeInt;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WeekOfTheMonth(const AValue: TDateTime): Word; overload;\r\nFunction WeekOfTheMonth(const AValue: TDateTime; out AYear, AMonth: Word): Word; overload;\r\nFunction DayOfTheMonth(const AValue: TDateTime): Word;\r\nFunction HourOfTheMonth(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheMonth(const AValue: TDateTime): Word;\r\nFunction SecondOfTheMonth(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheMonth(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DayOfTheWeek(const AValue: TDateTime): Word;\r\nFunction HourOfTheWeek(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheWeek(const AValue: TDateTime): Word;\r\nFunction SecondOfTheWeek(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheWeek(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction HourOfTheDay(const AValue: TDateTime): Word;\r\nFunction MinuteOfTheDay(const AValue: TDateTime): Word;\r\nFunction SecondOfTheDay(const AValue: TDateTime): LongWord;\r\nFunction MilliSecondOfTheDay(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of hour functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MinuteOfTheHour(const AValue: TDateTime): Word;\r\nFunction SecondOfTheHour(const AValue: TDateTime): Word;\r\nFunction MilliSecondOfTheHour(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of minute functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction SecondOfTheMinute(const AValue: TDateTime): Word;\r\nFunction MilliSecondOfTheMinute(const AValue: TDateTime): LongWord;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of second functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MilliSecondOfTheSecond(const AValue: TDateTime): Word;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Range checking functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WithinPastYears(const ANow, AThen: TDateTime; const AYears: Integer): Boolean;\r\nFunction WithinPastMonths(const ANow, AThen: TDateTime; const AMonths: Integer): Boolean;\r\nFunction WithinPastWeeks(const ANow, AThen: TDateTime; const AWeeks: Integer): Boolean;\r\nFunction WithinPastDays(const ANow, AThen: TDateTime; const ADays: Integer): Boolean;\r\nFunction WithinPastHours(const ANow, AThen: TDateTime; const AHours: NativeLargeInt): Boolean;\r\nFunction WithinPastMinutes(const ANow, AThen: TDateTime; const AMinutes: NativeLargeInt): Boolean;\r\nFunction WithinPastSeconds(const ANow, AThen: TDateTime; const ASeconds: NativeLargeInt): Boolean;\r\nFunction WithinPastMilliSeconds(const ANow, AThen: TDateTime; const AMilliSeconds: NativeLargeInt): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Period functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction YearsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\nFunction MonthsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\nFunction WeeksBetween(const ANow, AThen: TDateTime): Integer;\r\nFunction DaysBetween(const ANow, AThen: TDateTime): Integer;\r\nFunction HoursBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nFunction MinutesBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nFunction SecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nFunction MilliSecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nProcedure PeriodBetween(const ANow, AThen: TDateTime; Out Years, months, days : Word); \r\n\r\n{ ---------------------------------------------------------------------\r\n Timespan in xxx functions.\r\n ---------------------------------------------------------------------}\r\n\r\n{ YearSpan and MonthSpan are approximate values }\r\nFunction YearSpan(const ANow, AThen: TDateTime): Double;\r\nFunction MonthSpan(const ANow, AThen: TDateTime): Double;\r\nFunction WeekSpan(const ANow, AThen: TDateTime): Double;\r\nFunction DaySpan(const ANow, AThen: TDateTime): Double;\r\nFunction HourSpan(const ANow, AThen: TDateTime): Double;\r\nFunction MinuteSpan(const ANow, AThen: TDateTime): Double;\r\nFunction SecondSpan(const ANow, AThen: TDateTime): Double;\r\nFunction MilliSecondSpan(const ANow, AThen: TDateTime): Double;\r\n\r\n{ ---------------------------------------------------------------------\r\n Increment/decrement functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction IncYear(const AValue: TDateTime; const ANumberOfYears: Integer ): TDateTime;\r\nFunction IncYear(const AValue: TDateTime): TDateTime; // ; const ANumberOfYears: Integer = 1)\r\n// Function IncMonth is in SysUtils\r\nFunction IncWeek(const AValue: TDateTime; const ANumberOfWeeks: Integer): TDateTime;\r\nFunction IncWeek(const AValue: TDateTime): TDateTime; // ; const ANumberOfWeeks: Integer = 1)\r\nFunction IncDay(const AValue: TDateTime; const ANumberOfDays: Integer): TDateTime;\r\nFunction IncDay(const AValue: TDateTime): TDateTime; //; const ANumberOfDays: Integer = 1)\r\nFunction IncHour(const AValue: TDateTime; const ANumberOfHours: NativeLargeInt): TDateTime;\r\nFunction IncHour(const AValue: TDateTime): TDateTime; //; const ANumberOfHours: NativeLargeInt = 1\r\nFunction IncMinute(const AValue: TDateTime; const ANumberOfMinutes: NativeLargeInt): TDateTime;\r\nFunction IncMinute(const AValue: TDateTime): TDateTime; // ; const ANumberOfMinutes: NativeLargeInt = 1\r\nFunction IncSecond(const AValue: TDateTime; const ANumberOfSeconds: NativeLargeInt): TDateTime;\r\nFunction IncSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfSeconds: NativeLargeInt = 1\r\nFunction IncMilliSecond(const AValue: TDateTime; const ANumberOfMilliSeconds: NativeLargeInt): TDateTime;\r\nFunction IncMilliSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfMilliSeconds: NativeLargeInt = 1\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/Decode of complete timestamp\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nProcedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);\r\nFunction TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of year and day of week\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word): TDateTime; //; const ADayOfWeek: Word = 1\r\nProcedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear, ADayOfWeek: Word);\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime; const ADayOfWeek: Word): Boolean;\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime): Boolean; //; const ADayOfWeek: Word = 1\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying day of year\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;\r\nProcedure DecodeDateDay(const AValue: TDateTime; out AYear, ADayOfYear: Word);\r\nFunction TryEncodeDateDay(const AYear, ADayOfYear: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of month\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): TDateTime;\r\nProcedure DecodeDateMonthWeek(const AValue: TDateTime; out AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\nFunction TryEncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode time interval, allowing hours>24\r\n ---------------------------------------------------------------------}\r\n\r\nfunction TryEncodeTimeInterval(Hour, Min, Sec, MSec:word; Out Time : TDateTime) : boolean;\r\nfunction EncodeTimeInterval(Hour, Minute, Second, MilliSecond:word): TDateTime;\r\n\r\n{ ---------------------------------------------------------------------\r\n Replace given element with supplied value.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction RecodeYear(const AValue: TDateTime; const AYear: Word): TDateTime;\r\nFunction RecodeMonth(const AValue: TDateTime; const AMonth: Word): TDateTime;\r\nFunction RecodeDay(const AValue: TDateTime; const ADay: Word): TDateTime;\r\nFunction RecodeHour(const AValue: TDateTime; const AHour: Word): TDateTime;\r\nFunction RecodeMinute(const AValue: TDateTime; const AMinute: Word): TDateTime;\r\nFunction RecodeSecond(const AValue: TDateTime; const ASecond: Word): TDateTime;\r\nFunction RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: Word): TDateTime;\r\nFunction RecodeDate(const AValue: TDateTime; const AYear, AMonth, ADay: Word): TDateTime;\r\nFunction RecodeTime(const AValue: TDateTime; const AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nFunction RecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nFunction TryRecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AResult: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Comparision of date/time\r\n ---------------------------------------------------------------------}\r\n\r\nFunction CompareDateTime(const A, B: TDateTime): TValueRelationship;\r\nFunction CompareDate(const A, B: TDateTime): TValueRelationship;\r\nFunction CompareTime(const A, B: TDateTime): TValueRelationship;\r\nFunction SameDateTime(const A, B: TDateTime): Boolean;\r\nFunction SameDate(const A, B: TDateTime): Boolean;\r\nFunction SameTime(const A, B: TDateTime): Boolean;\r\n\r\n{ For a given date these Functions tell you the which day of the week of the\r\n month (or year). If its a Thursday, they will tell you if its the first,\r\n second, etc Thursday of the month (or year). Remember, even though its\r\n the first Thursday of the year it doesn't mean its the first week of the\r\n year. See ISO 8601 above for more information. }\r\n\r\nFunction NthDayOfWeek(const AValue: TDateTime): Word;\r\n\r\nProcedure DecodeDayOfWeekInMonth(const AValue: TDateTime; out AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word);\r\n\r\nFunction EncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word): TDateTime;\r\nFunction TryEncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word; out AValue: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Exception throwing routines\r\n ---------------------------------------------------------------------}\r\n\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; const ABaseDate: TDateTime);\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word); // const ABaseDate: TDateTime = 0\r\nProcedure InvalidDateWeekError(const AYear, AWeekOfYear, ADayOfWeek: Word);\r\nProcedure InvalidDateDayError(const AYear, ADayOfYear: Word);\r\nProcedure InvalidDateMonthWeekError(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\nProcedure InvalidDayOfWeekInMonthError(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word);\r\n\r\n{ ---------------------------------------------------------------------\r\n Julian and Modified Julian Date conversion support\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToJulianDate(const AValue: TDateTime): Double;\r\nFunction JulianDateToDateTime(const AValue: Double): TDateTime;\r\nFunction TryJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\n\r\nFunction DateTimeToModifiedJulianDate(const AValue: TDateTime): Double;\r\nFunction ModifiedJulianDateToDateTime(const AValue: Double): TDateTime;\r\nFunction TryModifiedJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\n\r\n{ ---------------------------------------------------------------------\r\n Unix timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToUnix(const AValue: TDateTime): NativeLargeInt;\r\nFunction UnixToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nFunction UnixTimeStampToMac(const AValue: NativeLargeInt): NativeLargeInt;\r\n\r\n{ ---------------------------------------------------------------------\r\n Mac timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToMac(const AValue: TDateTime): NativeLargeInt;\r\nFunction MacToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nFunction MacTimeStampToUnix(const AValue: NativeLargeInt): NativeLargeInt;\r\n\r\n{ .....................................................................\r\n Dos <-> Delphi datetime support\r\n .....................................................................}\r\n\r\nFunction DateTimeToDosDateTime(const AValue: TDateTime): longint;\r\nFunction DosDateTimeToDateTime( AValue: longint): TDateTime;\r\n\r\n{ UTC <-> Local time }\r\n\r\nFunction UniversalTimeToLocal(UT: TDateTime): TDateTime;\r\nFunction UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime;\r\nFunction LocalTimeToUniversal(LT: TDateTime): TDateTime;\r\nFunction LocalTimeToUniversal(LT: TDateTime; TZOffset: Integer): TDateTime;\r\n\r\n{ RFC 3339 support }\r\n\r\nFunction DateTimeToRFC3339(ADate :TDateTime):string;\r\nFunction DateToRFC3339(ADate :TDateTime):string;\r\nFunction TimeToRFC3339(ADate :TDateTime):string;\r\nFunction TryRFC3339ToDateTime(const Avalue: String; out ADateTime: TDateTime): Boolean;\r\nFunction RFC3339ToDateTime(const Avalue: String): TDateTime;\r\n\r\nType\r\n {\r\n Inverse of formatdatetime, destined for the dateutils unit of FPC.\r\n\r\n Limitations/implementation details:\r\n - An inverse of FormatDateTime is not 100% an inverse, simply because one can put e.g. time tokens twice in the format string,\r\n and scandatetime wouldn't know which time to pick.\r\n - Strings like hn can't be reversed safely. E.g. 1:2 (2 minutes after 1) delivers 12 which is parsed as 12:00 and then\r\n misses chars for the \"n\" part.\r\n - trailing characters are ignored.\r\n - no support for Eastern Asian formatting characters since they are windows only.\r\n - no MBCS support.\r\n\r\n Extensions\r\n - #9 eats whitespace.\r\n - whitespace at the end of a pattern is optional.\r\n - ? matches any char.\r\n - Quote the above chars to really match the char.\r\n }\r\n\r\n { TDateTimeScanner }\r\n\r\n TDateTimeScanner = Class\r\n Private\r\n FPattern: String;\r\n FText: String;\r\n FPatternOffset,\r\n FLen,FPatternLen: Integer;\r\n FPatternPos,FPos : Integer;\r\n FY,FM,FD : Word;\r\n FTimeval : TDateTime;\r\n procedure ArrayMatchError;\r\n procedure DoDateTime;\r\n procedure SetPattern(AValue: String);\r\n procedure SetText(AValue: String);\r\n function ScanFixedInt(maxv:integer):integer;\r\n function ScanPatternLength :integer;\r\n procedure MatchChar(c:char);\r\n function FindIMatch(const values :array of string; aTerm : string):integer;\r\n function FindMatch(const Values : array of string):integer;\r\n Procedure MatchPattern(const aPattern : String);\r\n Procedure DoYear;\r\n Procedure DoMonth;\r\n Procedure DoDay;\r\n Procedure DoTime;\r\n Procedure DoAMPM;\r\n Public\r\n Function Scan(StartPos: integer = -1) : TDateTime;\r\n property Pattern : String Read FPattern Write SetPattern;\r\n Property Text : String Read FText Write SetText;\r\n Property PatternOffset : Integer Read FPatternOffset;\r\n Property Position: Integer read FPos;\r\n end;\r\n\r\n // Easy access function\r\nFunction ScanDateTime(APattern,AValue: String; APos : integer = 1) : TDateTime;\r\n\r\nimplementation\r\n\r\nuses js, rtlconsts;\r\n\r\nconst\r\n TDateTimeEpsilon = 2.2204460493e-16;\r\n HalfMilliSecond = OneMillisecond /2 ;\r\n\r\n{ ---------------------------------------------------------------------\r\n Simple trimming functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateOf(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Trunc(AValue);\r\nend;\r\n\r\n\r\nFunction TimeOf(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Frac(Avalue);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Identification functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction IsInLeapYear(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=IsLeapYear(YearOf(AValue));\r\nend;\r\n\r\n\r\nFunction IsPM(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=(HourOf(AValue)>=12);\r\nend;\r\n\r\n\r\nFunction IsValidMonth(AMonth : Word) : Boolean;\r\n\r\nbegin\r\n Result:=(AMonth>=1) and (AMonth<=12);\r\nend;\r\n\r\nFunction IsValidDayOfWeek(ADayOfWeek : Word) : Boolean;\r\n\r\nbegin\r\n Result:=(ADayOfWeek>=1) and (ADayOfWeek<=7);\r\nend;\r\n\r\nFunction IsValidWeekOfMonth(AWeekOfMonth : Word) : Boolean;\r\n\r\nbegin\r\n Result:=(AWeekOfMonth>=1) and (AWeekOfMonth<=5);\r\nend;\r\n\r\nFunction IsValidDate(const AYear, AMonth, ADay: Word): Boolean;\r\nbegin\r\n Result:=(AYear<>0) and (AYear<10000)\r\n and IsValidMonth(AMonth)\r\n and (ADay<>0) and (ADay<=MonthDays[IsleapYear(AYear),AMonth]);\r\nend;\r\n\r\n\r\nFunction IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;\r\nbegin\r\n Result:=(AHour=HoursPerDay) and (AMinute=0) and (ASecond=0) and (AMillisecond=0);\r\n Result:=Result or\r\n ((AHour0) and (ADayOfYear<>0) and (AYear<10000) and\r\n (ADayOfYear<=DaysPerYear[IsLeapYear(AYear)]);\r\nend;\r\n\r\n\r\nFunction IsValidDateWeek(const AYear, AWeekOfYear, ADayOfWeek: Word): Boolean;\r\nbegin\r\n Result:=(AYear<>0) and (AYear<10000)\r\n and IsValidDayOfWeek(ADayOfWeek)\r\n and (AWeekOfYear<>0)\r\n and (AWeekOfYear<=WeeksInaYear(AYear));\r\n { should we not also check whether the day of the week is not\r\n larger than the last day of the last week in the year 9999 ?? }\r\nend;\r\n\r\n\r\nFunction IsValidDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): Boolean;\r\n\r\nbegin\r\n Result:=(AYear<>0) and (AYear<10000)\r\n and IsValidMonth(AMonth)\r\n and IsValidWeekOfMonth(AWeekOfMonth)\r\n and IsValidDayOfWeek(ADayOfWeek);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Enumeration functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WeeksInYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=WeeksInAYear(YearOf(AValue));\r\nend;\r\n\r\n\r\nFunction WeeksInAYear(const AYear: Word): Word;\r\n\r\nVar\r\n DOW : Word;\r\n\r\nbegin\r\n Result:=52;\r\n DOW:=DayOfTheWeek(StartOfAYear(AYear));\r\n If (DOW=4) or ((DOW=3) and IsLeapYear(AYear)) then\r\n Inc(Result);\r\nend;\r\n\r\n\r\nFunction DaysInYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=DaysPerYear[IsLeapYear(YearOf(AValue))];\r\nend;\r\n\r\n\r\nFunction DaysInAYear(const AYear: Word): Word;\r\nbegin\r\n Result:=DaysPerYear[Isleapyear(AYear)];\r\nend;\r\n\r\n\r\nFunction DaysInMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n Decodedate(AValue,Y,M,D);\r\n Result:=MonthDays[IsLeapYear(Y),M];\r\nend;\r\n\r\n\r\nFunction DaysInAMonth(const AYear, AMonth: Word): Word;\r\nbegin\r\n Result:=MonthDays[IsLeapYear(AYear),AMonth];\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Variations on current date/time.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction Today: TDateTime;\r\nbegin\r\n Result:=Date();\r\nend;\r\n\r\n\r\nFunction Yesterday: TDateTime;\r\nbegin\r\n Result:=Date()-1;\r\nend;\r\n\r\n\r\nFunction Tomorrow: TDateTime; \r\nbegin\r\n Result:=Date()+1;\r\nend;\r\n\r\n\r\nFunction IsToday(const AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=IsSameDay(AValue,Date());\r\nend;\r\n\r\n\r\nFunction IsSameDay(const AValue, ABasis: TDateTime): Boolean;\r\n\r\nVar\r\n D : TDateTime;\r\n\r\nbegin\r\n D:=AValue-Trunc(ABasis);\r\n Result:=(D>=0) and (D<1);\r\nend;\r\n\r\nfunction IsSameMonth(const Avalue, ABasis: TDateTime): Boolean;\r\nbegin\r\n result:=( YearOf(Avalue) = YearOf(Abasis) );\r\n result:=result and ( MonthOf(AValue) = MonthOf(ABasis) );\r\nend;\r\n\r\nconst\r\n DOWMap: array [1..7] of Word = (7, 1, 2, 3, 4, 5, 6);\r\n\r\nFunction PreviousDayOfWeek (DayOfWeek : Word) : Word;\r\n\r\nbegin\r\n If Not IsValidDayOfWeek(DayOfWeek) then\r\n Raise EConvertError.CreateFmt(SErrInvalidDayOfWeek,[DayOfWeek]);\r\n Result:=DOWMap[DayOfWeek];\r\nend;\r\n\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Extraction functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction YearOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n D,M : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Result,D,M);\r\nend;\r\n\r\n\r\nFunction MonthOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,Result,D);\r\nend;\r\n\r\n\r\nFunction WeekOf(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=WeekOfTheYear(AValue);\r\nend;\r\n\r\n\r\nFunction DayOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,Result);\r\nend;\r\n\r\n\r\nFunction HourOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n N,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,Result,N,S,MS);\r\nend;\r\n\r\n\r\nFunction MinuteOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,Result,S,MS);\r\nend;\r\n\r\n\r\nFunction SecondOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,N,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,N,Result,MS);\r\nend;\r\n\r\n\r\nFunction MilliSecondOf(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,N,S : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,N,S,Result);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction StartOfTheYear(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=EncodeDate(YearOf(AValue),1,1);\r\nend;\r\n\r\n\r\nFunction EndOfTheYear(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=EncodeDateTime(YearOf(AValue),12,31,23,59,59,999);\r\nend;\r\n\r\n\r\nFunction StartOfAYear(const AYear: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDate(AYear,1,1);\r\nend;\r\n\r\n\r\nFunction EndOfAYear(const AYear: Word): TDateTime;\r\n\r\nbegin\r\n Result:=(EncodeDateTime(AYear,12,31,23,59,59,999));\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheMonth(const AValue: TDateTime): TDateTime;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,D);\r\n Result:=EncodeDate(Y,M,1);\r\n// MonthDays[IsLeapYear(Y),M])\r\nend;\r\n\r\n\r\nFunction EndOfTheMonth(const AValue: TDateTime): TDateTime;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,D);\r\n Result:=EncodeDateTime(Y,M,MonthDays[IsLeapYear(Y),M],23,59,59,999);\r\nend;\r\n\r\n\r\nFunction StartOfAMonth(const AYear, AMonth: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDate(AYear,AMonth,1);\r\nend;\r\n\r\n\r\nFunction EndOfAMonth(const AYear, AMonth: Word): TDateTime;\r\n\r\nbegin\r\n Result:=EncodeDateTime(AYear,AMonth,MonthDays[IsLeapYear(AYear),AMonth],23,59,59,999);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction StartOfTheWeek(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Trunc(AValue)-DayOfTheWeek(AValue)+1;\r\nend;\r\n\r\n\r\nFunction EndOfTheWeek(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=EndOfTheDay(AValue-DayOfTheWeek(AValue)+7);\r\nend;\r\n\r\n\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDateWeek(AYear,AWeekOfYear,ADayOfWeek);\r\nend;\r\n\r\n\r\nFunction StartOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // ADayOFWeek 1\r\nbegin\r\n Result:=StartOfAWeek(AYear,AWeekOfYear,1)\r\nend;\r\n\r\n\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nbegin\r\n Result := EndOfTheDay(EncodeDateWeek(AYear, AWeekOfYear, ADayOfWeek));\r\nend;\r\n\r\n\r\nFunction EndOfAWeek(const AYear, AWeekOfYear: Word): TDateTime; // const ADayOfWeek: Word = 7\r\n\r\n\r\nbegin\r\n Result:=EndOfAWeek(AYear,AWeekOfYear,7);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Start/End of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction StartOfTheDay(const AValue: TDateTime): TDateTime;\r\nbegin\r\n Result:=Trunc(Avalue);\r\nend;\r\n\r\n\r\nFunction EndOfTheDay(const AValue: TDateTime): TDateTime;\r\n\r\nVar\r\n Y,M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,D);\r\n Result:=EncodeDateTime(Y,M,D,23,59,59,999);\r\nend;\r\n\r\n\r\nFunction StartOfADay(const AYear, AMonth, ADay: Word): TDateTime;\r\nbegin\r\n Result:=EncodeDate(AYear,AMonth,ADay);\r\nend;\r\n\r\n\r\nFunction StartOfADay(const AYear, ADayOfYear: Word): TDateTime;\r\nbegin\r\n Result:=StartOfAYear(AYear)+ADayOfYear-1;\r\nend;\r\n\r\n\r\nFunction EndOfADay(const AYear, AMonth, ADay: Word): TDateTime;\r\nbegin\r\n Result:=EndOfTheDay(EncodeDate(AYear,AMonth,ADay));\r\nend;\r\n\r\n\r\nFunction EndOfADay(const AYear, ADayOfYear: Word): TDateTime;\r\n\r\n\r\nbegin\r\n Result:=StartOfAYear(AYear)+ADayOfYear-1+EncodeTime(23,59,59,999);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of year functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction MonthOfTheYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=MonthOf(AValue);\r\nend;\r\n\r\n\r\nFunction WeekOfTheYear(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,DOW : Word;\r\n\r\nbegin\r\n DecodeDateWeek(AValue,Y,Result,DOW)\r\nend;\r\n\r\n\r\nFunction WeekOfTheYear(const AValue: TDateTime; out AYear: Word): Word;\r\n\r\nVar\r\n DOW : Word;\r\n\r\nbegin\r\n DecodeDateWeek(AValue,AYear,Result,DOW);\r\nend;\r\n\r\n\r\nFunction DayOfTheYear(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=Trunc(AValue-StartOfTheYear(AValue)+1);\r\nend;\r\n\r\n\r\nFunction HourOfTheYear(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=H+((DayOfTheYear(AValue)-1)*24);\r\nend;\r\n\r\n\r\nFunction MinuteOfTheYear(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=M+(H+((DayOfTheYear(AValue)-1)*24))*60;\r\nend;\r\n\r\n\r\nFunction SecondOfTheYear(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(M+(H+((DayOfTheYear(AValue)-1)*24))*60)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheYear(const AValue: TDateTime): NativeLargeInt;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((M+(H+((NativeLargeInt(DayOfTheYear(AValue))-1)*24))*60)*60+S)*1000+MS;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of month functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction WeekOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nvar\r\n Y,M,DOW : word;\r\n\r\nbegin\r\n DecodeDateMonthWeek(AValue,Y,M,Result,DOW);\r\nend;\r\n\r\n\r\nFunction WeekOfTheMonth(const AValue: TDateTime; out AYear, AMonth: Word): Word;\r\n\r\nVar\r\n DOW : Word;\r\n\r\nbegin\r\n DecodeDateMonthWeek(AValue,AYear,AMonth,Result,DOW);\r\nend;\r\n\r\n\r\nFunction DayOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,Y,M,Result);\r\nend;\r\n\r\n\r\nFunction HourOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=(D-1)*24+H;\r\nend;\r\n\r\n\r\nFunction MinuteOfTheMonth(const AValue: TDateTime): Word;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=((D-1)*24+H)*60+N;\r\nend;\r\n\r\n\r\nFunction SecondOfTheMonth(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=(((D-1)*24+H)*60+N)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheMonth(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Result:=((((D-1)*24+H)*60+N)*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of week functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction DayOfTheWeek(const AValue: TDateTime): Word;\r\n\r\nbegin\r\n Result:=DowMAP[DayOfWeek(AValue)];\r\nend;\r\n\r\n\r\nFunction HourOfTheWeek(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(DayOfTheWeek(AValue)-1)*24+H;\r\nend;\r\n\r\n\r\nFunction MinuteOfTheWeek(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((DayOfTheWeek(AValue)-1)*24+H)*60+M;\r\nend;\r\n\r\n\r\nFunction SecondOfTheWeek(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(((DayOfTheWeek(AValue)-1)*24+H)*60+M)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheWeek(const AValue: TDateTime): LongWord;\r\n\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((((DayOfTheWeek(AValue)-1)*24+H)*60+M)*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of day functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction HourOfTheDay(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=HourOf(AValue);\r\nend;\r\n\r\n\r\nFunction MinuteOfTheDay(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(H*60)+M;\r\nend;\r\n\r\n\r\nFunction SecondOfTheDay(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=((H*60)+M)*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheDay(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,M,S,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(((H*60)+M)*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of hour functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction MinuteOfTheHour(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=MinuteOf(AValue);\r\nend;\r\n\r\n\r\nFunction SecondOfTheHour(const AValue: TDateTime): Word;\r\n\r\nVar\r\n H,S,M,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=M*60+S;\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheHour(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,S,M,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=(M*60+S)*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of minute functions.\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction SecondOfTheMinute(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=SecondOf(AValue);\r\nend;\r\n\r\n\r\nFunction MilliSecondOfTheMinute(const AValue: TDateTime): LongWord;\r\n\r\nVar\r\n H,S,M,MS : Word;\r\n\r\nbegin\r\n DecodeTime(AValue,H,M,S,MS);\r\n Result:=S*1000+MS;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Part of second functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction MilliSecondOfTheSecond(const AValue: TDateTime): Word;\r\nbegin\r\n Result:=MilliSecondOf(AValue);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Range checking functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction WithinPastYears(const ANow, AThen: TDateTime; const AYears: Integer): Boolean;\r\nbegin\r\n Result:=YearsBetween(ANow,AThen)<=AYears;\r\nend;\r\n\r\n\r\nFunction WithinPastMonths(const ANow, AThen: TDateTime; const AMonths: Integer): Boolean;\r\nbegin\r\n Result:=MonthsBetween(ANow,AThen)<=AMonths;\r\nend;\r\n\r\n\r\nFunction WithinPastWeeks(const ANow, AThen: TDateTime; const AWeeks: Integer): Boolean;\r\nbegin\r\n Result:=WeeksBetween(ANow,AThen)<=AWeeks;\r\nend;\r\n\r\n\r\nFunction WithinPastDays(const ANow, AThen: TDateTime; const ADays: Integer): Boolean;\r\nbegin\r\n Result:=DaysBetween(ANow,AThen)<=ADays;\r\nend;\r\n\r\n\r\nFunction WithinPastHours(const ANow, AThen: TDateTime; const AHours: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=HoursBetween(ANow,AThen)<=AHours;\r\nend;\r\n\r\n\r\nFunction WithinPastMinutes(const ANow, AThen: TDateTime; const AMinutes: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=MinutesBetween(ANow,AThen)<=AMinutes;\r\nend;\r\n\r\n\r\nFunction WithinPastSeconds(const ANow, AThen: TDateTime; const ASeconds: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=SecondsBetween(ANow,Athen)<=ASeconds;\r\nend;\r\n\r\n\r\nFunction WithinPastMilliSeconds(const ANow, AThen: TDateTime; const AMilliSeconds: NativeLargeInt): Boolean;\r\nbegin\r\n Result:=MilliSecondsBetween(ANow,AThen)<=AMilliSeconds;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Period functions.\r\n ---------------------------------------------------------------------}\r\n\r\n{\r\n These functions are declared as approximate by Borland.\r\n A bit strange, since it can be calculated exactly ?\r\n\r\n -- No, because you need rounding or truncating (JM)\r\n}\r\n\r\n\r\nFunction DateTimeDiff(const ANow, AThen: TDateTime): TDateTime;\r\nbegin\r\n Result:= ANow - AThen;\r\n if (ANow>0) and (AThen<0) then\r\n Result:=Result-0.5\r\n else if (ANow<-1.0) and (AThen>-1.0) then\r\n Result:=Result+0.5;\r\nend;\r\n\r\n\r\nFunction YearsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\n\r\nvar\r\n yy, mm, dd: Word;\r\n \r\nbegin\r\n if AExact and (ANow >= -DateDelta) and (AThen >= -DateDelta) and\r\n (ANow <= MaxDateTime) and (AThen <= MaxDateTime) then\r\n begin\r\n PeriodBetween(ANow, AThen, yy , mm, dd);\r\n Result := yy;\r\n end\r\n else\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)/ApproxDaysPerYear);\r\nend;\r\n\r\n\r\nFunction MonthsBetween(const ANow, AThen: TDateTime; AExact : Boolean = False): Integer;\r\n\r\nvar\r\n y, m, d: Word;\r\n\r\nbegin\r\n if AExact and (ANow >= -DateDelta) and (AThen >= -DateDelta) and\r\n (ANow <= MaxDateTime) and (AThen <= MaxDateTime) then\r\n begin\r\n PeriodBetween(ANow, AThen, y, m, d);\r\n Result := y*12 + m;\r\n end\r\n else\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)/ApproxDaysPerMonth);\r\nend;\r\n\r\n\r\nFunction WeeksBetween(const ANow, AThen: TDateTime): Integer;\r\nbegin\r\n Result:=Trunc(Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond) div 7;\r\nend;\r\n\r\n\r\nFunction DaysBetween(const ANow, AThen: TDateTime): Integer;\r\nbegin\r\n Result:=Trunc(Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond);\r\nend;\r\n\r\n\r\nFunction HoursBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*HoursPerDay);\r\nend;\r\n\r\n\r\nFunction MinutesBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*MinsPerDay);\r\nend;\r\n\r\n\r\nFunction SecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*SecsPerDay);\r\nend;\r\n\r\n\r\nFunction MilliSecondsBetween(const ANow, AThen: TDateTime): NativeLargeInt;\r\nbegin\r\n Result:=Trunc((Abs(DateTimeDiff(ANow,AThen))+HalfMilliSecond)*MSecsPerDay);\r\nend;\r\n\r\nProcedure PeriodBetween(Const ANow, AThen: TDateTime; Out Years, months, days : Word); \r\n\r\nvar\r\n Y1, Y2, M1, M2, D1, D2: word;\r\n\r\nbegin\r\n if (AThen>ANow) then\r\n begin\r\n DecodeDate(ANow,Y1,M1,D1);\r\n DecodeDate(AThen,Y2,M2,D2);\r\n end\r\n else\r\n begin \r\n DecodeDate(AThen,Y1,M1,D1);\r\n DecodeDate(ANow,Y2,M2,D2);\r\n end;\r\n Years:=Y2-Y1;\r\n if (M1>M2) or ((M1=M2) and (D1>D2)) then Dec(Years);\r\n if (M1>M2) then Inc(M2,12); //already adjusted Years in that case\r\n Months:=M2-M1;\r\n if (D2>=D1) then\r\n Days:=D2-D1\r\n else\r\n begin\r\n if (Months=0) then\r\n Months:=11\r\n else\r\n Dec(Months);\r\n Days:=(DaysInAMonth(Y1,M1)-D1)+D2;\r\n end;\r\nend; \r\n\r\n{ ---------------------------------------------------------------------\r\n Timespan in xxx functions.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction YearSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))/ApproxDaysPerYear;\r\nend;\r\n\r\n\r\nFunction MonthSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))/ApproxDaysPerMonth;\r\nend;\r\n\r\n\r\nFunction WeekSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen)) / 7\r\nend;\r\n\r\n\r\nFunction DaySpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen));\r\nend;\r\n\r\n\r\nFunction HourSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*HoursPerDay;\r\nend;\r\n\r\n\r\nFunction MinuteSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*MinsPerDay;\r\nend;\r\n\r\n\r\nFunction SecondSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*SecsPerDay;\r\nend;\r\n\r\n\r\nFunction MilliSecondSpan(const ANow, AThen: TDateTime): Double;\r\nbegin\r\n Result:=Abs(DateTimeDiff(ANow,AThen))*MSecsPerDay;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Increment/decrement functions.\r\n ---------------------------------------------------------------------}\r\n\r\n{ TDateTime is not defined in the interval [-1.0..0.0[. Additionally, when\r\n negative the time part must be treated using its absolute value (0.25 always\r\n means \"6 a.m.\") -> skip the gap and convert the time part when crossing the\r\n gap -- and take care of rounding errors }\r\nProcedure MaybeSkipTimeWarp(OldDate: TDateTime; var NewDate: TDateTime);\r\nbegin\r\n if (OldDate>=0) and (NewDate<-TDateTimeEpsilon) then\r\n NewDate:=int(NewDate-1.0+TDateTimeEpsilon)-frac(1.0+frac(NewDate))\r\n else if (OldDate<=-1.0) and (NewDate>-1.0+TDateTimeEpsilon) then\r\n NewDate:=int(NewDate+1.0-TDateTimeEpsilon)+frac(1.0-abs(frac(1.0+NewDate)));\r\nend;\r\n\r\n\r\nfunction IncNegativeTime(AValue, Addend: TDateTime): TDateTime;\r\nvar\r\n newtime: tdatetime;\r\nbegin\r\n newtime:=-frac(Avalue)+frac(Addend);\r\n { handle rounding errors }\r\n if SameValue(newtime,int(newtime)+1,TDateTimeEpsilon) then\r\n newtime:=int(newtime)+1\r\n else if SameValue(newtime,int(newtime),TDateTimeEpsilon) then\r\n newtime:=int(newtime);\r\n { time underflow -> previous day }\r\n if newtime<-TDateTimeEpsilon then\r\n begin\r\n newtime:=1.0+newtime;\r\n avalue:=int(avalue)-1;\r\n end\r\n { time overflow -> next day }\r\n else if newtime>=1.0-TDateTimeEpsilon then\r\n begin\r\n newtime:=newtime-1.0;\r\n avalue:=int(avalue)+1;\r\n end;\r\n Result:=int(AValue)+int(Addend)-newtime;\r\nend;\r\n\r\nFunction IncYear(const AValue: TDateTime; const ANumberOfYears: Integer ): TDateTime;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n Y:=Y+ANumberOfYears;\r\n If (M=2) and (D=29) And (Not IsLeapYear(Y)) then\r\n D:=28;\r\n Result:=EncodeDateTime(Y,M,D,H,N,S,MS);\r\nend;\r\n\r\n\r\nFunction IncYear(const AValue: TDateTime): TDateTime; // ; const ANumberOfYears: Integer = 1)\r\nbegin\r\n Result:=IncYear(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncWeek(const AValue: TDateTime; const ANumberOfWeeks: Integer): TDateTime;\r\nbegin\r\n Result:=AValue+ANumberOfWeeks*7;\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncWeek(const AValue: TDateTime): TDateTime; // ; const ANumberOfWeeks: Integer = 1)\r\nbegin\r\n Result:=IncWeek(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncDay(const AValue: TDateTime; const ANumberOfDays: Integer): TDateTime;\r\nbegin\r\n Result:=AValue+ANumberOfDays;\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncDay(const AValue: TDateTime): TDateTime; //; const ANumberOfDays: Integer = 1)\r\nbegin\r\n Result:=IncDay(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncHour(const AValue: TDateTime; const ANumberOfHours: NativeLargeInt): TDateTime;\r\nbegin\r\n if AValue>=0 then\r\n Result:=AValue+ANumberOfHours/HoursPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfHours/HoursPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncHour(const AValue: TDateTime): TDateTime; //; const ANumberOfHours: NativeLargeInt = 1\r\nbegin\r\n Result:=IncHour(AValue,1);\r\nend;\r\n\r\n\r\nFunction IncMinute(const AValue: TDateTime; const ANumberOfMinutes: NativeLargeInt): TDateTime;\r\nbegin\r\n if AValue>=0 then\r\n Result:=AValue+ANumberOfMinutes/MinsPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfMinutes/MinsPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncMinute(const AValue: TDateTime): TDateTime; // ; const ANumberOfMinutes: NativeLargeInt = 1\r\nbegin\r\n Result:=IncMinute(AValue,1);\r\nend;\r\n\r\n\r\nFunction IncSecond(const AValue: TDateTime; const ANumberOfSeconds: NativeLargeInt): TDateTime;\r\nbegin\r\n if AValue>=0 then\r\n Result:=AValue+ANumberOfSeconds/SecsPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfSeconds/SecsPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfSeconds: NativeLargeInt = 1\r\nbegin\r\n Result:=IncSecond(Avalue,1);\r\nend;\r\n\r\n\r\nFunction IncMilliSecond(const AValue: TDateTime; const ANumberOfMilliSeconds: NativeLargeInt): TDateTime;\r\nbegin\r\n if Avalue>=0 then\r\n Result:=AValue+ANumberOfMilliSeconds/MSecsPerDay\r\n else\r\n Result:=IncNegativeTime(Avalue,ANumberOfMilliSeconds/MSecsPerDay);\r\n MaybeSkipTimeWarp(AValue,Result);\r\nend;\r\n\r\n\r\nFunction IncMilliSecond(const AValue: TDateTime): TDateTime; // ; const ANumberOfMilliSeconds: NativeLargeInt = 1\r\nbegin\r\n Result:=IncMilliSecond(AValue,1);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/Decode of complete timestamp\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateTime(AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond,Result) then\r\n InvalidDateTimeError(AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond)\r\nend;\r\n\r\n\r\nProcedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);\r\nbegin\r\n DecodeTime(AValue,AHour,AMinute,ASecond,AMilliSecond);\r\n if AHour=24 then // can happen due rounding issues mantis 17123\r\n begin\r\n AHour:=0; // rest is already zero\r\n DecodeDate(round(AValue),AYear,AMonth,ADay);\r\n end\r\n else\r\n DecodeDate(AValue,AYear,AMonth,ADay);\r\nend;\r\n\r\n\r\nFunction TryEncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AValue: TDateTime): Boolean;\r\n\r\nVar\r\n tmp : TDateTime;\r\n\r\nbegin\r\n Result:=TryEncodeDate(AYear,AMonth,ADay,AValue);\r\n Result:=Result and TryEncodeTime(AHour,AMinute,ASecond,Amillisecond,Tmp);\r\n If Result then\r\n Avalue:=ComposeDateTime(AValue,Tmp);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of year and day of week\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateWeek(AYear,AWeekOfYear,Result,ADayOfWeek) then\r\n InvalidDateWeekError(AYear,AWeekOfYear,ADayOfWeek);\r\nend;\r\n\r\n\r\nFunction EncodeDateWeek(const AYear, AWeekOfYear: Word): TDateTime; //; const ADayOfWeek: Word = 1\r\nbegin\r\n Result := EncodeDateWeek(AYear,AWeekOfYear,1);\r\nend;\r\n\r\n\r\nProcedure DecodeDateWeek(const AValue: TDateTime; out AYear, AWeekOfYear, ADayOfWeek: Word);\r\n\r\nvar\r\n DOY : Integer;\r\n D: Word;\r\n YS : TDateTime;\r\n YSDOW, YEDOW: Word;\r\n\r\nbegin\r\n AYear:=YearOf(AValue);\r\n // Correct to ISO DOW\r\n ADayOfWeek:=DayOfWeek(AValue)-1;\r\n If ADAyOfWeek=0 then\r\n ADayofweek:=7;\r\n YS:=StartOfAYear(AYear);\r\n DOY:=Trunc(AValue-YS)+1;\r\n YSDOW:=DayOfTheWeek(YS);\r\n // Correct week if later than wednesday. First week never starts later than wednesday\r\n if (YSDOW<5) then\r\n Inc(DOY,YSDOW-1)\r\n else\r\n Dec(DOY,8-YSDOW);\r\n if (DOY<=0) then // Day is in last week of previous year.\r\n DecodeDateWeek(YS-1,AYear,AWeekOfYear,D)\r\n else\r\n begin\r\n AWeekOfYear:=DOY div 7;\r\n if ((DOY mod 7)<>0) then\r\n Inc(AWeekOfYear);\r\n if (AWeekOfYear>52) then // Maybe in first week of next year ?\r\n begin\r\n YEDOW:=YSDOW;\r\n if IsLeapYear(AYear) then\r\n begin\r\n Inc(YEDOW);\r\n if (YEDOW>7) then\r\n YEDOW:=1;\r\n end;\r\n if (YEDOW<4) then // Really next year.\r\n begin\r\n Inc(AYear);\r\n AWeekOfYear:=1;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\n\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime; const ADayOfWeek: Word): Boolean;\r\n\r\nVar\r\n DOW : Word;\r\n Rest : Integer;\r\n\r\nbegin\r\n Result:=IsValidDateWeek(Ayear,AWeekOfYear,ADayOfWeek);\r\n If Result then\r\n begin\r\n AValue:=EncodeDate(AYear,1,1)+(7*(AWeekOfYear-1));\r\n DOW:=DayOfTheWeek(AValue);\r\n Rest:=ADayOfWeek-DOW;\r\n If (DOW>4) then\r\n Inc(Rest,7);\r\n AValue:=AValue+Rest;\r\n end;\r\nend;\r\n\r\n\r\nFunction TryEncodeDateWeek(const AYear, AWeekOfYear: Word; out AValue: TDateTime): Boolean; //; const ADayOfWeek: Word = 1\r\nbegin\r\n Result:=TryEncodeDateWeek(AYear,AWeekOfYear,AValue,1);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying day of year\r\n ---------------------------------------------------------------------}\r\n\r\nFunction EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateDay(AYear,ADayOfYear,Result) then\r\n InvalidDateDayError(AYear,ADayOfYear);\r\nend;\r\n\r\n\r\nProcedure DecodeDateDay(const AValue: TDateTime; out AYear, ADayOfYear: Word);\r\n\r\nVar\r\n M,D : Word;\r\n\r\nbegin\r\n DecodeDate(AValue,AYear,M,D);\r\n ADayOfyear:=Trunc(AValue-EncodeDate(AYear,1,1))+1;\r\nend;\r\n\r\n\r\nFunction TryEncodeDateDay(const AYear, ADayOfYear: Word; out AValue: TDateTime): Boolean;\r\nbegin\r\n Result:=(ADayOfYear<>0) and (ADayOfYear<=DaysPerYear [IsleapYear(AYear)]);\r\n If Result then\r\n AValue:=EncodeDate(AYear,1,1)+ADayOfYear-1;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Encode/decode date, specifying week of month\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word): TDateTime;\r\nbegin\r\n If Not TryEncodeDateMonthWeek(Ayear,AMonth,AWeekOfMonth,ADayOfWeek,Result) then\r\n InvalidDateMonthWeekError(AYear,AMonth,AWeekOfMonth,ADayOfWeek);\r\nend;\r\n\r\nProcedure DecodeDateMonthWeek(const AValue: TDateTime; out AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\n\r\nVar\r\n D,SDOM,EDOM : Word;\r\n SOM : TdateTime;\r\n DOM : Integer;\r\nbegin\r\n DecodeDate(AValue,AYear,AMonth,D);\r\n ADayOfWeek:=DayOfTheWeek(AValue);\r\n SOM:=EncodeDate(Ayear,Amonth,1);\r\n SDOM:=DayOfTheWeek(SOM);\r\n DOM:=D-1+SDOM;\r\n If SDOM>4 then\r\n Dec(DOM,7);\r\n // Too early in the month. First full week is next week, day is after thursday.\r\n If DOM<=0 Then\r\n DecodeDateMonthWeek(SOM-1,AYear,AMonth,AWeekOfMonth,D)\r\n else\r\n begin\r\n AWeekOfMonth:=(DOM div 7);\r\n if (DOM mod 7)<>0 then\r\n Inc(AWeekOfMonth);\r\n EDOM:=DayOfTheWeek(EndOfAMonth(Ayear,AMonth));\r\n // In last days of last long week, so in next month...\r\n If (EDOM<4) and ((DaysInAMonth(AYear,Amonth)-D)24\r\n ---------------------------------------------------------------------}\r\n\r\nfunction TryEncodeTimeInterval(Hour, Min, Sec, MSec: word; out Time: TDateTime): boolean;\r\nbegin\r\n Result:= (Min<60) and (Sec<60) and (MSec<1000);\r\n If Result then\r\n Time:=TDateTime(cardinal(Hour)*3600000+cardinal(Min)*60000+cardinal(Sec)*1000+MSec)/MSecsPerDay;\r\nend;\r\n\r\nfunction EncodeTimeInterval(Hour, Minute, Second, MilliSecond: word): TDateTime;\r\nbegin\r\n If not TryEncodeTimeInterval(Hour,Minute,Second,MilliSecond,Result) then\r\n Raise EConvertError.CreateFmt(SerrInvalidHourMinuteSecMsec,\r\n [Hour,Minute,Second,MilliSecond]);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Replace given element with supplied value.\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n LFAI = RecodeLeaveFieldAsIS; // Less typing, readable code\r\n{\r\n Note: We have little choice but to implement it like Borland did:\r\n If AValue contains some 'wrong' value, it will throw an error.\r\n To simulate this we'd have to check in each function whether\r\n both arguments are correct. To avoid it, all is routed through\r\n the 'central' RecodeDateTime function as in Borland's implementation.\r\n}\r\n\r\nFunction RecodeYear(const AValue: TDateTime; const AYear: Word): TDateTime;\r\n\r\nbegin\r\n Result := RecodeDateTime(AValue,AYear,LFAI,LFAI,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeMonth(const AValue: TDateTime; const AMonth: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,AMonth,LFAI,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeDay(const AValue: TDateTime; const ADay: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,ADay,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeHour(const AValue: TDateTime; const AHour: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,AHour,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeMinute(const AValue: TDateTime; const AMinute: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,LFAI,AMinute,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeSecond(const AValue: TDateTime; const ASecond: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,LFAI,LFAI,ASecond,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,LFAI,LFAI,LFAI,AMilliSecond);\r\nend;\r\n\r\n\r\nFunction RecodeDate(const AValue: TDateTime; const AYear, AMonth, ADay: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,AYear,AMonth,ADay,LFAI,LFAI,LFAI,LFAI);\r\nend;\r\n\r\n\r\nFunction RecodeTime(const AValue: TDateTime; const AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nbegin\r\n Result := RecodeDateTime(AValue,LFAI,LFAI,LFAI,AHour,AMinute,ASecond,AMilliSecond);\r\nend;\r\n\r\n\r\nFunction RecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word): TDateTime;\r\nbegin\r\n If Not TryRecodeDateTime(AValue,AYear,AMonth,ADay,AHour,AMinute,ASecond,AMilliSecond,Result) then\r\n InvalidDateTimeError(AYear,AMonth,ADay,AHour,AMinute,ASecond,AMilliSecond,AValue);\r\nend;\r\n\r\n\r\nFunction TryRecodeDateTime(const AValue: TDateTime; const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; out AResult: TDateTime): Boolean;\r\n\r\n Procedure FV (var AV{%H-} : Word; Arg : Word);\r\n\r\n begin\r\n If (Arg<>LFAI) then\r\n AV:=Arg;\r\n end;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n\r\nbegin\r\n DecodeDateTime(AValue,Y,M,D,H,N,S,MS);\r\n FV(Y,AYear);\r\n FV(M,AMonth);\r\n FV(D,ADay);\r\n FV(H,AHour);\r\n FV(N,AMinute);\r\n FV(S,ASecond);\r\n FV(MS,AMillisecond);\r\n Result:=TryEncodeDateTime(Y,M,D,H,N,S,MS,AResult);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Comparision of date/time\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nFunction CompareDateTime(const A, B: TDateTime): TValueRelationship;\r\nbegin\r\n If SameDateTime(A,B) then\r\n Result:=EqualsValue\r\n else if trunc(a)=trunc(b) then\r\n begin\r\n if abs(frac(a))>abs(frac(b)) then \r\n result:=GreaterThanValue\r\n else \r\n result:=LessThanValue;\r\n end \r\n else \r\n begin\r\n if a>b then \r\n result:=GreaterThanValue\r\n else \r\n result:=LessThanValue;\r\n end;\r\nend;\r\n\r\n\r\nFunction CompareDate(const A, B: TDateTime): TValueRelationship;\r\nbegin\r\n If SameDate(A,B) then\r\n Result:=EQualsValue\r\n else if AADayOfWeek then\r\n D:=D+7; // Clearer would have been Inc(ANthDayOfweek) but it's a const\r\n Result:=TryEncodeDate(Ayear,AMonth,D,AValue);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Exception throwing routines\r\n ---------------------------------------------------------------------}\r\n\r\n\r\n\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word; const ABaseDate: TDateTime);\r\n\r\n Function DoField(Arg,Def : Word; Unknown: String) : String;\r\n\r\n begin\r\n if Def=0 then ;\r\n If (Arg<>LFAI) then\r\n Result:=Format('%.*d',[Length(Unknown),Arg])\r\n else if (ABaseDate=0) then\r\n Result:=Unknown\r\n else\r\n Result:=Format('%.*d',[Length(Unknown),Arg]);\r\n end;\r\n\r\nVar\r\n Y,M,D,H,N,S,MS : Word;\r\n Msg : String;\r\n\r\nbegin\r\n DecodeDateTime(ABasedate,Y,M,D,H,N,S,MS);\r\n Msg:=DoField(AYear,Y,'????');\r\n Msg:=Msg+DateSeparator+DoField(AMonth,M,'??');\r\n Msg:=Msg+DateSeparator+DoField(ADay,D,'??');\r\n Msg:=Msg+' '+DoField(AHour,H,'??');\r\n Msg:=Msg+TimeSeparator+DoField(AMinute,N,'??');\r\n Msg:=Msg+TimeSeparator+Dofield(ASecond,S,'??');\r\n Msg:=Msg+DecimalSeparator+DoField(AMilliSecond,MS,'???');\r\n Raise EConvertError.CreateFmt(SErrInvalidTimeStamp,[Msg]);\r\nend;\r\n\r\n\r\nProcedure InvalidDateTimeError(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word); // const ABaseDate: TDateTime = 0\r\nbegin\r\n InvalidDateTimeError(AYear,AMonth,ADay,AHour,AMinute,ASecond,AMilliSecond,0);\r\nend;\r\n\r\n\r\nProcedure InvalidDateWeekError(const AYear, AWeekOfYear, ADayOfWeek: Word);\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDateWeek,[AYear,AWeekOfYear,ADayOfWeek]);\r\nend;\r\n\r\n\r\nProcedure InvalidDateDayError(const AYear, ADayOfYear: Word);\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDayOfYear,[AYear,ADayOfYear]);\r\nend;\r\n\r\n\r\nProcedure InvalidDateMonthWeekError(const AYear, AMonth, AWeekOfMonth, ADayOfWeek: Word);\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDateMonthWeek,[Ayear,AMonth,AWeekOfMonth,ADayOfWeek]);\r\nend;\r\n\r\n\r\nProcedure InvalidDayOfWeekInMonthError(const AYear, AMonth, ANthDayOfWeek, ADayOfWeek: Word);\r\n\r\nbegin\r\n Raise EConvertError.CreateFmt(SErrInvalidDayOfWeekInMonth,[AYear,AMonth,ANthDayOfWeek,ADayOfWeek]);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n Julian and Modified Julian Date conversion support\r\n ---------------------------------------------------------------------}\r\n\r\n{$push}\r\n{$R-}\r\n{$Q-}\r\n\r\nFunction DateTimeToJulianDate(const AValue: TDateTime): Double;\r\nvar\r\n day,month,year: word;\r\n a,y,m: longint;\r\nbegin\r\n DecodeDate ( AValue, year, month, day );\r\n a := (14-month) div 12;\r\n y := year + 4800 - a;\r\n m := month + (12*a) - 3;\r\n result := day + ((153*m+2) div 5) + (365*y)\r\n + (y div 4) - (y div 100) + (y div 400) - 32045.5 + frac(avalue);\r\nend;\r\n\r\n\r\nFunction JulianDateToDateTime(const AValue: Double): TDateTime;\r\nbegin\r\n if not TryJulianDateToDateTime(AValue, Result) then\r\n raise EConvertError.CreateFmt(SInvalidJulianDate, [AValue]);\r\nend;\r\n\r\n\r\nFunction TryJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\nvar\r\n a,b,c,d,e,m:longint;\r\n day,month,year: word;\r\nbegin\r\n a := trunc(AValue + 32044.5);\r\n b := (4*a + 3) div 146097;\r\n c := a - (146097*b div 4);\r\n d := (4*c + 3) div 1461;\r\n e := c - (1461*d div 4);\r\n m := (5*e+2) div 153;\r\n day := e - ((153*m + 2) div 5) + 1;\r\n month := m + 3 - 12 * ( m div 10 );\r\n year := (100*b) + d - 4800 + ( m div 10 );\r\n result := TryEncodeDate ( Year, Month, Day, ADateTime );\r\n if Result then\r\n// ADateTime:=IncMilliSecond(IncHour(ADateTime,-12),MillisecondOfTheDay(Abs(Frac(aValue))));\r\n ADateTime:=ADateTime+frac(AValue-0.5);\r\nend;\r\n\r\nFunction DateTimeToModifiedJulianDate(const AValue: TDateTime): Double;\r\nbegin\r\n result := DateTimeToJulianDate(AValue) - 2400000.5;\r\nend;\r\n\r\n\r\nFunction ModifiedJulianDateToDateTime(const AValue: Double): TDateTime;\r\nbegin\r\n result := JulianDateToDateTime(AValue + 2400000.5);\r\nend;\r\n\r\n\r\nFunction TryModifiedJulianDateToDateTime(const AValue: Double; out ADateTime: TDateTime): Boolean;\r\nbegin\r\n Result:=TryJulianDateToDateTime(AValue + 2400000.5, ADateTime);\r\nend;\r\n\r\n{$pop}//{$R-}{$Q-} for Julian conversion functions\r\n\r\n{ ---------------------------------------------------------------------\r\n Unix timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToUnix(const AValue: TDateTime): NativeLargeInt;\r\n\r\nbegin\r\n Result:=Round(DateTimeDiff(RecodeMillisecond(AValue,0),UnixEpoch)*SecsPerDay);\r\nend;\r\n\r\n\r\nFunction UnixToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nbegin\r\n Result:=IncSecond(UnixEpoch, AValue);\r\nend;\r\n\r\n\r\nFunction UnixTimeStampToMac(const AValue: NativeLargeInt): NativeLargeInt;\r\nconst\r\n Epoch=24107 * 24 * 3600;\r\nbegin\r\n Result:=AValue + Epoch;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n Mac timestamp support.\r\n ---------------------------------------------------------------------}\r\n\r\nFunction DateTimeToMac(const AValue: TDateTime): NativeLargeInt;\r\nvar\r\n Epoch:TDateTime;\r\nbegin\r\n Epoch:=EncodeDateTime( 1904, 1, 1, 0, 0, 0, 0 );\r\n Result:=SecondsBetween( Epoch, AValue );\r\nend;\r\n\r\n\r\nFunction MacToDateTime(const AValue: NativeLargeInt): TDateTime;\r\nvar\r\n Epoch:TDateTime;\r\nbegin\r\n Epoch:=EncodeDateTime( 1904, 1, 1, 0, 0, 0, 0 );\r\n Result:=IncSecond( Epoch, AValue );\r\nend;\r\n\r\n\r\nFunction MacTimeStampToUnix(const AValue: NativeLargeInt): NativeLargeInt;\r\nconst\r\n Epoch=24107 * 24 * 3600;\r\nbegin\r\n Result:=AValue - Epoch;\r\nend;\r\n\r\nFunction DateTimeToDosDateTime(const AValue: TDateTime): longint;\r\nvar year,month,day,hour,min,sec,msec : word;\r\n zs : longint;\r\nbegin\r\n decodedatetime(avalue,year,month,day,hour,min,sec,msec);\r\n result:=-1980;\r\n result:=result+year and 127;\r\n result:=result shl 4;\r\n result:=result+month;\r\n result:=result shl 5;\r\n result:=result+day;\r\n result:=result shl 16;\r\n zs:=hour;\r\n zs:=zs shl 6;\r\n zs:=zs+min;\r\n zs:=zs shl 5;\r\n zs:=zs+sec div 2;\r\n result:=result+(zs and $ffff);\r\nend;\r\n\r\nFunction DosDateTimeToDateTime( AValue: longint): TDateTime;\r\nvar year,month,day,hour,min,sec : integer;\r\nbegin\r\n sec:=(AValue and 31) * 2;\r\n avalue:=AValue shr 5;\r\n min:=AValue and 63;\r\n avalue:=AValue shr 6;\r\n hour:=AValue and 31;\r\n avalue:=AValue shr 5;\r\n day:=AValue and 31;\r\n avalue:=AValue shr 5;\r\n month:=AValue and 15;\r\n avalue:=AValue shr 4;\r\n year:=AValue+1980;\r\n result:=EncodeDateTime(year,month,day,hour,min,sec,0);\r\nend;\r\n\r\n\r\n\r\nconst whitespace = [' ',#13,#10];\r\n hrfactor = 1/(24);\r\n minfactor = 1/(24*60);\r\n secfactor = 1/(24*60*60);\r\n mssecfactor = 1/(24*60*60*1000);\r\n\r\nconst AMPMformatting : array[0..2] of string =('am/pm','a/p','ampm');\r\n\r\nprocedure raiseexception(const s:string);\r\n\r\nbegin\r\n raise EConvertError.Create(s);\r\nend;\r\n\r\n{ Conversion of UTC to local time and vice versa }\r\n\r\nFunction GetLocalTimeOffset : Integer;\r\n\r\nbegin\r\n Result:=TJSDate.New.getTimezoneOffset();\r\nend;\r\n\r\nfunction UniversalTimeToLocal(UT: TDateTime): TDateTime;\r\n\r\nbegin\r\n Result:=UniversalTimeToLocal(UT,-GetLocalTimeOffset);\r\nend;\r\n\r\nfunction UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime;\r\n\r\nbegin\r\n if (TZOffset > 0) then\r\n Result := UT + EncodeTime(TZOffset div 60, TZOffset mod 60, 0, 0)\r\n else if (TZOffset < 0) then\r\n Result := UT - EncodeTime(Abs(TZOffset) div 60, Abs(TZOffset) mod 60, 0, 0)\r\n else\r\n Result := UT;\r\nend;\r\n \r\nFunction LocalTimeToUniversal(LT: TDateTime): TDateTime;\r\n\r\nbegin\r\n Result:=LocalTimeToUniversal(LT,-GetLocalTimeOffset);\r\nend;\r\n\r\nFunction LocalTimeToUniversal(LT: TDateTime;TZOffset: Integer): TDateTime;\r\n\r\nbegin\r\n if (TZOffset > 0) then\r\n Result := LT - EncodeTime(TZOffset div 60, TZOffset mod 60, 0, 0)\r\n else if (TZOffset < 0) then\r\n Result := LT + EncodeTime(Abs(TZOffset) div 60, Abs(TZOffset) mod 60, 0, 0)\r\n else\r\n Result := LT;\r\nend;\r\n\r\n\r\n{ RFC 3339 }\r\n\r\nfunction DateTimeToRFC3339(ADate :TDateTime):string;\r\n\r\nbegin\r\n Result:=FormatDateTime('yyyy-mm-dd\"T\"hh\":\"nn\":\"ss\".\"zzz\"Z\"',ADate);\r\nend;\r\n\r\nfunction DateToRFC3339(ADate: TDateTime): string;\r\nbegin\r\n Result:=FormatDateTime('yyyy-mm-dd',ADate);\r\nend;\r\n\r\nfunction TimeToRFC3339(ADate :TDateTime):string;\r\n\r\nbegin\r\n Result:=FormatDateTime('hh\":\"nn\":\"ss\".\"zzz',ADate);\r\nend;\r\n\r\nFunction TryRFC3339ToDateTime(const Avalue: String; out ADateTime: TDateTime): Boolean;\r\n\r\n// 1 2\r\n// 12345678901234567890123\r\n// yyyy-mm-ddThh:nn:ss.zzz\r\n\r\nType\r\n TPartPos = (ppTime,ppYear,ppMonth,ppDay,ppHour,ppMinute,ppSec);\r\n TPos = Array [TPartPos] of byte;\r\n\r\nConst\r\n P : TPos = (11,1,6,9,12,15,18);\r\n\r\nvar\r\n lY, lM, lD, lH, lMi, lS: Integer;\r\n\r\nbegin\r\n if Trim(AValue) = '' then\r\n begin\r\n Result:=True;\r\n ADateTime:=0;\r\n end;\r\n lY:=StrToIntDef(Copy(AValue,P[ppYear],4),-1);\r\n lM:=StrToIntDef(Copy(AValue,P[ppMonth],2),-1);\r\n lD:=StrToIntDef(Copy(AValue,P[ppDay],2),-1);\r\n if (Length(AValue)>=P[ppTime]) then\r\n begin\r\n lH:=StrToIntDef(Copy(AValue,P[ppHour],2),-1);\r\n lMi:=StrToIntDef(Copy(AValue,P[ppMinute],2),-1);\r\n lS:=StrToIntDef(Copy(AValue,P[ppSec],2),-1);\r\n end\r\n else\r\n begin\r\n lH:=0;\r\n lMi:=0;\r\n lS:=0;\r\n end;\r\n Result:=(lY>=0) and (lM>=0) and (lD>=0) and (lH>=0) and (lMi>=0) and (ls>=0);\r\n if Not Result then\r\n ADateTime:=0\r\n else\r\n { Cannot EncodeDate if any part equals 0. EncodeTime is okay. }\r\n if (lY = 0) or (lM = 0) or (lD = 0) then\r\n ADateTime:=EncodeTime(lH, lMi, lS, 0)\r\n else\r\n ADateTime:=EncodeDate(lY, lM, lD) + EncodeTime(lH, lMi, lS, 0);\r\nend;\r\n\r\nFunction RFC3339ToDateTime(const Avalue: String): TDateTime;\r\n\r\nbegin\r\n if Not TryRFC3339ToDateTime(AValue,Result) then\r\n Result:=0;\r\nend;\r\n\r\nconst\r\n\r\n SPatternCharMismatch = 'Pattern mismatch char \"%s\" at position %d.';\r\n SNoCharMatch = 'Mismatch char \"%s\" <> \"%s\" at pattern position %d, string position %d.';\r\n SHHMMError = 'mm in a sequence hh:mm is interpreted as minutes. No longer versions allowed! (Position : %d).' ;\r\n SNoArrayMatch = 'Can''t match any allowed value at pattern position %d, string position %d.';\r\n //SFullpattern = 'Couldn''t match entire pattern string. Input too short at pattern position %d.';\r\n\r\n\r\n{ TDateTimeScanner }\r\nprocedure TDateTimeScanner.ArrayMatchError;\r\n\r\nbegin\r\n raiseexception(format(SNoArrayMatch,[FPatternPos+1,FPos]))\r\nend;\r\n\r\nprocedure TDateTimeScanner.SetPattern(AValue: String);\r\nbegin\r\n if FPattern=AValue then Exit;\r\n FPattern:=AValue;\r\n FPatternLen:=Length(FPattern);\r\nend;\r\n\r\nprocedure TDateTimeScanner.SetText(AValue: String);\r\nbegin\r\n if FText=AValue then Exit;\r\n FText:=AValue;\r\n FLen:=Length(FText);\r\nend;\r\n\r\nfunction TDateTimeScanner.ScanFixedInt(maxv:integer):integer;\r\n\r\nvar\r\n c,n : char;\r\n oi:integer;\r\n\r\nbegin\r\n Result:=0;\r\n oi:=FPos;\r\n c:=FPattern[FPatternPos];\r\n while (FPatternPos<=FPatternLen) and (FPattern[FPatternPos]=c) do\r\n Inc(FPatternPos);\r\n N:=FText[FPos];\r\n while (maxv>0) and (FPos<=FLen) and (N IN ['0'..'9']) do\r\n begin\r\n Result:=(Result*10)+ord(N)-48;\r\n inc(FPos);\r\n dec(maxv);\r\n if FPos<=FLen then\r\n N:=FText[FPos];\r\n end;\r\n if (OI=FPos) then\r\n raiseexception(format(SPatternCharMismatch,[c,oi]));\r\nend;\r\n\r\nfunction TDateTimeScanner.FindIMatch(const values :array of string; aTerm : string):integer;\r\n\r\nvar\r\n l,i : integer;\r\n\r\nbegin\r\n Result:=-1;\r\n l:=high(values);\r\n i:=0;\r\n while (i<=l) and (result=-1) do\r\n begin\r\n if SameText(Copy(aTerm,1,Length(values[i])),values[i]) then\r\n Result:=i;\r\n inc(i);\r\n end;\r\nend;\r\n\r\nfunction TDateTimeScanner.FindMatch(const Values : array of string):integer;\r\n\r\nbegin\r\n result:=FindIMatch(Values,Copy(FText,FPos,FLen-FPos+1));\r\n if result=-1 then\r\n arraymatcherror\r\n else\r\n begin\r\n inc(FPos,length(Values[result])+1);\r\n inc(FPatternPos,length(Values[result])+1);\r\n inc(result); // was 0 based.\r\n end;\r\nend;\r\n\r\n\r\nprocedure TDateTimeScanner.MatchChar(c:char);\r\n\r\nVar\r\n N : Char;\r\n\r\nbegin\r\n if (FPos<=Flen) then\r\n N:=FText[FPos]\r\n else\r\n N:='?';\r\n if (N<>c) then\r\n raiseexception(format(SNoCharMatch,[N,C,FPatternPos+FPatternOffset,FPos]));\r\n inc(FPatternPos);\r\n inc(FPos);\r\nend;\r\n\r\nfunction TDateTimeScanner.ScanPatternLength :integer;\r\n\r\nvar\r\n c : char;\r\n i : Integer;\r\n\r\nbegin\r\n result:=FPatternPos;\r\n I:=FPatternPos;\r\n c:=FPattern[I];\r\n while (I<=FPatternLen) and (FPattern[i]=c) do\r\n inc(I);\r\n Result:=I-Result;\r\nend;\r\n\r\nprocedure TDateTimeScanner.MatchPattern(const aPattern: String);\r\n\r\nVar\r\n T : String;\r\n cPos: Integer;\r\n\r\nbegin\r\n T:=FPattern;\r\n cPos:=FPatternPos;\r\n FPatternOffset:=FPatternPos;\r\n FPattern:=aPattern;\r\n FPatternLen:=Length(aPattern);\r\n try\r\n Scan;\r\n finally\r\n FPattern:=T;\r\n FPatternLen:=Length(aPattern);\r\n FPatternPos:=cPos;\r\n FPatternOffset:=0;\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoDay;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n i:=ScanPatternLength;\r\n case i of\r\n 1,2 : FD:=scanfixedint(2);\r\n 3 : FD:=findmatch(shortDayNames);\r\n 4 : FD:=findmatch(longDayNames);\r\n 5 : matchpattern(shortdateformat);\r\n 6 : matchpattern(longdateformat);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoYear;\r\n\r\nVar\r\n I : integer;\r\n pivot : Integer;\r\n\r\nbegin\r\n i:=ScanPatternLength;\r\n FY:=scanfixedint(4);\r\n if i<=2 then\r\n begin\r\n Pivot:=YearOf(Now)-TwoDigitYearCenturyWindow;\r\n inc(FY, Pivot div 100 * 100);\r\n if (TwoDigitYearCenturyWindow > 0) and (FY < Pivot) then\r\n inc(FY, 100);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoMonth;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n I:=ScanPatternLength;\r\n case i of\r\n 1,2: FM:=scanfixedint(2);\r\n 3: FM:=findmatch(ShortMonthNames);\r\n 4: FM:=findmatch(LongMonthNames);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoTime;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n i:=ScanPatternLength;\r\n case i of\r\n 1: matchpattern(ShortTimeFormat);\r\n 2: matchpattern(LongTimeFormat);\r\n end;\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoDateTime;\r\n\r\nbegin\r\n MatchPattern(ShortDateFormat);\r\n MatchPattern(#9);\r\n MatchPattern(LongTimeFormat);\r\n inc(FPatternPos);\r\nend;\r\n\r\nprocedure TDateTimeScanner.DoAMPM;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n i:=FindIMatch(AMPMformatting,Copy(FPattern,FPatternPos,5));\r\n case i of\r\n 0:\r\n begin\r\n i:=FindIMatch(['AM','PM'],Copy(FText,FPos,2));\r\n case i of\r\n 0: ;\r\n 1: FTimeval:=FTimeval+12*hrfactor;\r\n else\r\n ArrayMatchError\r\n end;\r\n inc(FPatternPos,length(AMPMformatting[0]));\r\n inc(FPos,2);\r\n end;\r\n 1:\r\n begin\r\n case Upcase(FText[FPos]) of\r\n 'A' : ;\r\n 'P' : FTimeval:=FTimeval+12*hrfactor;\r\n else\r\n ArrayMatchError\r\n end;\r\n inc(FPatternPos,length(AMPMformatting[1]));\r\n inc(FPos);\r\n end;\r\n 2:\r\n begin\r\n i:=FindIMatch([timeamstring,timepmstring],Copy(FText,FPos,5));\r\n case i of\r\n 0: inc(FPos,length(timeamstring));\r\n 1: begin\r\n FTimeval:=FTimeval+12*hrfactor;\r\n inc(FPos,length(timepmstring));\r\n end;\r\n else\r\n arraymatcherror\r\n end;\r\n inc(FPatternPos,length(AMPMformatting[2]));\r\n inc(FPatternPos,2);\r\n inc(FPos,2);\r\n end;\r\n else // no AM/PM match. Assume 'a' is simply a char\r\n MatchChar(FPattern[FPatternPos]);\r\n end;\r\nend;\r\n\r\nfunction TDateTimeScanner.Scan(StartPos: integer): TDateTime;\r\n\r\nvar\r\n lasttoken,\r\n activequote,\r\n lch : char;\r\n i : Integer;\r\n\r\nbegin\r\n if StartPos<1 then\r\n StartPos:=1;\r\n if FPos#0 then\r\n begin\r\n if (activequote<>lch) then\r\n MatchChar(lch)\r\n else\r\n begin\r\n activequote:=#0;\r\n inc(FPatternPos);\r\n end\r\n end\r\n else\r\n begin\r\n if (lch='M') and (lasttoken='H') then\r\n begin\r\n i:=ScanPatternLength;\r\n if i>2 then\r\n raiseexception(format(SHHMMError,[FPatternOffset+FPatternPos+1]));\r\n FTimeval:=FTimeval+scanfixedint(2)* minfactor;\r\n end\r\n else\r\n case lch of\r\n 'Y': DoYear;\r\n 'M': DoMonth;\r\n 'D': DoDay;\r\n 'T': DoTime;\r\n 'H': FTimeval:=FTimeval+scanfixedint(2)* hrfactor;\r\n 'N': FTimeval:=FTimeval+scanfixedint(2)* minfactor;\r\n 'S': FTimeval:=FTimeval+scanfixedint(2)* secfactor;\r\n 'Z': FTimeval:=FTimeval+scanfixedint(3)* mssecfactor;\r\n 'A': DoAMPM;\r\n '/': MatchChar(DateSeparator);\r\n ':': begin\r\n MatchChar(TimeSeparator);\r\n lch:=lasttoken;\r\n end;\r\n #39,'\"' :\r\n begin\r\n activequote:=lch;\r\n inc(FPatternPos);\r\n end;\r\n 'C': DoDateTime;\r\n '?': begin\r\n inc(FPatternPos);\r\n inc(FPos)\r\n end;\r\n #9: begin\r\n while (FPos<=FLen) and (FText[FPos] in WhiteSpace) do\r\n inc(FPos);\r\n inc(FPatternPos);\r\n end;\r\n else\r\n MatchChar(FPattern[FPatternPos]);\r\n end; {case}\r\n lasttoken:=lch;\r\n end\r\n end;\r\n// if (FPatternPos0) and (FPattern[FPatternLen-1]<>#9) then // allow omission of trailing whitespace\r\n// RaiseException(format(SFullpattern,[FPatternOffset+FPatternPos]));\r\n Result:=FTimeval;\r\n if (FY>0) and (FM>0) and (FD>0) then\r\n Result:=Result+EncodeDate(FY,FM,FD);\r\nend;\r\n\r\nFunction ScanDateTime(APattern,AValue: String; APos : integer = 1) : TDateTime;\r\n\r\nVar\r\n T : TDateTimeScanner;\r\n\r\nbegin\r\n T:=TDateTimeScanner.Create;\r\n try\r\n T.Pattern:=APattern;\r\n T.Text:=AValue;\r\n Result:=T.Scan(APos);\r\n finally\r\n T.Free;\r\n end;\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCTypes;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$HINTS OFF}\r\n{$IFDEF LCLLIB}\r\n{$DEFINE USETRECTF}\r\n{$ENDIF}\r\n{$IFDEF VCLLIB}\r\n{$IF COMPILERVERSION < 23}\r\n{$DEFINE USETRECTF}\r\n{$IFEND}\r\n{$ENDIF}\r\n{$HINTS ON}\r\n\r\n{$IFDEF WEBLIB}\r\n{$DEFINE USETRECTF}\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF VCLLIB}\r\n Windows,\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n UITypes,\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n LCLType,\r\n {$ENDIF}\r\n Types, Classes, WEBLib.Graphics\r\n ,SysUtils, WEBLib.Controls, Math\r\n ;\r\n\r\ntype\r\n ITMSFNCProductInfo = interface\r\n ['{C53329EA-7B3A-4507-AD9E-88ACD6A85054}']\r\n function GetVersion: string;\r\n function GetDocURL: string;\r\n function GetTipsURL: string;\r\n end;\r\n\r\nconst\r\n TTMSFNCBaseDocURL = 'http://www.tmssoftware.biz/Download/Manuals/TMSFNCUIPackDevGuide.pdf';\r\n TTMSFNCBaseTipsURL = 'http://www.tmssoftware.com/site/tmsfncuipack.asp?s=faq';\r\n {$HINTS OFF}\r\n {$IFNDEF LCLLIB}\r\n {$IF COMPILERVERSION > 28}\r\n pidWeb = $10000;\r\n {$ELSE}\r\n pidWeb = $1000;\r\n {$IFEND}\r\n {$ENDIF}\r\n {$HINTS ON}\r\n {$IFDEF FMXLIB}\r\n TMSPlatformsDesktop = pidWin32 or pidWin64 or pidOSX32;\r\n {$HINTS OFF}\r\n TMSPlatforms = pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator or {$IF COMPILERVERSION > 28}pidiOSDevice32 or pidiOSDevice64{$ELSE}pidiOSDevice{$IFEND} or pidAndroid;\r\n {$HINTS ON}\r\n TMSPlatformsWeb = TMSPlatforms or pidWeb;\r\n TMSPlatformsWebDesktop = TMSPlatformsDesktop or pidWeb;\r\n KEY_CANCEL = VKCANCEL;\r\n KEY_CONTROL = VKCONTROL;\r\n KEY_SHIFT = VKSHIFT;\r\n KEY_ESCAPE = VKESCAPE;\r\n KEY_INSERT = VKINSERT;\r\n KEY_DELETE = VKDELETE;\r\n KEY_TAB = VKTAB;\r\n KEY_PRIOR = VKPRIOR;\r\n KEY_NEXT = VKNEXT;\r\n KEY_UP = VKUP;\r\n KEY_DOWN = VKDOWN;\r\n KEY_RIGHT = VKRIGHT;\r\n KEY_LEFT = VKLEFT;\r\n KEY_HOME = VKHOME;\r\n KEY_END = VKEND;\r\n KEY_RETURN = VKRETURN;\r\n KEY_SPACE = VKSPACE;\r\n KEY_MENU = VKMENU;\r\n KEY_BACK = VKBACK;\r\n KEY_F1 = VKF1;\r\n KEY_F2 = VKF2;\r\n KEY_F3 = VKF3;\r\n KEY_F4 = VKF4;\r\n KEY_F5 = VKF5;\r\n KEY_F6 = VKF6;\r\n KEY_F7 = VKF7;\r\n KEY_F8 = VKF8;\r\n KEY_F9 = VKF9;\r\n KEY_F10 = VKF10;\r\n KEY_F11 = VKF11;\r\n KEY_F12 = VKF12;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n TMSPlatformsDesktop = pidWin32 or pidWin64;\r\n TMSPlatforms = pidWin32 or pidWin64;\r\n TMSPlatformsWeb = TMSPlatforms or pidWeb;\r\n TMSPlatformsWebDesktop = TMSPlatformsDesktop or pidWeb;\r\n {$ELSE}\r\n ssCommand = ssCtrl;\r\n TMSPlatformsDesktop = 0;\r\n TMSPlatforms = 0;\r\n TMSPlatformsWeb = 0;\r\n TMSPlatformsWebDesktop = 0;\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ssCommand = ssCtrl;\r\n {$ENDIF}\r\n KEY_CANCEL = VK_CANCEL;\r\n KEY_CONTROL = VK_CONTROL;\r\n KEY_SHIFT = VK_SHIFT;\r\n KEY_ESCAPE = VK_ESCAPE;\r\n KEY_INSERT = VK_INSERT;\r\n KEY_DELETE = VK_DELETE;\r\n KEY_TAB = VK_TAB;\r\n KEY_PRIOR = VK_PRIOR;\r\n KEY_NEXT = VK_NEXT;\r\n KEY_UP = VK_UP;\r\n KEY_DOWN = VK_DOWN;\r\n KEY_RIGHT = VK_RIGHT;\r\n KEY_LEFT = VK_LEFT;\r\n KEY_HOME = VK_HOME;\r\n KEY_END = VK_END;\r\n KEY_RETURN = VK_RETURN;\r\n KEY_SPACE = VK_SPACE;\r\n KEY_MENU = VK_MENU;\r\n KEY_BACK = VK_BACK;\r\n KEY_F1 = VK_F1;\r\n KEY_F2 = VK_F2;\r\n KEY_F3 = VK_F3;\r\n KEY_F4 = VK_F4;\r\n KEY_F5 = VK_F5;\r\n KEY_F6 = VK_F6;\r\n KEY_F7 = VK_F7;\r\n KEY_F8 = VK_F8;\r\n KEY_F9 = VK_F9;\r\n KEY_F10 = VK_F10;\r\n KEY_F11 = VK_F11;\r\n KEY_F12 = VK_F12;\r\n {$ENDIF}\r\n\r\ntype\r\n {$IFDEF WEBLIB}\r\n TResourceStream = TObject;\r\n TStream = TObject;\r\n TMemoryStream = TStream;\r\n TPopupMenu = class(TComponent);\r\n TMenuItem = class(TComponent);\r\n TBytes = array of Byte;\r\n PChar = string;\r\n TDate = TDateTime;\r\n TTime = TDateTime;\r\n TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);\r\n TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,\r\n mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);\r\n TMsgDlgButtons = set of TMsgDlgBtn;\r\n DWord = Cardinal;\r\n {$ENDIF}\r\n\r\n TTMSFNCMouseButton = TMouseButton;\r\n\r\n {$IFDEF USETRECTF}\r\n {$IFNDEF WEBLIB}\r\n PSizeF = ^TSizeF;\r\n {$ENDIF}\r\n TSizeF = record\r\n cx: Single;\r\n cy: Single;\r\n {$IFNDEF WEBLIB}\r\n public\r\n property Width: Single read cx write cx;\r\n property Height: Single read cy write cy;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFNDEF WEBLIB}\r\n TPointFType = array [0..1] of Single;\r\n PPointF = ^TPointF;\r\n {$ENDIF}\r\n TPointF = record\r\n {$IFDEF WEBLIB}\r\n X, Y: Single;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n function Length: Single;\r\n procedure Offset(const ADeltaX, ADeltaY: Single);\r\n case Integer of\r\n 0: (V: TPointFType;);\r\n 1: (X: Single;\r\n Y: Single;);\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFNDEF WEBLIB}\r\n PRectF = ^TRectF;\r\n {$ENDIF}\r\n TRectF = record\r\n {$IFNDEF WEBLIB}\r\n private\r\n function GetWidth: Single;\r\n procedure SetWidth(const Value: Single);\r\n function GetHeight: Single;\r\n procedure SetHeight(const Value: Single);\r\n function GetSize: TSizeF;\r\n procedure SetSize(const Value: TSizeF);\r\n public\r\n procedure Offset(const DX, DY: Single);\r\n procedure Inflate(const DX, DY: Single);\r\n function CenterAt(const ADesignatedArea: TRectF): TRectF;\r\n function SnapToPixel(const AScale: Single; const APlaceBetweenPixels: Boolean): TRectF;\r\n function FitInto(const ADesignatedArea: TRectF; out Ratio: Single): TRectF; overload;\r\n function FitInto(const ADesignatedArea: TRectF): TRectF; overload;\r\n function IsEmpty: Boolean;\r\n function IntersectsWith(const R: TRectF): Boolean;\r\n function CenterPoint: TPointF;\r\n function Empty: TRectF;\r\n property Width: Single read GetWidth write SetWidth;\r\n property Height: Single read GetHeight write SetHeight;\r\n property Size: TSizeF read GetSize write SetSize;\r\n case Integer of\r\n 0: (Left, Top, Right, Bottom: Single);\r\n 1: (TopLeft, BottomRight: TPointF);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Left, Top, Right, Bottom: Single;\r\n {$ENDIF}\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n TTMSFNCBitmap = TBitmap;\r\n TTMSFNCDrawBitmap = TBitmap;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n TTMSFNCBitmap = TPicture;\r\n TTMSFNCDrawBitmap = TGraphic;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n TTMSFNCBitmap = class(TBitmap);\r\n TTMSFNCDrawBitmap = TTMSFNCBitmap;\r\n {$ENDIF}\r\n\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF USETRECTF}\r\n TRectFHelper = record helper for TRectF\r\n function CenterAt(const ADesignatedArea: TRectF): TRectF;\r\n function SnapToPixel(const AScale: Single; const APlaceBetweenPixels: Boolean): TRectF;\r\n function FitInto(const ADesignatedArea: TRectF; out Ratio: Single): TRectF; overload;\r\n function FitInto(const ADesignatedArea: TRectF): TRectF; overload;\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCBitmapHelper = class helper for TTMSFNCBitmap\r\n procedure LoadFromURL(AURL: String); overload;\r\n procedure LoadFromURL(AURL: String; AInstance: NativeUInt); overload;\r\n procedure LoadFromResource(AResourceName: String); overload;\r\n procedure LoadFromResource(AResourceName: String; AInstance: NativeUInt); overload;\r\n {$IFDEF VCLLIB}\r\n procedure LoadFromStream(AStream: TCustomMemoryStream);\r\n procedure SaveToStream(AStream: TCustomMemoryStream);\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n class function CreateFromStream(AStream: TCustomMemoryStream): TTMSFNCBitmap; overload;\r\n {$ENDIF}\r\n class function CreateFromResource(AResourceName: String): TTMSFNCBitmap; overload;\r\n class function CreateFromResource(AResourceName: String; AInstance: NativeUInt): TTMSFNCBitmap; overload;\r\n class function CreateFromURL(AURL: String): TTMSFNCBitmap; overload;\r\n class function CreateFromURL(AURL: String; AInstance: NativeUInt): TTMSFNCBitmap; overload;\r\n end;\r\n {$ENDIF}\r\n\r\n TTMSFNCMargins = class(TPersistent)\r\n private\r\n FRight: Single;\r\n FBottom: Single;\r\n FTop: Single;\r\n FLeft: Single;\r\n FOnChange: TNotifyEvent;\r\n procedure SetBottom(const Value: Single);\r\n procedure SetLeft(const Value: Single);\r\n procedure SetRight(const Value: Single);\r\n procedure SetTop(const Value: Single);\r\n function IsLeftStored: Boolean;\r\n function IsTopStored: Boolean;\r\n function IsRightStored: Boolean;\r\n function IsBottomStored: Boolean;\r\n protected\r\n procedure Changed;\r\n public\r\n constructor Create; overload;\r\n constructor Create(const ARect: TRectF); overload;\r\n procedure Assign(Source: TPersistent); override;\r\n function Empty: Boolean;\r\n function Rect: TRectF;\r\n function PaddingRect(const R: TRectF): TRectF;\r\n published\r\n property Left: Single read FLeft write SetLeft stored IsLeftStored nodefault;\r\n property Top: Single read FTop write SetTop stored IsTopStored nodefault;\r\n property Right: Single read FRight write SetRight stored IsRightStored nodefault;\r\n property Bottom: Single read FBottom write SetBottom stored IsBottomStored nodefault;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n TTMSFNCScaledBitmap = class(TCollectionItem)\r\n private\r\n FBitmap: TTMSFNCBitmap;\r\n FScale: Single;\r\n FBitmapName: string;\r\n function IsScaleStored: Boolean;\r\n procedure SetBitmap(const Value: TTMSFNCBitmap);\r\n procedure SetScale(const Value: Single);\r\n procedure SetBitmapName(const Value: string);\r\n protected\r\n procedure BitmapChanged(Sender: TObject);\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Bitmap: TTMSFNCBitmap read FBitmap write SetBitmap;\r\n property BitmapName: string read FBitmapName write SetBitmapName;\r\n property Scale: Single read FScale write SetScale stored IsScaleStored nodefault;\r\n end;\r\n\r\n TTMSFNCScaledBitmaps = class(TOwnedCollection)\r\n private\r\n FOnChange: TNotifyEvent;\r\n function GetItems(Index: Integer): TTMSFNCScaledBitmap;\r\n procedure SetItems(Index: Integer; const Value: TTMSFNCScaledBitmap);\r\n function GetBitmap(Scale: Single): TTMSFNCBitmap;\r\n procedure SetBitmap(Scale: Single; const Value: TTMSFNCBitmap);\r\n protected\r\n procedure Update(Item: TCollectionItem); override;\r\n public\r\n constructor Create(AOwner: TPersistent);\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n function Add(Scale: Single = 1.0): TTMSFNCScaledBitmap; overload;\r\n {$IFNDEF WEBLIB}\r\n function AddBitmapFromFile(FileName: string; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\n {$ENDIF}\r\n function AddBitmapFromResource(ResourceName: String; Scale: Single = 1.0): TTMSFNCScaledBitmap; overload;\r\n function AddBitmapFromResource(ResourceName: String; AInstance: NativeUInt; Scale: Single = 1.0): TTMSFNCScaledBitmap; overload;\r\n function AddBitmap(Bitmap: TTMSFNCBitmap; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\n function AddBitmapName(BitmapName: string; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\n function AddDrawBitmap(Bitmap: TTMSFNCDrawBitmap; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\n function Insert(Index: Integer): TTMSFNCScaledBitmap; overload;\r\n function Insert(Index: Integer; Scale: Single): TTMSFNCScaledBitmap; overload;\r\n function GetBitmapByScale(Scale: Single): TTMSFNCBitmap;\r\n function GetItemByScale(Scale: Single): TTMSFNCScaledBitmap;\r\n property Items[Index: Integer]: TTMSFNCScaledBitmap read GetItems write SetItems; default;\r\n property Bitmaps[Scale: Single]: TTMSFNCBitmap read GetBitmap write SetBitmap;\r\n end;\r\n {$ENDIF}\r\n\r\n TTMSFNCPictureFormat = (pfBMP, pfGIF, pfJPG, pfPNG, pfICO, pfTiff, pfMetaFile, pfNone);\r\n\r\n ITMSFNCCustomEditor = interface\r\n ['{CC0C60B7-75F3-47CE-8A7F-8005A19F12E8}']\r\n procedure SetText(AValue: String);\r\n procedure SetSelStart(AValue: Integer);\r\n procedure SetSelLength(AValue: Integer);\r\n function GetTextLength: Integer;\r\n end;\r\n\r\n {$IFNDEF WEBLIB}\r\n {$IFDEF LCLLIB}generic {$ENDIF}TTMSFNCOwnedCollection = class(TOwnedCollection)\r\n public type\r\n TTMSFNCCollection = {$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection;\r\n\r\n TEnumerator = class\r\n private\r\n FIndex: Integer;\r\n FCol: TTMSFNCCollection;\r\n public\r\n constructor Create(ACol: TTMSFNCCollection);\r\n function GetCurrent: T;\r\n function MoveNext: Boolean;\r\n property Current: T read GetCurrent;\r\n end;\r\n public\r\n function GetEnumerator: TEnumerator;\r\n function GetItem(AIndex: Integer): T;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n TTMSFNCOwnedCollection = class(TOwnedCollection);\r\n {$ENDIF}\r\n\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCPersistent = class(TInterfacedPersistent);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n TTMSFNCPersistent = class(TPersistent);\r\n {$ENDIF}\r\n\r\n TTMSFNCValueRelationShip = TValueRelationShip;\r\n\r\nprocedure InflateRectEx(var R: TRectF; DX, DY: Single);\r\nfunction ConvertToRectF(const Rect: TRect): TRectF; overload;\r\nfunction ConvertToRectF(const Rect: TRectF): TRectF; overload;\r\nfunction ConvertToRect(const Rect: TRectF): TRect; overload;\r\nfunction ConvertToRect(const Rect: TRect): TRect; overload;\r\nfunction ConvertToSizeF(const Size: TSize): TSizeF; overload;\r\nfunction ConvertToSizeF(const Size: TSizeF): TSizeF; overload;\r\nfunction ConvertToSize(const Size: TSizeF): TSize; overload;\r\nfunction ConvertToSize(const Size: TSize): TSize; overload;\r\nfunction ConvertToPointF(const Point: TPoint): TPointF; overload;\r\nfunction ConvertToPointF(const Point: TPointF): TPointF; overload;\r\nfunction ConvertToPoint(const Point: TPointF): TPoint; overload;\r\nfunction ConvertToPoint(const Point: TPoint): TPoint; overload;\r\nfunction OffsetRectEx(var R: TRect; DX, DY: Integer): Boolean; overload;\r\nfunction OffsetRectEx(var R: TRectF; DX, DY: Single): Boolean; overload;\r\nfunction PtInRectEx(const Rect: TRectF; const P: TPointF): Boolean;\r\nfunction IntersectRectEx(const Rect1: TRectF; const Rect2: TRectF): Boolean; overload;\r\nfunction IntersectRectEx(out Rect: TRectF; const R1, R2: TRectF): Boolean; overload;\r\nfunction EqualRectEx(const R1, R2: TRectF): Boolean; overload;\r\nfunction EqualRectEx(const R1, R2: TRect): Boolean; overload;\r\nfunction RectWidthEx(const Rect: TRect): Integer; overload;\r\nfunction RectWidthEx(const Rect: TRectF): Single; overload;\r\nfunction RectHeightEx(const Rect: TRect): Integer; overload;\r\nfunction RectHeightEx(const Rect: TRectF): Single; overload;\r\nfunction RectCenterEx(var R: TRect; const B: TRect): TRect; overload;\r\nfunction RectCenterEx(var R: TRectF; const B: TRectF): TRectF; overload;\r\nfunction RectCenterAtEx(const Rect: TRectF; const ADesignatedArea: TRectF): TRectF;\r\nfunction RectSnapToPixelEx(const Rect: TRectF; const AScale: Single; const APlaceBetweenPixels: Boolean): TRectF;\r\nfunction RectFitIntoEx(const Rect: TRectF; const ADesignatedArea: TRectF; out Ratio: Single): TRectF; overload;\r\nfunction RectFitIntoEx(const Rect: TRectF; const ADesignatedArea: TRectF): TRectF; overload;\r\nfunction GetPointLength(const Point: TPointF): Single;\r\nfunction MakeRectF(Left, Top, Width, Height: Single): TRectF;\r\nfunction CenterPointEx(const R: TRectF): TPointF;\r\nfunction CompareValueEx(const A, B: Extended; Epsilon: Extended = 0): TTMSFNCValueRelationship;\r\nfunction RectIsEmpty(const R: TRectF): Boolean;\r\nfunction EmptyRect: TRectF;\r\nfunction RectIntersectsWithEx(const ARect: TRectF; const R: TRectF): Boolean;\r\n{$IFDEF USETRECTF}\r\nfunction RectF(Left, Top, Right, Bottom: Single): TRectF; {$IFNDEF WEBLIB}inline; {$ENDIF}overload;\r\nfunction PointF(X, Y: Single): TPointF; {$IFNDEF WEBLIB}inline; {$ENDIF}overload;\r\n{$ENDIF}\r\nfunction BitmapToDrawBitmap(ABitmap: TTMSFNCBitmap): TTMSFNCDrawBitmap; overload;\r\nfunction IsBitmapEmpty(ABitmap: TTMSFNCBitmap): Boolean;\r\nfunction CharInArray(AChar: Char; ACharArray: array of char): Boolean;\r\nfunction CharIsNumber(AChar: Char): Boolean;\r\nfunction CharIsLetter(AChar: Char): Boolean;\r\nfunction CharIsHex(AChar: Char): Boolean;\r\nfunction CharIsLetterOrNumber(AChar: Char): Boolean;\r\n{$IFDEF WEBLIB}\r\nfunction VarToStr(const S: string): string;\r\nfunction VarToDateTime(const S: string): TDateTime;\r\nfunction AnsiPos(const Substr, S: string): Integer;\r\nfunction AnsiUpperCase(const S: string): string;\r\nfunction HInstance: Integer;\r\n{$ENDIF}\r\n\r\nimplementation\r\n\r\n{$IFNDEF WEBLIB}\r\nuses\r\n WEBLib.TMSFNCUtils\r\n {$IFDEF VCLLIB}\r\n ,AnsiStrings\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,PNGImage, JPEG, GifImg\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n ,Character\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n ;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nfunction VarToStr(const S: string): string;\r\nbegin\r\n Result := S;\r\nend;\r\n\r\nfunction VarToDateTime(const S: string): TDateTime;\r\nbegin\r\n Result := StrToDateTime(S);\r\nend;\r\n\r\nfunction HInstance: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction AnsiUpperCase(const S: string): string;\r\nbegin\r\n Result := UpperCase(S);\r\nend;\r\n\r\nfunction AnsiPos(const Substr, S: string): Integer;\r\nbegin\r\n Result := Pos(SubStr, S);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction CharIsHex(AChar: Char): Boolean;\r\nbegin\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$WARNINGS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n Result := AChar.IsNumber or AChar.IsInArray(['a', 'b', 'c', 'd', 'e', 'f']) or AChar.IsInArray(['A', 'B', 'C', 'D', 'E', 'F']);\r\n {$ELSE}\r\n Result := (AChar in ['0'..'9']) or (AChar in ['a'..'f']) or (AChar in ['A'..'F']);\r\n {$IFEND}\r\n {$WARNINGS ON}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Result := (AChar in ['0'..'9']) or (AChar in ['a'..'f']) or (AChar in ['A'..'F']);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction CharIsLetter(AChar: Char): Boolean;\r\nbegin\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$WARNINGS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n Result := AChar.IsLetter;\r\n {$ELSE}\r\n Result := (AChar in ['a'..'z']) or (AChar in ['A'..'Z']);\r\n {$IFEND}\r\n {$WARNINGS ON}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Result := (AChar in ['a'..'z']) or (AChar in ['A'..'Z']);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction CharIsNumber(AChar: Char): Boolean;\r\nbegin\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$WARNINGS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n Result := AChar.IsNumber;\r\n {$ELSE}\r\n Result := (AChar in ['0'..'9']);\r\n {$IFEND}\r\n {$WARNINGS ON}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Result := (AChar in ['0'..'9']);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction CharIsLetterOrNumber(AChar: Char): Boolean;\r\nbegin\r\n Result := CharIsLetter(AChar) or CharIsNumber(AChar);\r\nend;\r\n\r\nfunction CharInArray(AChar: Char; ACharArray: array of char): Boolean;\r\nvar\r\n ch: Char;\r\n I: Integer;\r\nbegin\r\n Result := False;\r\n for I := 0 to Length(ACharArray) - 1 do\r\n begin\r\n ch := ACharArray[I];\r\n if ch = AChar then\r\n begin\r\n Result := True;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction IsBitmapEmpty(ABitmap: TTMSFNCBitmap): Boolean;\r\nvar\r\n b: TTMSFNCDrawBitmap;\r\nbegin\r\n Result := True;\r\n if Assigned(ABitmap) then\r\n begin\r\n b := BitmapToDrawBitmap(ABitmap);\r\n if Assigned(b) then\r\n begin\r\n {$IFDEF CMNLIB}\r\n Result := b.Empty;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Result := b.Empty;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n Result := b.IsEmpty\r\n {$ENDIF}\r\n end;\r\n end;\r\nend;\r\n\r\nfunction BitmapToDrawBitmap(ABitmap: TTMSFNCBitmap): TTMSFNCDrawBitmap;\r\nbegin\r\n Result := nil;\r\n if Assigned(ABitmap) then\r\n begin\r\n {$IFDEF CMNLIB}\r\n Result := ABitmap.Graphic;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Result := ABitmap;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n Result := ABitmap;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\n\r\n{ TTMSFNCBitmapHelper }\r\n\r\nclass function TTMSFNCBitmapHelper.CreateFromResource(AResourceName: String): TTMSFNCBitmap;\r\nbegin\r\n Result := CreateFromResource(AResourceName, TTMSFNCUtils.GetHInstance);\r\nend;\r\n\r\nclass function TTMSFNCBitmapHelper.CreateFromResource(AResourceName: String; AInstance: NativeUInt): TTMSFNCBitmap;\r\nbegin\r\n Result := TTMSFNCBitmap.Create;\r\n Result.LoadFromResource(AResourceName, AInstance);\r\nend;\r\n\r\nclass function TTMSFNCBitmapHelper.CreateFromURL(AURL: String): TTMSFNCBitmap;\r\nbegin\r\n Result := CreateFromURL(AURL, TTMSFNCUtils.GetHInstance);\r\nend;\r\n\r\nclass function TTMSFNCBitmapHelper.CreateFromURL(AURL: String; AInstance: NativeUInt): TTMSFNCBitmap;\r\nbegin\r\n Result := TTMSFNCBitmap.Create;\r\n Result.LoadFromURL(AURL, AInstance);\r\nend;\r\n\r\n{$IFDEF VCLLIB}\r\nprocedure TTMSFNCBitmapHelper.SaveToStream(AStream: TCustomMemoryStream);\r\nbegin\r\n if Assigned(AStream) then\r\n begin\r\n if Assigned(Graphic) then\r\n Graphic.SaveToStream(AStream);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapHelper.LoadFromStream(AStream: TCustomMemoryStream);\r\nvar\r\n pic: TGraphic;\r\n gcc: TGraphicClass;\r\nbegin\r\n if Assigned(AStream) then\r\n begin\r\n pic := nil;\r\n if TTMSFNCUtils.FindGraphicClass(AStream.Memory^, AStream.Size, gcc) then\r\n pic := gcc.Create;\r\n\r\n if Assigned(pic) then\r\n begin\r\n try\r\n AStream.Position := 0;\r\n pic.LoadFromStream(AStream);\r\n Self.Assign(pic);\r\n finally\r\n pic.Free;\r\n end;\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNLIB}\r\nclass function TTMSFNCBitmapHelper.CreateFromStream(AStream: TCustomMemoryStream): TTMSFNCBitmap;\r\nbegin\r\n Result := TTMSFNCBitmap.Create;\r\n Result.LoadFromStream(AStream);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCBitmapHelper.LoadFromURL(AURL: String);\r\nbegin\r\n LoadFromURL(AURL, TTMSFNCUtils.GetHInstance);\r\nend;\r\n\r\nprocedure TTMSFNCBitmapHelper.LoadFromURL(AURL: String; AInstance: NativeUInt);\r\nvar\r\n ms: TMemoryStream;\r\nbegin\r\n ms := TTMSFNCUtils.DownloadImage(AURL);\r\n try\r\n if Assigned(ms) then\r\n Self.LoadFromStream(ms);\r\n finally\r\n if Assigned(ms) then\r\n ms.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapHelper.LoadFromResource(AResourceName: String);\r\nbegin\r\n LoadFromResource(AResourceName, TTMSFNCUtils.GetHInstance);\r\nend;\r\n\r\nprocedure TTMSFNCBitmapHelper.LoadFromResource(AResourceName: String; AInstance: NativeUInt);\r\nvar\r\n r: TResourceStream;\r\nbegin\r\n r := nil;\r\n try\r\n r := TTMSFNCUtils.GetResourceStream(AResourceName, AInstance);\r\n if Assigned(r) then\r\n Self.LoadFromStream(r);\r\n finally\r\n if Assigned(r) then\r\n r.Free;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF USETRECTF}\r\n\r\n{ TRectF }\r\n\r\n{$IFNDEF WEBLIB}\r\nfunction TRectF.GetSize: TSizeF;\r\nbegin\r\n Result.cx := Width;\r\n Result.cy := Height;\r\nend;\r\n\r\nprocedure TRectF.SetSize(const Value: TSizeF);\r\nbegin\r\n Width := Value.cx;\r\n Height := Value.cy;\r\nend;\r\n\r\nfunction TRectF.GetHeight: Single;\r\nbegin\r\n Result := Self.Bottom - Self.Top;\r\nend;\r\n\r\nprocedure TRectF.SetHeight(const Value: Single);\r\nbegin\r\n Self.Bottom := Self.Top + Value;\r\nend;\r\n\r\nfunction TRectF.GetWidth: Single;\r\nbegin\r\n Result := Self.Right - Self.Left;\r\nend;\r\n\r\nprocedure TRectF.SetWidth(const Value: Single);\r\nbegin\r\n Self.Right := Self.Left + Value;\r\nend;\r\n\r\nfunction TRectF.CenterPoint: TPointF;\r\nbegin\r\n Result.X := (Right - Left) / 2.0 + Left;\r\n Result.Y := (Bottom - Top) / 2.0 + Top;\r\nend;\r\n\r\nfunction TRectF.IntersectsWith(const R: TRectF): Boolean;\r\nbegin\r\n Result := not ( (Self.BottomRight.X < R.TopLeft.X) or\r\n (Self.BottomRight.Y < R.TopLeft.Y) or\r\n (R.BottomRight.X < Self.TopLeft.X) or\r\n (R.BottomRight.Y < Self.TopLeft.Y) );\r\nend;\r\n\r\nprocedure TRectF.Offset(const DX, DY: Single);\r\nbegin\r\n TopLeft.Offset(DX, DY);\r\n BottomRight.Offset(DX, DY);\r\nend;\r\n\r\nprocedure TRectF.Inflate(const DX, DY: Single);\r\nbegin\r\n TopLeft.Offset(-DX, -DY);\r\n BottomRight.Offset(DX, DY);\r\nend;\r\n\r\nfunction TRectF.Empty: TRectF;\r\nbegin\r\n Result.Left := 0;\r\n Result.Top := 0;\r\n Result.Right := 0;\r\n Result.Bottom := 0;\r\nend;\r\n\r\nfunction TRectF.IsEmpty: Boolean;\r\nbegin\r\n Result := (Right < Left) or SameValue(Right, Left)\r\n or (Bottom < Top) or SameValue(Bottom, Top);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TPointF.Offset(const ADeltaX, ADeltaY: Single);\r\nbegin\r\n Self.X := Self.X + ADeltaX;\r\n Self.Y := Self.Y + ADeltaY;\r\nend;\r\n\r\nfunction TPointF.Length: Single;\r\nbegin\r\n Result := Sqrt(Sqr(X) + Sqr(Y));\r\nend;\r\n{$ENDIF}\r\n\r\nfunction PtInRectEx(const Rect: TRectF; const P: TPointF): Boolean;\r\nbegin\r\n Result := (P.X >= Rect.Left) and (P.X < Rect.Right) and (P.Y >= Rect.Top)\r\n and (P.Y < Rect.Bottom);\r\nend;\r\n\r\nfunction PointF(X, Y: Single): TPointF;\r\nbegin\r\n Result.X := X;\r\n Result.Y := Y;\r\nend;\r\n\r\nfunction OffsetRectEx(var R: TRect; DX, DY: Integer): Boolean;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if @R <> nil then\r\n {$ENDIF}\r\n begin\r\n R.Left := R.Left + DX;\r\n R.Right := R.Right + DX;\r\n R.Top := R.Top + DY;\r\n R.Bottom := R.Bottom + DY;\r\n Result := True;\r\n end\r\n {$IFNDEF WEBLIB}\r\n else\r\n Result := False;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction OffsetRectEx(var R: TRectF; DX, DY: Single): Boolean;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if @R <> nil then\r\n {$ENDIF}\r\n begin\r\n R.Left := R.Left + DX;\r\n R.Right := R.Right + DX;\r\n R.Top := R.Top + DY;\r\n R.Bottom := R.Bottom + DY;\r\n Result := True;\r\n end\r\n {$IFNDEF WEBLIB}\r\n else\r\n Result := False;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction RectF(Left, Top, Right, Bottom: Single): TRectF;\r\nbegin\r\n Result.Left := Left;\r\n Result.Top := Top;\r\n Result.Bottom := Bottom;\r\n Result.Right := Right;\r\nend;\r\n\r\nprocedure InflateRectEx(var R: TRectF; DX, DY: Single);\r\nbegin\r\n R.Left := R.Left - DX;\r\n R.Right := R.Right + DX;\r\n R.Top := R.Top - DY;\r\n R.Bottom := R.Bottom + DY;\r\nend;\r\n\r\nfunction IntersectRectEx(const Rect1: TRectF; const Rect2: TRectF): Boolean;\r\nbegin\r\n Result := (Rect1.Left < Rect2.Right)\r\n and (Rect1.Right > Rect2.Left)\r\n and (Rect1.Top < Rect2.Bottom)\r\n and (Rect1.Bottom > Rect2.Top);\r\nend;\r\n\r\nfunction EqualRectEx(const R1, R2: TRect): Boolean;\r\nbegin\r\n Result := (R1.Left = R2.Left) and (R1.Right = R2.Right) and\r\n (R1.Top = R2.Top) and (R1.Bottom = R2.Bottom);\r\nend;\r\n\r\nfunction EqualRectEx(const R1, R2: TRectF): Boolean;\r\nbegin\r\n Result := (R1.Left = R2.Left) and (R1.Right = R2.Right) and\r\n (R1.Top = R2.Top) and (R1.Bottom = R2.Bottom);\r\nend;\r\n\r\n{$ELSE}\r\n\r\nfunction EqualRectEx(const R1, R2: TRect): Boolean;\r\nbegin\r\n Result := EqualRect(R1, R2);\r\nend;\r\n\r\nfunction EqualRectEx(const R1, R2: TRectF): Boolean;\r\nbegin\r\n Result := EqualRect(R1, R2);\r\nend;\r\n\r\nfunction IntersectRectEx(const Rect1: TRectF; const Rect2: TRectF): Boolean;\r\nbegin\r\n Result := IntersectRect(Rect1, Rect2);\r\nend;\r\n\r\nfunction OffsetRectEx(var R: TRect; DX, DY: Integer): Boolean;\r\nbegin\r\n Result := OffsetRect(R, DX, DY);\r\nend;\r\n\r\nfunction OffsetRectEx(var R: TRectF; DX, DY: Single): Boolean;\r\nbegin\r\n Result := OffsetRect(R, DX, DY);\r\nend;\r\n\r\nprocedure InflateRectEx(var R: TRectF; DX, DY: Single);\r\nbegin\r\n InflateRect(R, DX, DY);\r\nend;\r\n\r\nfunction PtInRectEx(const Rect: TRectF; const P: TPointF): Boolean;\r\nbegin\r\n Result := PtInRect(Rect, P);\r\nend;\r\n\r\n{$ENDIF}\r\n\r\n{$IFNDEF WEBLIB}\r\nfunction {$IFDEF USETRECTF}TRectF{$ELSE}{$IFNDEF LCLLIB}TRectFHelper{$ELSE}TRectF{$ENDIF}{$ENDIF}.FitInto(const ADesignatedArea: TRectF; out Ratio: Single): TRectF;\r\nbegin\r\n if (ADesignatedArea.Width <= 0) or (ADesignatedArea.Height <= 0) then\r\n begin\r\n Ratio := 1;\r\n Exit(Self);\r\n end;\r\n\r\n if (Self.Width / ADesignatedArea.Width) > (Self.Height / ADesignatedArea.Height) then\r\n Ratio := Self.Width / ADesignatedArea.Width\r\n else\r\n Ratio := Self.Height / ADesignatedArea.Height;\r\n\r\n Result := RectF(0, 0, Self.Width / Ratio, Self.Height / Ratio);\r\n RectCenterEx(Result, ADesignatedArea);\r\nend;\r\n\r\nfunction {$IFDEF USETRECTF}TRectF{$ELSE}{$IFNDEF LCLLIB}TRectFHelper{$ELSE}TRectF{$ENDIF}{$ENDIF}.FitInto(const ADesignatedArea: TRectF): TRectF;\r\nvar\r\n Ratio: Single;\r\nbegin\r\n Result := FitInto(ADesignatedArea, Ratio);\r\nend;\r\n\r\nfunction {$IFDEF USETRECTF}TRectF{$ELSE}{$IFNDEF LCLLIB}TRectFHelper{$ELSE}TRectF{$ENDIF}{$ENDIF}.CenterAt(const ADesignatedArea: TRectF): TRectF;\r\nbegin\r\n Result := Self;\r\n RectCenterEx(Result, ADesignatedArea);\r\nend;\r\n\r\nfunction {$IFDEF USETRECTF}TRectF{$ELSE}{$IFNDEF LCLLIB}TRectFHelper{$ELSE}TRectF{$ENDIF}{$ENDIF}.SnapToPixel(const AScale: Single; const APlaceBetweenPixels: Boolean): TRectF;\r\nvar\r\n LScale, HalfPixel: Single;\r\nbegin\r\n if AScale <= 0 then\r\n LScale := 1\r\n else\r\n LScale := AScale;\r\n Result.Left := System.Trunc(Self.Left * LScale) / LScale;\r\n Result.Top := System.Trunc(Self.Top * LScale) / LScale;\r\n Result.Width := System.Round(Self.Width * LScale) / LScale;\r\n Result.Height := System.Round(Self.Height * LScale) / LScale;\r\n if APlaceBetweenPixels then\r\n begin\r\n HalfPixel := 1 / (2 * LScale);\r\n Result.Offset(HalfPixel, HalfPixel);\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction RectWidthEx(const Rect: TRect): Integer;\r\nbegin\r\n Result := Rect.Right - Rect.Left;\r\nend;\r\n\r\nfunction RectHeightEx(const Rect: TRect): Integer;\r\nbegin\r\n Result := Rect.Bottom - Rect.Top;\r\nend;\r\n\r\nfunction RectWidthEx(const Rect: TRectF): Single;\r\nbegin\r\n Result := Rect.Right - Rect.Left;\r\nend;\r\n\r\nfunction RectHeightEx(const Rect: TRectF): Single;\r\nbegin\r\n Result := Rect.Bottom - Rect.Top;\r\nend;\r\n\r\nfunction RectCenterAtEx(const Rect: TRectF; const ADesignatedArea: TRectF): TRectF;\r\nbegin\r\n Result := Rect;\r\n RectCenterEx(Result, ADesignatedArea);\r\nend;\r\n\r\nfunction RectSnapToPixelEx(const Rect: TRectF; const AScale: Single; const APlaceBetweenPixels: Boolean): TRectF;\r\nvar\r\n LScale, HalfPixel: Single;\r\nbegin\r\n if AScale <= 0 then\r\n LScale := 1\r\n else\r\n LScale := AScale;\r\n Result.Left := Trunc(Rect.Left * LScale) / LScale;\r\n Result.Top := Trunc(Rect.Top * LScale) / LScale;\r\n Result.Right := Result.Left + Round((Rect.Right - Rect.Left) * LScale) / LScale;\r\n Result.Bottom := Result.Top + Round((Rect.Bottom - Rect.Top) * LScale) / LScale;\r\n if APlaceBetweenPixels then\r\n begin\r\n HalfPixel := 1 / (2 * LScale);\r\n OffsetRectEx(Result, HalfPixel, HalfPixel);\r\n end;\r\nend;\r\n\r\nfunction RectFitIntoEx(const Rect: TRectF; const ADesignatedArea: TRectF; out Ratio: Single): TRectF;\r\nbegin\r\n if (ADesignatedArea.Right - ADesignatedArea.Left <= 0) or (ADesignatedArea.Bottom - ADesignatedArea.Top <= 0) then\r\n begin\r\n Ratio := 1;\r\n Exit(Rect);\r\n end;\r\n\r\n if ((Rect.Right - Rect.Left) / (ADesignatedArea.Right - ADesignatedArea.Left)) > ((Rect.Bottom - Rect.Top) / (ADesignatedArea.Bottom - ADesignatedArea.Top)) then\r\n Ratio := (Rect.Right - Rect.Left) / (ADesignatedArea.Right - ADesignatedArea.Left)\r\n else\r\n Ratio := (Rect.Bottom - Rect.Top) / (ADesignatedArea.Bottom - ADesignatedArea.Top);\r\n\r\n Result := RectF(0, 0, (Rect.Right - Rect.Left) / Ratio, (Rect.Bottom - Rect.Top) / Ratio);\r\n RectCenterEx(Result, ADesignatedArea);\r\nend;\r\n\r\nfunction RectFitIntoEx(const Rect: TRectF; const ADesignatedArea: TRectF): TRectF;\r\nvar\r\n Ratio: Single;\r\nbegin\r\n Result := RectFitIntoEx(Rect, ADesignatedArea, Ratio);\r\nend;\r\n\r\nfunction RectCenterEx(var R: TRect; const B: TRect): TRect;\r\nbegin\r\n OffsetRectEx(R, -R.Left, -R.Top);\r\n OffsetRectEx(R, (RectWidthEx(B) - RectWidthEx(R)) div 2, (RectHeightEx(B) - RectHeightEx(R)) div 2);\r\n OffsetRectEx(R, B.Left, B.Top);\r\n Result := R;\r\nend;\r\n\r\nfunction RectCenterEx(var R: TRectF; const B: TRectF): TRectF;\r\nbegin\r\n OffsetRectEx(R, -R.Left, -R.Top);\r\n OffsetRectEx(R, Round((RectWidthEx(B) - RectWidthEx(R)) / 2), Round((RectHeightEx(B) - RectHeightEx(R)) / 2));\r\n OffsetRectEx(R, B.Left, B.Top);\r\n Result := R;\r\nend;\r\n\r\nfunction IntersectRectEx(out Rect: TRectF; const R1, R2: TRectF): Boolean;\r\nvar\r\n tmpRect: TRectF;\r\nbegin\r\n tmpRect := R1;\r\n if R2.Left > R1.Left then tmpRect.Left := R2.Left;\r\n if R2.Top > R1.Top then tmpRect.Top := R2.Top;\r\n if R2.Right < R1.Right then tmpRect.Right := R2.Right;\r\n if R2.Bottom < R1.Bottom then tmpRect.Bottom := R2.Bottom;\r\n {$IFDEF WEBLIB}\r\n Result := not RectIsEmpty(tmpRect);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Result := not tmpRect.IsEmpty;\r\n {$ENDIF}\r\n if not Result then\r\n begin\r\n tmpRect.Top := 0.0;\r\n tmpRect.Bottom := 0.0;\r\n tmpRect.Left := 0.0;\r\n tmpRect.Right := 0.0;\r\n end;\r\n Rect := tmpRect;\r\nend;\r\n\r\nfunction EmptyRect: TRectF;\r\nbegin\r\n Result := RectF(0, 0, 0, 0);\r\nend;\r\n\r\nfunction RectIsEmpty(const R: TRectF): Boolean;\r\nbegin\r\n Result := (R.Right < R.Left) or SameValue(R.Right, R.Left)\r\n or (R.Bottom < R.Top) or SameValue(R.Bottom, R.Top);\r\nend;\r\n\r\nfunction CompareValueEx(const A, B: Extended; Epsilon: Extended = 0): TTMSFNCValueRelationShip;\r\nbegin\r\n if SameValue(A, B, Epsilon) then\r\n Result := EqualsValue\r\n else if A < B then\r\n Result := LessThanValue\r\n else\r\n Result := GreaterThanValue;\r\nend;\r\n\r\nfunction RectIntersectsWithEx(const ARect: TRectF; const R: TRectF): Boolean;\r\nbegin\r\n Result := (ARect.Left < R.Right)\r\n and (ARect.Right > R.Left)\r\n and (ARect.Top < R.Bottom)\r\n and (ARect.Bottom > R.Top);\r\nend;\r\n\r\nfunction CenterPointEx(const R: TRectF): TPointF;\r\nbegin\r\n Result.X := (R.Right - R.Left) / 2.0 + R.Left;\r\n Result.Y := (R.Bottom - R.Top) / 2.0 + R.Top;\r\nend;\r\n\r\nfunction MakeRectF(Left, Top, Width, Height: Single): TRectF;\r\nbegin\r\n Result.Left := Left;\r\n Result.Top := Top;\r\n {$IFDEF WEBLIB}\r\n Result.Right := Left + Width;\r\n Result.Bottom := Top + Height;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Result.Width := Width;\r\n Result.Height := Height;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction GetPointLength(const Point: TPointF): Single;\r\nbegin\r\n Result := Sqrt(Sqr(Point.X) + Sqr(Point.Y));\r\nend;\r\n\r\nfunction ConvertToRect(const Rect: TRect): TRect;\r\nbegin\r\n Result := Rect;\r\nend;\r\n\r\nfunction ConvertToRect(const Rect: TRectF): TRect;\r\nbegin\r\n Result.Left := Round(Rect.Left);\r\n Result.Top := Round(Rect.Top);\r\n Result.Right := Round(Rect.Right);\r\n Result.Bottom := Round(Rect.Bottom);\r\nend;\r\n\r\nfunction ConvertToRectF(const Rect: TRectF): TRectF;\r\nbegin\r\n Result := Rect;\r\nend;\r\n\r\nfunction ConvertToRectF(const Rect: TRect): TRectF;\r\nbegin\r\n Result.Left := Rect.Left;\r\n Result.Top := Rect.Top;\r\n Result.Right := Rect.Right;\r\n Result.Bottom := Rect.Bottom;\r\nend;\r\n\r\nfunction ConvertToPoint(const Point: TPoint): TPoint;\r\nbegin\r\n Result := Point;\r\nend;\r\n\r\nfunction ConvertToPoint(const Point: TPointF): TPoint;\r\nbegin\r\n Result.X := Round(Point.X);\r\n Result.Y := Round(Point.Y);\r\nend;\r\n\r\nfunction ConvertToPointF(const Point: TPointF): TPointF;\r\nbegin\r\n Result := Point;\r\nend;\r\n\r\nfunction ConvertToPointF(const Point: TPoint): TPointF;\r\nbegin\r\n Result.X := Point.X;\r\n Result.Y := Point.Y;\r\nend;\r\n\r\nfunction ConvertToSize(const Size: TSize): TSize;\r\nbegin\r\n Result := Size;\r\nend;\r\n\r\nfunction ConvertToSize(const Size: TSizeF): TSize;\r\nbegin\r\n Result.cx := Round(Size.cx);\r\n Result.cy := Round(Size.cy);\r\nend;\r\n\r\nfunction ConvertToSizeF(const Size: TSizeF): TSizeF;\r\nbegin\r\n Result := Size;\r\nend;\r\n\r\nfunction ConvertToSizeF(const Size: TSize): TSizeF;\r\nbegin\r\n Result.cx := Size.cx;\r\n Result.cy := Size.cy;\r\nend;\r\n\r\n{ TTMSFNCMargins }\r\n\r\nprocedure TTMSFNCMargins.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCMargins then\r\n begin\r\n FLeft := (Source as TTMSFNCMargins).Left;\r\n FTop := (Source as TTMSFNCMargins).Top;\r\n FRight := (Source as TTMSFNCMargins).Right;\r\n FBottom := (Source as TTMSFNCMargins).Bottom;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCMargins.Changed;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nconstructor TTMSFNCMargins.Create(const ARect: TRectF);\r\nbegin\r\n FLeft := ARect.Left;\r\n FBottom := ARect.Bottom;\r\n FRight := ARect.Right;\r\n FTop := ARect.Top;\r\nend;\r\n\r\nconstructor TTMSFNCMargins.Create;\r\nbegin\r\n FLeft := 0;\r\n FBottom := 0;\r\n FRight := 0;\r\n FTop := 0;\r\nend;\r\n\r\nfunction TTMSFNCMargins.Empty: Boolean;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := RectF(Left, Top, Right, Bottom);\r\n {$IFDEF WEBLIB}\r\n Result := RectIsEmpty(R);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Result := R.IsEmpty;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCMargins.SetBottom(const Value: Single);\r\nbegin\r\n if FBottom <> Value then\r\n begin\r\n FBottom := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCMargins.SetLeft(const Value: Single);\r\nbegin\r\n if FLeft <> Value then\r\n begin\r\n FLeft := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCMargins.SetRight(const Value: Single);\r\nbegin\r\n if FRight <> Value then\r\n begin\r\n FRight := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCMargins.SetTop(const Value: Single);\r\nbegin\r\n if FTop <> Value then\r\n begin\r\n FTop := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCMargins.IsLeftStored: Boolean;\r\nbegin\r\n Result := Left <> 0;\r\nend;\r\n\r\nfunction TTMSFNCMargins.IsTopStored: Boolean;\r\nbegin\r\n Result := Top <> 0;\r\nend;\r\n\r\nfunction TTMSFNCMargins.PaddingRect(const R: TRectF): TRectF;\r\nbegin\r\n Result := RectF(R.Left + FLeft, R.Top + FTop, R.Right - FRight, R.Bottom - FBottom);\r\nend;\r\n\r\nfunction TTMSFNCMargins.Rect: TRectF;\r\nbegin\r\n Result := RectF(Left, Top, Right, Bottom);\r\nend;\r\n\r\nfunction TTMSFNCMargins.IsBottomStored: Boolean;\r\nbegin\r\n Result := Bottom <> 0;\r\nend;\r\n\r\nfunction TTMSFNCMargins.IsRightStored: Boolean;\r\nbegin\r\n Result := Right <> 0;\r\nend;\r\n\r\n{$IFNDEF LIMITEDGRAPHICSMODE}\r\n\r\n{ TTMSFNCScaledBitmap }\r\n\r\nprocedure TTMSFNCScaledBitmap.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCScaledBitmap then\r\n begin\r\n FBitmap.Assign((Source as TTMSFNCScaledBitmap).Bitmap);\r\n FBitmapName := (Source as TTMSFNCScaledBitmap).BitmapName;\r\n FScale := (Source as TTMSFNCScaledBitmap).Scale;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScaledBitmap.BitmapChanged(Sender: TObject);\r\nbegin\r\n Changed(False);\r\nend;\r\n\r\nconstructor TTMSFNCScaledBitmap.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FBitmap := TTMSFNCBitmap.Create;\r\n FBitmap.OnChange := @BitmapChanged;\r\n FScale := 1.0;\r\nend;\r\n\r\ndestructor TTMSFNCScaledBitmap.Destroy;\r\nbegin\r\n FBitmap.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmap.IsScaleStored: Boolean;\r\nbegin\r\n Result := Scale <> 1.0;\r\nend;\r\n\r\nprocedure TTMSFNCScaledBitmap.SetBitmap(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FBitmap <> Value then\r\n begin\r\n FBitmap.Assign(Value);\r\n Changed(False);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScaledBitmap.SetBitmapName(const Value: string);\r\nbegin\r\n if FBitmapName <> Value then\r\n begin\r\n FBitmapName := Value;\r\n Changed(False);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScaledBitmap.SetScale(const Value: Single);\r\nbegin\r\n if FScale <> Value then\r\n begin\r\n FScale := Value;\r\n Changed(False);\r\n end;\r\nend;\r\n\r\n{ TTMSFNCScaledBitmaps }\r\n\r\nfunction TTMSFNCScaledBitmaps.Add(Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := TTMSFNCScaledBitmap(inherited Add);\r\n Result.Scale := Scale;\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.AddBitmap(Bitmap: TTMSFNCBitmap; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := Add(Scale);\r\n Result.Bitmap.Assign(Bitmap);\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nfunction TTMSFNCScaledBitmaps.AddBitmapFromFile(FileName: string;\r\n Scale: Single): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := Add(Scale);\r\n Result.Bitmap.LoadFromFile(FileName);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCScaledBitmaps.AddBitmapFromResource(ResourceName: String; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\nbegin\r\n {$IFDEF WEBLIB}\r\n Result := AddBitmapFromResource(ResourceName, 0, Scale);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Result := AddBitmapFromResource(ResourceName, HInstance, Scale);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.AddBitmapFromResource(ResourceName: String; AInstance: NativeUInt; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := Add(Scale);\r\n Result.Bitmap.LoadFromResource(ResourceName, AInstance);\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.AddBitmapName(BitmapName: string; Scale: Single = 1.0): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := Add(Scale);\r\n Result.BitmapName := BitmapName;\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.AddDrawBitmap(Bitmap: TTMSFNCDrawBitmap;\r\n Scale: Single): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := Add(Scale);\r\n Result.Bitmap.Assign(Bitmap);\r\nend;\r\n\r\nconstructor TTMSFNCScaledBitmaps.Create(AOwner: TPersistent);\r\nbegin\r\n inherited Create(AOwner, TTMSFNCScaledBitmap);\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.GetBitmap(Scale: Single): TTMSFNCBitmap;\r\nbegin\r\n Result := GetBitmapByScale(Scale);\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.GetBitmapByScale(\r\n Scale: Single): TTMSFNCBitmap;\r\nvar\r\n it: TTMSFNCScaledBitmap;\r\nbegin\r\n Result := nil;\r\n it := GetItemByScale(Scale);\r\n if Assigned(it) then\r\n Result := it.Bitmap;\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.GetItemByScale(Scale: Single): TTMSFNCScaledBitmap;\r\nvar\r\n I: Integer;\r\n cl: TTMSFNCScaledBitmap;\r\n it: TTMSFNCScaledBitmap;\r\n mx: Single;\r\nbegin\r\n Result := nil;\r\n cl := nil;\r\n mx := 0;\r\n for I := 0 to Count - 1 do\r\n begin\r\n it := Items[I];\r\n if it.Scale = Scale then\r\n begin\r\n Result := it;\r\n Break;\r\n end\r\n else if (it.Scale <> Scale) and (it.Scale > mx) then\r\n begin\r\n cl := it;\r\n mx := it.Scale;\r\n end;\r\n end;\r\n\r\n if Result = nil then\r\n Result := cl;\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.GetItems(Index: Integer): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := TTMSFNCScaledBitmap(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.Insert(Index: Integer;\r\n Scale: Single): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := TTMSFNCScaledBitmap(inherited Insert(Index));\r\n Result.Scale := Scale;\r\nend;\r\n\r\nfunction TTMSFNCScaledBitmaps.Insert(Index: integer): TTMSFNCScaledBitmap;\r\nbegin\r\n Result := TTMSFNCScaledBitmap(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TTMSFNCScaledBitmaps.SetBitmap(Scale: Single;\r\n const Value: TTMSFNCBitmap);\r\nvar\r\n b: TTMSFNCScaledBitmap;\r\nbegin\r\n b := GetItemByScale(Scale);\r\n if not Assigned(b) then\r\n b := Add(Scale);\r\n\r\n b.Bitmap.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScaledBitmaps.SetItems(Index: Integer; const Value: TTMSFNCScaledBitmap);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TTMSFNCScaledBitmaps.Update(Item: TCollectionItem);\r\nbegin\r\n inherited;\r\n if Assigned(FOnChange) then\r\n FOnChange(Self);\r\nend;\r\n\r\n{$ENDIF}\r\n\r\n{$IFNDEF WEBLIB}\r\n\r\n{ TTMSFNCOwnedCollection.TEnumerator }\r\n\r\nconstructor TTMSFNCOwnedCollection{$IFNDEF LCLLIB}{$ENDIF}.TEnumerator.Create(ACol: TTMSFNCCollection);\r\nbegin\r\n inherited Create;\r\n FIndex := -1;\r\n FCol := ACol;\r\nend;\r\n\r\nfunction TTMSFNCOwnedCollection{$IFNDEF LCLLIB}{$ENDIF}.TEnumerator.GetCurrent: T;\r\nbegin\r\n Result := FCol.GetItem(FIndex);\r\nend;\r\n\r\nfunction TTMSFNCOwnedCollection{$IFNDEF LCLLIB}{$ENDIF}.TEnumerator.MoveNext: Boolean;\r\nbegin\r\n Result := FIndex < FCol.Count - 1;\r\n if Result then\r\n Inc(FIndex);\r\nend;\r\n\r\n{ TTMSFNCOwnedCollection }\r\n\r\nfunction TTMSFNCOwnedCollection{$IFNDEF LCLLIB}{$ENDIF}.GetEnumerator: TEnumerator;\r\nbegin\r\n Result := TEnumerator.Create(Self);\r\nend;\r\n\r\nfunction TTMSFNCOwnedCollection{$IFNDEF LCLLIB}{$ENDIF}.GetItem(AIndex: Integer): T;\r\nbegin\r\n Result := Items[AIndex] as T;\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n\r\n","{\r\n This file is part of the Pas2JS run time library.\r\n Copyright (c) 2018 by Mattias Gaertner\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit TypInfo;\r\n\r\n{$mode objfpc}\r\n{$modeswitch externalclass}\r\n\r\ninterface\r\n\r\nuses\r\n SysUtils, Types, RTLConsts, JS;\r\n\r\ntype\r\n // if you change the following enumeration type in any way\r\n // you also have to change the rtl.js in an appropriate way !\r\n TTypeKind = (\r\n tkUnknown, // 0\r\n tkInteger, // 1\r\n tkChar, // 2 in Delphi/FPC tkWChar, tkUChar\r\n tkString, // 3 in Delphi/FPC tkSString, tkWString or tkUString\r\n tkEnumeration, // 4\r\n tkSet, // 5\r\n tkDouble, // 6\r\n tkBool, // 7\r\n tkProcVar, // 8\r\n tkMethod, // 9 proc var of object\r\n tkArray, // 10 static array\r\n tkDynArray, // 11\r\n tkRecord, // 12\r\n tkClass, // 13\r\n tkClassRef, // 14\r\n tkPointer, // 15\r\n tkJSValue, // 16\r\n tkRefToProcVar, // 17\r\n tkInterface // 18\r\n //tkObject,\r\n //tkSString,tkLString,tkAString,tkWString,\r\n //tkVariant,\r\n //tkWChar,\r\n //tkInt64,\r\n //tkQWord,\r\n //tkInterfaceRaw,\r\n //tkUString,tkUChar,\r\n //tkHelper,\r\n //tkFile,\r\n );\r\n TTypeKinds = set of TTypeKind;\r\n\r\nconst\r\n tkFloat = tkDouble; // for compatibility with Delphi/FPC\r\n tkProcedure = tkProcVar; // for compatibility with Delphi\r\n tkAny = [Low(TTypeKind)..High(TTypeKind)];\r\n tkMethods = [tkMethod];\r\n tkProperties = tkAny-tkMethods-[tkUnknown];\r\n\r\ntype\r\n { TTypeInfo }\r\n\r\n TTypeInfo = class external name 'rtl.tTypeInfo'\r\n public\r\n Name: String external name 'name';\r\n Kind: TTypeKind external name 'kind';\r\n end;\r\n TTypeInfoClassOf = class of TTypeInfo;\r\n\r\n TOrdType = (\r\n otSByte, // 0\r\n otUByte, // 1\r\n otSWord, // 2\r\n otUWord, // 3\r\n otSLong, // 4\r\n otULong, // 5\r\n otSIntDouble, // 6 NativeInt\r\n otUIntDouble // 7 NativeUInt\r\n );\r\n\r\n { TTypeInfoInteger - Kind = tkInteger }\r\n\r\n TTypeInfoInteger = class external name 'rtl.tTypeInfoInteger'(TTypeInfo)\r\n public\r\n MinValue: NativeInt external name 'minvalue';\r\n MaxValue: NativeInt external name 'maxvalue';\r\n OrdType : TOrdType external name 'ordtype';\r\n end;\r\n\r\n { TEnumType }\r\n\r\n TEnumType = class external name 'anonymous'\r\n private\r\n function GetIntToName(Index: NativeInt): String; external name '[]';\r\n function GetNameToInt(Name: String): NativeInt; external name '[]';\r\n public\r\n property IntToName[Index: NativeInt]: String read GetIntToName;\r\n property NameToInt[Name: String]: NativeInt read GetNameToInt;\r\n end;\r\n\r\n { TTypeInfoEnum - Kind = tkEnumeration }\r\n\r\n TTypeInfoEnum = class external name 'rtl.tTypeInfoEnum'(TTypeInfoInteger)\r\n public\r\n // not supported: OrdType : TOrdType, BaseType: TTypeInfo\r\n EnumType: TEnumType external name 'enumtype';\r\n end;\r\n\r\n { TTypeInfoSet - Kind = tkSet }\r\n\r\n TTypeInfoSet = class external name 'rtl.tTypeInfoSet'(TTypeInfo)\r\n public\r\n // not supported: OrdType : TOrdType, BaseType: TTypeInfo\r\n CompType: TTypeInfo external name 'comptype';\r\n end;\r\n\r\n { TTypeInfoStaticArray - Kind = tkArray }\r\n\r\n TTypeInfoStaticArray = class external name 'rtl.tTypeInfoStaticArray'(TTypeInfo)\r\n public\r\n Dims: TIntegerDynArray;\r\n ElType: TTypeInfo external name 'eltype';\r\n end;\r\n\r\n { TTypeInfoDynArray - Kind = tkDynArray }\r\n\r\n TTypeInfoDynArray = class external name 'rtl.tTypeInfoDynArray'(TTypeInfo)\r\n public\r\n DimCount: NativeInt external name 'dimcount';\r\n ElType: TTypeInfo external name 'eltype';\r\n end;\r\n\r\n TParamFlag = (\r\n pfVar, // 2^0 = 1\r\n pfConst, // 2^1 = 2\r\n pfOut, // 2^2 = 4\r\n pfArray // 2^3 = 8\r\n //pfAddress,pfReference,\r\n );\r\n TParamFlags = set of TParamFlag;\r\n\r\n { TProcedureParam }\r\n\r\n TProcedureParam = class external name 'anonymous'\r\n public\r\n Name: String external name 'name';\r\n TypeInfo: TTypeInfo external name 'typeinfo';\r\n Flags: NativeInt external name 'flags'; // TParamFlags as bit vector\r\n end;\r\n\r\n TProcedureParams = array of TProcedureParam;\r\n\r\n TProcedureFlag = (\r\n pfStatic, // 2^0 = 1\r\n pfVarargs, // 2^1 = 2\r\n pfExternal // 2^2 = 4 name may be an expression\r\n );\r\n TProcedureFlags = set of TProcedureFlag;\r\n\r\n { TProcedureSignature }\r\n\r\n TProcedureSignature = class external name 'anonymous'\r\n public\r\n Params: TProcedureParams external name 'params'; // can be null\r\n ResultType: TTypeInfo external name 'resulttype'; // can be null\r\n Flags: NativeInt external name 'flags'; // TProcedureFlags as bit vector\r\n end;\r\n\r\n { TTypeInfoProcVar - Kind = tkProcVar }\r\n\r\n TTypeInfoProcVar = class external name 'rtl.tTypeInfoProcVar'(TTypeInfo)\r\n public\r\n ProcSig: TProcedureSignature external name 'procsig';\r\n end;\r\n\r\n { TTypeInfoRefToProcVar - Kind = tkRefToProcVar }\r\n\r\n TTypeInfoRefToProcVar = class external name 'rtl.tTypeInfoRefToProcVar'(TTypeInfoProcVar)\r\n end;\r\n\r\n TMethodKind = (\r\n mkProcedure, // 0 default\r\n mkFunction, // 1\r\n mkConstructor, // 2\r\n mkDestructor, // 3\r\n mkClassProcedure,// 4\r\n mkClassFunction // 5\r\n //mkClassConstructor,mkClassDestructor,mkOperatorOverload\r\n );\r\n TMethodKinds = set of TMethodKind;\r\n\r\n { TTypeInfoMethodVar - Kind = tkMethod }\r\n\r\n TTypeInfoMethodVar = class external name 'rtl.tTypeInfoMethodVar'(TTypeInfoProcVar)\r\n public\r\n MethodKind: TMethodKind external name 'methodkind';\r\n end;\r\n\r\n TTypeMemberKind = (\r\n tmkUnknown, // 0\r\n tmkField, // 1\r\n tmkMethod, // 2\r\n tmkProperty // 3\r\n );\r\n TTypeMemberKinds = set of TTypeMemberKind;\r\n\r\n { TTypeMember }\r\n\r\n TTypeMember = class external name 'rtl.tTypeMember'\r\n public\r\n Name: String external name 'name';\r\n Kind: TTypeMemberKind external name 'kind';\r\n end;\r\n TTypeMemberDynArray = array of TTypeMember;\r\n\r\n { TTypeMemberField - Kind = tmkField }\r\n\r\n TTypeMemberField = class external name 'rtl.tTypeMemberField'(TTypeMember)\r\n public\r\n TypeInfo: TTypeInfo external name 'typeinfo';\r\n end;\r\n\r\n { TTypeMemberMethod - Kind = tmkMethod }\r\n\r\n TTypeMemberMethod = class external name 'rtl.tTypeMemberMethod'(TTypeMember)\r\n public\r\n MethodKind: TMethodKind external name 'methodkind';\r\n ProcSig: TProcedureSignature external name 'procsig';\r\n end;\r\n TTypeMemberMethodDynArray = array of TTypeMemberMethod;\r\n\r\nconst\r\n pfGetFunction = 1; // getter is a function\r\n pfSetProcedure = 2; // setter is a procedure\r\n // stored is a 2-bit vector:\r\n pfStoredFalse = 4; // stored false, never\r\n pfStoredField = 8; // stored field, field name is in Stored\r\n pfStoredFunction = 12; // stored function, function name is in Stored\r\n pfHasIndex = 16; { if getter is function, append Index as last param\r\n if setter is function, append Index as second last param }\r\ntype\r\n { TTypeMemberProperty - Kind = tmkProperty }\r\n\r\n TTypeMemberProperty = class external name 'rtl.tTypeMemberProperty'(TTypeMember)\r\n public\r\n TypeInfo: TTypeInfo external name 'typeinfo';\r\n Flags: NativeInt external name 'flags'; // bit vector, see pf constants above\r\n Params: TProcedureParams external name 'params'; // can be null\r\n Index: JSValue external name 'index'; // can be undefined\r\n Getter: String external name 'getter'; // name of field or function\r\n Setter: String external name 'setter'; // name of field or function\r\n Stored: String external name 'stored'; // name of field or function, can be undefined\r\n Default: JSValue external name 'Default'; // can be undefined\r\n end;\r\n TTypeMemberPropertyDynArray = array of TTypeMemberProperty;\r\n\r\n { TTypeMembers }\r\n\r\n TTypeMembers = class external name 'rtl.tTypeMembers'\r\n private\r\n function GetItems(Name: String): TTypeMember; external name '[]';\r\n procedure SetItems(Name: String; const AValue: TTypeMember); external name '[]';\r\n public\r\n property Members[Name: String]: TTypeMember read GetItems write SetItems; default;\r\n end;\r\n\r\n { TTypeInfoStruct }\r\n\r\n TTypeInfoStruct = class external name 'rtl.tTypeInfoStruct'(TTypeInfo)\r\n private\r\n FFieldCount: NativeInt external name 'fields.length';\r\n FMethodCount: NativeInt external name 'methods.length';\r\n FPropCount: NativeInt external name 'properties.length';\r\n public\r\n Members: TTypeMembers external name 'members';\r\n Names: TStringDynArray external name 'names'; // all member names with TTypeInfo\r\n Fields: TStringDynArray external name 'fields';\r\n Methods: TStringDynArray external name 'methods';\r\n Properties: TStringDynArray external name 'properties';\r\n property FieldCount: NativeInt read FFieldCount;\r\n function GetField(Index: NativeInt): TTypeMemberField; external name 'getField';\r\n function AddField(aName: String; aType: TTypeInfo; Options: TJSObject = nil\r\n ): TTypeMemberField; external name 'addField';\r\n property MethodCount: NativeInt read FMethodCount;\r\n function GetMethod(Index: NativeInt): TTypeMemberMethod; external name 'getMethod';\r\n function AddMethod(aName: String; MethodKind: TMethodKind = mkProcedure;\r\n Params: TJSArray = nil; ResultType: TTypeInfo = nil;\r\n Options: TJSObject = nil): TTypeMemberMethod; external name 'addMethod';\r\n property PropCount: NativeInt read FPropCount;\r\n function GetProp(Index: NativeInt): TTypeMemberProperty; external name 'getProperty';\r\n function AddProperty(aName: String; Flags: NativeInt; ResultType: TTypeInfo;\r\n Getter, Setter: String; Options: TJSObject = nil): TTypeMemberProperty; external name 'addProperty';\r\n end;\r\n\r\n { TTypeInfoRecord - Kind = tkRecord }\r\n\r\n TTypeInfoRecord = class external name 'rtl.tTypeInfoRecord'(TTypeInfoStruct)\r\n public\r\n RecordType: TJSObject external name 'record';\r\n end;\r\n\r\n { TTypeInfoClass - Kind = tkClass }\r\n\r\n TTypeInfoClass = class external name 'rtl.tTypeInfoClass'(TTypeInfoStruct)\r\n public\r\n ClassType: TClass external name 'class';\r\n Ancestor: TTypeInfoClass external name 'ancestor';\r\n end;\r\n\r\n { TTypeInfoClassRef - class-of, Kind = tkClassRef }\r\n\r\n TTypeInfoClassRef = class external name 'rtl.tTypeInfoClassRef'(TTypeInfo)\r\n public\r\n InstanceType: TTypeInfo external name 'instancetype';\r\n end;\r\n\r\n { TTypeInfoPointer - Kind = tkPointer }\r\n\r\n TTypeInfoPointer = class external name 'rtl.tTypeInfoPointer'(TTypeInfo)\r\n public\r\n RefType: TTypeInfo external name 'reftype'; // can be null\r\n end;\r\n\r\n { TTypeInfoInterface - Kind = tkInterface }\r\n\r\n TTypeInfoInterface = class external name 'rtl.tTypeInfoInterface'(TTypeInfoStruct)\r\n public\r\n InterfaceType: TJSObject external name 'interface';\r\n Ancestor: TTypeInfoInterface external name 'ancestor';\r\n end;\r\n\r\n EPropertyError = class(Exception);\r\n\r\nfunction GetClassMembers(aTIClass: TTypeInfoClass): TTypeMemberDynArray;\r\nfunction GetClassMember(aTIClass: TTypeInfoClass; const aName: String): TTypeMember;\r\nfunction GetInstanceMethod(Instance: TObject; const aName: String): Pointer;\r\nfunction GetClassMethods(aTIClass: TTypeInfoClass): TTypeMemberMethodDynArray;\r\nfunction CreateMethod(Instance: TObject; FuncName: String): Pointer; external name 'rtl.createCallback';\r\n\r\nfunction GetInterfaceMembers(aTIInterface: TTypeInfoInterface): TTypeMemberDynArray;\r\nfunction GetInterfaceMember(aTIInterface: TTypeInfoInterface; const aName: String): TTypeMember;\r\nfunction GetInterfaceMethods(aTIInterface: TTypeInfoInterface): TTypeMemberMethodDynArray;\r\n\r\nfunction GetPropInfos(aTIClass: TTypeInfoClass): TTypeMemberPropertyDynArray;\r\nfunction GetPropInfo(TI: TTypeInfoClass; const PropName: String): TTypeMemberProperty;\r\nfunction GetPropInfo(TI: TTypeInfoClass; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\nfunction GetPropInfo(Instance: TObject; const PropName: String): TTypeMemberProperty;\r\nfunction GetPropInfo(Instance: TObject; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\nfunction GetPropInfo(aClass: TClass; const PropName: String): TTypeMemberProperty;\r\nfunction GetPropInfo(aClass: TClass; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\n\r\nfunction FindPropInfo(Instance: TObject; const PropName: String): TTypeMemberProperty;\r\nfunction FindPropInfo(Instance: TObject; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\nfunction FindPropInfo(aClass: TClass; const PropName: String): TTypeMemberProperty;\r\nfunction FindPropInfo(aClass: TClass; const PropName: String; const Kinds: TTypeKinds): TTypeMemberProperty;\r\n\r\n// Property information routines.\r\nFunction IsStoredProp(Instance: TObject; const PropInfo: TTypeMemberProperty): Boolean;\r\nFunction IsStoredProp(Instance: TObject; const PropName: string): Boolean;\r\nfunction IsPublishedProp(Instance: TObject; const PropName: String): Boolean;\r\nfunction IsPublishedProp(aClass: TClass; const PropName: String): Boolean;\r\nfunction PropType(Instance: TObject; const PropName: string): TTypeKind;\r\nfunction PropType(aClass: TClass; const PropName: string): TTypeKind;\r\nfunction PropIsType(Instance: TObject; const PropName: string; const TypeKind: TTypeKind): Boolean;\r\nfunction PropIsType(aClass: TClass; const PropName: string; const TypeKind: TTypeKind): Boolean;\r\n\r\nfunction GetJSValueProp(Instance: TObject; const PropName: String): JSValue;\r\nfunction GetJSValueProp(Instance: TObject; const PropInfo: TTypeMemberProperty): JSValue;\r\nprocedure SetJSValueProp(Instance: TObject; const PropName: String; Value: JSValue);\r\nprocedure SetJSValueProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: JSValue);\r\n\r\nfunction GetNativeIntProp(Instance: TObject; const PropName: String): NativeInt;\r\nfunction GetNativeIntProp(Instance: TObject; const PropInfo: TTypeMemberProperty): NativeInt;\r\nprocedure SetNativeIntProp(Instance: TObject; const PropName: String; Value: NativeInt);\r\nprocedure SetNativeIntProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: NativeInt);\r\n\r\nfunction GetOrdProp(Instance: TObject; const PropName: String): longint;\r\nfunction GetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty): longint;\r\nprocedure SetOrdProp(Instance: TObject; const PropName: String; Value: longint);\r\nprocedure SetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: longint);\r\n\r\nfunction GetStrProp(Instance: TObject; const PropName: String): String;\r\nfunction GetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String;\r\nprocedure SetStrProp(Instance: TObject; const PropName: String; Value: String);\r\nprocedure SetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: String);\r\n\r\nfunction GetStringProp(Instance: TObject; const PropName: String): String; deprecated;\r\nfunction GetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; deprecated;\r\nprocedure SetStringProp(Instance: TObject; const PropName: String; Value: String); deprecated;\r\nprocedure SetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: String); deprecated;\r\n\r\nfunction GetBoolProp(Instance: TObject; const PropName: String): boolean;\r\nfunction GetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty): boolean;\r\nprocedure SetBoolProp(Instance: TObject; const PropName: String; Value: boolean);\r\nprocedure SetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: boolean);\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropName: String): TObject;\r\nfunction GetObjectProp(Instance: TObject; const PropName: String; MinClass : TClass): TObject;\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty): TObject;\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; MinClass : TClass): TObject;\r\nprocedure SetObjectProp(Instance: TObject; const PropName: String; Value: TObject) ;\r\nprocedure SetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: TObject);\r\n\r\nFunction GetFloatProp(Instance: TObject; const PropName: string): Double;\r\nFunction GetFloatProp(Instance: TObject; PropInfo : TTypeMemberProperty) : Double;\r\nProcedure SetFloatProp(Instance: TObject; const PropName: string; Value: Double);\r\nProcedure SetFloatProp(Instance: TObject; PropInfo : TTypeMemberProperty; Value : Double);\r\n\r\nimplementation\r\n\r\nfunction GetClassMembers(aTIClass: TTypeInfoClass): TTypeMemberDynArray;\r\nvar\r\n C: TTypeInfoClass;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n C:=aTIClass;\r\n while C<>nil do\r\n begin\r\n inc(Cnt,length(C.Names));\r\n C:=C.Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n C:=aTIClass;\r\n i:=0;\r\n while C<>nil do\r\n begin\r\n for j:=0 to length(C.Names)-1 do\r\n begin\r\n Result[i]:=C.Members[C.Names[j]];\r\n inc(i);\r\n end;\r\n C:=C.Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetClassMember(aTIClass: TTypeInfoClass; const aName: String): TTypeMember;\r\nvar\r\n C: TTypeInfoClass;\r\n i: Integer;\r\nbegin\r\n // quick search: case sensitive\r\n C:=aTIClass;\r\n while C<>nil do\r\n begin\r\n if TJSObject(C.Members).hasOwnProperty(aName) then\r\n exit(C.Members[aName]);\r\n C:=C.Ancestor;\r\n end;\r\n // slow search: case insensitive\r\n C:=aTIClass;\r\n while C<>nil do\r\n begin\r\n for i:=0 to length(C.Names)-1 do\r\n if CompareText(C.Names[i],aName)=0 then\r\n exit(C.Members[C.Names[i]]);\r\n C:=C.Ancestor;\r\n end;\r\n Result:=nil;\r\nend;\r\n\r\nfunction GetInstanceMethod(Instance: TObject; const aName: String): Pointer;\r\nvar\r\n TI: TTypeMember;\r\nbegin\r\n if Instance=nil then exit(nil);\r\n TI:=GetClassMember(TypeInfo(Instance),aName);\r\n if not (TI is TTypeMemberMethod) then exit(nil);\r\n Result:=CreateMethod(Instance,TI.Name); // Note: use TI.Name for the correct case!\r\nend;\r\n\r\nfunction GetClassMethods(aTIClass: TTypeInfoClass): TTypeMemberMethodDynArray;\r\nvar\r\n C: TTypeInfoClass;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n C:=aTIClass;\r\n while C<>nil do\r\n begin\r\n inc(Cnt,C.MethodCount);\r\n C:=C.Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n C:=aTIClass;\r\n i:=0;\r\n while C<>nil do\r\n begin\r\n for j:=0 to C.MethodCount-1 do\r\n begin\r\n Result[i]:=TTypeMemberMethod(C.Members[C.Methods[j]]);\r\n inc(i);\r\n end;\r\n C:=C.Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetInterfaceMembers(aTIInterface: TTypeInfoInterface\r\n ): TTypeMemberDynArray;\r\nvar\r\n Intf: TTypeInfoInterface;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n inc(Cnt,length(Intf.Names));\r\n Intf:=Intf.Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n Intf:=aTIInterface;\r\n i:=0;\r\n while Intf<>nil do\r\n begin\r\n for j:=0 to length(Intf.Names)-1 do\r\n begin\r\n Result[i]:=Intf.Members[Intf.Names[j]];\r\n inc(i);\r\n end;\r\n Intf:=Intf.Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetInterfaceMember(aTIInterface: TTypeInfoInterface;\r\n const aName: String): TTypeMember;\r\nvar\r\n Intf: TTypeInfoInterface;\r\n i: Integer;\r\nbegin\r\n // quick search: case sensitive\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n if TJSObject(Intf.Members).hasOwnProperty(aName) then\r\n exit(Intf.Members[aName]);\r\n Intf:=Intf.Ancestor;\r\n end;\r\n // slow search: case insensitive\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n for i:=0 to length(Intf.Names)-1 do\r\n if CompareText(Intf.Names[i],aName)=0 then\r\n exit(Intf.Members[Intf.Names[i]]);\r\n Intf:=Intf.Ancestor;\r\n end;\r\n Result:=nil;\r\nend;\r\n\r\nfunction GetInterfaceMethods(aTIInterface: TTypeInfoInterface\r\n ): TTypeMemberMethodDynArray;\r\nvar\r\n Intf: TTypeInfoInterface;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n Intf:=aTIInterface;\r\n while Intf<>nil do\r\n begin\r\n inc(Cnt,Intf.MethodCount);\r\n Intf:=Intf.Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n Intf:=aTIInterface;\r\n i:=0;\r\n while Intf<>nil do\r\n begin\r\n for j:=0 to Intf.MethodCount-1 do\r\n begin\r\n Result[i]:=TTypeMemberMethod(Intf.Members[Intf.Methods[j]]);\r\n inc(i);\r\n end;\r\n Intf:=Intf.Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetPropInfos(aTIClass: TTypeInfoClass): TTypeMemberPropertyDynArray;\r\nvar\r\n C: TTypeInfoClass;\r\n i, Cnt, j: Integer;\r\nbegin\r\n Cnt:=0;\r\n C:=aTIClass;\r\n while C<>nil do\r\n begin\r\n inc(Cnt,C.PropCount);\r\n C:=C.Ancestor;\r\n end;\r\n SetLength(Result,Cnt);\r\n C:=aTIClass;\r\n i:=0;\r\n while C<>nil do\r\n begin\r\n for j:=0 to C.PropCount-1 do\r\n begin\r\n Result[i]:=TTypeMemberProperty(C.Members[C.Properties[j]]);\r\n inc(i);\r\n end;\r\n C:=C.Ancestor;\r\n end;\r\nend;\r\n\r\nfunction GetPropInfo(TI: TTypeInfoClass; const PropName: String\r\n ): TTypeMemberProperty;\r\nvar\r\n m: TTypeMember;\r\n i: Integer;\r\n C: TTypeInfoClass;\r\nbegin\r\n // quick search case sensitive\r\n C:=TI;\r\n while C<>nil do\r\n begin\r\n m:=C.Members[PropName];\r\n if m is TTypeMemberProperty then\r\n exit(TTypeMemberProperty(m));\r\n C:=C.Ancestor;\r\n end;\r\n\r\n // slow search case insensitive\r\n Result:=nil;\r\n repeat\r\n for i:=0 to TI.PropCount-1 do\r\n if CompareText(PropName,TI.Properties[i])=0 then\r\n begin\r\n m:=TI.Members[TI.Properties[i]];\r\n if m is TTypeMemberProperty then\r\n Result:=TTypeMemberProperty(m);\r\n exit;\r\n end;\r\n TI:=TI.Ancestor;\r\n until TI=nil;\r\nend;\r\n\r\nfunction GetPropInfo(TI: TTypeInfoClass; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TI,PropName);\r\n if (Kinds<>[]) and (Result<>nil) and not (Result.TypeInfo.Kind in Kinds) then\r\n Result:=nil;\r\nend;\r\n\r\nfunction GetPropInfo(Instance: TObject; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance),PropName,[]);\r\nend;\r\n\r\nfunction GetPropInfo(Instance: TObject; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance),PropName,Kinds);\r\nend;\r\n\r\nfunction GetPropInfo(aClass: TClass; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(AClass),PropName,[]);\r\nend;\r\n\r\nfunction GetPropInfo(aClass: TClass; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(AClass),PropName,Kinds);\r\nend;\r\n\r\nfunction FindPropInfo(Instance: TObject; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance), PropName);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction FindPropInfo(Instance: TObject; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(Instance), PropName, Kinds);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction FindPropInfo(aClass: TClass; const PropName: String\r\n ): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(aClass), PropName);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction FindPropInfo(aClass: TClass; const PropName: String;\r\n const Kinds: TTypeKinds): TTypeMemberProperty;\r\nbegin\r\n Result:=GetPropInfo(TypeInfo(aClass), PropName, Kinds);\r\n if Result=nil then\r\n raise EPropertyError.CreateFmt(SErrPropertyNotFound, [PropName]);\r\nend;\r\n\r\nfunction IsStoredProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): Boolean;\r\ntype\r\n TIsStored = function: Boolean of object;\r\nbegin\r\n case PropInfo.Flags and 12 of\r\n 0: Result:=true;\r\n 4: Result:=false;\r\n 8: Result:=Boolean(TJSObject(Instance)[PropInfo.Stored]);\r\n else Result:=TIsStored(TJSObject(Instance)[PropInfo.Stored])();\r\n end;\r\nend;\r\n\r\nfunction IsStoredProp(Instance: TObject; const PropName: string): Boolean;\r\nbegin\r\n Result:=IsStoredProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction IsPublishedProp(Instance: TObject; const PropName: String): Boolean;\r\nbegin\r\n Result:=GetPropInfo(Instance,PropName)<>nil;\r\nend;\r\n\r\nfunction IsPublishedProp(aClass: TClass; const PropName: String): Boolean;\r\nbegin\r\n Result:=GetPropInfo(aClass,PropName)<>nil;\r\nend;\r\n\r\nfunction PropType(Instance: TObject; const PropName: string): TTypeKind;\r\nbegin\r\n Result:=FindPropInfo(Instance,PropName).TypeInfo.Kind;\r\nend;\r\n\r\nfunction PropType(aClass: TClass; const PropName: string): TTypeKind;\r\nbegin\r\n Result:=FindPropInfo(aClass,PropName).TypeInfo.Kind;\r\nend;\r\n\r\nfunction PropIsType(Instance: TObject; const PropName: string;\r\n const TypeKind: TTypeKind): Boolean;\r\nbegin\r\n Result:=PropType(Instance,PropName)=TypeKind;\r\nend;\r\n\r\nfunction PropIsType(aClass: TClass; const PropName: string;\r\n const TypeKind: TTypeKind): Boolean;\r\nbegin\r\n Result:=PropType(aClass,PropName)=TypeKind;\r\nend;\r\n\r\ntype\r\n TGetterKind = (\r\n gkNone,\r\n gkField,\r\n gkFunction,\r\n gkFunctionWithParams\r\n );\r\n\r\nfunction GetPropGetterKind(const PropInfo: TTypeMemberProperty): TGetterKind;\r\nbegin\r\n if PropInfo.Getter='' then\r\n Result:=gkNone\r\n else if (pfGetFunction and PropInfo.Flags)>0 then\r\n begin\r\n if length(PropInfo.Params)>0 then\r\n Result:=gkFunctionWithParams\r\n else\r\n Result:=gkFunction;\r\n end\r\n else\r\n Result:=gkField;\r\nend;\r\n\r\ntype\r\n TSetterKind = (\r\n skNone,\r\n skField,\r\n skProcedure,\r\n skProcedureWithParams\r\n );\r\n\r\nfunction GetPropSetterKind(const PropInfo: TTypeMemberProperty): TSetterKind;\r\nbegin\r\n if PropInfo.Setter='' then\r\n Result:=skNone\r\n else if (pfSetProcedure and PropInfo.Flags)>0 then\r\n begin\r\n if length(PropInfo.Params)>0 then\r\n Result:=skProcedureWithParams\r\n else\r\n Result:=skProcedure;\r\n end\r\n else\r\n Result:=skField;\r\nend;\r\n\r\nfunction GetJSValueProp(Instance: TObject; const PropName: String): JSValue;\r\nbegin\r\n Result:=GetJSValueProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetJSValueProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): JSValue;\r\ntype\r\n TGetter = function: JSValue of object;\r\n TGetterWithIndex = function(Index: JSValue): JSValue of object;\r\nvar\r\n gk: TGetterKind;\r\nbegin\r\n gk:=GetPropGetterKind(PropInfo);\r\n case gk of\r\n gkNone:\r\n raise EPropertyError.CreateFmt(SCantReadPropertyS, [PropInfo.Name]);\r\n gkField:\r\n Result:=TJSObject(Instance)[PropInfo.Getter];\r\n gkFunction:\r\n if (pfHasIndex and PropInfo.Flags)>0 then\r\n Result:=TGetterWithIndex(TJSObject(Instance)[PropInfo.Getter])(PropInfo.Index)\r\n else\r\n Result:=TGetter(TJSObject(Instance)[PropInfo.Getter])();\r\n gkFunctionWithParams:\r\n raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);\r\n end;\r\nend;\r\n\r\nprocedure SetJSValueProp(Instance: TObject; const PropName: String;\r\n Value: JSValue);\r\nbegin\r\n SetJSValueProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetJSValueProp(Instance: TObject;\r\n const PropInfo: TTypeMemberProperty; Value: JSValue);\r\ntype\r\n TSetter = procedure(Value: JSValue) of object;\r\n TSetterWithIndex = procedure(Index, Value: JSValue) of object;\r\nvar\r\n sk: TSetterKind;\r\nbegin\r\n sk:=GetPropSetterKind(PropInfo);\r\n case sk of\r\n skNone:\r\n raise EPropertyError.CreateFmt(SCantWritePropertyS, [PropInfo.Name]);\r\n skField:\r\n TJSObject(Instance)[PropInfo.Setter]:=Value;\r\n skProcedure:\r\n if (pfHasIndex and PropInfo.Flags)>0 then\r\n TSetterWithIndex(TJSObject(Instance)[PropInfo.Setter])(PropInfo.Index,Value)\r\n else\r\n TSetter(TJSObject(Instance)[PropInfo.Setter])(Value);\r\n skProcedureWithParams:\r\n raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);\r\n end;\r\nend;\r\n\r\nfunction GetNativeIntProp(Instance: TObject; const PropName: String): NativeInt;\r\nbegin\r\n Result:=GetNativeIntProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetNativeIntProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): NativeInt;\r\nbegin\r\n Result:=NativeInt(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetNativeIntProp(Instance: TObject; const PropName: String;\r\n Value: NativeInt);\r\nbegin\r\n SetJSValueProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetNativeIntProp(Instance: TObject;\r\n const PropInfo: TTypeMemberProperty; Value: NativeInt);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetOrdProp(Instance: TObject; const PropName: String): longint;\r\nbegin\r\n Result:=longint(GetJSValueProp(Instance,PropName));\r\nend;\r\n\r\nfunction GetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): longint;\r\nbegin\r\n Result:=longint(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetOrdProp(Instance: TObject; const PropName: String; Value: longint);\r\nbegin\r\n SetJSValueProp(Instance,PropName,Value);\r\nend;\r\n\r\nprocedure SetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: longint);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetStrProp(Instance: TObject; const PropName: String): String;\r\nbegin\r\n Result:=GetStrProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): String;\r\nbegin\r\n Result:=String(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetStrProp(Instance: TObject; const PropName: String; Value: String\r\n );\r\nbegin\r\n SetStrProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: String);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetStringProp(Instance: TObject; const PropName: String): String;\r\nbegin\r\n Result:=GetStrProp(Instance,PropName);\r\nend;\r\n\r\nfunction GetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): String;\r\nbegin\r\n Result:=GetStrProp(Instance,PropInfo);\r\nend;\r\n\r\nprocedure SetStringProp(Instance: TObject; const PropName: String; Value: String\r\n );\r\nbegin\r\n SetStrProp(Instance,PropName,Value);\r\nend;\r\n\r\nprocedure SetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: String);\r\nbegin\r\n SetStrProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetBoolProp(Instance: TObject; const PropName: String): boolean;\r\nbegin\r\n Result:=GetBoolProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty\r\n ): boolean;\r\nbegin\r\n Result:=Boolean(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nprocedure SetBoolProp(Instance: TObject; const PropName: String; Value: boolean\r\n );\r\nbegin\r\n SetBoolProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty;\r\n Value: boolean);\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropName: String): TObject;\r\nbegin\r\n Result:=GetObjectProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropName: String; MinClass : TClass): TObject;\r\nbegin\r\n Result:=GetObjectProp(Instance,FindPropInfo(Instance,PropName));\r\n if (MinClass<>Nil) and (Result<>Nil) Then\r\n if not Result.InheritsFrom(MinClass) then\r\n Result:=Nil;\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty): TObject;\r\n\r\nbegin\r\n Result:=GetObjectProp(Instance,PropInfo,Nil);\r\nend;\r\n\r\nfunction GetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; MinClass : TClass): TObject;\r\n\r\nVar\r\n O : TObject;\r\n\r\nbegin\r\n O:=TObject(GetJSValueProp(Instance,PropInfo));\r\n if (MinClass<>Nil) and not O.InheritsFrom(MinClass) then\r\n Result:=Nil\r\n else\r\n Result:=O;\r\nend;\r\n\r\nprocedure SetObjectProp(Instance: TObject; const PropName: String; Value: TObject) ;\r\n\r\nbegin\r\n SetObjectProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nprocedure SetObjectProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: TObject);\r\n\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nFunction GetFloatProp(Instance: TObject; PropInfo : TTypeMemberProperty) : Double;\r\nbegin\r\n Result:=Double(GetJSValueProp(Instance,PropInfo));\r\nend;\r\n\r\nFunction GetFloatProp(Instance: TObject; const PropName: string): Double;\r\n\r\nbegin\r\n Result:=GetFloatProp(Instance,FindPropInfo(Instance,PropName));\r\nend;\r\n\r\nProcedure SetFloatProp(Instance: TObject; const PropName: string; Value: Double);\r\n\r\nbegin\r\n SetFloatProp(Instance,FindPropInfo(Instance,PropName),Value);\r\nend;\r\n\r\nProcedure SetFloatProp(Instance: TObject; PropInfo : TTypeMemberProperty; Value : Double);\r\n\r\nbegin\r\n SetJSValueProp(Instance,PropInfo,Value);\r\nend;\r\n\r\nend.\r\n\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCUtils;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n Windows,\r\n {$ENDIF}\r\n Classes, SysUtils, Types, WEBLib.TMSFNCTypes, WEBLib.Controls,\r\n WEBLib.Graphics, WEBLib.Forms\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types, FMX.Dialogs\r\n {$IFDEF MACOS}\r\n ,MacApi.ObjectiveC, MacApi.ObjcRuntime\r\n {$IFDEF IOS}\r\n ,iOSApi.Foundation\r\n {$ELSE}\r\n ,MacApi.Foundation\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,Rtti\r\n {$ENDIF}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n ,UITypes\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,JPEG, PngImage, GifImg\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n ,Dialogs\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n PthDel = {$IFDEF MSWINDOWS} '\\'; {$ELSE} '/'; {$ENDIF}\r\n\r\ntype\r\n TTMSFNCUtilsCharSet = array of char;\r\n\r\n TTMSFNCUtils = class\r\n public\r\n class procedure OpenURL(AURL: string);\r\n class procedure OpenFile(AFile: string; {%H-}AControlReference: TControl = nil);\r\n class procedure GetFonts(FontList: TStringList);\r\n class procedure SetFontSize(AFont: TFont; ASize: Single);\r\n class function GetHInstance: NativeUInt;\r\n class function IsHTMLUnicode(AValue: UnicodeString): Boolean;\r\n class function IsHTML(AValue: String): Boolean;\r\n class function GetDocumentsPath: String;\r\n class function GetAppPath: String;\r\n class function GetMousePos: TPointF;\r\n class function IsHighDPIScale: Boolean;\r\n class function GetDPIScale({%H-}AOwner: TComponent = nil): Single;\r\n class function AddBackslash(const AValue: string): string;\r\n class function GetResourceStream(AResourceName: string): TResourceStream; overload;\r\n class function GetResourceStream(AResourceName: string; AInstance: NativeUInt): TResourceStream; overload;\r\n class function Clone(AComponent: TComponent): TComponent;\r\n class function HTMLStrip(AHTML: string): string;\r\n class function VarPos(ASubValue, AValue: string; var AResult: Integer): Integer;\r\n class function VarPosNoCase(ASubValue, AValue: string; var AResult: Integer): Integer;\r\n class function CharInStr(s: string; Index: Integer): Char;\r\n class function HexStrToBytes(const AValue: string): TBytes;\r\n class function SaveBitmapToHexStr(const ABitmap: TTMSFNCBitmap): string;\r\n class function SaveStreamToHexStr(const AStream: TStream): string;\r\n class function CreateBitmapFromHexStr(const AHexStr: string): TTMSFNCBitmap;\r\n class function MulDivInt(nNumber, nNumerator, nDenominator: Integer): Integer; overload;\r\n class function MulDivSingle(nNumber, nNumerator, nDenominator: Single): Single; overload;\r\n class procedure LoadBitmapFromHexStr(const AHexStr: string; const ABitmap: TTMSFNCBitmap);\r\n class procedure LoadStreamFromHexStr(const AHexStr: string; const AStream: TStream);\r\n {$IFDEF CMNLIB}\r\n class function ConvertBitmapToJPEGStream(ABitmap: TTMSFNCBitmap; AQuality: Single = 1.0; ABackgroundColor: TColor = clWhite): TMemoryStream;\r\n class function FindGraphicClass(const Buffer; const {%H-}BufferSize: Int64; out GraphicClass: TGraphicClass): Boolean;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n class function ConvertBitmapToJPEGStream(ABitmap: TTMSFNCBitmap; AQuality: Single = 1.0; ABackgroundColor: TAlphaColor = TAlphaColorRec.White): TMemoryStream;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n class function ConvertBitmapToJPEGStream(ABitmap: TTMSFNCBitmap; AQuality: Single = 1.0; ABackgroundColor: TColor = clWhite): TMemoryStream;\r\n {$ENDIF}\r\n class procedure Split(const ADelimiter: Char; AInput: string; const AStrings: TStrings);\r\n class function MatchStrEx(AValue1, AValue2: string; ACaseSensitive: Boolean): Boolean;\r\n class function MatchStr(AValue1, AValue2:string; ACaseSensitive: Boolean): Boolean;\r\n class function StripLogicSpaces(AValue: string): string;\r\n class function FirstChar(ACharset: TTMSFNCUtilsCharSet; AValue: string; var spos: Integer): char;\r\n class function CharInSet(ch: Char; ACharSet: TTMSFNCUtilsCharSet): boolean; overload;\r\n class function AddCharSet(ACharSet1, ACharSet2: TTMSFNCUtilsCharSet): TTMSFNCUtilsCharSet;\r\n class function SubCharSet(ACharSet1, ACharSet2: TTMSFNCUtilsCharSet): TTMSFNCUtilsCharSet;\r\n class function AlphaCharSet: TTMSFNCUtilsCharSet;\r\n class function NumericCharSet: TTMSFNCUtilsCharSet;\r\n class function CreateCharSet(AValue: string): TTMSFNCUtilsCharSet;\r\n class function IsDate(AValue: string; var ADate: TDateTime): boolean;\r\n class function IPos(su,s:string):Integer;\r\n class function UnFixMarkup(su:string; SpecialChars: boolean = true): string;\r\n class function FixMarkup(su:string;SpecialChars: boolean = true): string;\r\n class function TagReplaceString(const Srch,Repl:string;var Dest:string):Boolean;\r\n class function Matches(s0a, s1a: PChar): Boolean; overload;\r\n {$IFNDEF WEBLIB}\r\n class function Matches(s0a, s1a: string): Boolean; overload;\r\n {$ENDIF}\r\n class function StripThousandSep(ps: string): String;\r\n class function ClosingParenthesis(s1: string): Integer;\r\n class function GetMarkupIndex(const Markup: string): integer;\r\n class function GetSpecialChar(const Value: integer): UnicodeString;\r\n class function IndexOfTextInArray(const AText: string; const AValues: array of string): Integer;\r\n {$IFDEF MACOS}\r\n class function NSStrEx(AString: String): NSString;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n class function GetParentForm(AControl: TFMXObject): TCustomForm;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n class function GetParentForm(AControl: TControl): TCustomForm;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n class function GetParentForm(AControl: TControl): TCustomForm;\r\n {$ENDIF}\r\n class function GetOwnerForm(AComponent: TComponent): TCustomForm;\r\n class function &Message(const AMessage: string): Integer; overload;\r\n class function &Message(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons; const AHelpContext: LongInt): Integer; overload;\r\n class function SelectFile(var AFileName: string; const ADefaultFolder: string = ''; const AFilter: string = ''): Boolean;\r\n class function SaveFile(var AFileName: string; const AFilter: string = ''): Boolean;\r\n class function EscapeString(const AValue: string): string;\r\n class function UnescapeString(const AValue: string): string;\r\n class function DownloadImage(AURL: string): TMemoryStream;\r\n end;\r\n\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCComponentHelper = class helper for TComponent\r\n function GetVersionNumber(AMaj, AMin, ARel, ABld: ShortInt): string;\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNLIB}\r\n TTMSFNCControlHelper = class helper for TControl\r\n function MakeScreenshot: TTMSFNCBitmap;\r\n end;\r\n {$ENDIF}\r\n\r\n TTMSFNCClipBoardFormat = (cfText, cfRTF, cfHTML, cfBitmap, cfBitmapWin, cfStream, cfRichTextStream);\r\n\r\n TTMSFNCClipBoard = class\r\n protected\r\n {$IFDEF FMXLIB}\r\n {$IFDEF MSWINDOWS}\r\n class function GetFormat(AFormat: TTMSFNCClipBoardFormat): Cardinal; virtual;\r\n class function isTextFormat(AFormat: Cardinal): Boolean; virtual;\r\n class function isStreamFormat(AFormat: Cardinal): Boolean; virtual;\r\n {$ELSE}\r\n class function GetFormat(AFormat: TTMSFNCClipBoardFormat): string; virtual;\r\n class function isTextFormat(AFormat: String): Boolean; virtual;\r\n class function isStreamFormat(AFormat: String): Boolean; virtual;\r\n {$ENDIF}\r\n {$ENDIF}\r\n public\r\n {$IFDEF FMXLIB}\r\n {$IFDEF MSWINDOWS}\r\n class procedure SetValue(AValue: TValue; AFormat: Cardinal); virtual;\r\n class function GetValue(AFormat: Cardinal): TValue; virtual;\r\n class function GetCustomValue(AFormat: Cardinal; AData: Pointer): TValue; virtual;\r\n class procedure SetCustomValue(AFormat: Cardinal; AValue: TValue; var AData: Pointer); virtual;\r\n class function AllocateCustomValue(AFormat: Cardinal; AValue: TValue): THandle; virtual;\r\n {$ELSE}\r\n class procedure SetValue(AValue: TValue; AFormat: String); virtual;\r\n class function GetValue(AFormat: String): TValue; virtual;\r\n {$IFDEF MACOS}\r\n class function GetCustomValue(AFormat: String; AData: NSData): TValue; virtual;\r\n class function SetCustomValue(AFormat: String; AValue: TValue): NSData; virtual;\r\n {$ELSE}\r\n class function GetCustomValue(AFormat: String; AData: Pointer): TValue; virtual;\r\n class function SetCustomValue(AFormat: String; AValue: TValue): Pointer; virtual;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF MSWINDOWS}\r\n class procedure SetBitmapWin(ABitmap: TTMSFNCBitmap); virtual;\r\n class function GetBitmapWin: TTMSFNCBitmap; virtual;\r\n {$ENDIF}\r\n {$IFDEF MSWINDOWS}\r\n class function HasFormat(AFormat: Cardinal): Boolean; overload; virtual;\r\n {$ELSE}\r\n class function HasFormat(AFormat: String): Boolean; overload; virtual;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNLIB}\r\n class function GetFormat(AFormat: TTMSFNCClipBoardFormat): string; virtual;\r\n {$ENDIF}\r\n class function HasFormat(AFormat: TTMSFNCClipBoardFormat): Boolean; overload; virtual;\r\n class function HasContent: Boolean; virtual;\r\n class procedure Clear; virtual;\r\n class procedure SetText(AText: String); virtual;\r\n class function GetText: String; virtual;\r\n class procedure SetStream(AStream: TMemoryStream); virtual;\r\n class function GetStream: TMemoryStream; virtual;\r\n class procedure SetBitmap(ABitmap: TTMSFNCBitmap); virtual;\r\n class function GetBitmap: TTMSFNCBitmap; virtual;\r\n class procedure SetRichTextStream(AStream: TMemoryStream); virtual;\r\n class function GetRichTextStream: TMemoryStream; virtual;\r\n class procedure SetRTF(ARTF: String); virtual;\r\n class function GetRTF: String; virtual;\r\n class procedure SetHTML(AHTML: String); virtual;\r\n class function GetHTML: String; virtual;\r\n end;\r\n\r\n{$EXTERNALSYM Hiword}\r\nfunction Hiword(L: DWORD): Word;\r\n{$EXTERNALSYM LoWord}\r\nfunction LoWord(L: DWORD): Word;\r\n{$EXTERNALSYM MakeWord}\r\nfunction MakeWord(b1,b2: Integer): Integer;\r\n{$EXTERNALSYM MakeLong}\r\nfunction MakeLong(i1,i2: Integer): Integer;\r\n\r\nvar\r\n CF_FNCSTREAM: Word;\r\n CF_FNCRICHTEXTSTREAM: Word;\r\n CF_FNCRTF: Word;\r\n CF_FNCBITMAP: Word;\r\n {$IFDEF FMXLIB}\r\n CF_FNCBITMAPWIN: Word;\r\n {$ENDIF}\r\n CF_FNCHTML: Word;\r\n\r\nimplementation\r\n\r\n{$IFNDEF WEBLIB}\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n {$IFNDEF LCLLIB}\r\n WinInet, ShellApi, AnsiStrings\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,ShlObj, ComObj\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n iOSApi.UIKit, iOSApi.CocoaTypes, FMX.Platform.iOS\r\n {$ELSE}\r\n MacApi.AppKit\r\n {$ENDIF}\r\n ,MacApi.Helpers\r\n {$ENDIF}\r\n {$IFDEF ANDROID}\r\n AndroidApi.JNI.App, AndroidApi.JNI.GraphicsContentViewText, AndroidApi.JNIBridge, Generics.Collections,\r\n AndroidApi.JNI.Net, AndroidApi.Helpers, FMX.Helpers.Android, AndroidApi.JNI.JavaTypes\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n {$IFDEF LINUX}\r\n StrUtils, FMUX.Api\r\n {$ENDIF}\r\n ,FMX.Platform, IOUtils, FMX.Surfaces\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 28}\r\n ,FMX.Utils\r\n {$IFEND}\r\n {$IF COMPILERVERSION > 30}\r\n {$IFDEF FMXMOBILE}\r\n ,FMX.DialogService.Async\r\n {$ELSE}\r\n ,FMX.DialogService.Sync\r\n {$ENDIF}\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n LCLIntF, LCLType\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n ,ClipBrd\r\n {$ENDIF}\r\n {$IFNDEF LINUX}\r\n {$IFNDEF LCLLIB}\r\n ,StrUtils\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,FPHTTPClient\r\n {$ENDIF}\r\n ;\r\n{$ENDIF}\r\n\r\nconst\r\n HTMLNumSpecialChar = 64;\r\n JSONNumSpecialChar = 7;\r\n\r\nvar\r\n HTMLEncodedChar : array[1..HTMLNumSpecialChar] of unicodestring = ('&','<','>','\"',' ',\r\n 'é','è','ë','ê',\r\n 'ó','ò','ö','ô',\r\n 'í','ì','ï','î',\r\n 'ú','ù','ü','û',\r\n 'á','à','ä','â',\r\n 'É','È','Ë','Ê',\r\n 'Ó','Ò','Ö','Ô',\r\n 'Í','Ì','Ï','Î',\r\n 'Ú','Ù','Ü','Û',\r\n 'Á','À','Ä','Â',\r\n 'ç','Ç','ø','Ø',\r\n 'å','Å','©','®',\r\n '€','«','»','ã',\r\n 'Ã','õ','Õ','™',\r\n '§','¶','ß');\r\n\r\n HTMLSpecialChar : array[1..HTMLNumSpecialChar] of string = ('amp;','lt;','gt;','quot;',' ',\r\n 'é','è','ë','ê',\r\n 'ó','ò','ö','ô',\r\n 'í','ì','ï','î',\r\n 'ú','ù','ü','û',\r\n 'á','à','ä','â',\r\n 'É','È','Ë','Ê',\r\n 'Ó','Ò','Ö','Ô',\r\n 'Í','Ì','Ï','Î',\r\n 'Ú','Ù','Ü','Û',\r\n 'Á','À','Ä','Â',\r\n 'ç','Ç','ø','Ø',\r\n 'å','Å','©','®',\r\n '€','«','»','ã',\r\n 'Ã','õ','Õ',\r\n '™','§','¶','ß');\r\n\r\n JSONSpecialChar: array[1..JSONNumSpecialChar] of char = ('\"','\\',#8,#12,#10,#13,#9);\r\n\r\n JSONEncodedSpecialChar: array[1..JSONNumSpecialChar] of string = ('\\u0022','\\u005C','\\u0008','\\u000C','\\u000A','\\u000D','\\u0009');\r\n\r\n\r\nfunction Hiword(L: DWORD): Word;\r\nbegin\r\n Result := L shr 16;\r\nend;\r\n\r\nfunction LoWord(L: DWORD): Word;\r\nbegin\r\n Result := L AND $FFFF;\r\nend;\r\n\r\nfunction MakeWord(b1,b2: Integer): Integer;\r\nbegin\r\n Result := b1 or b2 shl 8;\r\nend;\r\n\r\nfunction MakeLong(i1,i2: Integer): Integer;\r\nbegin\r\n Result := i1 or i2 shl 16;\r\nend;\r\n\r\n{$IFDEF ANDROID}\r\ntype\r\n JHttpURLConnection = interface;\r\n JURLConnection = interface;\r\n JURL = interface;\r\n\r\n JURLClass = interface(JObjectClass)\r\n ['{3E1A363B-FA2A-4399-A0C7-24DFC255E133}']\r\n {class} function init(spec: JString): JURL; cdecl; overload;\r\n end;\r\n\r\n [JavaSignature('java/net/URL')]\r\n JURL = interface(JObject)\r\n ['{BCC8860A-E48B-4894-95A9-26B3AFDF3EDC}']\r\n function openConnection: JURLConnection; cdecl; overload;\r\n end;\r\n TJURL = class(TJavaGenericImport) end;\r\n\r\n JURLConnectionClass = interface(JObjectClass)\r\n ['{969FF7F8-7B73-491C-A621-855E197B0B6B}']\r\n end;\r\n\r\n [JavaSignature('java/net/URLConnection')]\r\n JURLConnection = interface(JObject)\r\n ['{F50D6528-AE5E-4862-89A1-CAE44274AED9}']\r\n function getHeaderField(key: JString): JString; cdecl; overload;\r\n end;\r\n TJURLConnection = class(TJavaGenericImport) end;\r\n\r\n JHttpURLConnectionClass = interface(JURLConnectionClass)\r\n ['{D80190E4-FBCC-4286-9E39-42F45C58E7D9}']\r\n end;\r\n [JavaSignature('java/net/HttpURLConnection')]\r\n JHttpURLConnection = interface(JURLConnection)\r\n ['{57A25834-F65A-4078-8B73-1C566DF70536}']\r\n procedure setRequestMethod(method: JString); cdecl;\r\n procedure setDoInput(newValue: Boolean); cdecl;\r\n procedure setDoOutput(newValue: Boolean); cdecl;\r\n function getOutputStream: JOutputStream; cdecl;\r\n function getInputStream: JInputStream; cdecl;\r\n function getResponseCode: Integer; cdecl;\r\n end;\r\n TJHttpURLConnection = class(TJavaGenericImport) end;\r\n\r\ntype\r\n TTMSFNCUtilsFileMode = (ufmOpen, ufmSave);\r\n\r\n TTMSFNCUtilsDialogDismissListener = class(TJavaLocal, JDialogInterface_OnDismissListener)\r\n public\r\n procedure onDismiss(dialog: JDialogInterface); cdecl;\r\n end;\r\n\r\n TTMSFNCUtilsDialogSelectDirectoryListener = class(TJavaLocal, JDialogInterface_OnClickListener)\r\n public\r\n procedure onClick(dialog: JDialogInterface; which: Integer); cdecl;\r\n end;\r\n\r\n TTMSFNCUtilsDialogSelectFileListener = class(TJavaLocal, JDialogInterface_OnClickListener)\r\n public\r\n procedure onClick(dialog: JDialogInterface; which: Integer); cdecl;\r\n end;\r\n\r\nvar\r\n FFilePicked: Boolean;\r\n FFileMode: TTMSFNCUtilsFileMode;\r\n FSelectedFile: String;\r\n FCancelled: Boolean;\r\n FManuallyCancelled: Boolean;\r\n FDialogBuilder: JAlertDialog_Builder;\r\n FDialog: JDialog;\r\n FCurrentPath: JFile;\r\n FFileList: TJavaObjectArray;\r\n FDirectoryListener: TTMSFNCUtilsDialogSelectDirectoryListener;\r\n FSelectFileListener: TTMSFNCUtilsDialogSelectFileListener;\r\n FFilter: string;\r\n FDismissListener: TTMSFNCUtilsDialogDismissListener;\r\n\r\nfunction SharedActivityEx: JActivity;\r\nbegin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 29}\r\n Result := TAndroidHelper.Activity;\r\n {$ELSE}\r\n Result := SharedActivity;\r\n {$IFEND}\r\n {$HINTS ON}\r\nend;\r\n\r\nprocedure LoadFileList(APath: JFile; AFilter: string);\r\nvar\r\n l, lf: TList;\r\n a, c: TArray;\r\n I, K: Integer;\r\n s: string;\r\n SR: TSearchRec;\r\n fn: string;\r\n chk: Boolean;\r\nbegin\r\n FCurrentPath := APath;\r\n l := TList.Create;\r\n if APath.exists then\r\n begin\r\n lf := TList.Create;\r\n\r\n a := AFilter.Split(['|']);\r\n\r\n for I := 0 to Length(a) - 1 do\r\n begin\r\n if Odd(I) then\r\n begin\r\n c := a[I].Split([';']);\r\n for K := 0 to Length(c) - 1 do\r\n begin\r\n s := c[K].Replace('*', '');\r\n if not lf.Contains(s) then\r\n lf.Add(s);\r\n end;\r\n end;\r\n end;\r\n\r\n if APath.getParentFile <> nil then\r\n l.Add('..');\r\n\r\n fn := TTMSFNCUtils.AddBackslash(JStringToString(APath.getPath)) + '*';\r\n k := FindFirst(fn, faAnyFile, SR);\r\n while K = 0 do\r\n begin\r\n chk := (sr.Name <> '.') and (sr.Name <> '..');\r\n chk := chk and (lf.Contains(ExtractFileExt(sr.Name)) or (lf.Count = 0) or ((lf.Count = 1) and (lf[0] = '.')) or (sr.Attr and 16 = 16));\r\n\r\n if chk then\r\n begin\r\n l.Add(ExtractFilePath(fn) + SR.Name);\r\n end;\r\n\r\n K := FindNext(SR);\r\n end;\r\n FindClose(SR);\r\n\r\n lf.Free;\r\n end;\r\n\r\n FFileList := TJavaObjectArray.Create(l.Count);\r\n for I := 0 to l.Count - 1 do\r\n FFileList.Items[I] := StrToJCharSequence(l[I]);\r\n\r\n l.Free;\r\nend;\r\n\r\nprocedure ShowDialog(AFile: JFile);\r\nbegin\r\n FDialogBuilder := TJAlertDialog_Builder.JavaClass.init(SharedActivityEx);\r\n FDialogBuilder.setTitle(StrToJCharSequence(JStringToString(AFile.getPath)));\r\n if FFileMode = ufmSave then\r\n FDialogBuilder.setPositiveButton(StrToJCharSequence('Save'), FDirectoryListener);\r\n FDialogBuilder.setItems(FFileList, FSelectFileListener);\r\n FDialog := FDialogBuilder.create;\r\n FDialog.setOnDismissListener(FDismissListener);\r\n FDialog.show;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF MACOS}\r\nclass function TTMSFNCUtils.NSStrEx(AString: String): NSString;\r\nbegin\r\n Result := StrToNSStr(AString);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCUtils }\r\n\r\nclass function TTMSFNCUtils.IPos(su,s:string):Integer;\r\nbegin\r\n Result := Pos(UpperCase(su),UpperCase(s));\r\nend;\r\n\r\nclass function TTMSFNCUtils.TagReplaceString(const Srch,Repl:string;var Dest:string):Boolean;\r\nvar\r\n i: Integer;\r\nbegin\r\n i := IPos(srch,dest);\r\n if i > 0 then\r\n begin\r\n Result := True;\r\n Delete(Dest,i,Length(Srch));\r\n Dest := Copy(Dest,1,i-1) + Repl + Copy(Dest,i,Length(Dest));\r\n end\r\n else\r\n Result := False;\r\nend;\r\n\r\nclass function TTMSFNCUtils.SaveFile(var AFileName: string; const AFilter: string = ''): Boolean;\r\n{$IFNDEF WEBLIB}\r\n{$IFNDEF FMXMOBILE}\r\nvar\r\n s: TSaveDialog;\r\n ext: string;\r\n{$ENDIF}\r\n{$IFDEF FMXMOBILE}\r\n{$IFDEF ANDROID}\r\nvar\r\n fn: string;\r\n f: string;\r\n{$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n {$IFDEF FMXMOBILE}\r\n {$IFDEF ANDROID}\r\n fn := ExtractFileName(AFileName);\r\n\r\n FFileMode := ufmSave;\r\n FFilePicked := False;\r\n FCancelled := False;\r\n\r\n FDirectoryListener := TTMSFNCUtilsDialogSelectDirectoryListener.Create;\r\n FSelectFileListener := TTMSFNCUtilsDialogSelectFileListener.Create;\r\n FDismissListener := TTMSFNCUtilsDialogDismissListener.Create;\r\n\r\n FFilter := AFilter;\r\n if ExtractFilePath(AFileName) = '' then\r\n f := AddBackslash(TTMSFNCUtils.GetDocumentsPath)\r\n else\r\n f := AddBackslash(ExtractFilePath(AFileName));\r\n\r\n FSelectedFile := f + fn;\r\n\r\n FCurrentPath := TJFile.JavaClass.init(StringToJString(f));\r\n LoadFileList(FCurrentPath, FFilter);\r\n CallInUIThreadAndWaitFinishing(\r\n procedure\r\n begin\r\n ShowDialog(FCurrentPath);\r\n end\r\n );\r\n\r\n while not FFilePicked and not FCancelled do\r\n Sleep(1);\r\n\r\n if FFilePicked and not FCancelled then\r\n begin\r\n AFileName := FSelectedFile;\r\n if ExtractFileExt(FSelectedFile) = '' then\r\n AFileName := AddBackslash(AFileName) + fn;\r\n\r\n Result := True;\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFNDEF FMXMOBILE}\r\n s := TSaveDialog.Create(Application);\r\n try\r\n ext := ExtractFileExt(AFileName);\r\n s.Filter := AFilter;\r\n if ExtractFilePath(AFileName) = '' then\r\n s.InitialDir := AddBackslash(TTMSFNCUtils.GetDocumentsPath)\r\n else\r\n s.InitialDir := AddBackslash(ExtractFilePath(AFileName));\r\n s.Options := s.Options + [TOpenOption.ofOverwritePrompt];\r\n s.FileName := ExtractFileName(AFileName);\r\n if s.Execute then\r\n begin\r\n AFileName := s.FileName;\r\n if ExtractFileExt(s.FileName) = '' then\r\n AFileName := AFileName + ext;\r\n Result := True;\r\n end;\r\n finally\r\n s.Free;\r\n end;\r\n {$ENDIF}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nbegin\r\n raise Exception.Create('SaveFile not supported');\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.EscapeString(const AValue: string): string;\r\nvar\r\n res: string;\r\n ch: char;\r\n i: integer;\r\n\r\n function EscapeSpecialChar(ch: char; var s: string): boolean;\r\n var\r\n i: integer;\r\n begin\r\n Result := false;\r\n s := '';\r\n\r\n for i := 1 to JSONNumSpecialChar do\r\n begin\r\n if ch = JSONSpecialChar[i] then\r\n begin\r\n s := JSONEncodedSpecialChar[i];\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n Result := '';\r\n for i := 1 to length(AValue) do\r\n begin\r\n ch := CharInStr(AValue, i);\r\n\r\n if ch > #127 then\r\n Result := Result + '\\u' + IntToHex(ord(ch),4)\r\n else\r\n begin\r\n res := '';\r\n if EscapeSpecialChar(ch, res) then\r\n Result := Result + res\r\n else\r\n Result := Result + ch\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.UnescapeString(const AValue: string): string;\r\nvar\r\n i: Integer;\r\n j: Integer;\r\n c: Integer;\r\n o: Integer;\r\n s: string;\r\n x: Integer;\r\nbegin\r\n SetLength(s, Length(AValue));\r\n {$IFDEF FMXMOBILE}\r\n o := 1;\r\n {$ENDIF}\r\n {$IFNDEF FMXMOBILE}\r\n o := 0;\r\n {$ENDIF}\r\n i := 1;\r\n j := 1;\r\n while i <= Length(AValue) do\r\n begin\r\n if AValue[i - o] = '\\' then\r\n begin\r\n if i < Length(AValue) then\r\n begin\r\n if AValue[i + 1 - o] = '\\' then\r\n begin\r\n x := j - o;\r\n s[x] := '\\';\r\n inc(i, 2);\r\n end\r\n else if (AValue[i + 1 - o] = 'u') and (i + 1 + 4 <= Length(AValue)) and TryStrToInt('$' + string(Copy(AValue, i + 2, 4)), c) then\r\n begin\r\n inc(i, 6);\r\n x := j - o;\r\n {$IFDEF WEBLIB}\r\n s[x] := Chr(c);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n s[x] := Char(c);\r\n {$ENDIF}\r\n end\r\n else\r\n raise Exception.CreateFmt('Invalid code at position %s', [IntToStr(i)]);\r\n end\r\n else\r\n raise Exception.Create('Unexpected end of string');\r\n end\r\n else\r\n begin\r\n x := j - o;\r\n s[x] := AValue[i - o];\r\n inc(i);\r\n end;\r\n inc(j);\r\n end;\r\n SetLength(s, j - 1);\r\n\r\n Result := s;\r\nend;\r\n\r\nclass function TTMSFNCUtils.SelectFile(var AFileName: string; const ADefaultFolder: string = ''; const AFilter: string = ''): Boolean;\r\n{$IFNDEF WEBLIB}\r\n{$IFNDEF FMXMOBILE}\r\nvar\r\n o: TOpenDialog;\r\n{$ENDIF}\r\n{$IFDEF FMXMOBILE}\r\n{$IFDEF ANDROID}\r\nvar\r\n f: string;\r\n{$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n {$IFDEF FMXMOBILE}\r\n {$IFDEF ANDROID}\r\n FFileMode := ufmOpen;\r\n FFilePicked := False;\r\n FCancelled := False;\r\n\r\n FSelectFileListener := TTMSFNCUtilsDialogSelectFileListener.Create;\r\n FDismissListener := TTMSFNCUtilsDialogDismissListener.Create;\r\n\r\n FFilter := AFilter;\r\n if ADefaultFolder = '' then\r\n f := AddBackslash(TTMSFNCUtils.GetDocumentsPath)\r\n else\r\n f := AddBackslash(ADefaultFolder);\r\n\r\n FCurrentPath := TJFile.JavaClass.init(StringToJString(f));\r\n LoadFileList(FCurrentPath, FFilter);\r\n CallInUIThreadAndWaitFinishing(\r\n procedure\r\n begin\r\n ShowDialog(FCurrentPath);\r\n end\r\n );\r\n\r\n while not FFilePicked and not FCancelled do\r\n Sleep(1);\r\n\r\n if FFilePicked and not FCancelled then\r\n begin\r\n AFileName := FSelectedFile;\r\n Result := True;\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFNDEF FMXMOBILE}\r\n o := TOpenDialog.Create(Application);\r\n try\r\n o.Options := [TOpenOption.ofFileMustExist];\r\n if ADefaultFolder = '' then\r\n o.InitialDir := AddBackslash(TTMSFNCUtils.GetDocumentsPath)\r\n else\r\n o.InitialDir := AddBackslash(ADefaultFolder);\r\n o.Filter := AFilter;\r\n if o.Execute then\r\n begin\r\n AFileName := o.FileName;\r\n Result := False;\r\n end;\r\n finally\r\n o.Free;\r\n end;\r\n {$ENDIF}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nbegin\r\n raise Exception.Create('SelectFile not supported');\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.&Message(const AMessage: string): Integer;\r\nbegin\r\n Result := TTMSFNCUtils.&Message(AMessage, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOK], 0);\r\nend;\r\n\r\nclass function TTMSFNCUtils.&Message(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons; const AHelpContext: LongInt): Integer;\r\nbegin\r\n{$IFNDEF WEBLIB}\r\n {$IFDEF FMXMOBILE}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 30}\r\n TDialogServiceAsync.MessageDialog(AMessage, ADialogType, AButtons, TMsgDlgBtn.mbYes, AHelpContext);\r\n Result := mrOk;\r\n {$ELSE}\r\n Result := mrOk;\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ELSE}\r\n {$IFDEF LCLLIB}\r\n Result := MessageDlg(AMessage, ADialogType, AButtons, AHelpContext);\r\n {$ELSE}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 30}\r\n {$IFDEF FMXLIB}\r\n Result := TDialogServiceSync.MessageDialog(AMessage, ADialogType, AButtons, TMsgDlgBtn.mbYes, AHelpContext);\r\n {$ELSE}\r\n Result := MessageDlg(AMessage, ADialogType, AButtons, AHelpContext);\r\n {$ENDIF}\r\n {$ELSE}\r\n Result := MessageDlg(AMessage, ADialogType, AButtons, AHelpContext);\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$ENDIF}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n if ((TMsgDlgBtn.mbOK in AButtons) and (TMsgDlgBtn.mbCancel in AButtons)) or ((TMsgDlgBtn.mbYes in AButtons) and (TMsgDlgBtn.mbNo in AButtons)) then\r\n begin\r\n asm\r\n if (window.confirm(AMessage))\r\n {\r\n return 1\r\n }\r\n else\r\n {\r\n return 2\r\n }\r\n end;\r\n end\r\n else\r\n begin\r\n asm\r\n window.alert(AMessage);\r\n return 1\r\n end;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.NumericCharSet: TTMSFNCUtilsCharSet;\r\nvar\r\n ch: char;\r\n i: integer;\r\nbegin\r\n SetLength(Result,10);\r\n i := 0;\r\n\r\n for ch := '0' to '9' do\r\n begin\r\n Result[i] := ch;\r\n inc(i);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.CreateCharSet(AValue: string): TTMSFNCUtilsCharSet;\r\nvar\r\n i: integer;\r\nbegin\r\n SetLength(Result, Length(AValue));\r\n\r\n for i := 1 to Length(AValue) do\r\n begin\r\n Result[i - 1] := CharInStr(AValue, i);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.DownloadImage(AURL: string): TMemoryStream;\r\n{$IFDEF LCLLIB}\r\nbegin\r\n try\r\n Result := TMemoryStream.Create;\r\n TFPHTTPClient.SimpleGet(AURL, Result);\r\n finally\r\n end;\r\n{$ENDIF}\r\n{$IFNDEF LCLLIB}\r\n{$IFDEF MACOS}\r\nvar\r\n req: NSMutableURLRequest;\r\n nurl: NSURL;\r\n res: Pointer;\r\n resdata: NSData;\r\nbegin\r\n Result := TMemoryStream.Create;\r\n try\r\n nurl := TNSURL.Wrap(TNSURL.OCClass.URLWithString(TTMSFNCUtils.NSStrEx(AURL)));\r\n req := TNSMutableURLRequest.Wrap(TNSMutableURLRequest.OCClass.requestWithURL(nurl, NSURLRequestUseProtocolCachePolicy, 60.0));\r\n req.setHTTPMethod(TTMSFNCUtils.NSStrEx('GET'));\r\n\r\n res := nil;\r\n resdata := TNSURLConnection.OCClass.sendSynchronousRequest(req, @res, nil);\r\n if Assigned(resdata) and Assigned(res) then\r\n begin\r\n if not UTF8ToString(TNSString.Wrap(TNSHTTPURLResponse.Wrap(res).allHeaderFields.valueForKey(TTMSFNCUtils.NSStrEx('Content-Type'))).UTF8String).StartsWith('image/') then\r\n Exit;\r\n\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Result.Write(resdata.bytes^, resdata.length);\r\n {$ELSE}\r\n Result.Write(resdata.bytes, resdata.length);\r\n {$IFEND}\r\n {$HINTS ON}\r\n end;\r\n finally\r\n end;\r\n{$ELSE}\r\n{$IFDEF ANDROID}\r\n var\r\n urlCon: JHttpURLConnection;\r\n u: JURL;\r\n r: Integer;\r\n data: TJavaArray;\r\n bs: JByteArrayOutputStream;\r\n ip: JInputStream;\r\n begin\r\n Result := TMemoryStream.Create;\r\n try\r\n u := TJURL.JavaClass.init(StringToJString(AURL));\r\n urlCon := TJHttpURLConnection.Wrap((u.openConnection as ILocalObject).GetObjectID);\r\n urlCon.setDoInput(True);\r\n urlCon.setDoOutput(False);\r\n urlCon.setRequestMethod(StringToJString('GET'));\r\n\r\n if not urlCon.getHeaderField(StringToJString('Content-Type')).startsWith(StringToJString('image/')) then\r\n Exit;\r\n\r\n if (urlCon.getResponseCode in [200, 201]) then\r\n begin\r\n bs := TJByteArrayOutputStream.JavaClass.init;\r\n ip := urlCon.getInputStream;\r\n r := ip.read();\r\n while r <> -1 do\r\n begin\r\n bs.write(r);\r\n r := ip.read();\r\n end;\r\n\r\n data := bs.toByteArray;\r\n Result := TMemoryStream.Create;\r\n Result.WriteBuffer(data.Data^, bs.size);\r\n bs.close;\r\n end;\r\n finally\r\n end;\r\n{$ELSE}\r\n{$IFDEF LINUX}\r\nbegin\r\n DoProgress;\r\n{$ELSE}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n UrlHandle: HINTERNET;\r\n Buffer: array[0..1024] of AnsiChar;\r\n BytesRead: DWORD;\r\n lpdwlen,lpdwidx,lpdword: DWORD;\r\n cbuf: array[0..255] of char;\r\n p: Pointer;\r\nbegin\r\n Result := TMemoryStream.Create;\r\n\r\n p := InternetOpen('TTMSFNCUtils', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);\r\n\r\n if Assigned(p) then\r\n begin\r\n UrlHandle := InternetOpenUrl(p, PChar(AURL), nil, 0, INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_RELOAD, 0);\r\n\r\n if Assigned(UrlHandle) then\r\n begin\r\n lpdwlen := SizeOf(cbuf);\r\n lpdwidx := 0;\r\n HttpQueryInfo(UrlHandle, HTTP_QUERY_CONTENT_TYPE,@cbuf,lpdwlen,lpdwidx);\r\n\r\n if Pos('IMAGE',UpperCase(StrPas(cbuf))) = 0 then\r\n begin\r\n InternetCloseHandle(UrlHandle);\r\n Exit;\r\n end;\r\n\r\n lpdword := 0;\r\n lpdwlen := 4;\r\n lpdwidx := 0;\r\n\r\n HttpQueryInfo(URLHandle,HTTP_QUERY_CONTENT_LENGTH,@lpdword,lpdwlen,lpdwidx);\r\n\r\n try\r\n FillChar(Buffer, SizeOf(Buffer), 0);\r\n repeat\r\n FillChar(Buffer, SizeOf(Buffer), 0);\r\n InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);\r\n Result.Write(buffer, bytesread);\r\n until BytesRead = 0;\r\n finally\r\n end;\r\n InternetCloseHandle(UrlHandle);\r\n end\r\n else\r\n raise Exception.CreateFmt('Cannot open URL %s', [AUrl]);\r\n end\r\n else\r\n raise Exception.Create('Unable to initialize Wininet');\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nbegin\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.IndexOfTextInArray(const AText: string; const AValues: array of string): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n for I := Low(AValues) to High(AValues) do\r\n if SameText(AText, AValues[I]) then\r\n begin\r\n if (pos('cute', AText) > 0) or (pos('grave', AText) > 0) or (pos('uml', AText) > 0) or (pos('circ', AText) > 0) or (pos('tilde', AText) > 0) then\r\n begin\r\n if (AText = AValues[I]) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end\r\n else\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetMarkupIndex(const Markup: string): integer;\r\nbegin\r\n Result := IndexOfTextInArray(Markup, HTMLSpecialChar);\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetSpecialChar(const Value: integer): UnicodeString;\r\nbegin\r\n Result := HTMLEncodedChar[Value];\r\nend;\r\n\r\nclass function TTMSFNCUtils.UnFixMarkup(su:string;SpecialChars: boolean = true):string;\r\nvar\r\n i: integer;\r\nbegin\r\n while Pos('<',su) > 0 do\r\n begin\r\n TagReplacestring('<','<',su);\r\n end;\r\n\r\n while Pos('>',su) > 0 do\r\n begin\r\n TagReplacestring('>','>',su);\r\n end;\r\n\r\n while Pos('&',su) > 0 do\r\n begin\r\n TagReplacestring('&','&',su);\r\n end;\r\n\r\n while Pos('"',su) > 0 do\r\n begin\r\n TagReplacestring('"','\"',su);\r\n end;\r\n\r\n if SpecialChars then\r\n begin\r\n for i := 4 to HTMLNumSpecialChar do\r\n begin\r\n while Pos(string(HTMLSpecialChar[i]),su) > 0 do\r\n begin\r\n TagReplacestring(string(HTMLSpecialChar[i]),string(HTMLEncodedChar[i]),su);\r\n end;\r\n end;\r\n end;\r\n\r\n Result := su;\r\nend;\r\n\r\nclass function TTMSFNCUtils.FixMarkup(su:string;SpecialChars: boolean = true): string;\r\nvar\r\n i: integer;\r\nbegin\r\n while Pos('&',su) > 0 do\r\n begin\r\n TagReplacestring('&','*amp;',su);\r\n end;\r\n\r\n while Pos('*amp;',su) > 0 do\r\n begin\r\n TagReplacestring('*amp;','&',su);\r\n end;\r\n\r\n while Pos('\"',su) > 0 do\r\n begin\r\n TagReplacestring('\"','"',su);\r\n end;\r\n\r\n while Pos('<',su) > 0 do\r\n begin\r\n TagReplacestring('<','<',su);\r\n end;\r\n\r\n while Pos('>',su) > 0 do\r\n begin\r\n TagReplacestring('>','>',su);\r\n end;\r\n\r\n if SpecialChars then\r\n begin\r\n for i := 4 to HTMLNumSpecialChar do\r\n begin\r\n while Pos(string(HTMLEncodedChar[i]),su) > 0 do\r\n begin\r\n TagReplacestring(string(HTMLEncodedChar[i]),string(HTMLSpecialChar[i]),su);\r\n end;\r\n end;\r\n end;\r\n\r\n Result := su;\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetOwnerForm(AComponent: TComponent): TCustomForm;\r\nvar\r\n c: TComponent;\r\nbegin\r\n Result := nil;\r\n c := AComponent;\r\n if not Assigned(c) then\r\n Exit;\r\n\r\n if c.Owner is TCustomForm then\r\n Result := c.Owner as TCustomForm\r\n else\r\n Result := GetOwnerForm(c.Owner);\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nclass function TTMSFNCUtils.GetParentForm(AControl: TFMXObject): TCustomForm;\r\nvar\r\n c: TFMXObject;\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\nclass function TTMSFNCUtils.GetParentForm(AControl: TControl): TCustomForm;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nclass function TTMSFNCUtils.GetParentForm(AControl: TControl): TCustomForm;\r\nvar\r\n c: TControl;\r\n{$ENDIF}\r\nbegin\r\n{$IFDEF FMXLIB}\r\n Result := nil;\r\n c := AControl;\r\n if not Assigned(c) then\r\n Exit;\r\n\r\n if c.Parent is TCustomForm then\r\n Result := c.Parent as TCustomForm\r\n else\r\n Result := GetParentForm(c.Parent);\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n Result := Forms.GetParentForm(AControl);\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n Result := nil;\r\n c := AControl;\r\n if not Assigned(c) then\r\n Exit;\r\n\r\n if c.Parent is TCustomForm then\r\n Result := c.Parent as TCustomForm\r\n else\r\n Result := GetParentForm(c.Parent);\r\n{$ENDIF}\r\nend;\r\n\r\n{$IFDEF VCLLIB}\r\nfunction CalculateDPIScale(Scaled: boolean; AHDC: HDC): single; overload;\r\nvar\r\n FDPI: integer;\r\nbegin\r\n Result:= 1.0;\r\n if Scaled then\r\n begin\r\n if AHDC = 0 then\r\n AHDC:= GetDC(0);\r\n try\r\n FDPI := GetDeviceCaps(AHDC, LOGPIXELSX);\r\n if FDPI <> 96 then\r\n Result:= FDPI / 96;\r\n finally\r\n if AHDC = 0 then\r\n ReleaseDC(0, AHDC);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction CalculateDPIScale(AForm: TCustomForm; AHDC: HDC): single; overload;\r\nbegin\r\n Result := 1.0;\r\n if Assigned(AForm) and (AForm is TForm) then\r\n Result := CalculateDPIScale((AForm as TForm).Scaled, AHDC);\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TTMSFNCUtils.CharInStr(s: string; Index: Integer): Char;\r\nbegin\r\n Result := #0;\r\n if (Index > 0) and (Index <= Length(s)) then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n dec(Index);\r\n {$ENDIF}\r\n Result := s[Index]\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.Clone(AComponent: TComponent): TComponent;\r\n{$IFDEF WEBLIB}\r\nbegin\r\n raise Exception.Create('Implement Clone');\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n S: TStream;\r\n SaveName: string;\r\n Reader: TReader;\r\nbegin\r\n S := TMemoryStream.Create;\r\n try\r\n { store }\r\n SaveName := AComponent.Name;\r\n AComponent.Name := '';\r\n S.WriteComponent(AComponent);\r\n AComponent.Name := SaveName;\r\n S.Position := 0;\r\n { load }\r\n try\r\n Reader := TReader.Create(S, 4096);\r\n try\r\n Result := Reader.ReadRootComponent(nil);\r\n finally\r\n Reader.Free;\r\n end;\r\n finally\r\n end;\r\n finally\r\n S.Free;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetAppPath: String;\r\nbegin\r\n {$IFDEF WEBLIB}\r\n Result := 'file://'\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Result := ExtractFilePath(ParamStr(0));\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetDocumentsPath: string;\r\n{$IFDEF VCLLIB}\r\nvar\r\n szBuffer: array [0..MAX_PATH] of Char;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := TPath.GetDocumentsPath;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Result := GetUserDir + PathDelim + 'Documents';\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n OleCheck(SHGetFolderPath(0, $0005, 0, 0, szBuffer));\r\n Result := szBuffer;\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetMousePos: TPointF;\r\n{$IFDEF FMXLIB}\r\nvar\r\n m: IFMXMouseService;\r\n{$ENDIF}\r\nbegin\r\n Result := PointF(-1, -1);\r\n {$IFDEF FMXLIB}\r\n if TPlatformServices.Current.SupportsPlatformService(IFMXMouseService, IInterface(m)) then\r\n Result := m.GetMousePos;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n Result := PointF(Mouse.CursorPos.X, Mouse.CursorPos.Y);\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.AddBackslash(const AValue: string): string;\r\nbegin\r\n {$IFDEF FMXMOBILE}\r\n if (Length(AValue) >= 1) and (AValue[Length(AValue) - 1] <> PthDel) then\r\n {$ELSE}\r\n if (Length(AValue) >= 1) and (AValue[Length(AValue)] <> PthDel) then\r\n {$ENDIF}\r\n Result := AValue + PthDel\r\n else\r\n Result := AValue;\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetDPIScale(AOwner: TComponent = nil): Single;\r\n{$IFDEF FMXLIB}\r\nvar\r\n ScreenSvc: IFMXScreenService;\r\n{$ENDIF}\r\n{$IFDEF VCLLIB}\r\nvar\r\n frm: TCustomform;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := 1.0;\r\n if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenSvc)) then\r\n Result := ScreenSvc.GetScreenScale;\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n Result := 1.0;\r\n if Assigned(Application.MainForm) and Assigned(Application.MainForm.Canvas) then\r\n Result := CalculateDPIScale(Application.MainForm, Application.MainForm.Canvas.Handle)\r\n else if Assigned(AOwner) then\r\n begin\r\n frm := GetOwnerForm(AOwner);\r\n if Assigned(frm) and Assigned(frm.Canvas) then\r\n Result := CalculateDPIScale(frm, frm.Canvas.Handle);\r\n end;\r\n\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n Result := Screen.PixelsPerInch / 96;\r\n {$ENDIF}\r\n {$IFDEF DARWIN}\r\n Result := Screen.PixelsPerInch / 72;\r\n {$ENDIF}\r\n {$IFDEF LINUX}\r\n Result := Screen.PixelsPerInch / 96;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Result := 1.0;\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.IsHighDPIScale: Boolean;\r\nbegin\r\n Result := GetDPIScale > 1;\r\nend;\r\n\r\nclass function TTMSFNCUtils.IsHTMLUnicode(AValue: UnicodeString): Boolean;\r\nbegin\r\n {$IFDEF LCLLIB}\r\n Result := IsHTML(UTF8Encode(AValue));\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n Result := IsHTML(AValue);\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.IsHTML(AValue: string): Boolean;\r\nbegin\r\n Result := (Pos(' 0) or (Pos('/>', AValue) > 0) or (Pos('
', UpperCase(AValue)) > 0);\r\nend;\r\n\r\nclass procedure TTMSFNCUtils.OpenFile(AFile: string; AControlReference: TControl = nil);\r\n{$IFDEF ANDROID}\r\nvar\r\n i: JIntent;\r\n t: string;\r\n ext: string;\r\n{$ENDIF}\r\n{$IFDEF IOS}\r\nvar\r\n docController: UIDocumentInteractionController;\r\n url: NSURL;\r\n r: NSRect;\r\n vw: UIView;\r\n frm: TCommonCustomForm;\r\n pt: TPointF;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n {$IFDEF LINUX}\r\n FmuxOpenFile(PChar(AFile));\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n frm := Application.MainForm;\r\n if Assigned(frm) then\r\n begin\r\n url := TNSURL.Wrap(TNSURL.OCClass.fileURLWithPath(NSStrEx(AFile)));\r\n docController := TUIDocumentInteractionController.Wrap(TUIDocumentInteractionController.OCClass.interactionControllerWithURL(url));\r\n docController.retain;\r\n vw := WindowHandleToPlatform(frm.Handle).View;\r\n if Assigned(AControlReference) then\r\n begin\r\n pt := AControlReference.LocalToAbsolute(AControlReference.Position.Point);\r\n r.origin.x := pt.X;\r\n r.origin.Y := pt.Y;\r\n r.size.Width := AControlReference.Width;\r\n r.size.Height := AControlReference.Height;\r\n end\r\n else\r\n r := vw.frame;\r\n\r\n docController.presentOpenInMenuFromRect(r, vw, TRUE);\r\n end;\r\n {$ELSE}\r\n TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace).openFile(NSStrEx(AFile));\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF ANDROID}\r\n i := TJIntent.Create;\r\n i.setAction(TJIntent.JavaClass.ACTION_VIEW);\r\n if not AFile.ToLower.StartsWith('file://') then\r\n AFile := 'file://' + AFile;\r\n\r\n ext := ExtractFileExt(AFile).ToLower;\r\n if ext = '.pdf' then\r\n t := 'application/pdf'\r\n else if ext = '.html' then\r\n t := 'text/html'\r\n else if (ext = '.jpeg') or (ext = '.jpg') then\r\n t := 'image/jpeg'\r\n else if (ext = '.gif') then\r\n t := 'image/gif'\r\n else if (ext = '.png') then\r\n t := 'image/png'\r\n else if (ext = '.bmp') then\r\n t := 'image/bmp'\r\n else\r\n t := 'text/plain';\r\n\r\n i.setDataAndType(StrToJURI(AFile), StringToJString(t));\r\n SharedActivityEx.startActivity(i);\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFNDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n ShellExecute(0,PChar('open'),PChar(AFile),PChar(''),PChar(''), SW_NORMAL);\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF LCLLIB}\r\n OpenDocument(AFile);\r\n {$ENDIF}\r\nend;\r\n\r\nclass procedure TTMSFNCUtils.OpenURL(AURL: string);\r\n{$IFDEF ANDROID}\r\nvar\r\n i: JIntent;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n {$IFDEF LINUX}\r\n FmuxOpenUrl(PChar(AURL));\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n TUIApplication.Wrap(TUIApplication.OCClass.sharedApplication).openURL(TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSStrEx(AUrl))));\r\n {$ELSE}\r\n TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace).openURL(TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSStrEx(AUrl))));\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF ANDROID}\r\n i := TJIntent.Create;\r\n i.setAction(TJIntent.JavaClass.ACTION_VIEW);\r\n i.setData(StrToJURI(AURL));\r\n SharedActivityEx.startActivity(i);\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF LCLLIB}\r\n LCLIntF.OpenURL(AURL);\r\n {$ENDIF}\r\n\r\n {$IFNDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n ShellExecute(0,PChar('open'),PChar(AURL),PChar(''),PChar(''), SW_NORMAL);\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n asm\r\n window.open(AURL, '_blank');\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetHInstance: NativeUInt;\r\nbegin\r\n Result := HInstance;\r\nend;\r\n\r\n{$IFDEF WEBLIB}\r\nclass procedure TTMSFNCUtils.GetFonts(FontList: TStringList);\r\nbegin\r\n FontList.BeginUpdate;\r\n FontList.Add('Arial');\r\n FontList.Add('Helvetica');\r\n FontList.Add('Times New Roman');\r\n FontList.Add('Times');\r\n FontList.Add('Courier New');\r\n FontList.Add('Courier');\r\n FontList.Add('Verdana');\r\n FontList.Add('Georgia');\r\n FontList.Add('Palatino');\r\n FontList.Add('Garamond');\r\n FontList.Add('Bookman');\r\n FontList.Add('Comic Sans MS');\r\n FontList.Add('Trebuchet MS');\r\n FontList.Add('Arial Black');\r\n FontList.Add('Impact');\r\n FontList.Sort;\r\n FontList.EndUpdate;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF LCLLIB}\r\n{$IFDEF MSWINDOWS}\r\nfunction EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;\r\n FontType: Integer; Data: Pointer): Integer; stdcall;\r\nvar\r\n S: TStrings;\r\n Temp: string;\r\nbegin\r\n S := TStrings(Data);\r\n Temp := LogFont.lfFaceName;\r\n if (S.Count = 0) or (AnsiCompareText(S[S.Count-1], Temp) <> 0) then\r\n S.Add(Temp);\r\n Result := 1;\r\nend;\r\n\r\nclass procedure TTMSFNCUtils.GetFonts(FontList: TStringList);\r\nvar\r\n DC: HDC;\r\n LFont: TLogFont;\r\nbegin\r\n FontList.BeginUpdate;\r\n FontList.Clear;\r\n DC := GetDC(0);\r\n FillChar(LFont, sizeof(LFont), 0);\r\n LFont.lfCharset := DEFAULT_CHARSET;\r\n EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, LPARAM(FontList), 0);\r\n ReleaseDC(0, DC);\r\n FontList.Sort;\r\n FontList.EndUpdate;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF LINUX}\r\nclass procedure TTMSFNCUtils.GetFonts(FontList: TStringList);\r\nvar\r\n I: Integer;\r\nbegin\r\n FontList.BeginUpdate;\r\n FontList.Clear;\r\n for I := 0 to FmuxGetFontCount - 1 do\r\n FontList.Add(FmuxGetFontName(I));\r\n FontList.Sort;\r\n FontList.EndUpdate;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF MACOS}\r\nclass procedure TTMSFNCUtils.GetFonts(FontList: TStringList);\r\n{$IFDEF IOS}\r\nvar\r\n arr: NSArray;\r\n I: Integer;\r\n lItem: NSString;\r\nbegin\r\n FontList.BeginUpdate;\r\n FontList.Clear;\r\n arr := TUIFont.OCClass.familyNames;\r\n arr := arr.sortedArrayUsingSelector(sel_getUid('localizedCaseInsensitiveCompare:'));\r\n\r\n for I := 0 to arr.count - 1 do\r\n begin\r\n lItem := TNSString.Wrap(arr.objectAtIndex(i));\r\n FontList.Add(String(lItem.UTF8String));\r\n end;\r\n FontList.Sort;\r\n FontList.EndUpdate;\r\nend;\r\n{$ELSE}\r\nvar\r\n fManager: NsFontManager;\r\n list: NSArray;\r\n lItem: NSString;\r\n i: Integer;\r\nbegin\r\n FontList.BeginUpdate;\r\n FontList.Clear;\r\n fManager := TNsFontManager.Wrap(TNsFontManager.OCClass.sharedFontManager);\r\n list := fManager.availableFontFamilies;\r\n if (List <> nil) and (List.count > 0) then\r\n begin\r\n for i := 0 to List.Count-1 do\r\n begin\r\n lItem := TNSString.Wrap(List.objectAtIndex(i));\r\n FontList.Add(String(lItem.UTF8String));\r\n end;\r\n end;\r\n FontList.Sort;\r\n FontList.EndUpdate;\r\nend;\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\n{$IFDEF ANDROID}\r\nclass procedure TTMSFNCUtils.GetFonts(FontList: TStringList);\r\nbegin\r\n FontList.BeginUpdate;\r\n FontList.Clear;\r\n FontList.Add('Roboto');\r\n FontList.Add('Droid Sans');\r\n FontList.Add('Droid Serif');\r\n FontList.Add('Droid Sans Mono');\r\n FontList.Sort;\r\n FontList.EndUpdate;\r\nend;\r\n{$ENDIF}\r\n{$ELSE}\r\nclass procedure TTMSFNCUtils.GetFonts(FontList: TStringList);\r\nbegin\r\n FontList.Assign(Screen.Fonts);\r\nend;\r\n{$ENDIF}\r\n\r\nclass procedure TTMSFNCUtils.SetFontSize(AFont: TFont; ASize: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n AFont.Size := ASize;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n AFont.Size := Round(ASize / 96 * 72);\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n AFont.Size := Round(ASize / 96 * 72);\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF CMNLIB}\r\nclass function TTMSFNCUtils.FindGraphicClass(const Buffer; const BufferSize: Int64;\r\n out GraphicClass: TGraphicClass): Boolean;\r\nvar\r\n {$IFDEF VCLLIB}\r\n LongWords: array[Byte] of LongWord absolute Buffer;\r\n {$ENDIF}\r\n Words: array[Byte] of Word absolute Buffer;\r\nbegin\r\n GraphicClass := nil;\r\n\r\n if BufferSize = 0 then\r\n begin\r\n Result := False;\r\n Exit;\r\n end;\r\n\r\n {$IFDEF VCLLIB}\r\n case Words[0] of\r\n $4D42: GraphicClass := TBitmap;\r\n $D8FF: GraphicClass := TJPEGImage;\r\n $4949: if Words[1] = $002A then GraphicClass := TWicImage; //i.e., TIFF\r\n $4D4D: if Words[1] = $2A00 then GraphicClass := TWicImage; //i.e., TIFF\r\n else\r\n if Int64(Buffer) = $A1A0A0D474E5089 then\r\n GraphicClass := TPNGImage\r\n else if LongWords[0] = $9AC6CDD7 then\r\n GraphicClass := TMetafile\r\n else if (LongWords[0] = 1) and (LongWords[10] = $464D4520) then\r\n GraphicClass := TMetafile\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n else if AnsiStrings.StrLComp(PAnsiChar(@Buffer), 'GIF', 3) = 0 then\r\n {$ELSE}\r\n else if StrLComp(PAnsiChar(@Buffer), 'GIF', 3) = 0 then\r\n {$IFEND}\r\n GraphicClass := TGIFImage\r\n {$HINTS ON}\r\n else if Words[1] = 1 then\r\n GraphicClass := TIcon;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n case Words[0] of\r\n $4D42: GraphicClass := GetGraphicClassForFileExtension('bmp');\r\n $D8FF: GraphicClass := GetGraphicClassForFileExtension('jpeg');\r\n $4949: if Words[1] = $002A then GraphicClass := GetGraphicClassForFileExtension('tiff');\r\n $4D4D: if Words[1] = $2A00 then GraphicClass := GetGraphicClassForFileExtension('tiff');\r\n else\r\n if Int64(Buffer) = $A1A0A0D474E5089 then\r\n GraphicClass := GetGraphicClassForFileExtension('png')\r\n else if StrLComp(PAnsiChar(@Buffer), 'GIF', 3) = 0 then\r\n GraphicClass := GetGraphicClassForFileExtension('gif')\r\n else if Words[1] = 1 then\r\n GraphicClass := GetGraphicClassForFileExtension('ico');\r\n end;\r\n {$ENDIF}\r\n Result := (GraphicClass <> nil);\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TTMSFNCUtils.SaveStreamToHexStr(const AStream: TStream): string;\r\n{$IFDEF WEBLIB}\r\nbegin\r\n raise Exception.Create('Implement SaveStreamToHexStr');\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n s: string;\r\n K: Integer;\r\n bt: Byte;\r\nbegin\r\n s := '';\r\n AStream.Position := 0;\r\n for K := 1 to AStream.Size do\r\n begin\r\n bt := 0;\r\n AStream.Read(bt, 1);\r\n s := s + IntToHex(bt, 2);\r\n end;\r\n Result := s;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.SaveBitmapToHexStr(const ABitmap: TTMSFNCBitmap): string;\r\n{$IFDEF WEBLIB}\r\nbegin\r\n raise Exception.Create('Implement SaveBitmapToHexStr');\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n ms: TMemoryStream;\r\n s: string;\r\nbegin\r\n ms := TMemoryStream.Create;\r\n try\r\n s := '';\r\n {$IFDEF CMNLIB}\r\n if Assigned(ABitmap.Graphic) and not ABitmap.Graphic.Empty then\r\n begin\r\n ABitmap.Graphic.SaveToStream(ms);\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n if not ABitmap.IsEmpty then\r\n begin\r\n ABitmap.SaveToStream(ms);\r\n {$ENDIF}\r\n s := SaveStreamToHexStr(ms);\r\n end;\r\n Result := s;\r\n finally\r\n ms.Free;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.MulDivSingle(nNumber, nNumerator, nDenominator: Single): Single;\r\nbegin\r\n Result := MulDivInt(Round(nNumber), Round(nNumerator), Round(nDenominator));\r\nend;\r\n\r\nclass function TTMSFNCUtils.MulDivInt(nNumber, nNumerator, nDenominator: Integer): Integer;\r\n function MathRound(AValue: Extended): Int64;\r\n begin\r\n if AValue >= 0 then\r\n Result := Trunc(AValue + 0.5)\r\n else\r\n Result := Trunc(AValue - 0.5);\r\n end;\r\nbegin\r\n if nDenominator = 0 then\r\n Result := -1\r\n else\r\n Result := MathRound(Int64(nNumber) * Int64(nNumerator) / nDenominator);\r\nend;\r\n\r\nclass function TTMSFNCUtils.CreateBitmapFromHexStr(const AHexStr: string): TTMSFNCBitmap;\r\nbegin\r\n Result := TTMSFNCBitmap.Create;\r\n LoadBitmapFromHexStr(AHexStr, Result);\r\nend;\r\n\r\nclass procedure TTMSFNCUtils.LoadBitmapFromHexStr(const AHexStr: string; const ABitmap: TTMSFNCBitmap);\r\n{$IFDEF WEBLIB}\r\nbegin\r\n raise Exception.Create('Implement LoadBitmapFromHexStr');\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n sst: TStringStream;\r\n bst: TBytesStream;\r\n M: Integer;\r\n bt: TBytes;\r\n {$IFDEF VCLLIB}\r\n p: TGraphic;\r\n gcc: TGraphicClass;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n I: Integer;\r\n {$ENDIF}\r\nbegin\r\n sst := TStringStream.Create(AHexStr);\r\n bst := TBytesStream.Create;\r\n try\r\n for M := 1 to sst.Size div 2 do\r\n begin\r\n bt := HexStrToBytes(sst.ReadString(2));\r\n {$IFDEF LCLLIB}\r\n for I := 0 to Length(bt) - 1 do\r\n bst.WriteByte(bt[I]);\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n bst.Write(bt, Length(bt));\r\n {$ENDIF}\r\n end;\r\n\r\n bst.Position := 0;\r\n {$IFDEF VCLLIB}\r\n if TTMSFNCUtils.FindGraphicClass(bst.Memory^, bst.Size, gcc) then\r\n begin\r\n p := gcc.Create;\r\n try\r\n bst.Position := 0;\r\n p.LoadFromStream(bst);\r\n ABitmap.Assign(p)\r\n {$ENDIF}\r\n\r\n {$IFNDEF VCLLIB}\r\n ABitmap.LoadFromStream(bst);\r\n {$ENDIF}\r\n\r\n {$IFDEF VCLLIB}\r\n finally\r\n p.Free;\r\n end;\r\n end;\r\n {$ENDIF}\r\n\r\n finally\r\n sst.Free;\r\n bst.Free;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass procedure TTMSFNCUtils.LoadStreamFromHexStr(const AHexStr: string;\r\n const AStream: TStream);\r\n{$IFDEF WEBLIB}\r\nbegin\r\n raise Exception.Create('Implement LoadStreamFromHexStr');\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n sst: TStringStream;\r\n bst: TBytesStream;\r\n M: Integer;\r\n bt: TBytes;\r\n {$IFDEF LCLLIB}\r\n I: Integer;\r\n {$ENDIF}\r\nbegin\r\n sst := TStringStream.Create(AHexStr);\r\n bst := TBytesStream.Create;\r\n try\r\n for M := 1 to sst.Size div 2 do\r\n begin\r\n bt := HexStrToBytes(sst.ReadString(2));\r\n {$IFDEF LCLLIB}\r\n for I := 0 to Length(bt) - 1 do\r\n bst.WriteByte(bt[I]);\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n bst.Write(bt, Length(bt));\r\n {$ENDIF}\r\n end;\r\n\r\n bst.Position := 0;\r\n AStream.CopyFrom(bst, bst.Size);\r\n finally\r\n sst.Free;\r\n bst.Free;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.HexStrToBytes(const AValue: string): TBytes;\r\nvar\r\n il, idx: Integer;\r\n b: TBytes;\r\nbegin\r\n Result := nil;\r\n SetLength(b, Length(AValue) div 2);\r\n il := 1;\r\n idx := 0;\r\n while il <= Length(AValue) do\r\n begin\r\n b[idx] := StrToInt('$' + AValue[il{$IFDEF FMXMOBILE}-1{$ENDIF}] + AValue[il{$IFNDEF FMXMOBILE} + 1{$ENDIF}]);\r\n il := il + 2;\r\n idx := idx + 1;\r\n end;\r\n Result := b;\r\nend;\r\n\r\nclass function TTMSFNCUtils.AddCharSet(ACharSet1,\r\n ACharSet2: TTMSFNCUtilsCharSet): TTMSFNCUtilsCharSet;\r\nvar\r\n l,j: integer;\r\nbegin\r\n l := Length(ACharSet1)+Length(ACharSet2);\r\n SetLength(Result,l);\r\n l := 0;\r\n\r\n for j := 0 to High(ACharSet1) do\r\n begin\r\n Result[l] := ACharSet1[j];\r\n inc(l);\r\n end;\r\n\r\n for j := 0 to High(ACharSet2) do\r\n begin\r\n Result[l] := ACharSet2[j];\r\n inc(l);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.AlphaCharSet: TTMSFNCUtilsCharSet;\r\nvar\r\n i: integer;\r\n ch: char;\r\nbegin\r\n SetLength(Result,52);\r\n i := 0;\r\n\r\n for ch := 'a' to 'z' do\r\n begin\r\n Result[i] := ch;\r\n inc(i);\r\n end;\r\n\r\n for ch := 'A' to 'Z' do\r\n begin\r\n Result[i] := ch;\r\n inc(i);\r\n end;\r\n\r\nend;\r\n\r\nclass function TTMSFNCUtils.CharInSet(ch: Char; ACharset: TTMSFNCUtilsCharSet): boolean;\r\nvar\r\n j: integer;\r\nbegin\r\n Result := false;\r\n for j := 0 to High(ACharSet) do\r\n begin\r\n if ch = ACharSet[j] then\r\n begin\r\n result := true;\r\n break;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.FirstChar(ACharset: TTMSFNCUtilsCharSet; AValue: string; var spos: Integer): char;\r\nvar\r\n i:Integer;\r\n q: Integer;\r\n\r\nbegin\r\n {$IFDEF FMXMOBILE}\r\n i := 0;\r\n {$ELSE}\r\n i := 1;\r\n {$ENDIF}\r\n q := 0;\r\n spos := -1;\r\n Result := #0;\r\n\r\n while i <= Length(AValue) do\r\n begin\r\n if AValue[i] = '\"' then\r\n inc(q);\r\n\r\n if (CharInSet(AValue[i], ACharSet)) and not Odd(q) then\r\n begin\r\n spos := i;\r\n Result := AValue[i];\r\n Break;\r\n end;\r\n Inc(i);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.StripLogicSpaces(AValue: string): string;\r\nvar\r\n i, k: integer;\r\n q: integer;\r\nbegin\r\n q := 0;\r\n {$IFDEF FMXMOBILE}\r\n i := 0;\r\n k := length(AValue) - 1;\r\n {$ELSE}\r\n i := 1;\r\n k := length(AValue);\r\n {$ENDIF}\r\n Result := '';\r\n\r\n while (i <= k) do\r\n begin\r\n if AValue[i] = '\"' then\r\n inc(q);\r\n\r\n if (AValue[i] = ' ') then\r\n begin\r\n if Odd(q) then\r\n Result := Result + AValue[i];\r\n end\r\n else\r\n Result := Result + AValue[i];\r\n\r\n inc(i);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.ClosingParenthesis(s1: string): integer;\r\nvar\r\n i,j,k,r: integer;\r\nbegin\r\n r := 0;\r\n j := 0;\r\n k := 0;\r\n {$IFDEF FMXMOBILE}\r\n i := 0;\r\n {$ELSE}\r\n i := 1;\r\n {$ENDIF}\r\n\r\n while (i <= length(s1)) do\r\n begin\r\n if (s1[i] = ')') then\r\n inc(k);\r\n\r\n if (s1[i] = '(') then\r\n inc(j);\r\n\r\n if (s1[i] = ')') and (j = k) then\r\n begin\r\n r := i;\r\n break;\r\n end;\r\n\r\n inc(i);\r\n end;\r\n\r\n Result := r;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nclass function TTMSFNCUtils.ConvertBitmapToJPEGStream(ABitmap: TTMSFNCBitmap; AQuality: Single = 1.0; ABackgroundColor: TAlphaColor = TAlphaColorRec.White): TMemoryStream;\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\nclass function TTMSFNCUtils.ConvertBitmapToJPEGStream(ABitmap: TTMSFNCBitmap; AQuality: Single = 1.0; ABackgroundColor: TColor = clWhite): TMemoryStream;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nclass function TTMSFNCUtils.ConvertBitmapToJPEGStream(ABitmap: TTMSFNCBitmap; AQuality: Single = 1.0; ABackgroundColor: TColor = clWhite): TMemoryStream;\r\nbegin\r\n raise Exception.Create('ConvertBitmapToJPEGStream');\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n ms: TMemoryStream;\r\n bmp: TBitmap;\r\n{$IFDEF FMXLIB}\r\n s: TBitmapSurface;\r\n sp: TBitmapCodecSaveParams;\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n gcc: TGraphicClass;\r\n bms: TMemoryStream;\r\n p: TGraphic;\r\n img: TJPEGImage;\r\n{$ENDIF}\r\nbegin\r\n Result := nil;\r\n {$IFDEF FMXLIB}\r\n s := TBitmapSurface.Create;\r\n bmp := TBitmap.Create;\r\n try\r\n bmp.Width := ABitmap.Width;\r\n bmp.Height := ABitmap.Height;\r\n if (ABackgroundColor <> TAlphaColorRec.Null) and (Integer(ABackgroundColor) <> -1) then\r\n bmp.Clear(ABackgroundColor)\r\n else\r\n bmp.Clear(TAlphaColorRec.White);\r\n bmp.Canvas.BeginScene;\r\n bmp.Canvas.DrawBitmap(ABitmap, RectF(0, 0, bmp.Width, bmp.Height), RectF(0, 0, bmp.Width, bmp.Height), 1);\r\n bmp.Canvas.EndScene;\r\n s.Assign(bmp);\r\n sp.Quality := Round(AQuality * 100);\r\n ms := TMemoryStream.Create;\r\n if TBitmapCodecManager.SaveToStream(ms, s, '.jpeg', @sp) then\r\n Result := ms;\r\n finally\r\n bmp.Free;\r\n s.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n bms := TMemoryStream.Create;\r\n ABitmap.SaveToStream(bms);\r\n try\r\n if FindGraphicClass(bms.Memory^, bms.Size, gcc) then\r\n begin\r\n if gcc = TJPEGImage then\r\n begin\r\n ms := TMemoryStream.Create;\r\n ms.LoadFromStream(bms);\r\n Result := ms;\r\n end\r\n else\r\n begin\r\n p := gcc.Create;\r\n img := TJPEGImage.Create;\r\n img.CompressionQuality := Round(AQuality * 100);\r\n bmp := TBitmap.Create;\r\n try\r\n bms.Position := 0;\r\n p.LoadFromStream(bms);\r\n bmp.Width := p.Width;\r\n bmp.Height := p.Height;\r\n if (ABackgroundColor <> clNone) and (Integer(ABackgroundColor) <> -1) then\r\n bmp.Canvas.Brush.Color := ABackgroundColor\r\n else\r\n bmp.Canvas.Brush.Color := clWhite;\r\n bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height));\r\n bmp.Canvas.Draw(0, 0, p);\r\n img.Assign(bmp);\r\n ms := TMemoryStream.Create;\r\n img.SaveToStream(ms);\r\n Result := ms;\r\n finally\r\n bmp.Free;\r\n img.Free;\r\n p.Free;\r\n end;\r\n end;\r\n end;\r\n finally\r\n bms.Free;\r\n end;\r\n {$ENDIF}\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.StripThousandSep(ps: string): string;\r\nbegin\r\n {$IFDEF WEBLIB}\r\n while (Pos(ThousandSeparator, ps) > 0) do\r\n Delete(ps, Pos(ThousandSeparator, ps), 1);\r\n Result := ps;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n while (Pos(FormatSettings.ThousandSeparator, ps) > 0) do\r\n Delete(ps, Pos(FormatSettings.ThousandSeparator, ps), 1);\r\n Result := ps;\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCUtils.SubCharSet(ACharSet1,\r\n ACharSet2: TTMSFNCUtilsCharSet): TTMSFNCUtilsCharSet;\r\nvar\r\n i,j,l: integer;\r\n found: boolean;\r\nbegin\r\n l := 0;\r\n SetLength(Result,l);\r\n\r\n for i := 0 to Length(ACharSet1) - 1 do\r\n begin\r\n found := false;\r\n for j := 0 to Length(ACharSet2) - 1 do\r\n begin\r\n if ACharSet1[i] = ACharSet2[j] then\r\n begin\r\n found := true;\r\n break;\r\n end;\r\n end;\r\n\r\n if not found then\r\n begin\r\n inc(l);\r\n SetLength(Result,l);\r\n Result[l - 1] := ACharSet1[i];\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.IsDate(AValue: string; var ADate: TDateTime):boolean;\r\nvar\r\n su, ts: string;\r\n da,mo,ye,ho,mi,se: Word;\r\n err: Integer;\r\n dp,mp,yp,vp: Integer;\r\nbegin\r\n Result := False;\r\n\r\n ts := '';\r\n\r\n {$IFDEF WEBLIB}\r\n su := UpperCase(ShortDateFormat);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n su := UpperCase(FormatSettings.ShortDateFormat);\r\n {$ENDIF}\r\n dp := pos('D',su);\r\n mp := pos('M',su);\r\n yp := pos('Y',su);\r\n\r\n da := 0;\r\n mo := 0;\r\n ye := 0;\r\n ho := 0;\r\n mi := 0;\r\n se := 0;\r\n\r\n vp := -1;\r\n {$IFDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(DateSeparator,AValue,vp)>0 then\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(FormatSettings.DateSeparator,AValue,vp)>0 then\r\n {$ENDIF}\r\n begin\r\n su := Copy(AValue,1,vp - 1);\r\n\r\n if (dp0 then Exit;\r\n Delete(AValue,1,vp);\r\n\r\n {$IFDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(DateSeparator,AValue,vp)>0 then\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(FormatSettings.DateSeparator,AValue,vp)>0 then\r\n {$ENDIF}\r\n begin\r\n su := Copy(AValue,1,vp - 1);\r\n\r\n if ((dp>mp) and (dpyp) and (dpdp) and (mpyp) and (mpmp) and (ypdp) and (yp0 then Exit;\r\n Delete(AValue,1,vp);\r\n\r\n AValue := Trim(AValue);\r\n\r\n if TTMSFNCUtils.VarPos(' ',AValue, vp) > 0 then // there is space to separate date & time\r\n begin\r\n ts := copy(AValue, vp, length(AValue));\r\n AValue := copy(AValue, 1, vp - 1);\r\n end;\r\n\r\n if (dp>mp) and\r\n (dp>yp) then\r\n val(AValue,da,err)\r\n else\r\n if (mp>dp) and\r\n (mp>yp) then\r\n val(AValue,mo,err)\r\n else\r\n if (yp>mp) and\r\n (yp>dp) then\r\n val(AValue,ye,err);\r\n\r\n if err<>0 then Exit;\r\n if (da>31) then Exit;\r\n if (mo>12) then Exit;\r\n\r\n if (ts <> '') then // there is a time part\r\n begin\r\n {$IFDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(TimeSeparator,ts,vp)>0 then\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(FormatSettings.TimeSeparator,ts,vp)>0 then\r\n {$ENDIF}\r\n begin\r\n su := Copy(ts,1,vp - 1); // hour part\r\n val(su,ho,err);\r\n\r\n if (err <> 0) then Exit;\r\n if (ho > 23) then Exit;\r\n\r\n Delete(ts,1,vp);\r\n\r\n {$IFDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(TimeSeparator,ts,vp)>0 then // there is a second part\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if TTMSFNCUtils.VarPos(FormatSettings.TimeSeparator,ts,vp)>0 then // there is a second part\r\n {$ENDIF}\r\n begin\r\n su := Copy(ts,1,vp - 1); // minute part\r\n val(su,mi,err);\r\n\r\n if err <> 0 then Exit;\r\n Delete(ts,1,vp);\r\n\r\n val(ts,se,err); // second part\r\n if (err <> 0) then Exit;\r\n if (se > 60) then Exit;\r\n end\r\n else\r\n begin\r\n val(su,mi,err); // minute part\r\n if (err <> 0) then Exit;\r\n end;\r\n\r\n if (mi > 59) then Exit;\r\n\r\n Result := true;\r\n end;\r\n end\r\n else\r\n Result := True;\r\n\r\n try\r\n ADate := EncodeDate(ye,mo,da) + EncodeTime(ho,mi,se,0);\r\n except\r\n Result := False;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCUtils.Matches(s0a, s1a: PChar): Boolean;\r\n{$IFNDEF WEBLIB}\r\nbegin\r\n Result := Matches(string(s0a), string(s1a));\r\nend;\r\n\r\nclass function TTMSFNCUtils.Matches(s0a, s1a: string): Boolean;\r\n{$ENDIF}\r\nconst\r\n larger = '>';\r\n smaller = '<';\r\n logand = '&';\r\n logor = '^';\r\n asterix = '*';\r\n qmark = '?';\r\n negation = '!';\r\n\r\nvar\r\n matching: boolean;\r\n done: boolean;\r\n len: longint;\r\n lastchar: char;\r\n s0,s1,s2,s3: integer;\r\n oksmaller,oklarger,negflag: boolean;\r\n compstr: string;\r\n flag1,flag2,flag3: boolean;\r\n equal: boolean;\r\n n1,n2: double;\r\n code1, code2: Integer;\r\n dt1,dt2: TDateTime;\r\n q, i: integer;\r\nbegin\r\n {$IFDEF FMXMOBILE}\r\n i := 1;\r\n {$ENDIF}\r\n {$IFNDEF FMXMOBILE}\r\n i := 0;\r\n {$ENDIF}\r\n\r\n oksmaller := True;\r\n oklarger := True;\r\n flag1 := False;\r\n flag2 := False;\r\n flag3 := False;\r\n negflag := False;\r\n equal := False;\r\n\r\n { [<>] string [&|] [<>] string }\r\n\r\n // do larger than or larger than or equal\r\n\r\n s2 := Pos(larger,s0a);\r\n\r\n if s2 <> 0 then\r\n begin\r\n inc(s2);\r\n if (s0a[s2 - i] = '=') then\r\n begin\r\n Equal := True;\r\n inc(s2);\r\n end;\r\n\r\n while (s0a[s2 - i] = ' ') do\r\n inc(s2);\r\n\r\n s3 := s2;\r\n len := 0;\r\n\r\n lastchar := #0;\r\n\r\n q := 0;\r\n\r\n while (s0a[s2 - i] <> ' ') and (s2 <= Length(s0a)) and (odd(q) or ((s0a[s2 - i] <> '&') and (s0a[s2 - i] <> '|'))) do\r\n begin\r\n if (s0a[s2 - i] = '\"') then\r\n inc(q);\r\n\r\n if (len = 0) and (s0a[s2 - i] = '\"') then\r\n inc(s3)\r\n else\r\n inc(len);\r\n\r\n lastchar := s0a[s2 - i];\r\n inc(s2);\r\n\r\n if (s0a[s2 - i] = ' ') and odd(q) then // skip space if between quotes\r\n begin\r\n lastchar := s0a[s2 - i];\r\n inc(s2);\r\n end;\r\n end;\r\n\r\n if (len > 0) and (lastchar = '\"') then\r\n dec(len);\r\n\r\n compstr := Copy(s0a,s3,len);\r\n\r\n //StrLCopy(compstr,s3,len);\r\n\r\n Val(TTMSFNCUtils.StripThousandSep(s1a),n1,code1);\r\n Val(TTMSFNCUtils.StripThousandSep(compstr),n2,code2);\r\n\r\n dt2 := 0;\r\n if TTMSFNCUtils.IsDate(compstr,dt2) then\r\n code2 := 1;\r\n\r\n dt1 := 0;\r\n if TTMSFNCUtils.IsDate(s1a,dt1) then\r\n code1 := 1;\r\n\r\n if (code1 = 0) and (code2 = 0) then {both are numeric types}\r\n begin\r\n if equal then\r\n oklarger := n1 >= n2\r\n else\r\n oklarger := n1 > n2;\r\n end\r\n else\r\n begin\r\n if TTMSFNCUtils.IsDate(compstr,dt2) and TTMSFNCUtils.IsDate(s1a,dt1) then\r\n begin\r\n if equal then\r\n oklarger := dt1 >= dt2\r\n else\r\n oklarger := dt1 > dt2;\r\n end\r\n else\r\n begin\r\n if equal then\r\n oklarger := (CompareStr(compstr,s1a)<=0)\r\n else\r\n oklarger := (CompareStr(compstr,s1a)<0);\r\n end;\r\n end;\r\n flag1 := True;\r\n end;\r\n\r\n equal := False;\r\n\r\n // do smaller than or smaller than or equal\r\n s2 := Pos(smaller, s0a);\r\n if (s2 <> 0) then\r\n begin\r\n inc(s2);\r\n if (s0a[s2 - i] = '=') then\r\n begin\r\n equal := True;\r\n inc(s2);\r\n end;\r\n\r\n lastchar := #0;\r\n\r\n while (s0a[s2 - i] =' ') do inc(s2);\r\n s3 := s2;\r\n len := 0;\r\n q := 0;\r\n\r\n while (s0a[s2 - i] <> ' ') and (s2 <= Length(s0a)) and (odd(q) or ((s0a[s2 - i] <> '&') and (s0a[s2 - i] <> '|'))) do\r\n begin\r\n if s0a[s2 - i] = '\"' then\r\n inc(q);\r\n\r\n if (len = 0) and (s0a[s2 - i] = '\"') then\r\n inc(s3)\r\n else\r\n inc(len);\r\n\r\n lastchar := s0a[s2 - i];\r\n inc(s2);\r\n end;\r\n\r\n if (len > 0) and (lastchar = '\"') then\r\n dec(len);\r\n\r\n compstr := copy(s0a, s3, len);\r\n\r\n Val(TTMSFNCUtils.StripThousandSep(s1a),n1,code1);\r\n Val(TTMSFNCUtils.StripThousandSep(compstr),n2,code2);\r\n if TTMSFNCUtils.IsDate(compstr,dt2) then code2 := 1;\r\n if TTMSFNCUtils.IsDate(s1a,dt1) then code1 := 1;\r\n\r\n if (code1 = 0) and (code2 = 0) then // both are numeric types\r\n begin\r\n if equal then\r\n oksmaller := n1 <= n2\r\n else\r\n oksmaller := n1 < n2;\r\n end\r\n else\r\n begin\r\n // check for dates here ?\r\n if TTMSFNCUtils.IsDate(compstr, dt2) and TTMSFNCUtils.IsDate(s1a, dt1) then\r\n begin\r\n if equal then\r\n oksmaller := dt1 <= dt2\r\n else\r\n oksmaller := dt1 < dt2;\r\n end\r\n else\r\n begin\r\n if equal then\r\n oksmaller := (CompareStr(compstr,s1a)>=0)\r\n else\r\n oksmaller := (CompareStr(compstr,s1a)>0);\r\n end;\r\n end;\r\n\r\n flag2 := True;\r\n end;\r\n\r\n s2 := Pos(negation, s0a);\r\n\r\n if (s2 <> 0) then\r\n begin\r\n inc(s2);\r\n while (s0a[s2 - i] = ' ') do\r\n inc(s2);\r\n s3 := s2;\r\n len := 0;\r\n\r\n lastchar := #0;\r\n q := 0;\r\n\r\n while (s0a[s2 - i] <> ' ') and (s2 <= length(s0a)) and (odd(q) or ((s0a[s2 - i] <> '&') and (s0a[s2 - i] <> '|'))) do\r\n begin\r\n if (s0a[s2 - i] = '\"') then\r\n inc(q);\r\n\r\n if (len = 0) and (s0a[s2 - i] = '\"') then\r\n inc(s3)\r\n else\r\n inc(len);\r\n\r\n lastchar := s0a[s2 - i];\r\n inc(s2);\r\n end;\r\n\r\n if (len > 0) and (lastchar = '\"') then\r\n dec(len);\r\n\r\n compstr := copy(s0a, s3, len);\r\n flag3 := True;\r\n end;\r\n\r\n if (flag3) then\r\n begin\r\n if Pos(larger, s0a) = 0 then\r\n flag1 := flag3;\r\n if Pos(smaller, s0a) = 0 then\r\n flag2 := flag3;\r\n end;\r\n\r\n if (Pos(logor, s0a) <> 0) then\r\n if flag1 or flag2 then\r\n begin\r\n matches := oksmaller or oklarger;\r\n Exit;\r\n end;\r\n\r\n if (Pos(logand, s0a) <> 0) then\r\n if flag1 and flag2 then\r\n begin\r\n matches := oksmaller and oklarger;\r\n Exit;\r\n end;\r\n\r\n if ((Pos(larger, s0a) <> 0) and (oklarger)) or\r\n ((Pos(smaller, s0a) <> 0) and (oksmaller)) then\r\n begin\r\n matches := True;\r\n Exit;\r\n end;\r\n\r\n s0 := 1;\r\n s1 := 1;\r\n\r\n matching := True;\r\n\r\n done := ((s0 >= Length(s0a)) and (s1 >= Length(s1a))) or (s0a = '') or (s1a = '');\r\n\r\n while not done and matching do\r\n begin\r\n case s0a[s0 - i] of\r\n qmark:\r\n begin\r\n matching := s1 <= Length(s1a);\r\n if matching then\r\n begin\r\n inc(s0);\r\n inc(s1);\r\n end;\r\n end;\r\n negation:\r\n begin\r\n negflag:=True;\r\n inc(s0);\r\n end;\r\n '\"':\r\n begin\r\n inc(s0);\r\n end;\r\n asterix:\r\n begin\r\n repeat\r\n inc(s0)\r\n until (s0a[s0 - i] <> asterix);\r\n len := Length(s1a) - s1;\r\n inc(s1,len);\r\n matching := matches(copy(s0a,s0,Length(s0a)),Copy(s1a, s1, Length(s1a)));\r\n\r\n while (len >= 0) and not matching do\r\n begin\r\n dec(s1);\r\n dec(len);\r\n matching := matches(copy(s0a,s0,Length(s0a)),Copy(s1a, s1, Length(s1a)));\r\n end;\r\n if matching then\r\n begin\r\n s0 := Length(s0a)+1;\r\n s1 := Length(s1a)+1;\r\n end;\r\n end;\r\n else\r\n begin\r\n if (s0 <= Length(s0a)) and (s1 <= Length(s1a)) then\r\n matching := s0a[s0 - i] = s1a[s1 - i]\r\n else\r\n matching := false;\r\n\r\n if matching then\r\n begin\r\n inc(s0);\r\n inc(s1);\r\n end;\r\n end;\r\n end;\r\n\r\n Done := (s0 > Length(s0a)) and (s1 > Length(s1a));\r\n end;\r\n\r\n if negflag then\r\n Matches := not matching\r\n else\r\n Matches := matching;\r\nend;\r\n\r\nclass function TTMSFNCUtils.MatchStr(AValue1, AValue2:string; ACaseSensitive:Boolean):Boolean;\r\nbegin\r\n if ACaseSensitive then\r\n Result := Matches(PChar(AValue1),PChar(AValue2))\r\n else\r\n Result := Matches(PChar(AnsiUpperCase(AValue1)),PChar(AnsiUpperCase(AValue2)));\r\nend;\r\n\r\nclass function TTMSFNCUtils.MatchStrEx(AValue1, AValue2: string; ACaseSensitive: Boolean): Boolean;\r\nvar\r\n ch,lastop: Char;\r\n sep,cp: Integer;\r\n res,newres: Boolean;\r\n CharArray: TTMSFNCUtilsCharSet;\r\nbegin\r\n AValue1 := Trim(AValue1);\r\n AValue1 := StripLogicSpaces(AValue1);\r\n\r\n sep := -1;\r\n if TTMSFNCUtils.VarPos('=', AValue1, sep) = 1 then\r\n Delete(AValue1, sep, 1);\r\n\r\n LastOp := #0;\r\n Res := True;\r\n\r\n SetLength(CharArray,5);\r\n CharArray[0] := '(';\r\n CharArray[1] := ';';\r\n CharArray[2] := '^';\r\n CharArray[3] := '&';\r\n CharArray[4] := '|';\r\n\r\n repeat\r\n ch := FirstChar(CharArray, AValue1, sep);\r\n if ch <> #0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if (length(AValue1) > 0) and (AValue1[0] = '(') and (pos('(',AValue1) > 0) then\r\n {$ELSE}\r\n if (length(AValue1) > 0) and (AValue1[1] = '(') and (pos('(',AValue1) > 0) then\r\n {$ENDIF}\r\n begin\r\n cp := ClosingParenthesis(AValue1);\r\n NewRes := MatchStrEx(copy(AValue1,2,cp - 2),AValue2,ACaseSensitive);\r\n delete(AValue1,1,cp);\r\n end\r\n else\r\n begin\r\n NewRes := MatchStr(Copy(AValue1,1,sep - 1),AValue2,ACaseSensitive);\r\n Delete(AValue1,1,sep);\r\n end;\r\n\r\n if LastOp = #0 then\r\n Res := NewRes\r\n else\r\n case LastOp of\r\n ';','^','|':Res := Res or NewRes;\r\n '&':Res := Res and NewRes;\r\n end;\r\n\r\n LastOp := ch;\r\n end;\r\n\r\n until (ch = #0);\r\n\r\n NewRes := MatchStr(AValue1, AValue2, ACaseSensitive);\r\n\r\n if LastOp = #0 then\r\n Res := NewRes\r\n else\r\n case LastOp of\r\n ';','^','|':Res := Res or NewRes;\r\n '&':Res := Res and NewRes;\r\n end;\r\n\r\n Result := Res;\r\nend;\r\n\r\nclass procedure TTMSFNCUtils.Split(const ADelimiter: Char; AInput: string; const AStrings: TStrings);\r\nbegin\r\n AStrings.Clear;\r\n AStrings.Delimiter := ADelimiter;\r\n AStrings.StrictDelimiter := True;\r\n AStrings.DelimitedText := AInput;\r\nend;\r\n\r\nclass function TTMSFNCUtils.VarPos(ASubValue, AValue: string; var AResult: Integer): Integer;\r\nbegin\r\n AResult := Pos(ASubValue, AValue);\r\n Result := AResult;\r\nend;\r\n\r\nclass function TTMSFNCUtils.VarPosNoCase(ASubValue, AValue: string;\r\n var AResult: Integer): Integer;\r\nbegin\r\n AResult := Pos(Uppercase(ASubValue), Uppercase(AValue));\r\n Result := AResult;\r\nend;\r\n\r\nclass function TTMSFNCUtils.HTMLStrip(AHTML: string): string;\r\nvar\r\n TagPos: integer;\r\nbegin\r\n Result := '';\r\n // replace line breaks by linefeeds\r\n while (pos('
',uppercase(AHTML))>0) do\r\n AHTML := StringReplace(AHTML,'
',chr(13)+chr(10),[rfIgnoreCase]);\r\n\r\n while (pos('
',uppercase(AHTML))>0) do\r\n AHTML := StringReplace(AHTML,'
',chr(13)+chr(10),[rfIgnoreCase]);\r\n\r\n TagPos := 0;\r\n {remove all other tags}\r\n while (VarPos('<',AHTML,TagPos) > 0) do\r\n begin\r\n Result := Result + Copy(AHTML,1,TagPos-1);\r\n if (VarPos('>',AHTML,TagPos)>0) then\r\n Delete(AHTML,1,TagPos)\r\n else\r\n Break;\r\n end;\r\n Result := Result + AHTML;\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetResourceStream(AResourceName: string): TResourceStream;\r\nbegin\r\n Result := GetResourceStream(AResourceName, GetHInstance);\r\nend;\r\n\r\nclass function TTMSFNCUtils.GetResourceStream(AResourceName: string; AInstance: NativeUInt): TResourceStream;\r\n{$IFDEF WEBLIB}\r\nbegin\r\n Result := nil;\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n hst: NativeUInt;\r\n function FindRCData(ModuleHandle: HMODULE; Name: string): boolean;\r\n begin\r\n Result := FindResource(ModuleHandle, PChar(Name), PChar(RT_RCDATA)) <> 0;\r\n end;\r\nbegin\r\n Result := nil;\r\n hst := AInstance;\r\n if FindRCData(hst, AResourceName) then\r\n Result := TResourceStream.Create(hst, AResourceName, RT_RCDATA);\r\n{$ENDIF}\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\n\r\n{ TTMSFNCComponentHelper }\r\n\r\nfunction TTMSFNCComponentHelper.GetVersionNumber(AMaj, AMin, ARel,\r\n ABld: ShortInt): string;\r\nvar\r\n vn: Integer;\r\nbegin\r\n vn := MakeLong(MakeWord(ABld, ARel),MakeWord(AMin, AMaj));\r\n Result := IntToStr(Hi(Hiword(vn)))+'.'+IntToStr(Lo(Hiword(vn)))+'.'+IntToStr(Hi(Loword(vn)))+'.'+IntToStr(Lo(Loword(vn)));\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNLIB}\r\n\r\n{ TTMSFNCControlHelper }\r\n\r\nfunction TTMSFNCControlHelper.MakeScreenshot: TTMSFNCBitmap;\r\nvar\r\n bmp: Graphics.TBitmap;\r\nbegin\r\n bmp := Graphics.TBitmap.Create;\r\n bmp.SetSize(Width, Height);\r\n Result := TTMSFNCBitmap.Create;\r\n try\r\n if (Self is TWinControl) and (Self as TWinControl).HandleAllocated then\r\n TWinControl(Self).PaintTo(bmp.Canvas.Handle, 0, 0);\r\n\r\n Result.Assign(bmp);\r\n finally\r\n bmp.Free;\r\n end;\r\nend;\r\n\r\n{$ENDIF}\r\n\r\n{ TTMSFNCClipBoard }\r\n\r\n{$IFDEF FMXLIB}\r\n\r\nclass procedure TTMSFNCClipBoard.Clear;\r\n{$IFDEF MACOS}\r\nvar\r\n{$IFDEF IOS}\r\n pb: UIPasteboard;\r\n{$ELSE}\r\n pb: NSPasteboard;\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$IFDEF ANDROID}\r\nvar\r\n clip: IFMXClipboardService;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF MSWINDOWS}\r\n OpenClipboard(0);\r\n try\r\n EmptyClipboard;\r\n finally\r\n CloseClipBoard;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n pb := TUIPasteboard.Wrap(TUIPasteboard.OCClass.generalPasteboard);\r\n pb.setData(nil, CocoaNSStringConst(libUIKit, 'UIPasteboardNameGeneral'));\r\n {$ELSE}\r\n pb := TNSPasteboard.Wrap(TNSPasteboard.OCClass.generalPasteboard);\r\n pb.clearContents;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF ANDROID}\r\n if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(clip)) then\r\n clip.SetClipboard('');\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetHTML: String;\r\nvar\r\n val: TValue;\r\nbegin\r\n Result := '';\r\n val := GetValue(GetFormat(TTMSFNCClipBoardFormat.cfHTML));\r\n if not val.IsEmpty and val.IsType then\r\n Result := val.AsType;\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.IsTextFormat(AFormat: Cardinal): Boolean;\r\n{$ELSE}\r\nclass function TTMSFNCClipBoard.IsTextFormat(AFormat: String): Boolean;\r\n{$ENDIF}\r\nbegin\r\n Result := (AFormat = GetFormat(TTMSFNCClipBoardFormat.cfText))\r\n or (AFormat = GetFormat(TTMSFNCClipBoardFormat.cfRTF))\r\n or (AFormat = GetFormat(TTMSFNCClipBoardFormat.cfHTML));\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.IsStreamFormat(AFormat: Cardinal): Boolean;\r\n{$ELSE}\r\nclass function TTMSFNCClipBoard.IsStreamFormat(AFormat: String): Boolean;\r\n{$ENDIF}\r\nbegin\r\n Result := (AFormat = GetFormat(TTMSFNCClipBoardFormat.cfStream)) or (AFormat = GetFormat(TTMSFNCClipBoardFormat.cfBitmap))\r\n or (AFormat = GetFormat(TTMSFNCClipBoardFormat.cfRichTextStream));\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.GetFormat(AFormat: TTMSFNCClipBoardFormat): Cardinal;\r\nbegin\r\n case AFormat of\r\n TTMSFNCClipBoardFormat.cfText: Result := CF_TEXT;\r\n TTMSFNCClipBoardFormat.cfRTF: Result := CF_FNCRTF;\r\n TTMSFNCClipBoardFormat.cfHTML: Result := CF_FNCHTML;\r\n TTMSFNCClipBoardFormat.cfStream: Result := CF_FNCSTREAM;\r\n TTMSFNCClipBoardFormat.cfBitmap: Result := CF_FNCBITMAP;\r\n TTMSFNCClipBoardFormat.cfBitmapWin: Result := CF_FNCBITMAPWIN;\r\n TTMSFNCClipBoardFormat.cfRichTextStream: Result := CF_FNCRICHTEXTSTREAM;\r\n else\r\n Result := 0;\r\n end;\r\nend;\r\n{$ELSE}\r\nclass function TTMSFNCClipBoard.GetFormat(AFormat: TTMSFNCClipBoardFormat): string;\r\nbegin\r\n Result := '';\r\n case AFormat of\r\n TTMSFNCClipBoardFormat.cfText: Result := 'public.utf8-plain-text';\r\n TTMSFNCClipBoardFormat.cfRTF: Result := 'public.rtf';\r\n TTMSFNCClipBoardFormat.cfHTML: Result := 'public.html';\r\n TTMSFNCClipBoardFormat.cfStream: Result := 'TTMSFNCClipBoard.StreamFormat';\r\n {$IFDEF IOS}\r\n TTMSFNCClipBoardFormat.cfBitmap: Result := 'public.png';\r\n {$ELSE}\r\n TTMSFNCClipBoardFormat.cfBitmap: Result := 'public.image';\r\n {$ENDIF}\r\n TTMSFNCClipBoardFormat.cfRichTextStream: Result := 'RichEditorText';\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TTMSFNCClipBoard.GetRTF: String;\r\nvar\r\n val: TValue;\r\nbegin\r\n Result := '';\r\n val := GetValue(GetFormat(TTMSFNCClipBoardFormat.cfRTF));\r\n if not val.IsEmpty and val.IsType then\r\n Result := val.AsType;\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetBitmap: TTMSFNCBitmap;\r\nvar\r\n val: TValue;\r\n ms: TMemoryStream;\r\nbegin\r\n Result := nil;\r\n val := GetValue(GetFormat(TTMSFNCClipBoardFormat.cfBitmap));\r\n if not val.IsEmpty and val.IsType then\r\n begin\r\n Result := TTMSFNCBitmap.Create;\r\n Result.LoadFromStream(val.AsType);\r\n ms := val.AsType;\r\n ms.Free;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetStream: TMemoryStream;\r\nvar\r\n val: TValue;\r\nbegin\r\n Result := nil;\r\n val := GetValue(GetFormat(TTMSFNCClipBoardFormat.cfStream));\r\n if not val.IsEmpty and val.IsType then\r\n Result := val.AsType;\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetRichTextStream: TMemoryStream;\r\nvar\r\n val: TValue;\r\nbegin\r\n Result := nil;\r\n val := GetValue(GetFormat(TTMSFNCClipBoardFormat.cfRichTextStream));\r\n if not val.IsEmpty and val.IsType then\r\n Result := val.AsType;\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetText: String;\r\nvar\r\n val: TValue;\r\nbegin\r\n Result := '';\r\n val := GetValue(GetFormat(TTMSFNCClipBoardFormat.cfText));\r\n if not val.IsEmpty and val.IsType then\r\n Result := val.AsType;\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.AllocateCustomValue(AFormat: Cardinal; AValue: TValue): THandle;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetCustomValue(AFormat: Cardinal; AValue: TValue; var AData: Pointer);\r\n{$ELSE}\r\n{$IFDEF MACOS}\r\nclass function TTMSFNCClipBoard.SetCustomValue(AFormat: String; AValue: TValue): NSData;\r\n{$ELSE}\r\nclass function TTMSFNCClipBoard.SetCustomValue(AFormat: String; AValue: TValue): Pointer;\r\n{$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n {$IFNDEF MSWINDOWS}\r\n Result := nil;\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.GetCustomValue(AFormat: Cardinal; AData: Pointer): TValue;\r\n{$ELSE}\r\n{$IFDEF MACOS}\r\nclass function TTMSFNCClipBoard.GetCustomValue(AFormat: String; AData: NSData): TValue;\r\n{$ELSE}\r\nclass function TTMSFNCClipBoard.GetCustomValue(AFormat: String; AData: Pointer): TValue;\r\n{$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.GetValue(AFormat: Cardinal): TValue;\r\n{$ELSE}\r\nclass function TTMSFNCClipBoard.GetValue(AFormat: String): TValue;\r\n{$ENDIF}\r\n{$IFDEF MACOS}\r\nvar\r\n dt: NSData;\r\n str: NSString;\r\n I: Integer;\r\n arr: NSArray;\r\n{$IFDEF IOS}\r\n dtObj: NSObject;\r\n dtp: Pointer;\r\n pb: UIPasteboard;\r\n dic: NSDictionary;\r\n K: Integer;\r\n kp: Pointer;\r\n key: String;\r\n{$ELSE}\r\n pb: NSPasteboard;\r\n pbit: NSPasteboardItem;\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$IFDEF MSWINDOWS}\r\nvar\r\n hMem: THandle;\r\n pMem: Pointer;\r\n txt: string;\r\n{$ENDIF}\r\n{$IFDEF ANDROID}\r\nvar\r\n clip: IFMXClipboardService;\r\n{$ENDIF}\r\nbegin\r\n Result := nil;\r\n{$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n pb := TUIPasteboard.Wrap(TUIPasteboard.OCClass.generalPasteboard);\r\n arr := pb.items;\r\n for I := 0 to arr.count - 1 do\r\n begin\r\n dic := TNSDictionary.Wrap(arr.objectAtIndex(I));\r\n for K := 0 to dic.allKeys.count - 1 do\r\n begin\r\n kp := dic.allKeys.objectAtIndex(K);\r\n key := UTF8ToString(TNSString.Wrap(kp).UTF8String);\r\n if key = AFormat then\r\n begin\r\n dtp := dic.objectForKey(kp);\r\n dtobj := TNSObject.Wrap(dtp);\r\n if isStreamFormat(AFormat) then\r\n begin\r\n dt := TNSData.Wrap(dtp);\r\n if Assigned(dt) then\r\n begin\r\n Result := TMemoryStream.Create;\r\n Result.AsType.Write(dt.bytes^, dt.length);\r\n Result.AsType.Position := 0;\r\n Exit;\r\n end;\r\n end\r\n else if isTextFormat(AFormat) then\r\n begin\r\n str := TNSString.Wrap(dtp);\r\n Result := UTF8ToString(str.UTF8String);\r\n Exit;\r\n end\r\n else\r\n Result := GetCustomValue(AFormat, TNSData.Wrap(dtp));\r\n end;\r\n end;\r\n end;\r\n {$ELSE}\r\n pb := TNSPasteboard.Wrap(TNSPasteboard.OCClass.generalPasteboard);\r\n arr := pb.pasteboardItems;\r\n for I := 0 to arr.count - 1 do\r\n begin\r\n pbit := TNSPasteboardItem.Wrap(arr.objectAtIndex(I));\r\n if isTextFormat(AFormat) then\r\n begin\r\n str := pbit.stringForType(TTMSFNCUtils.NSStrEx(AFormat));\r\n if Assigned(str) then\r\n begin\r\n Result := UTF8ToString(str.UTF8String);\r\n Exit;\r\n end;\r\n end\r\n else if isStreamFormat(AFormat) then\r\n begin\r\n if AFormat = 'public.image' then\r\n begin\r\n dt := pbit.dataForType(TTMSFNCUtils.NSStrEx('public.png'));\r\n if not Assigned(dt) then\r\n begin\r\n dt := pbit.dataForType(TTMSFNCUtils.NSStrEx('public.tiff'));\r\n if not Assigned(dt) then\r\n dt := pbit.dataForType(TTMSFNCUtils.NSStrEx('public.jpeg'));\r\n end;\r\n end\r\n else\r\n dt := pbit.dataForType(TTMSFNCUtils.NSStrEx(AFormat));\r\n\r\n if Assigned(dt) then\r\n begin\r\n Result := TMemoryStream.Create;\r\n Result.AsType.Write(dt.bytes^, dt.length);\r\n Result.AsType.Position := 0;\r\n Exit;\r\n end;\r\n end\r\n else\r\n Result := GetCustomValue(AFormat, pbit.dataForType(TTMSFNCUtils.NSStrEx(AFormat)));\r\n end;\r\n {$ENDIF}\r\n{$ENDIF}\r\n\r\n{$IFDEF MSWINDOWS}\r\n if AFormat = CF_TEXT then\r\n begin\r\n if HasFormat(CF_UNICODETEXT) then\r\n AFormat := CF_UNICODETEXT;\r\n end;\r\n\r\n OpenClipboard(0);\r\n try\r\n hMem := GetClipboardData(AFormat);\r\n finally\r\n CloseClipboard;\r\n end;\r\n\r\n if hMem <> 0 then\r\n begin\r\n pMem := GlobalLock(hMem);\r\n if pMem <> nil then\r\n begin\r\n try\r\n if isStreamFormat(AFormat) then\r\n begin\r\n Result := TMemoryStream.Create;\r\n Result.AsType.Write(pMem^, GlobalSize(hMem));\r\n Result.AsType.Position := 0;\r\n end\r\n else if isTextFormat(AFormat) or (AFormat = CF_UNICODETEXT) then\r\n begin\r\n if AFormat = CF_UNICODETEXT then\r\n txt := PChar(pMem)\r\n else\r\n txt := UTF8ToString(pMem);\r\n\r\n Result := txt;\r\n end\r\n else\r\n Result := GetCustomValue(AFormat, pMem);\r\n finally\r\n GlobalUnlock(hMem);\r\n end;\r\n end;\r\n end;\r\n{$ENDIF}\r\n\r\n{$IFDEF ANDROID}\r\n if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(clip)) then\r\n Result := clip.GetClipboard;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.HasFormat(AFormat: TTMSFNCClipBoardFormat): Boolean;\r\nbegin\r\n Result := HasFormat(GetFormat(AFormat));\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.HasFormat(AFormat: Cardinal): Boolean;\r\nbegin\r\n Result := False;\r\n try\r\n OpenClipboard(0);\r\n Result := Boolean(IsClipboardFormatAvailable(AFormat));\r\n CloseClipboard;\r\n except\r\n end;\r\nend;\r\n{$ELSE}\r\nclass function TTMSFNCClipBoard.HasFormat(AFormat: String): Boolean;\r\nvar\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n I, K: Integer;\r\n kp: Pointer;\r\n key: String;\r\n pb: UIPasteBoard;\r\n arr: NSArray;\r\n dic: NSDictionary;\r\n {$ELSE}\r\n I: Integer;\r\n pb: NSPasteBoard;\r\n pbi: NSPasteboardItem;\r\n str: NSString;\r\n {$ENDIF}\r\n {$ELSE}\r\n clip: IFMXClipboardService;\r\n {$ENDIF}\r\nbegin\r\n Result := False;\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n pb := TUIPasteboard.Wrap(TUIPasteboard.OCClass.generalPasteboard);\r\n arr := pb.items;\r\n for I := 0 to arr.count - 1 do\r\n begin\r\n dic := TNSDictionary.Wrap(arr.objectAtIndex(I));\r\n for K := 0 to dic.allKeys.count - 1 do\r\n begin\r\n kp := dic.allKeys.objectAtIndex(K);\r\n key := UTF8ToString(TNSString.Wrap(kp).UTF8String);\r\n if key = AFormat then\r\n begin\r\n Result := True;\r\n Exit;\r\n end;\r\n end;\r\n end;\r\n {$ELSE}\r\n pb := TNSPasteboard.Wrap(TNSPasteboard.OCClass.generalPasteboard);\r\n for I := 0 to pb.pasteboardItems.count - 1 do\r\n begin\r\n pbi := TNSPasteboardItem.Wrap(pb.pasteboardItems.objectAtIndex(I));\r\n str := pbi.availableTypeFromArray(TNSArray.Wrap(TNSArray.OCClass.arrayWithObject((TTMSFNCUtils.NSStrEx(AFormat) as ILocalObject).GetObjectID)));\r\n if Assigned(str) then\r\n begin\r\n Result := True;\r\n Exit;\r\n end;\r\n end;\r\n {$ENDIF}\r\n {$ELSE}\r\n if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(clip)) then\r\n Result := not clip.GetClipboard.IsEmpty;\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\nclass procedure TTMSFNCClipBoard.SetHTML(AHTML: String);\r\nbegin\r\n SetValue(AHTML, GetFormat(TTMSFNCClipBoardFormat.cfHTML));\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetRTF(ARTF: String);\r\nbegin\r\n SetValue(ARTF, GetFormat(TTMSFNCClipBoardFormat.cfRTF));\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetStream(AStream: TMemoryStream);\r\nbegin\r\n SetValue(AStream, GetFormat(TTMSFNCClipBoardFormat.cfStream));\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass function TTMSFNCClipBoard.GetBitmapWin: TTMSFNCBitmap;\r\nvar\r\n Header: TBitmapFileHeader;\r\n DataHandle: HGLOBAL;\r\n BitmapInfoPtr: PBitmapV5Header;\r\n Stream: TMemoryStream;\r\nbegin\r\n Result := nil;\r\n OpenClipboard(0);\r\n DataHandle := GetClipboardData(CF_DIB);\r\n BitmapInfoPtr := nil;\r\n if DataHandle <> 0 then\r\n BitmapInfoPtr := GlobalLock(DataHandle);\r\n\r\n if Assigned(BitmapInfoPtr) then\r\n begin\r\n Stream := TMemoryStream.Create;\r\n try\r\n FillChar(Header, SizeOf(Header), 0);\r\n Header.bfType := $4D42;\r\n Header.bfSize := SizeOf(Header) + GlobalSize(DataHandle);\r\n Header.bfOffBits := SizeOf(Header) + BitmapInfoPtr.bV5Size;\r\n Stream.WriteBuffer(Header, SizeOf(Header));\r\n Stream.WriteBuffer(BitmapInfoPtr^, Header.bfSize - SizeOf(Header));\r\n Stream.Position := 0;\r\n Result := TTMSFNCBitmap.Create;\r\n Result.LoadFromStream(Stream);\r\n finally\r\n GlobalUnlock(DataHandle);\r\n Stream.Free;\r\n CloseClipboard;\r\n end;\r\n end;\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetBitmapWin(ABitmap: TTMSFNCBitmap);\r\nvar\r\n Data: THandle;\r\n DataPtr: Pointer;\r\n BitmapHeader: TBitmapInfoHeader;\r\n BitmapData: TBitmapData;\r\n I, J: Integer;\r\n DIBDataPtr: Pointer;\r\nbegin\r\n OpenClipboard(0);\r\n try\r\n FillChar(BitmapHeader, SizeOf(BitmapHeader), 0);\r\n BitmapHeader.biSize := SizeOf(TBitmapInfoHeader);\r\n BitmapHeader.biPlanes := 1;\r\n BitmapHeader.biBitCount := 32;\r\n BitmapHeader.biCompression := BI_RGB;\r\n\r\n BitmapHeader.biWidth := ABitmap.Width;\r\n BitmapHeader.biHeight := ABitmap.Height;\r\n BitmapHeader.biSizeImage := ABitmap.BytesPerPixel * ABitmap.Width * ABitmap.Height;\r\n\r\n if BitmapHeader.biWidth <= 0 then\r\n BitmapHeader.biWidth := 1;\r\n if BitmapHeader.biHeight <= 0 then\r\n BitmapHeader.biHeight := 1;\r\n\r\n Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, BitmapHeader.biWidth * Abs(BitmapHeader.biHeight) * 4 + SizeOf(BitmapHeader));\r\n try\r\n DataPtr := GlobalLock(Data);\r\n try\r\n Move(BitmapHeader, DataPtr^, SizeOf(BitmapHeader));\r\n DIBDataPtr := @(PByteArray(DataPtr)[SizeOf(BitmapHeader)]);\r\n\r\n if ABitmap.Map(TMapAccess.Read, BitmapData) then\r\n try\r\n if BitmapData.PixelFormat = TPixelFormat.BGRA then\r\n for I := 0 to ABitmap.Height - 1 do\r\n Move(PAlphaColorArray(BitmapData.Data)[I * (BitmapData.Pitch div 4)],\r\n PAlphaColorArray(DIBDataPtr)[(ABitmap.Height - 1 - I) * ABitmap.Width], ABitmap.Width * 4)\r\n else\r\n for I := 0 to ABitmap.Height - 1 do\r\n for J := 0 to ABitmap.Width - 1 do\r\n PAlphaColorArray(DIBDataPtr)[(ABitmap.Height - 1 - I) * ABitmap.Width + J] :=\r\n BitmapData.GetPixel(J, I);\r\n finally\r\n ABitmap.Unmap(BitmapData);\r\n end;\r\n finally\r\n GlobalUnlock(Data);\r\n end;\r\n SetClipboardData(CF_DIB, Data);\r\n except\r\n GlobalFree(Data);\r\n raise;\r\n end;\r\n finally\r\n CloseClipboard;\r\n end;\r\nend;\r\n\r\n{$ENDIF}\r\n\r\nclass procedure TTMSFNCClipBoard.SetBitmap(ABitmap: TTMSFNCBitmap);\r\nvar\r\n ms: TMemoryStream;\r\nbegin\r\n ms := TMemoryStream.Create;\r\n try\r\n ABitmap.SaveToStream(ms);\r\n SetValue(ms, GetFormat(TTMSFNCClipBoardFormat.cfBitmap));\r\n finally\r\n ms.Free;\r\n end;\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetRichTextStream(AStream: TMemoryStream);\r\nbegin\r\n SetValue(AStream, GetFormat(TTMSFNCClipBoardFormat.cfRichTextStream));\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetText(AText: String);\r\nbegin\r\n SetValue(AText, GetFormat(TTMSFNCClipBoardFormat.cfText));\r\nend;\r\n\r\n{$IFDEF MSWINDOWS}\r\nclass procedure TTMSFNCClipBoard.SetValue(AValue: TValue; AFormat: Cardinal);\r\n{$ELSE}\r\nclass procedure TTMSFNCClipBoard.SetValue(AValue: TValue; AFormat: String);\r\n{$ENDIF}\r\n{$IFDEF MACOS}\r\nvar\r\n{$IFDEF IOS}\r\n pb: UIPasteboard;\r\n dic: NSDictionary;\r\n pValue: Pointer;\r\n{$ELSE}\r\n pb: NSPasteboard;\r\n pbit: NSPasteboardItem;\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$IFDEF MSWINDOWS}\r\nvar\r\n hMem: THandle;\r\n pMem: Pointer;\r\n txt: string;\r\n l: integer;\r\n{$ENDIF}\r\n{$IFDEF ANDROID}\r\nvar\r\n clip: IFMXClipboardService;\r\n{$ENDIF}\r\nbegin\r\n if AValue.IsObject then\r\n begin\r\n if AValue.IsType then\r\n AValue.AsType.Position := 0;\r\n end;\r\n\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n pb := TUIPasteboard.Wrap(TUIPasteboard.OCClass.generalPasteboard);\r\n if AValue.IsType then\r\n pValue := TNSData.OCClass.dataWithBytes(AValue.AsType.Memory, AValue.AsType.Size)\r\n else if AValue.IsType then\r\n pValue := (TTMSFNCUtils.NSStrEx(AValue.AsType) as ILocalObject).GetObjectID\r\n else\r\n pValue := (SetCustomValue(AFormat, AValue) as ILocalObject).GetObjectID;\r\n\r\n if Assigned(pValue) then\r\n begin\r\n dic := TNSDictionary.Wrap(TNSDictionary.OCClass.dictionaryWithObject(pValue, (TTMSFNCUtils.NSStrEx(AFormat) as ILocalObject).GetObjectID));\r\n pb.addItems(TNSArray.Wrap(TNSArray.OCClass.arrayWithObject((dic as ILocalObject).GetObjectID)));\r\n end;\r\n {$ELSE}\r\n pb := TNSPasteboard.Wrap(TNSPasteboard.OCClass.generalPasteboard);\r\n pbit := TNSPasteboardItem.Wrap(TNSPasteboardItem.Wrap(TNSPasteboardItem.OCClass.alloc).init);\r\n if AValue.IsType then\r\n pbit.setData(TNSData.Wrap(TNSData.OCClass.dataWithBytes(AValue.AsType.Memory, AValue.AsType.Size)), TTMSFNCUtils.NSStrEx(AFormat))\r\n else if AValue.IsType then\r\n pbit.setData(TTMSFNCUtils.NSStrEx(AValue.AsType).dataUsingEncoding(NSUTF8StringEncoding), TTMSFNCUtils.NSStrEx(AFormat))\r\n else\r\n pbit.setData(SetCustomValue(AFormat, AValue), TTMSFNCUtils.NSStrEx(AFormat));\r\n\r\n pb.writeObjects(TNSArray.Wrap(TNSArray.OCClass.arrayWithObject((pbit as ILocalObject).GetObjectID)));\r\n {$ENDIF}\r\n{$ENDIF}\r\n\r\n{$IFDEF MSWINDOWS}\r\n if AValue.IsObject and AValue.IsType then\r\n hMem := GlobalAlloc(GHND or GMEM_DDESHARE, AValue.AsType.Size)\r\n else if AValue.IsType then\r\n begin\r\n txt := AValue.AsString;\r\n if AFormat = CF_FNCRTF then\r\n begin\r\n l := Length(txt) + 1;\r\n hMem := GlobalAlloc(GHND or GMEM_DDESHARE, l)\r\n end\r\n else\r\n begin\r\n l := ByteLength(txt) + SizeOf(Char);\r\n hMem := GlobalAlloc(GHND or GMEM_DDESHARE, l)\r\n end;\r\n end\r\n else\r\n hMem := AllocateCustomValue(AFormat, AValue);\r\n\r\n if hMem <> 0 then\r\n begin\r\n pMem := GlobalLock(hMem);\r\n if pMem <> nil then\r\n begin\r\n try\r\n if AValue.IsObject and AValue.IsType then\r\n begin\r\n AValue.AsType.Read(pMem^, AValue.AsType.Size);\r\n AValue.AsType.Position := 0;\r\n end\r\n else if AValue.IsType then\r\n begin\r\n if AFormat = CF_FNCRTF then\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n AnsiStrings.StrCopy(pMem, PAnsiChar(AnsiString(txt)));\r\n {$ELSE}\r\n StrCopy(PAnsiChar(pMem), PAnsiChar(AnsiString(txt)));\r\n {$IFEND}\r\n {$HINTS ON}\r\n end\r\n else\r\n begin\r\n if AFormat = CF_TEXT then\r\n AFormat := CF_UNICODETEXT;\r\n\r\n Move(PChar(txt)^, pMem^, ByteLength(txt) + SizeOf(Char));\r\n end;\r\n end\r\n else\r\n SetCustomValue(AFormat, AValue, pMem);\r\n finally\r\n GlobalUnlock(hMem);\r\n end;\r\n OpenClipboard(0);\r\n try\r\n SetClipboardData(AFormat, hmem);\r\n finally\r\n CloseClipboard;\r\n end;\r\n end\r\n else\r\n begin\r\n GlobalFree(hMem);\r\n end;\r\n end;\r\n{$ENDIF}\r\n\r\n{$IFDEF ANDROID}\r\n if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(clip)) then\r\n clip.SetClipboard(AValue);\r\n{$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nclass function TTMSFNCClipBoard.GetBitmap: TTMSFNCBitmap;\r\nbegin\r\n raise Exception.Create('GetBitmap not supported');\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetBitmap(ABitmap: TTMSFNCBitmap);\r\nbegin\r\n raise Exception.Create('SetBitmap not supported');\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetRichTextStream: TMemoryStream;\r\nbegin\r\n raise Exception.Create('GetRichTextStream not supported');\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetRichTextStream(AStream: TMemoryStream);\r\nbegin\r\n raise Exception.Create('SetRichTextStream not supported');\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetStream: TMemoryStream;\r\nbegin\r\n raise Exception.Create('GetStream not supported');\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetStream(AStream: TMemoryStream);\r\nbegin\r\n raise Exception.Create('SetStream not supported');\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetRTF: string;\r\nbegin\r\n raise Exception.Create('GetRTF not supported');\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetRTF(ARTF: String);\r\nbegin\r\n raise Exception.Create('SetRTF not supported');\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetHTML: string;\r\nbegin\r\n raise Exception.Create('GetHTML not supported');\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetHTML(AHTML: String);\r\nbegin\r\n raise Exception.Create('SetHTML not supported');\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetText: string;\r\nbegin\r\n raise Exception.Create('GetText not supported');\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetText(AText: String);\r\nbegin\r\n asm\r\n const element = document.createElement('textarea');\r\n element.value = AText;\r\n document.body.appendChild(element);\r\n element.focus();\r\n element.setSelectionRange(0, element.value.length);\r\n document.execCommand('copy');\r\n document.body.removeChild(element);\r\n end;\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.Clear;\r\nbegin\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.HasFormat(AFormat: TTMSFNCClipBoardFormat): Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNLIB}\r\nclass function TTMSFNCClipBoard.HasFormat(AFormat: TTMSFNCClipBoardFormat): Boolean;\r\nbegin\r\n Result := False;\r\n case AFormat of\r\n TTMSFNCClipBoardFormat.cfText: Result := Clipboard.HasFormat(CF_TEXT);\r\n TTMSFNCClipBoardFormat.cfRTF: Result := Clipboard.HasFormat(CF_FNCRTF);\r\n TTMSFNCClipBoardFormat.cfHTML: Result := Clipboard.HasFormat(CF_FNCHTML);\r\n TTMSFNCClipBoardFormat.cfStream: Result := Clipboard.HasFormat(CF_FNCSTREAM);\r\n TTMSFNCClipBoardFormat.cfBitmap: Result := Clipboard.HasFormat(CF_FNCBITMAP);\r\n TTMSFNCClipBoardFormat.cfRichTextStream: Result := Clipboard.HasFormat(CF_FNCRICHTEXTSTREAM);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetFormat(AFormat: TTMSFNCClipBoardFormat): string;\r\nbegin\r\n Result := '';\r\n {$IFDEF MSWINDOWS}\r\n case AFormat of\r\n TTMSFNCClipBoardFormat.cfText: Result := 'text/plain';\r\n TTMSFNCClipBoardFormat.cfRTF: Result := 'Rich Text Format';\r\n TTMSFNCClipBoardFormat.cfHTML: Result := 'HTML Format';\r\n TTMSFNCClipBoardFormat.cfStream: Result := 'TTMSFNCClipBoard.StreamFormat';\r\n TTMSFNCClipBoardFormat.cfBitmap: Result := 'Delphi Picture';\r\n TTMSFNCClipBoardFormat.cfRichTextStream: Result := 'RichEditorText';\r\n end;\r\n {$ENDIF}\r\n {$IFDEF UNIX}\r\n case AFormat of\r\n TTMSFNCClipBoardFormat.cfText: Result := 'text/plain';\r\n TTMSFNCClipBoardFormat.cfRTF: Result := 'text/richtext';\r\n TTMSFNCClipBoardFormat.cfHTML: Result := 'text/html';\r\n TTMSFNCClipBoardFormat.cfStream: Result := 'TTMSFNCClipBoard.StreamFormat';\r\n TTMSFNCClipBoardFormat.cfBitmap: Result := 'Delphi Picture';\r\n TTMSFNCClipBoardFormat.cfRichTextStream: Result := 'RichEditorText';\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.Clear;\r\nbegin\r\n Clipboard.Clear;\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetText(AText: String);\r\nbegin\r\n {$IFDEF VCLLIB}\r\n Clipboard.AsText := AText;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Clipboard.SetTextBuf(PChar(AText));\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetText: String;\r\nbegin\r\n Result := Clipboard.AsText;\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetStream(AStream: TMemoryStream);\r\n{$IFDEF VCLLIB}\r\nvar\r\n Data: THandle;\r\n DataPtr: Pointer;\r\nbegin\r\n Clipboard.Open;\r\n try\r\n Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, AStream.Size);\r\n try\r\n DataPtr := GlobalLock(Data);\r\n try\r\n Move(AStream.Memory^, DataPtr^, AStream.Size);\r\n SetClipboardData(CF_FNCSTREAM, Data);\r\n finally\r\n GlobalUnlock(Data);\r\n end;\r\n except\r\n GlobalFree(Data);\r\n raise;\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nbegin\r\n Clipboard.Open;\r\n try\r\n Clipboard.AddFormat(CF_FNCSTREAM, AStream);\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetStream: TMemoryStream;\r\n{$IFDEF VCLLIB}\r\nvar\r\n DataPtr: Pointer;\r\n Data: THandle;\r\nbegin\r\n Result := nil;\r\n Clipboard.Open;\r\n try\r\n Data := GetClipboardData(CF_FNCSTREAM);\r\n if Data <> 0 then\r\n begin\r\n DataPtr := GlobalLock(Data);\r\n if Assigned(DataPtr) then\r\n begin\r\n Result := TMemoryStream.Create;\r\n Result.WriteBuffer(DataPtr^, GlobalSize(Data));\r\n Result.Position := 0;\r\n end;\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nvar\r\n fmt: TClipboardFormat;\r\nbegin\r\n Result := nil;\r\n fmt := Clipboard.FindFormatID(GetFormat(cfStream));\r\n if fmt <> 0 then\r\n begin\r\n Result := TMemoryStream.Create;\r\n Clipboard.GetFormat(fmt, Result);\r\n Result.Position := 0;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetBitmap(ABitmap: TTMSFNCBitmap);\r\n{$IFDEF VCLLIB}\r\nvar\r\n pic: TGraphic;\r\n ms, ds: TMemoryStream;\r\n gcc: TGraphicClass;\r\nbegin\r\n pic := nil;\r\n\r\n if IsBitmapEmpty(ABitmap) then\r\n Exit;\r\n\r\n ds := TMemoryStream.Create;\r\n try\r\n ABitmap.SaveToStream(ds);\r\n ds.Position := 0;\r\n if TTMSFNCUtils.FindGraphicClass(ds.Memory^, ds.Size, gcc) then\r\n pic := gcc.Create;\r\n finally\r\n ds.Free;\r\n end;\r\n\r\n if Assigned(pic) then\r\n begin\r\n try\r\n ms := TMemoryStream.Create;\r\n try\r\n ABitmap.SaveToStream(ms);\r\n ms.Position := 0;\r\n pic.LoadFromStream(ms);\r\n finally\r\n ms.Free;\r\n end;\r\n\r\n Clipboard.Open;\r\n try\r\n Clipboard.Assign(pic);\r\n finally\r\n Clipboard.Close;\r\n end;\r\n\r\n finally\r\n pic.Free;\r\n end;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nbegin\r\n if IsBitmapEmpty(ABitmap) then\r\n Exit;\r\n\r\n ClipBoard.Open;\r\n try\r\n ClipBoard.Assign(ABitmap.Graphic);\r\n finally\r\n ClipBoard.Close;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetBitmap: TTMSFNCBitmap;\r\nbegin\r\n Result := TTMSFNCBitmap.Create;\r\n Result.Assign(Clipboard);\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetRichTextStream(AStream: TMemoryStream);\r\n{$IFDEF VCLLIB}\r\nvar\r\n Data: THandle;\r\n DataPtr: Pointer;\r\nbegin\r\n Clipboard.Open;\r\n try\r\n Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, AStream.Size);\r\n try\r\n DataPtr := GlobalLock(Data);\r\n try\r\n Move(AStream.Memory^, DataPtr^, AStream.Size);\r\n SetClipboardData(CF_FNCRICHTEXTSTREAM, Data);\r\n finally\r\n GlobalUnlock(Data);\r\n end;\r\n except\r\n GlobalFree(Data);\r\n raise;\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nbegin\r\n Clipboard.Open;\r\n try\r\n Clipboard.AddFormat(CF_FNCRICHTEXTSTREAM, AStream);\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetRichTextStream: TMemoryStream;\r\n{$IFDEF VCLLIB}\r\nvar\r\n DataPtr: Pointer;\r\n Data: THandle;\r\nbegin\r\n Result := nil;\r\n Clipboard.Open;\r\n try\r\n Data := GetClipboardData(CF_FNCRICHTEXTSTREAM);\r\n if Data <> 0 then\r\n begin\r\n DataPtr := GlobalLock(Data);\r\n if Assigned(DataPtr) then\r\n begin\r\n Result := TMemoryStream.Create;\r\n Result.WriteBuffer(DataPtr^, GlobalSize(Data));\r\n Result.Position := 0;\r\n end;\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nvar\r\n fmt: TClipboardFormat;\r\nbegin\r\n Result := nil;\r\n fmt := Clipboard.FindFormatID(GetFormat(cfRichTextStream));\r\n if fmt <> 0 then\r\n begin\r\n Result := TMemoryStream.Create;\r\n Clipboard.GetFormat(fmt, Result);\r\n Result.Position := 0;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetRTF(ARTF: String);\r\n{$IFDEF VCLLIB}\r\nvar\r\n rtfstr: ansistring;\r\n MemHandleRTF: THandle;\r\nbegin\r\n Clipboard.Open;\r\n try\r\n rtfstr := ansistring(ARTF);\r\n\r\n MemHandleRTF := GlobalAlloc(GHND or GMEM_SHARE, Length(rtfstr) + 1);\r\n\r\n if (MemHandleRTF <> 0) then\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n AnsiStrings.StrCopy(GlobalLock(MemHandleRTF), PAnsiChar(rtfstr));\r\n {$ELSE}\r\n StrCopy(PAnsiChar(GlobalLock(MemHandleRTF)), PAnsiChar(rtfstr));\r\n {$IFEND}\r\n {$HINTS ON}\r\n GlobalUnlock(MemHandleRTF);\r\n SetClipboardData(CF_FNCRTF, MemHandleRTF);\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nbegin\r\n Clipboard.Open;\r\n try\r\n Clipboard.AddFormat(CF_FNCRTF, ARTF[1], Length(ARTF));\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetRTF: String;\r\n{$IFDEF VCLLIB}\r\nvar\r\n hClip: THandle;\r\n bufptr: Pointer;\r\n mstream: TStringStream;\r\nbegin\r\n Result := '';\r\n Clipboard.Open;\r\n try\r\n HClip := Clipboard.GetAsHandle(CF_FNCRTF);\r\n bufptr := GlobalLock(HClip);\r\n if bufptr <> nil then\r\n begin\r\n try\r\n mstream := TStringStream.Create('');\r\n try\r\n mstream.WriteBuffer(bufptr^, GlobalSize(HClip));\r\n Result := mstream.DataString;\r\n finally\r\n mstream.Free;\r\n end;\r\n finally\r\n GlobalUnlock(HClip);\r\n end;\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nvar\r\n fmt: TClipboardFormat;\r\n ms: TMemoryStream;\r\n sz: int64;\r\nbegin\r\n Result := '';\r\n fmt := Clipboard.FindFormatID(GetFormat(cfRTF));\r\n if fmt <> 0 then\r\n begin\r\n ms := TMemoryStream.Create;\r\n try\r\n if Clipboard.GetFormat(fmt, ms) then\r\n begin\r\n sz := ms.Size;\r\n if (sz > 0) and (PChar(ms.Memory)[sz - 1]=#0) then\r\n Dec(sz);\r\n\r\n ms.Position := 0;\r\n SetLength(Result, sz);\r\n if sz > 0 then\r\n ms.Read(Result[1], sz);\r\n end;\r\n finally\r\n ms.Free;\r\n end;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass procedure TTMSFNCClipBoard.SetHTML(AHTML: String);\r\n{$IFDEF VCLLIB}\r\nvar\r\n htmlstr: ansistring;\r\n MemHandleHTML: THandle;\r\nbegin\r\n htmlstr := AnsiString(AHTML);\r\n htmlstr := AnsiString('Version:0.9'#13#10\r\n +'StartHTML:71'#13#10\r\n +'EndHTML:'+inttostr(length(htmlstr) + 71)+#13#10\r\n +'StartFragment:140'#13#10\r\n +'EndFragment:'+inttostr(length(htmlstr)+ 142)+#13#10\r\n +'' +#13#10\r\n +''#13#10\r\n +''#13#10\r\n +'The HTML Clipboard'#13#10\r\n +''#13#10\r\n +''#13#10\r\n +''#13#10\r\n +''#13#10)\r\n + htmlstr + AnsiString(#13#10\r\n +''#13#10\r\n +''#13#10\r\n +''#13#10);\r\n\r\n Clipboard.Open;\r\n try\r\n MemHandleHTML := GlobalAlloc(GHND or GMEM_SHARE, Length(htmlstr) + 1);\r\n\r\n if (MemHandleHTML <> 0) then\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 24}\r\n AnsiStrings.StrCopy(GlobalLock(MemHandleHTML), PAnsiChar(htmlstr));\r\n {$ELSE}\r\n StrCopy(PAnsiChar(GlobalLock(MemHandleHTML)), PAnsiChar(htmlstr));\r\n {$IFEND}\r\n {$HINTS ON}\r\n GlobalUnlock(MemHandleHTML);\r\n SetClipboardData(CF_FNCHTML, MemHandleHTML);\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\n{$IFDEF MSWINDOWS}\r\nconst\r\n nhdr = 'Version:0.9' + #13#10 +\r\n 'StartHTML:%.10d' + #13#10+\r\n 'EndHTML:%.10d' + #13#10+\r\n 'StartFragment:%.10d' + #13#10+\r\n 'EndFragment:%.10d' + #13#10;\r\n hdr = '';\r\n ftr1 = '';\r\n ftr2 = '';\r\n{$ENDIF}\r\nvar\r\n HTMLSource : String;\r\n {$IFDEF MSWINDOWS}\r\n iStartHTML: Integer;\r\n iStartFragment: Integer;\r\n iEndFragment: Integer;\r\n iEndHTML: Integer;\r\n {$ENDIF}\r\nbegin\r\n {$IFDEF MSWINDOWS}\r\n iStartHTML := 105;\r\n iStartFragment := iStartHTML + Length(nhdr);\r\n iEndFragment := iStartFragment + Length(AHTML) + Length(ftr1);\r\n iEndHTML := iEndFragment + Length(ftr2);\r\n HTMLSource := Format(nhdr, [iStartHTML, iEndHTML, iStartFragment,\r\n iEndFragment]) + hdr + AHTML + ftr1 + ftr2;\r\n {$ELSE}\r\n HTMLSource := AHTML;\r\n {$ENDIF}\r\n\r\n Clipboard.Open;\r\n try\r\n Clipboard.AddFormat(CF_FNCHTML, HTMLSource[1], Length(HTMLSource));\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCClipBoard.GetHTML: String;\r\n{$IFDEF VCLLIB}\r\nvar\r\n hclip: THandle;\r\n bufptr: Pointer;\r\n mstream: TStringStream;\r\nbegin\r\n Result := '';\r\n Clipboard.Open;\r\n try\r\n HClip := Clipboard.GetAsHandle(CF_FNCHTML);\r\n bufptr := GlobalLock(HClip);\r\n if bufptr <> nil then\r\n begin\r\n try\r\n mstream := TStringStream.Create('');\r\n try\r\n mstream.WriteBuffer(bufptr^, GlobalSize(HClip));\r\n Result := UTF8ToString(RawByteString(mstream.DataString));\r\n finally\r\n mstream.Free;\r\n end;\r\n finally\r\n GlobalUnlock(HClip);\r\n end;\r\n end;\r\n finally\r\n Clipboard.Close;\r\n end;\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\nvar\r\n fmt: TClipboardFormat;\r\n ms: TMemoryStream;\r\n sz: int64;\r\nbegin\r\n Result := '';\r\n fmt := Clipboard.FindFormatID(GetFormat(cfHTML));\r\n if fmt <> 0 then\r\n begin\r\n ms := TMemoryStream.Create;\r\n try\r\n if Clipboard.GetFormat(fmt, ms) then\r\n begin\r\n sz := ms.Size;\r\n if (sz > 0) and (PChar(ms.Memory)[sz-1]=#0) then\r\n Dec(sz);\r\n\r\n ms.Position := 0;\r\n SetLength(Result, sz);\r\n if sz > 0 then\r\n ms.Read(Result[1], sz);\r\n end;\r\n finally\r\n ms.Free;\r\n end;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\n{$ENDIF}\r\n\r\nclass function TTMSFNCClipBoard.HasContent: Boolean;\r\nbegin\r\n Result := HasFormat(TTMSFNCClipBoardFormat.cfText)\r\n or HasFormat(TTMSFNCClipBoardFormat.cfRTF)\r\n or HasFormat(TTMSFNCClipBoardFormat.cfBitmap)\r\n or HasFormat(TTMSFNCClipBoardFormat.cfBitmapWin)\r\n or HasFormat(TTMSFNCClipBoardFormat.cfRichTextStream)\r\n or HasFormat(TTMSFNCClipBoardFormat.cfStream);\r\nend;\r\n\r\n{$IFDEF ANDROID}\r\nprocedure TTMSFNCUtilsDialogSelectFileListener.onClick(dialog: JDialogInterface; which: Integer);\r\nvar\r\n f: JFile;\r\n s: JCharSequence;\r\nbegin\r\n s := FFileList.Items[which];\r\n if JCharSequenceToStr(s) = '..' then\r\n f := FCurrentPath.getParentFile\r\n else\r\n f := TJFile.JavaClass.init(s.toString);\r\n\r\n if f.isDirectory then\r\n begin\r\n if FFileMode = ufmSave then\r\n FSelectedFile := JStringToString(f.toString);\r\n\r\n LoadFileList(f, FFilter);\r\n FManuallyCancelled := True;\r\n FDialog.cancel;\r\n FDialog.dismiss;\r\n CallInUIThreadAndWaitFinishing(\r\n procedure\r\n begin\r\n ShowDialog(f);\r\n end\r\n );\r\n end\r\n else\r\n begin\r\n FSelectedFile := JStringToString(f.toString);\r\n FFilePicked := True;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCUtilsDialogDismissListener.onDismiss(dialog: JDialogInterface);\r\nbegin\r\n FCancelled := not FManuallyCancelled;\r\n FManuallyCancelled := False;\r\nend;\r\n\r\nprocedure TTMSFNCUtilsDialogSelectDirectoryListener.onClick(dialog: JDialogInterface; which: Integer);\r\nbegin\r\n FFilePicked := True;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF WEBLIB}\r\ninitialization\r\nbegin\r\n if not IsConsole then\r\n begin\r\n {$IFNDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n CF_FNCRICHTEXTSTREAM := RegisterClipboardFormat('RichEditorText');\r\n CF_FNCSTREAM := RegisterClipboardFormat('TTMSFNCClipBoard.StreamFormat');\r\n {$IFDEF FMXLIB}\r\n CF_FNCBITMAP := RegisterClipboardFormat('PNG');\r\n CF_FNCBITMAPWIN := CF_BITMAP;\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n CF_FNCBITMAP := CF_BITMAP;\r\n {$ENDIF}\r\n CF_FNCRTF := RegisterClipboardFormat('Rich Text Format');\r\n CF_FNCHTML := RegisterClipboardFormat('HTML Format');\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF LCLLIB}\r\n CF_FNCRICHTEXTSTREAM := RegisterClipboardFormat('RichEditorText');\r\n CF_FNCSTREAM := RegisterClipboardFormat('TTMSFNCClipBoard.StreamFormat');\r\n CF_FNCBITMAP := CF_PICTURE;\r\n CF_FNCRTF := RegisterClipboardFormat(TTMSFNCClipBoard.GetFormat(TTMSFNCClipBoardFormat.cfRTF));\r\n CF_FNCHTML := RegisterClipboardFormat(TTMSFNCClipBoard.GetFormat(TTMSFNCClipBoardFormat.cfHTML));\r\n {$ENDIF}\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n\r\n\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCGraphicsTypes;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE USECOMMONCOLORS}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE USECOMMONCOLORS}\r\n{$DEFINE CMNWEBLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF FMXLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n Windows,\r\n {$ENDIF}\r\n Classes, Types, WEBLib.TMSFNCTypes, WEBLib.Graphics\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n ,UITypes\r\n {$IFEND}\r\n {$HINTS ON}\r\n ,Generics.Collections\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n {$IFNDEF LCLLIB}\r\n FPC_FULLVERSION = 0;\r\n {$ENDIF}\r\n PathScale = 1E-4;\r\n PathFontSize = 1E-2;\r\n PathPosition = 1E-3;\r\n PathAngle = 1E-4;\r\n\r\n {$IFDEF FMXLIB}\r\n gcAlpha = $FF000000;\r\n gcAliceblue = gcAlpha or $F0F8FF;\r\n gcAntiquewhite = gcAlpha or $FAEBD7;\r\n gcAqua = gcAlpha or $00FFFF;\r\n gcAquamarine = gcAlpha or $7FFFD4;\r\n gcAzure = gcAlpha or $F0FFFF;\r\n gcBeige = gcAlpha or $F5F5DC;\r\n gcBisque = gcAlpha or $FFE4C4;\r\n gcBlack = gcAlpha or $000000;\r\n gcBlanchedalmond = gcAlpha or $FFEBCD;\r\n gcBlue = gcAlpha or $0000FF;\r\n gcBlueviolet = gcAlpha or $8A2BE2;\r\n gcBrown = gcAlpha or $A52A2A;\r\n gcBurlywood = gcAlpha or $DEB887;\r\n gcCadetblue = gcAlpha or $5F9EA0;\r\n gcChartreuse = gcAlpha or $7FFF00;\r\n gcChocolate = gcAlpha or $D2691E;\r\n gcCoral = gcAlpha or $FF7F50;\r\n gcCornflowerblue = gcAlpha or $6495ED;\r\n gcCornsilk = gcAlpha or $FFF8DC;\r\n gcCrimson = gcAlpha or $DC143C;\r\n gcCyan = gcAlpha or $00FFFF;\r\n gcDarkblue = gcAlpha or $00008B;\r\n gcDarkcyan = gcAlpha or $008B8B;\r\n gcDarkgoldenrod = gcAlpha or $B8860B;\r\n gcDarkgray = gcAlpha or $A9A9A9;\r\n gcDarkgreen = gcAlpha or $006400;\r\n gcDarkgrey = gcAlpha or $A9A9A9;\r\n gcDarkkhaki = gcAlpha or $BDB76B;\r\n gcDarkmagenta = gcAlpha or $8B008B;\r\n gcDarkolivegreen = gcAlpha or $556B2F;\r\n gcDarkorange = gcAlpha or $FF8C00;\r\n gcDarkorchid = gcAlpha or $9932CC;\r\n gcDarkred = gcAlpha or $8B0000;\r\n gcDarksalmon = gcAlpha or $E9967A;\r\n gcDarkseagreen = gcAlpha or $8FBC8F;\r\n gcDarkslateblue = gcAlpha or $483D8B;\r\n gcDarkslategray = gcAlpha or $2F4F4F;\r\n gcDarkslategrey = gcAlpha or $2F4F4F;\r\n gcDarkturquoise = gcAlpha or $00CED1;\r\n gcDarkviolet = gcAlpha or $9400D3;\r\n gcDeeppink = gcAlpha or $FF1493;\r\n gcDeepskyblue = gcAlpha or $00BFFF;\r\n gcDimgray = gcAlpha or $696969;\r\n gcDimgrey = gcAlpha or $696969;\r\n gcDodgerblue = gcAlpha or $1E90FF;\r\n gcFirebrick = gcAlpha or $B22222;\r\n gcFloralwhite = gcAlpha or $FFFAF0;\r\n gcForestgreen = gcAlpha or $228B22;\r\n gcFuchsia = gcAlpha or $FF00FF;\r\n gcGainsboro = gcAlpha or $DCDCDC;\r\n gcGhostwhite = gcAlpha or $F8F8FF;\r\n gcGold = gcAlpha or $FFD700;\r\n gcGoldenrod = gcAlpha or $DAA520;\r\n gcGray = gcAlpha or $808080;\r\n gcGreen = gcAlpha or $008000;\r\n gcGreenyellow = gcAlpha or $ADFF2F;\r\n gcGrey = gcAlpha or $808080;\r\n gcHoneydew = gcAlpha or $F0FFF0;\r\n gcHotpink = gcAlpha or $FF69B4;\r\n gcIndianred = gcAlpha or $CD5C5C;\r\n gcIndigo = gcAlpha or $4B0082;\r\n gcIvory = gcAlpha or $FFFFF0;\r\n gcKhaki = gcAlpha or $F0E68C;\r\n gcLavender = gcAlpha or $E6E6FA;\r\n gcLavenderblush = gcAlpha or $FFF0F5;\r\n gcLawngreen = gcAlpha or $7CFC00;\r\n gcLemonchiffon = gcAlpha or $FFFACD;\r\n gcLightblue = gcAlpha or $ADD8E6;\r\n gcLightcoral = gcAlpha or $F08080;\r\n gcLightcyan = gcAlpha or $E0FFFF;\r\n gcLightgoldenrodyellow = gcAlpha or $FAFAD2;\r\n gcLightgray = gcAlpha or $D3D3D3;\r\n gcLightgreen = gcAlpha or $90EE90;\r\n gcLightgrey = gcAlpha or $D3D3D3;\r\n gcLightpink = gcAlpha or $FFB6C1;\r\n gcLightsalmon = gcAlpha or $FFA07A;\r\n gcLightseagreen = gcAlpha or $20B2AA;\r\n gcLightskyblue = gcAlpha or $87CEFA;\r\n gcLightslategray = gcAlpha or $778899;\r\n gcLightslategrey = gcAlpha or $778899;\r\n gcLightsteelblue = gcAlpha or $B0C4DE;\r\n gcLightyellow = gcAlpha or $FFFFE0;\r\n gcLtGray = gcAlpha or $C0C0C0;\r\n gcMedGray = gcAlpha or $A0A0A0;\r\n gcDkGray = gcAlpha or $808080;\r\n gcMoneyGreen = gcAlpha or $C0DCC0;\r\n gcLegacySkyBlue = gcAlpha or $F0CAA6;\r\n gcCream = gcAlpha or $F0FBFF;\r\n gcLime = gcAlpha or $00FF00;\r\n gcLimegreen = gcAlpha or $32CD32;\r\n gcLinen = gcAlpha or $FAF0E6;\r\n gcMagenta = gcAlpha or $FF00FF;\r\n gcMaroon = gcAlpha or $800000;\r\n gcMediumaquamarine = gcAlpha or $66CDAA;\r\n gcMediumblue = gcAlpha or $0000CD;\r\n gcMediumorchid = gcAlpha or $BA55D3;\r\n gcMediumpurple = gcAlpha or $9370DB;\r\n gcMediumseagreen = gcAlpha or $3CB371;\r\n gcMediumslateblue = gcAlpha or $7B68EE;\r\n gcMediumspringgreen = gcAlpha or $00FA9A;\r\n gcMediumturquoise = gcAlpha or $48D1CC;\r\n gcMediumvioletred = gcAlpha or $C71585;\r\n gcMidnightblue = gcAlpha or $191970;\r\n gcMintcream = gcAlpha or $F5FFFA;\r\n gcMistyrose = gcAlpha or $FFE4E1;\r\n gcMoccasin = gcAlpha or $FFE4B5;\r\n gcNavajowhite = gcAlpha or $FFDEAD;\r\n gcNavy = gcAlpha or $000080;\r\n gcOldlace = gcAlpha or $FDF5E6;\r\n gcOlive = gcAlpha or $808000;\r\n gcOlivedrab = gcAlpha or $6B8E23;\r\n gcOrange = gcAlpha or $FFA500;\r\n gcOrangered = gcAlpha or $FF4500;\r\n gcOrchid = gcAlpha or $DA70D6;\r\n gcPalegoldenrod = gcAlpha or $EEE8AA;\r\n gcPalegreen = gcAlpha or $98FB98;\r\n gcPaleturquoise = gcAlpha or $AFEEEE;\r\n gcPalevioletred = gcAlpha or $DB7093;\r\n gcPapayawhip = gcAlpha or $FFEFD5;\r\n gcPeachpuff = gcAlpha or $FFDAB9;\r\n gcPeru = gcAlpha or $CD853F;\r\n gcPink = gcAlpha or $FFC0CB;\r\n gcPlum = gcAlpha or $DDA0DD;\r\n gcPowderblue = gcAlpha or $B0E0E6;\r\n gcPurple = gcAlpha or $800080;\r\n gcRed = gcAlpha or $FF0000;\r\n gcRosybrown = gcAlpha or $BC8F8F;\r\n gcRoyalblue = gcAlpha or $4169E1;\r\n gcSaddlebrown = gcAlpha or $8B4513;\r\n gcSalmon = gcAlpha or $FA8072;\r\n gcSandybrown = gcAlpha or $F4A460;\r\n gcSeagreen = gcAlpha or $2E8B57;\r\n gcSeashell = gcAlpha or $FFF5EE;\r\n gcSienna = gcAlpha or $A0522D;\r\n gcSilver = gcAlpha or $C0C0C0;\r\n gcSkyblue = gcAlpha or $87CEEB;\r\n gcSlateblue = gcAlpha or $6A5ACD;\r\n gcSlategray = gcAlpha or $708090;\r\n gcSlategrey = gcAlpha or $708090;\r\n gcSnow = gcAlpha or $FFFAFA;\r\n gcSpringgreen = gcAlpha or $00FF7F;\r\n gcSteelblue = gcAlpha or $4682B4;\r\n gcTan = gcAlpha or $D2B48C;\r\n gcTeal = gcAlpha or $008080;\r\n gcThistle = gcAlpha or $D8BFD8;\r\n gcTomato = gcAlpha or $FF6347;\r\n gcTurquoise = gcAlpha or $40E0D0;\r\n gcViolet = gcAlpha or $EE82EE;\r\n gcWheat = gcAlpha or $F5DEB3;\r\n gcWhite = gcAlpha or $FFFFFF;\r\n gcWhitesmoke = gcAlpha or $F5F5F5;\r\n gcYellow = gcAlpha or $FFFF00;\r\n gcYellowgreen = gcAlpha or $9ACD32;\r\n gcNull = $00000000;\r\n {$ENDIF}\r\n {$IFDEF USECOMMONCOLORS}\r\n gcAliceblue = $FFF8F0;\r\n gcAntiquewhite = $D7EBFA;\r\n gcAqua = $FFFF00;\r\n gcAquamarine = $D4FF7F;\r\n gcAzure = $FFFFF0;\r\n gcBeige = $DCF5F5;\r\n gcBisque = $C4E4FF;\r\n gcBlack = $000000;\r\n gcBlanchedalmond = $CDEBFF;\r\n gcBlue = $FF0000;\r\n gcBlueviolet = $E22B8A;\r\n gcBrown = $2A2AA5;\r\n gcBurlywood = $87B8DE;\r\n gcCadetblue = $A09E5F;\r\n gcChartreuse = $00FF7F;\r\n gcChocolate = $1E69D2;\r\n gcCoral = $507FFF;\r\n gcCornflowerblue = $ED9564;\r\n gcCornsilk = $DCF8FF;\r\n gcCrimson = $3C14DC;\r\n gcCyan = $FFFF00;\r\n gcDarkblue = $8B0000;\r\n gcDarkcyan = $8B8B00;\r\n gcDarkgoldenrod = $0B86B8;\r\n gcDarkgray = $A9A9A9;\r\n gcDarkgreen = $006400;\r\n gcDarkgrey = $A9A9A9;\r\n gcDarkkhaki = $6BB7BD;\r\n gcDarkmagenta = $8B008B;\r\n gcDarkolivegreen = $2F6B55;\r\n gcDarkorange = $008CFF;\r\n gcDarkorchid = $CC3299;\r\n gcDarkred = $00008B;\r\n gcDarksalmon = $7A96E9;\r\n gcDarkseagreen = $8FBC8F;\r\n gcDarkslateblue = $8B3D48;\r\n gcDarkslategray = $4F4F2F;\r\n gcDarkslategrey = $4F4F2F;\r\n gcDarkturquoise = $D1CE00;\r\n gcDarkviolet = $D30094;\r\n gcDeeppink = $9314FF;\r\n gcDeepskyblue = $FFBF00;\r\n gcDimgray = $696969;\r\n gcDimgrey = $696969;\r\n gcDodgerblue = $FF901E;\r\n gcFirebrick = $2222B2;\r\n gcFloralwhite = $F0FAFF;\r\n gcForestgreen = $228B22;\r\n gcFuchsia = $FF00FF;\r\n gcGainsboro = $DCDCDC;\r\n gcGhostwhite = $FFF8F8;\r\n gcGold = $00D7FF;\r\n gcGoldenrod = $20A5DA;\r\n gcGray = $808080;\r\n gcGreen = $008000;\r\n gcGreenyellow = $2FFFAD;\r\n gcGrey = $808080;\r\n gcHoneydew = $F0FFF0;\r\n gcHotpink = $B469FF;\r\n gcIndianred = $5C5CCD;\r\n gcIndigo = $82004B;\r\n gcIvory = $F0FFFF;\r\n gcKhaki = $8CE6F0;\r\n gcLavender = $FAE6E6;\r\n gcLavenderblush = $F5F0FF;\r\n gcLawngreen = $00FC7C;\r\n gcLemonchiffon = $CDFAFF;\r\n gcLightblue = $E6D8AD;\r\n gcLightcoral = $8080F0;\r\n gcLightcyan = $FFFFE0;\r\n gcLightgoldenrodyellow = $D2FAFA;\r\n gcLightgray = $D3D3D3;\r\n gcLightgreen = $90EE90;\r\n gcLightgrey = $D3D3D3;\r\n gcLightpink = $C1B6FF;\r\n gcLightsalmon = $7AA0FF;\r\n gcLightseagreen = $AAB220;\r\n gcLightskyblue = $FACE87;\r\n gcLightslategray = $998877;\r\n gcLightslategrey = $998877;\r\n gcLightsteelblue = $DEC4B0;\r\n gcLightyellow = $E0FFFF;\r\n gcLtGray = $C0C0C0;\r\n gcMedGray = $A4A0A0;\r\n gcDkGray = $808080;\r\n gcMoneyGreen = $C0DCC0;\r\n gcLegacySkyBlue = $F0CAA6;\r\n gcCream = $F0FBFF;\r\n gcLime = $00FF00;\r\n gcLimegreen = $32CD32;\r\n gcLinen = $E6F0FA;\r\n gcMagenta = $FF00FF;\r\n gcMaroon = $000080;\r\n gcMediumaquamarine = $AACD66;\r\n gcMediumblue = $CD0000;\r\n gcMediumorchid = $D355BA;\r\n gcMediumpurple = $DB7093;\r\n gcMediumseagreen = $71B33C;\r\n gcMediumslateblue = $EE687B;\r\n gcMediumspringgreen = $9AFA00;\r\n gcMediumturquoise = $CCD148;\r\n gcMediumvioletred = $8515C7;\r\n gcMidnightblue = $701919;\r\n gcMintcream = $FAFFF5;\r\n gcMistyrose = $E1E4FF;\r\n gcMoccasin = $B5E4FF;\r\n gcNavajowhite = $ADDEFF;\r\n gcNavy = $800000;\r\n gcOldlace = $E6F5FD;\r\n gcOlive = $008080;\r\n gcOlivedrab = $238E6B;\r\n gcOrange = $00A5FF;\r\n gcOrangered = $0045FF;\r\n gcOrchid = $D670DA;\r\n gcPalegoldenrod = $AAE8EE;\r\n gcPalegreen = $98FB98;\r\n gcPaleturquoise = $EEEEAF;\r\n gcPalevioletred = $9370DB;\r\n gcPapayawhip = $D5EFFF;\r\n gcPeachpuff = $B9DAFF;\r\n gcPeru = $3F85CD;\r\n gcPink = $CBC0FF;\r\n gcPlum = $DDA0DD;\r\n gcPowderblue = $E6E0B0;\r\n gcPurple = $800080;\r\n gcRed = $0000FF;\r\n gcRosybrown = $8F8FBC;\r\n gcRoyalblue = $E16941;\r\n gcSaddlebrown = $13458B;\r\n gcSalmon = $7280FA;\r\n gcSandybrown = $60A4F4;\r\n gcSeagreen = $578B2E;\r\n gcSeashell = $EEF5FF;\r\n gcSienna = $2D52A0;\r\n gcSilver = $C0C0C0;\r\n gcSkyblue = $EBCE87;\r\n gcSlateblue = $CD5A6A;\r\n gcSlategray = $908070;\r\n gcSlategrey = $908070;\r\n gcSnow = $FAFAFF;\r\n gcSpringgreen = $7FFF00;\r\n gcSteelblue = $B48246;\r\n gcTan = $8CB4D2;\r\n gcTeal = $808000;\r\n gcThistle = $D8BFD8;\r\n gcTomato = $4763FF;\r\n gcTurquoise = $D0E040;\r\n gcViolet = $EE82EE;\r\n gcWheat = $B3DEF5;\r\n gcWhite = $FFFFFF;\r\n gcWhitesmoke = $F5F5F5;\r\n gcYellow = $00FFFF;\r\n gcYellowgreen = $32CD9A;\r\n gcNull = -1;\r\n {$ENDIF}\r\n\r\ntype\r\n {$IFDEF FMXLIB}\r\n TTMSFNCGraphicsColor = TAlphaColor;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n TTMSFNCGraphicsColor = TColor;\r\n {$ENDIF}\r\n\r\n TTMSFNCGraphicsColorEntry = record\r\n Value: TTMSFNCGraphicsColor;\r\n Name: PChar;\r\n end;\r\n\r\nconst\r\n TMSFNCGraphicsColorCount = 154;\r\n {$IFNDEF WEBLIB}\r\n TMSFNCGraphicsColors: array[0..TMSFNCGraphicsColorCount - 1] of TTMSFNCGraphicsColorEntry = (\r\n (Value: gcAliceblue; Name:'gcAliceblue'),\r\n (Value: gcAntiquewhite; Name:'gcAntiquewhite'),\r\n (Value: gcAqua; Name:'gcAqua'),\r\n (Value: gcAquamarine; Name:'gcAquamarine'),\r\n (Value: gcAzure; Name:'gcAzure'),\r\n (Value: gcBeige; Name:'gcBeige'),\r\n (Value: gcBisque; Name:'gcBisque'),\r\n (Value: gcBlack; Name:'gcBlack'),\r\n (Value: gcBlanchedalmond; Name:'gcBlanchedalmond'),\r\n (Value: gcBlue; Name:'gcBlue'),\r\n (Value: gcBlueviolet; Name:'gcBlueviolet'),\r\n (Value: gcBrown; Name:'gcBrown'),\r\n (Value: gcBurlywood; Name:'gcBurlywood'),\r\n (Value: gcCadetblue; Name:'gcCadetblue'),\r\n (Value: gcChartreuse; Name:'gcChartreuse'),\r\n (Value: gcChocolate; Name:'gcChocolate'),\r\n (Value: gcCoral; Name:'gcCoral'),\r\n (Value: gcCornflowerblue; Name:'gcCornflowerblue'),\r\n (Value: gcCornsilk; Name:'gcCornsilk'),\r\n (Value: gcCrimson; Name:'gcCrimson'),\r\n (Value: gcCyan; Name:'gcCyan'),\r\n (Value: gcDarkblue; Name:'gcDarkblue'),\r\n (Value: gcDarkcyan; Name:'gcDarkcyan'),\r\n (Value: gcDarkgoldenrod; Name:'gcDarkgoldenrod'),\r\n (Value: gcDarkgray; Name:'gcDarkgray'),\r\n (Value: gcDarkgreen; Name:'gcDarkgreen'),\r\n (Value: gcDarkgrey; Name:'gcDarkgrey'),\r\n (Value: gcDarkkhaki; Name:'gcDarkkhaki'),\r\n (Value: gcDarkmagenta; Name:'gcDarkmagenta'),\r\n (Value: gcDarkolivegreen; Name:'gcDarkolivegreen'),\r\n (Value: gcDarkorange; Name:'gcDarkorange'),\r\n (Value: gcDarkorchid; Name:'gcDarkorchid'),\r\n (Value: gcDarkred; Name:'gcDarkred'),\r\n (Value: gcDarksalmon; Name:'gcDarksalmon'),\r\n (Value: gcDarkseagreen; Name:'gcDarkseagreen'),\r\n (Value: gcDarkslateblue; Name:'gcDarkslateblue'),\r\n (Value: gcDarkslategray; Name:'gcDarkslategray'),\r\n (Value: gcDarkslategrey; Name:'gcDarkslategrey'),\r\n (Value: gcDarkturquoise; Name:'gcDarkturquoise'),\r\n (Value: gcDarkviolet; Name:'gcDarkviolet'),\r\n (Value: gcDeeppink; Name:'gcDeeppink'),\r\n (Value: gcDeepskyblue; Name:'gcDeepskyblue'),\r\n (Value: gcDimgray; Name:'gcDimgray'),\r\n (Value: gcDimgrey; Name:'gcDimgray'),\r\n (Value: gcDodgerblue; Name:'gcDodgerblue'),\r\n (Value: gcFirebrick; Name:'gcFirebrick'),\r\n (Value: gcFloralwhite; Name:'gcFloralwhite'),\r\n (Value: gcForestgreen; Name:'gcForestgreen'),\r\n (Value: gcFuchsia; Name:'gcFuchsia'),\r\n (Value: gcGainsboro; Name:'gcGainsboro'),\r\n (Value: gcGhostwhite; Name:'gcGhostwhite'),\r\n (Value: gcGold; Name:'gcGold'),\r\n (Value: gcGoldenrod; Name:'gcGoldenrod'),\r\n (Value: gcGray; Name:'gcGray'),\r\n (Value: gcGreen; Name:'gcGreen'),\r\n (Value: gcGreenyellow; Name:'gcGreenyellow'),\r\n (Value: gcGrey; Name:'gcGrey'),\r\n (Value: gcHoneydew; Name:'gcHoneydew'),\r\n (Value: gcHotpink; Name:'gcHotpink'),\r\n (Value: gcIndianred; Name:'gcIndianred'),\r\n (Value: gcIndigo; Name:'gcIndigo'),\r\n (Value: gcIvory; Name:'gcIvory'),\r\n (Value: gcKhaki; Name:'gcKhaki'),\r\n (Value: gcLavender; Name:'gcLavender'),\r\n (Value: gcLavenderblush; Name:'gcLavenderblush'),\r\n (Value: gcLawngreen; Name:'gcLawngreen'),\r\n (Value: gcLemonchiffon; Name:'gcLemonchiffon'),\r\n (Value: gcLightblue; Name:'gcLightblue'),\r\n (Value: gcLightcoral; Name:'gcLightcoral'),\r\n (Value: gcLightcyan; Name:'gcLightcyan'),\r\n (Value: gcLightgoldenrodyellow; Name:'gcLightgoldenrodyellow'),\r\n (Value: gcLightgray; Name:'gcLightgray'),\r\n (Value: gcLightgreen; Name:'gcLightgreen'),\r\n (Value: gcLightgrey; Name:'gcLightgrey'),\r\n (Value: gcLightpink; Name:'gcLightpink'),\r\n (Value: gcLightsalmon; Name:'gcLightsalmon'),\r\n (Value: gcLightseagreen; Name:'gcLightseagreen'),\r\n (Value: gcLightskyblue; Name:'gcLightskyblue'),\r\n (Value: gcLightslategray; Name:'gcLightslategray'),\r\n (Value: gcLightslategrey; Name:'gcLightslategrey'),\r\n (Value: gcLightsteelblue; Name:'gcLightsteelblue'),\r\n (Value: gcLightyellow; Name:'gcLightyellow'),\r\n (Value: gcLtGray; Name:'gcLtGray'),\r\n (Value: gcMedGray; Name:'gcMedGray'),\r\n (Value: gcDkGray; Name:'gcDkGray'),\r\n (Value: gcMoneyGreen; Name:'gcMoneyGreen'),\r\n (Value: gcLegacySkyBlue; Name:'gcLegacySkyBlue'),\r\n (Value: gcCream; Name:'gcCream'),\r\n (Value: gcLime; Name:'gcLime'),\r\n (Value: gcLimegreen; Name:'gcLimegreen'),\r\n (Value: gcLinen; Name:'gcLinen'),\r\n (Value: gcMagenta; Name:'gcMagenta'),\r\n (Value: gcMaroon; Name:'gcMaroon'),\r\n (Value: gcMediumaquamarine; Name:'gcMediumaquamarine'),\r\n (Value: gcMediumblue; Name:'gcMediumblue'),\r\n (Value: gcMediumorchid; Name:'gcMediumorchid'),\r\n (Value: gcMediumpurple; Name:'gcMediumpurple'),\r\n (Value: gcMediumseagreen; Name:'gcMediumseagreen'),\r\n (Value: gcMediumslateblue; Name:'gcMediumslateblue'),\r\n (Value: gcMediumspringgreen; Name:'gcMediumspringgreen'),\r\n (Value: gcMediumturquoise; Name:'gcMediumturquoise'),\r\n (Value: gcMediumvioletred; Name:'gcMediumvioletred'),\r\n (Value: gcMidnightblue; Name:'gcMidnightblue'),\r\n (Value: gcMintcream; Name:'gcMintcream'),\r\n (Value: gcMistyrose; Name:'gcMistyrose'),\r\n (Value: gcMoccasin; Name:'gcMoccasin'),\r\n (Value: gcNavajowhite; Name:'gcNavajowhite'),\r\n (Value: gcNavy; Name:'gcNavy'),\r\n (Value: gcOldlace; Name:'gcOldlace'),\r\n (Value: gcOlive; Name:'gcOlive'),\r\n (Value: gcOlivedrab; Name:'gcOlivedrab'),\r\n (Value: gcOrange; Name:'gcOrange'),\r\n (Value: gcOrangered; Name:'gcOrangered'),\r\n (Value: gcOrchid; Name:'gcOrchid'),\r\n (Value: gcPalegoldenrod; Name:'gcPalegoldenrod'),\r\n (Value: gcPalegreen; Name:'gcPalegreen'),\r\n (Value: gcPaleturquoise; Name:'gcPaleturquoise'),\r\n (Value: gcPalevioletred; Name:'gcPalevioletred'),\r\n (Value: gcPapayawhip; Name:'gcPapayawhip'),\r\n (Value: gcPeachpuff; Name:'gcPeachpuff'),\r\n (Value: gcPeru; Name:'gcPeru'),\r\n (Value: gcPink; Name:'gcPink'),\r\n (Value: gcPlum; Name:'gcPlum'),\r\n (Value: gcPowderblue; Name:'gcPowderblue'),\r\n (Value: gcPurple; Name:'gcPurple'),\r\n (Value: gcRed; Name:'gcRed'),\r\n (Value: gcRosybrown; Name:'gcRosybrown'),\r\n (Value: gcRoyalblue; Name:'gcRoyalblue'),\r\n (Value: gcSaddlebrown; Name:'gcSaddlebrown'),\r\n (Value: gcSalmon; Name:'gcSalmon'),\r\n (Value: gcSandybrown; Name:'gcSandybrown'),\r\n (Value: gcSeagreen; Name:'gcSeagreen'),\r\n (Value: gcSeashell; Name:'gcSeashell'),\r\n (Value: gcSienna; Name:'gcSienna'),\r\n (Value: gcSilver; Name:'gcSilver'),\r\n (Value: gcSkyblue; Name:'gcSkyblue'),\r\n (Value: gcSlateblue; Name:'gcSlateblue'),\r\n (Value: gcSlategray; Name:'gcSlategray'),\r\n (Value: gcSlategrey; Name:'gcSlategrey'),\r\n (Value: gcSnow; Name:'gcSnow'),\r\n (Value: gcSpringgreen; Name:'gcSpringgreen'),\r\n (Value: gcSteelblue; Name:'gcSteelblue'),\r\n (Value: gcTan; Name:'gcTan'),\r\n (Value: gcTeal; Name:'gcTeal'),\r\n (Value: gcThistle; Name:'gcThistle'),\r\n (Value: gcTomato; Name:'gcTomato'),\r\n (Value: gcTurquoise; Name:'gcTurquoise'),\r\n (Value: gcViolet; Name:'gcViolet'),\r\n (Value: gcWheat; Name:'gcWheat'),\r\n (Value: gcWhite; Name:'gcWhite'),\r\n (Value: gcWhitesmoke; Name:'gcWhitesmoke'),\r\n (Value: gcYellow; Name:'gcYellow'),\r\n (Value: gcYellowgreen; Name:'gcYellowgreen'),\r\n (Value: gcNull; Name:'gcNull'));\r\n {$ENDIF}\r\n\r\ntype\r\n TTMSFNCGraphicsStrokeKind = (gskNone, gskSolid, gskDash, gskDot, gskDashDot, gskDashDotDot);\r\n TTMSFNCGraphicsTextureMode = (gtmOriginal, gtmFit, gtmStretch, gtmCenter, gtmTile);\r\n TTMSFNCGraphicsFillKind = (gfkNone, gfkSolid, gfkGradient, gfkTexture);\r\n TTMSFNCGraphicsFillOrientation = (gfoHorizontal, gfoVertical);\r\n TTMSFNCGraphicsTextAlign = (gtaCenter, gtaLeading, gtaTrailing);\r\n TTMSFNCGraphicsTextTrimming = (gttNone, gttCharacter, gttWord);\r\n TTMSFNCGraphicsSide = (gsLeft, gsTop, gsRight, gsBottom);\r\n TTMSFNCGraphicsSides = set of TTMSFNCGraphicsSide;\r\n TTMSFNCGraphicsTextQuality = (gtqDefault, gtqAntiAliasing, gtqClearType);\r\n\r\nconst\r\n AllSides = [gsLeft, gsTop, gsRight, gsBottom];\r\n Epsilon: Single = 1E-40;\r\n\r\ntype\r\n TTMSFNCGraphicsStroke = class;\r\n TTMSFNCGraphicsFill = class;\r\n TTMSFNCGraphicsFont = class;\r\n\r\n TTMSFNCGraphicsSaveState = class(TPersistent)\r\n private\r\n {$IFDEF CMNWEBLIB}\r\n FSaveDC: Integer;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n FSaveDC: TCanvasSaveState;\r\n {$ENDIF}\r\n FFont: TTMSFNCGraphicsFont;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FFill: TTMSFNCGraphicsFill;\r\n FCustomSaveDC: Integer;\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property CustomSaveDC: Integer read FCustomSaveDC write FCustomSaveDC;\r\n {$IFDEF CMNWEBLIB}\r\n property SaveDC: Integer read FSaveDC write FSaveDC;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n property SaveDC: TCanvasSaveState read FSaveDC write FSaveDC;\r\n {$ENDIF}\r\n end;\r\n\r\n TTMSFNCCustomGraphicsFill = class(TPersistent)\r\n private\r\n FUpdateCount: Integer;\r\n FOnChanged: TNotifyEvent;\r\n FOrientation: TTMSFNCGraphicsFillOrientation;\r\n FKind: TTMSFNCGraphicsFillKind;\r\n FColor: TTMSFNCGraphicsColor;\r\n FColorTo: TTMSFNCGraphicsColor;\r\n FColorMirror: TTMSFNCGraphicsColor;\r\n FColorMirrorTo: TTMSFNCGraphicsColor;\r\n FOpacity: Single;\r\n FTexture: TTMSFNCBitmap;\r\n FTextureMode: TTMSFNCGraphicsTextureMode;\r\n procedure SetKind(const Value: TTMSFNCGraphicsFillKind);\r\n procedure SetOrientation(const Value: TTMSFNCGraphicsFillOrientation);\r\n procedure SetColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetColorTo(const Value: TTMSFNCGraphicsColor);\r\n procedure SetColorMirror(const Value: TTMSFNCGraphicsColor);\r\n procedure SetColorMirrorTo(const Value: TTMSFNCGraphicsColor);\r\n procedure SetOpacity(const Value: Single);\r\n function IsOpacityStored: Boolean;\r\n procedure SetTexture(const Value: TTMSFNCBitmap);\r\n procedure SetTextureMode(const Value: TTMSFNCGraphicsTextureMode);\r\n protected\r\n procedure Changed;\r\n procedure TextureChanged(Sender: TObject);\r\n property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;\r\n property Kind: TTMSFNCGraphicsFillKind read FKind write SetKind default gfkSolid;\r\n property Orientation: TTMSFNCGraphicsFillOrientation read FOrientation write SetOrientation default gfoVertical;\r\n property Color: TTMSFNCGraphicsColor read FColor write SetColor default gcWhite;\r\n property ColorTo: TTMSFNCGraphicsColor read FColorTo write SetColorTo default gcGray;\r\n property ColorMirror: TTMSFNCGraphicsColor read FColorMirror write SetColorMirror default gcNull;\r\n property ColorMirrorTo: TTMSFNCGraphicsColor read FColorMirrorTo write SetColorMirrorTo default gcNull;\r\n property Opacity: Single read FOpacity write SetOpacity stored IsOpacityStored nodefault;\r\n property Texture: TTMSFNCBitmap read FTexture write SetTexture;\r\n property TextureMode: TTMSFNCGraphicsTextureMode read FTextureMode write SetTextureMode default gtmStretch;\r\n public\r\n constructor Create(const AKind: TTMSFNCGraphicsFillKind = gfkSolid; const AColor: TTMSFNCGraphicsColor = gcWhite); virtual;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure BeginUpdate; virtual;\r\n procedure EndUpdate; virtual;\r\n end;\r\n\r\n TTMSFNCGraphicsFill = class(TTMSFNCCustomGraphicsFill)\r\n public\r\n {$IFDEF CMNWEBLIB}\r\n property Opacity;\r\n {$ENDIF}\r\n published\r\n property OnChanged;\r\n property Kind;\r\n property Orientation;\r\n property Color;\r\n property ColorTo;\r\n property ColorMirror;\r\n property ColorMirrorTo;\r\n property TextureMode;\r\n property Texture;\r\n {$IFDEF FMXLIB}\r\n property Opacity;\r\n {$ENDIF}\r\n end;\r\n\r\n TTMSFNCGraphicsFont = class(TFont)\r\n private\r\n FUpdateCount: Integer;\r\n FOnChanged: TNotifyEvent;\r\n {$IFDEF FMXLIB}\r\n FHeight: Integer;\r\n FColor: TTMSFNCGraphicsColor;\r\n procedure SetColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetName(const Value: string);\r\n function GetName: string;\r\n {$ENDIF}\r\n protected\r\n procedure DoChanged(Sender: TObject); {$IFDEF FMXLIB}reintroduce;{$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF LCLLIB}\r\n procedure Changed; override;\r\n {$ENDIF}\r\n {$ENDIF}\r\n public\r\n {$IFNDEF LCLLIB}\r\n constructor Create; virtual;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n constructor Create; override;\r\n {$ENDIF}\r\n procedure Assign(Source: TPersistent); override;\r\n procedure AssignSource(Source: TPersistent); virtual;\r\n {$IFDEF FMXLIB}\r\n property Height: Integer read FHeight write FHeight;\r\n published\r\n property Color: TTMSFNCGraphicsColor read FColor write SetColor default gcBlack;\r\n property Name: string read GetName write SetName;\r\n {$ENDIF}\r\n property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;\r\n procedure BeginUpdate; virtual;\r\n procedure EndUpdate; virtual;\r\n end;\r\n\r\n TTMSFNCCustomGraphicsStroke = class(TPersistent)\r\n private\r\n FUpdateCount: Integer;\r\n FOnChanged: TNotifyEvent;\r\n FKind: TTMSFNCGraphicsStrokeKind;\r\n FColor: TTMSFNCGraphicsColor;\r\n FWidth: Single;\r\n FOpacity: Single;\r\n procedure SetKind(const Value: TTMSFNCGraphicsStrokeKind);\r\n procedure SetColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetWidth(const Value: Single);\r\n procedure SetOpacity(const Value: Single);\r\n function IsOpacityStored: Boolean;\r\n function IsWidthStored: Boolean;\r\n protected\r\n procedure Changed;\r\n property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;\r\n property Kind: TTMSFNCGraphicsStrokeKind read FKind write SetKind default gskSolid;\r\n property Color: TTMSFNCGraphicsColor read FColor write SetColor default gcSilver;\r\n property Width: Single read FWidth write SetWidth stored IsWidthStored nodefault;\r\n property Opacity: Single read FOpacity write SetOpacity stored IsOpacityStored nodefault;\r\n public\r\n constructor Create(const AKind: TTMSFNCGraphicsStrokeKind = gskSolid; const AColor: TTMSFNCGraphicsColor = gcSilver); virtual;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure BeginUpdate; virtual;\r\n procedure EndUpdate; virtual;\r\n end;\r\n\r\n TTMSFNCGraphicsStroke = class(TTMSFNCCustomGraphicsStroke)\r\n public\r\n {$IFDEF CMNWEBLIB}\r\n property Opacity;\r\n {$ENDIF}\r\n published\r\n property OnChanged;\r\n property Kind;\r\n property Color;\r\n property Width;\r\n {$IFDEF FMXLIB}\r\n property Opacity;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCGraphicsVectorArray = array [0..2] of Single;\r\n\r\n TTMSFNCGraphicsVector = record\r\n case Integer of\r\n 0: (V: TTMSFNCGraphicsVectorArray;);\r\n 1: (X: Single;\r\n Y: Single;\r\n W: Single;);\r\n end;\r\n\r\n TTMSFNCGraphicsMatrixArray = array [0..2] of TTMSFNCGraphicsVector;\r\n\r\n TTMSFNCGraphicsMatrix = record\r\n private\r\n function Scale(const AFactor: Single): TTMSFNCGraphicsMatrix;\r\n public\r\n class function Identity: TTMSFNCGraphicsMatrix; static;\r\n class function CreateRotation(const AAngle: Single): TTMSFNCGraphicsMatrix; static;\r\n class function CreateScaling(const AScaleX, AScaleY: Single): TTMSFNCGraphicsMatrix; static;\r\n class function CreateTranslation(const ADeltaX, ADeltaY: Single): TTMSFNCGraphicsMatrix; static;\r\n {$IFDEF LCLLIB}\r\n class operator *(const AMatrix1, AMatrix2: TTMSFNCGraphicsMatrix): TTMSFNCGraphicsMatrix;\r\n class operator *(const APoint: TPointF; const AMatrix: TTMSFNCGraphicsMatrix): TPointF;\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n class operator Multiply(const AMatrix1, AMatrix2: TTMSFNCGraphicsMatrix): TTMSFNCGraphicsMatrix;\r\n class operator Multiply(const APoint: TPointF; const AMatrix: TTMSFNCGraphicsMatrix): TPointF;\r\n {$ENDIF}\r\n\r\n function Determinant: Single;\r\n function Adjoint: TTMSFNCGraphicsMatrix;\r\n function Inverse: TTMSFNCGraphicsMatrix;\r\n\r\n case Integer of\r\n 0: (M: TTMSFNCGraphicsMatrixArray;);\r\n 1: (m11, m12, m13: Single;\r\n m21, m22, m23: Single;\r\n m31, m32, m33: Single);\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCGraphicsMatrix = record\r\n m11, m12, m13: Single;\r\n m21, m22, m23: Single;\r\n m31, m32, m33: Single;\r\n end;\r\n {$ENDIF}\r\n\r\n TTMSFNCGraphicsPathPolygon = array of TPointF;\r\n\r\n TTMSFNCGraphicsPathPointKind = (gppMoveTo, gppLineTo, gppCurveTo, gppClose);\r\n\r\n TTMSFNCGraphicsPathCubicBezier = array[0..3] of TPointF;\r\n\r\n TTMSFNCGraphicsPathPoint = record\r\n Kind: TTMSFNCGraphicsPathPointKind;\r\n {$HINTS OFF}\r\n {$WARNINGS OFF}\r\n {$IF FPC_FULLVERSION < 30000}\r\n Dummy: Boolean;\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$WARNINGS ON}\r\n Point: TPointF;\r\n {$IFDEF LCLLIB}\r\n class operator = (z1, z2 : TTMSFNCGraphicsPathPoint) b : Boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n TTMSFNCGraphicsPathDrawMode = (pdmPolygon, pdmPolyline);\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCGraphicsPathPoints = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCGraphicsPathPoint;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCGraphicsPathPoint);\r\n public\r\n property Items[Index: Integer]: TTMSFNCGraphicsPathPoint read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCGraphicsPathPoints = class(TList);\r\n {$ENDIF}\r\n\r\n TTMSFNCGraphicsPath = class(TPersistent)\r\n private\r\n FStartPoint: TPointF;\r\n FClippable: Boolean;\r\n FPoints: TTMSFNCGraphicsPathPoints;\r\n procedure CalculateBezierCoefficients(const Bezier: TTMSFNCGraphicsPathCubicBezier; out AX, BX, CX, AY, BY, CY: Single);\r\n function GetCount: Integer;\r\n function GetPoint(AIndex: Integer): TTMSFNCGraphicsPathPoint;\r\n public\r\n constructor Create; virtual;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function LastPoint: TPointF;\r\n function IsPointVisible(const P: TPointF): Boolean;\r\n function IsRectVisible(const R: TRectF): Boolean;\r\n function PointOnBezier(const StartPoint: TPointF; const AX, BX, CX, AY, BY, CY, T: Single): TPointF;\r\n function CreateBezier(const Bezier: TTMSFNCGraphicsPathCubicBezier; const PointCount: Integer): TTMSFNCGraphicsPathPolygon;\r\n function GetBounds: TRectF;\r\n function IsClippable: Boolean;\r\n procedure MoveTo(const P: TPointF);\r\n procedure LineTo(const P: TPointF);\r\n procedure CurveTo(const ControlPoint1, ControlPoint2, EndPoint: TPointF);\r\n procedure SmoothCurveTo(const ControlPoint2, EndPoint: TPointF);\r\n procedure QuadCurveTo(const ControlPoint, EndPoint: TPointF);\r\n procedure AddPolygon(const APolygon: TTMSFNCGraphicsPathPolygon);\r\n procedure ClosePath;\r\n procedure AddLine(const StartPoint, EndPoint: TPointF);\r\n procedure AddEllipse(const ARect: TRectF);\r\n procedure AddRectangle(const ARect: TRectF);\r\n procedure AddArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single);\r\n procedure AddPath(APath: TTMSFNCGraphicsPath);\r\n procedure ApplyMatrix(AMatrix: TTMSFNCGraphicsMatrix);\r\n procedure Clear;\r\n procedure Flatten(const Flatness: Single = 0.25);\r\n procedure FlattenToPolygon(var Polygon: TTMSFNCGraphicsPathPolygon; const Flatness: Single = 0.25);\r\n property Count: Integer read GetCount;\r\n property Points[AIndex: Integer]: TTMSFNCGraphicsPathPoint read GetPoint; default;\r\n property PathData: TTMSFNCGraphicsPathPoints read FPoints;\r\n property Clippable: Boolean read FClippable write FClippable;\r\n end;\r\n\r\n TTMSFNCGraphicsColorObject = class\r\n private\r\n FColor: TTMSFNCGraphicsColor;\r\n public\r\n constructor Create(AColor: TTMSFNCGraphicsColor);\r\n property Color: TTMSFNCGraphicsColor read FColor write FColor;\r\n end;\r\n\r\n TTMSFNCGraphicsModifyRectMode = (gcrmNone, gcrmExpandAll, gcrmShrinkAll, gcrmShiftRightAndExpandHeight, gcrmShiftDownAndExpandWidth,\r\n gcrmShiftRightAndShrinkHeight, gcrmShiftRightDown, gcrmShiftRightUp, gcrmShiftLeftUp, gcrmShiftLeftDown, gcrmShiftUpAndExpandWidth,\r\n gcrmShiftLeftAndExpandHeight);\r\n TTMSFNCGraphicsModifyPointMode = (gcpmNone, gcpmLeftUp, gcpmRightDown, gcpmLeftDown, gcpmRightUp);\r\n TTMSFNCGraphicsExpanderState = (gesCollapsed, gesExpanded);\r\n TTMSFNCGraphicsCompactState = (gcsCollapsed, gcsExpanded);\r\n\r\n TTMSFNCGraphicsCorner = (gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight);\r\n TTMSFNCGraphicsCorners = set of TTMSFNCGraphicsCorner;\r\n\r\nfunction ModifyRect(const ARect: TRectF; const {%H-}ARectMode: TTMSFNCGraphicsModifyRectMode): TRectF;\r\nfunction ModifyPoint(const APoint: TPointF; const {%H-}APointMode: TTMSFNCGraphicsModifyPointMode): TPointF;\r\nfunction MakeGraphicsColor(ARed, AGreen, ABlue: Byte{$IFDEF FMXLIB};AAlpha: Byte = 255{$ENDIF}): TTMSFNCGraphicsColor;\r\nfunction Lighter(AColor: TTMSFNCGraphicsColor; APercent: Byte): TTMSFNCGraphicsColor;\r\nfunction Darker(AColor: TTMSFNCGraphicsColor; APercent: Byte): TTMSFNCGraphicsColor;\r\nfunction Blend(AColor1: TTMSFNCGraphicsColor; AColor2: TTMSFNCGraphicsColor; ALevel: Byte): TTMSFNCGraphicsColor;\r\nfunction ColorLookup: TStringList;\r\nfunction PointInPoly(APoint: TPointF; APolygon: TTMSFNCGraphicsPathPolygon): Boolean;\r\nfunction RectInPoly(ARect: TRectF; APolygon: TTMSFNCGraphicsPathPolygon): Boolean;\r\nfunction PolyInRect(APolygon: TTMSFNCGraphicsPathPolygon; ARect: TRectF): Boolean;\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF WEBLIB}\r\nprocedure DrawGradient(ACanvas: TCanvas; AColor, AColorTo: TColor; ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; ADirection: Boolean);\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nprocedure DrawGradient(ACanvas: TCanvas; AColor, AColorTo: TColor; ARect: TRect; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; ADirection: Boolean);\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\nfunction MatrixIdentity: TTMSFNCGraphicsMatrix;\r\nfunction MatrixCreateRotation(const AAngle: Single): TTMSFNCGraphicsMatrix;\r\nfunction MatrixCreateScaling(const AScaleX, AScaleY: Single): TTMSFNCGraphicsMatrix;\r\nfunction MatrixCreateTranslation(const ADeltaX, ADeltaY: Single): TTMSFNCGraphicsMatrix;\r\nfunction MatrixMultiply(const AMatrix1, AMatrix2: TTMSFNCGraphicsMatrix): TTMSFNCGraphicsMatrix; overload;\r\nfunction MatrixMultiply(const APoint: TPointF; const AMatrix: TTMSFNCGraphicsMatrix): TPointF; overload;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.TMSFNCUtils, SysUtils, Math\r\n {$IFDEF FMXLIB}\r\n ,UIConsts\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFNDEF MSWINDOWS}\r\n ,LCLIntF\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\nvar\r\n FColorLookup: TStringList;\r\n\r\nfunction MatrixIdentity: TTMSFNCGraphicsMatrix;\r\nbegin\r\n Result.m11 := 1;\r\n Result.m12 := 0;\r\n Result.m13 := 0;\r\n Result.m21 := 0;\r\n Result.m22 := 1;\r\n Result.m23 := 0;\r\n Result.m31 := 0;\r\n Result.m32 := 0;\r\n Result.m33 := 1;\r\nend;\r\n\r\nfunction MatrixCreateRotation(const AAngle: Single): TTMSFNCGraphicsMatrix;\r\nvar\r\n S, C: Single;\r\nbegin\r\n S := Sin(AAngle);\r\n C := Cos(AAngle);\r\n Result := MatrixIdentity;\r\n Result.m11 := C;\r\n Result.m12 := S;\r\n Result.m21 := -S;\r\n Result.m22 := C;\r\nend;\r\n\r\nfunction MatrixCreateScaling(const AScaleX, AScaleY: Single): TTMSFNCGraphicsMatrix;\r\nbegin\r\n Result := MatrixIdentity;\r\n Result.m11 := AScaleX;\r\n Result.m22 := AScaleY;\r\nend;\r\n\r\nfunction MatrixCreateTranslation(const ADeltaX, ADeltaY: Single): TTMSFNCGraphicsMatrix;\r\nbegin\r\n Result := MatrixIdentity;\r\n Result.m31 := ADeltaX;\r\n Result.m32 := ADeltaY;\r\nend;\r\n\r\nfunction MatrixMultiply(const APoint: TPointF; const AMatrix: TTMSFNCGraphicsMatrix): TPointF;\r\nbegin\r\n Result.X := APoint.X * AMatrix.m11 + APoint.Y * AMatrix.m21 + AMatrix.m31;\r\n Result.Y := APoint.X * AMatrix.m12 + APoint.Y * AMatrix.m22 + AMatrix.m32;\r\nend;\r\n\r\nfunction MatrixMultiply(const AMatrix1, AMatrix2: TTMSFNCGraphicsMatrix): TTMSFNCGraphicsMatrix;\r\nbegin\r\n Result.m11 := AMatrix1.m11 * AMatrix2.m11 + AMatrix1.m12 * AMatrix2.m21 + AMatrix1.m13 * AMatrix2.m31;\r\n Result.m12 := AMatrix1.m11 * AMatrix2.m12 + AMatrix1.m12 * AMatrix2.m22 + AMatrix1.m13 * AMatrix2.m32;\r\n Result.m13 := AMatrix1.m11 * AMatrix2.m13 + AMatrix1.m12 * AMatrix2.m23 + AMatrix1.m13 * AMatrix2.m33;\r\n Result.m21 := AMatrix1.m21 * AMatrix2.m11 + AMatrix1.m22 * AMatrix2.m21 + AMatrix1.m23 * AMatrix2.m31;\r\n Result.m22 := AMatrix1.m21 * AMatrix2.m12 + AMatrix1.m22 * AMatrix2.m22 + AMatrix1.m23 * AMatrix2.m32;\r\n Result.m23 := AMatrix1.m21 * AMatrix2.m13 + AMatrix1.m22 * AMatrix2.m23 + AMatrix1.m23 * AMatrix2.m33;\r\n Result.m31 := AMatrix1.m31 * AMatrix2.m11 + AMatrix1.m32 * AMatrix2.m21 + AMatrix1.m33 * AMatrix2.m31;\r\n Result.m32 := AMatrix1.m31 * AMatrix2.m12 + AMatrix1.m32 * AMatrix2.m22 + AMatrix1.m33 * AMatrix2.m32;\r\n Result.m33 := AMatrix1.m31 * AMatrix2.m13 + AMatrix1.m32 * AMatrix2.m23 + AMatrix1.m33 * AMatrix2.m33;\r\nend;\r\n\r\nfunction ModifyRect(const ARect: TRectF; const ARectMode: TTMSFNCGraphicsModifyRectMode): TRectF;\r\nbegin\r\n Result := ARect;\r\n {$IFDEF FMXWEBLIB}\r\n case ARectMode of\r\n gcrmExpandAll: Result := RectF(int(Result.Left) - 0.5, int(Result.Top) - 0.5, int(Result.Right) + 0.5, int(Result.Bottom) + 0.5);\r\n gcrmShrinkAll: Result := RectF(int(Result.Left) + 0.5, int(Result.Top) + 0.5, int(Result.Right) - 0.5, int(Result.Bottom) - 0.5);\r\n gcrmShiftRightAndExpandHeight: Result := RectF(int(Result.Left) + 0.5, int(Result.Top) - 0.5, int(Result.Right) + 0.5, int(Result.Bottom) + 0.5);\r\n gcrmShiftRightDown: Result := RectF(int(Result.Left) + 0.5, int(Result.Top) + 0.5, int(Result.Right) + 0.5, int(Result.Bottom) + 0.5);\r\n gcrmShiftRightAndShrinkHeight: Result := RectF(int(Result.Left) + 0.5, int(Result.Top) + 0.5, int(Result.Right) + 0.5, int(Result.Bottom) - 0.5);\r\n gcrmShiftDownAndExpandWidth: Result := RectF(int(Result.Left) - 0.5, int(Result.Top) + 0.5, int(Result.Right) + 0.5, int(Result.Bottom) + 0.5);\r\n gcrmShiftUpAndExpandWidth: Result := RectF(int(Result.Left) - 0.5, int(Result.Top) - 0.5, int(Result.Right) + 0.5, int(Result.Bottom) - 0.5);\r\n gcrmShiftRightUp: Result := RectF(Int(Result.Left) + 0.5, Int(Result.Top) - 0.5, Int(Result.Right) + 0.5, Int(Result.Bottom) - 0.5);\r\n gcrmShiftLeftUp: Result := RectF(Int(Result.Left) - 0.5, Int(Result.Top) - 0.5, Int(Result.Right) - 0.5, Int(Result.Bottom) - 0.5);\r\n gcrmShiftLeftDown: Result := RectF(Int(Result.Left) - 0.5, Int(Result.Top) + 0.5, Int(Result.Right) - 0.5, Int(Result.Bottom) + 0.5);\r\n gcrmShiftLeftAndExpandHeight: Result := RectF(int(Result.Left) - 0.5, int(Result.Top) - 0.5, int(Result.Right) - 0.5, int(Result.Bottom) + 0.5);\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction ModifyPoint(const APoint: TPointF; const APointMode: TTMSFNCGraphicsModifyPointMode): TPointF;\r\nbegin\r\n Result := APoint;\r\n {$IFDEF FMXWEBLIB}\r\n case APointMode of\r\n gcpmRightDown: Result := PointF(Int(Result.X) + 0.5, Int(Result.Y) + 0.5);\r\n gcpmLeftUp: Result := PointF(Int(Result.X) - 0.5, Int(Result.Y) - 0.5);\r\n gcpmRightUp: Result := PointF(Int(Result.X) + 0.5, Int(Result.Y) - 0.5);\r\n gcpmLeftDown: Result := PointF(Int(Result.X) - 0.5, Int(Result.Y) + 0.5);\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction ColorLookup: TStringList;\r\nbegin\r\n Result := FColorLookup;\r\nend;\r\n\r\nfunction PolyInRect(APolygon: TTMSFNCGraphicsPathPolygon; ARect: TRectF): Boolean;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := False;\r\n for I := 0 to Length(APolygon) - 1 do\r\n begin\r\n if PtInRectEx(ARect, APolygon[I]) then\r\n begin\r\n Result := True;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction RectInPoly(ARect: TRectF; APolygon: TTMSFNCGraphicsPathPolygon): Boolean;\r\nbegin\r\n Result := PointInPoly(PointF(ARect.Left, ARect.Top), APolygon)\r\n or PointInPoly(PointF(ARect.Right, ARect.Top), APolygon)\r\n or PointInPoly(PointF(ARect.Left, ARect.Bottom), APolygon)\r\n or PointInPoly(PointF(ARect.Right, ARect.Bottom), APolygon);\r\nend;\r\n\r\nfunction PointInPoly(APoint: TPointF; APolygon: TTMSFNCGraphicsPathPolygon): Boolean;\r\nvar\r\n minX, maxX, minY, maxY: Double;\r\n I, J: Integer;\r\n q: TPointF;\r\n pt, ptn: TPointF;\r\n inside, chk: Boolean;\r\n calc: Double;\r\n chkc: Boolean;\r\nbegin\r\n Result := False;\r\n if Length(APolygon) = 0 then\r\n Exit;\r\n\r\n minX := APolygon[0].X;\r\n maxX := APolygon[0].X;\r\n minY := APolygon[0].Y;\r\n maxY := APolygon[0].Y;\r\n\r\n for I := 1 to Length(APolygon) - 1 do\r\n begin\r\n q := APolygon[I];\r\n minX := Min(q.X, minX);\r\n maxX := Max(q.X, maxX);\r\n minY := Min(q.Y, minY);\r\n maxY := Max(q.Y, maxY);\r\n end;\r\n\r\n if (APoint.X < minX) or (APoint.X > maxX) or (APoint.Y < minY) or (APoint.Y > maxY) then\r\n begin\r\n Result := False;\r\n Exit;\r\n end;\r\n\r\n inside := False;\r\n J := Length(APolygon) - 1;\r\n for I := 0 to Length(APolygon) - 1 do\r\n begin\r\n pt := APolygon[I];\r\n ptn := APolygon[J];\r\n chk := (pt.Y > APoint.Y) <> (ptn.Y > APoint.Y);\r\n if (ptn.Y - pt.Y) <> 0 then\r\n begin\r\n calc := (ptn.X - pt.X) * (APoint.Y - pt.Y) / (ptn.Y - pt.Y) + pt.X;\r\n chkc := APoint.X < calc;\r\n if chk and chkc then\r\n inside := not inside;\r\n end;\r\n\r\n j := I;\r\n end;\r\n Result := inside;\r\nend;\r\n\r\nfunction Blend(AColor1: TTMSFNCGraphicsColor; AColor2: TTMSFNCGraphicsColor; ALevel: Byte): TTMSFNCGraphicsColor;\r\nvar\r\n c1, c2: LongInt;\r\n r, g, b, v1, v2: byte;\r\nbegin\r\n ALevel := Round(2.55 * ALevel);\r\n {$IFDEF CMNWEBLIB}\r\n c1 := ColorToRGB(AColor1);\r\n c2 := ColorToRGB(AColor2);\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n c1 := AColor1;\r\n c2 := AColor2;\r\n {$ENDIF}\r\n v1 := Byte(c1);\r\n v2 := Byte(c2);\r\n r := Max(0, Min(255, ALevel * (v1 - v2) shr 8 + v2));\r\n v1 := Byte(c1 shr 8);\r\n v2 := Byte(c2 shr 8);\r\n g := Max(0, Min(255, ALevel * (v1 - v2) shr 8 + v2));\r\n v1 := Byte(c1 shr 16);\r\n v2 := Byte(c2 shr 16);\r\n b := Max(0, Min(255, ALevel * (v1 - v2) shr 8 + v2));\r\n {$IFDEF CMNWEBLIB}\r\n Result := (b shl 16) + (g shl 8) + r;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n Result := MakeGraphicsColor(r, g, b);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction Lighter(AColor: TTMSFNCGraphicsColor; APercent: Byte): TTMSFNCGraphicsColor;\r\nvar\r\n r, g, b: Byte;\r\nbegin\r\n {$IFDEF CMNWEBLIB}\r\n AColor := ColorToRGB(AColor);\r\n r := GetRValue(AColor);\r\n g := GetGValue(AColor);\r\n b := GetBValue(AColor);\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n r := TAlphaColorRec(AColor).R;\r\n g := TAlphaColorRec(AColor).G;\r\n b := TAlphaColorRec(AColor).B;\r\n {$ENDIF}\r\n\r\n r := r + Min(255, TTMSFNCUtils.MulDivInt(255 - r, APercent, 100));\r\n g := g + Min(255, TTMSFNCUtils.MulDivInt(255 - g, APercent, 100));\r\n b := b + Min(255, TTMSFNCUtils.MulDivInt(255 - b, APercent, 100));\r\n\r\n {$IFDEF FMXLIB}\r\n Result := MakeGraphicsColor(r, g, b, TAlphaColorRec(AColor).A);\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n Result := MakeGraphicsColor(r, g, b);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction Darker(AColor: TTMSFNCGraphicsColor; APercent: Byte): TTMSFNCGraphicsColor;\r\nvar\r\n r, g, b: Byte;\r\nbegin\r\n {$IFDEF CMNWEBLIB}\r\n AColor := ColorToRGB(AColor);\r\n r := GetRValue(AColor);\r\n g := GetGValue(AColor);\r\n b := GetBValue(AColor);\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n r := TAlphaColorRec(AColor).R;\r\n g := TAlphaColorRec(AColor).G;\r\n b := TAlphaColorRec(AColor).B;\r\n {$ENDIF}\r\n\r\n r := r - Max(0, TTMSFNCUtils.MulDivInt(255 - r, APercent, 100));\r\n g := g - Max(0, TTMSFNCUtils.MulDivInt(255 - g, APercent, 100));\r\n b := b - Max(0, TTMSFNCUtils.MulDivInt(255 - b, APercent, 100));\r\n\r\n {$IFDEF FMXLIB}\r\n Result := MakeGraphicsColor(r, g, b, TAlphaColorRec(AColor).A);\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n Result := MakeGraphicsColor(r, g, b);\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF WEBLIB}\r\nprocedure DrawGradient(ACanvas: TCanvas; AColor, AColorTo: TColor;\r\n ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; ADirection: Boolean);\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nprocedure DrawGradient(ACanvas: TCanvas; AColor, AColorTo: TColor;\r\n ARect: TRect; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; ADirection: Boolean);\r\n{$ENDIF}\r\nvar\r\n diffr,startr,endr: Integer;\r\n diffg,startg,endg: Integer;\r\n diffb,startb,endb: Integer;\r\n si: Integer;\r\n rstepr,rstepg,rstepb,rstepw: Single;\r\n i,stepw: Word;\r\n oldp, oldb: TColor;\r\n Steps: Integer;\r\n {$IFDEF WEBLIB}\r\n R, dr: TRectF;\r\n iend: Single;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n R, dr: TRect;\r\n iend: Integer;\r\n {$ENDIF}\r\n a: Single;\r\n oldps: TPenStyle;\r\n oldbs: TBrushStyle;\r\nbegin\r\n R := ARect;\r\n\r\n {$IFDEF WEBLIB}\r\n if ADirection then\r\n Steps := Round(R.Right - R.Left)\r\n else\r\n Steps := Round(R.Bottom - R.Top);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if ADirection then\r\n Steps := R.Right - R.Left\r\n else\r\n Steps := R.Bottom - R.Top;\r\n {$ENDIF}\r\n\r\n if Steps = 0 then\r\n Steps := 1;\r\n\r\n AColor := ColorToRGB(AColor);\r\n AColorTo := ColorToRGB(AColorTo);\r\n\r\n startr := (AColor and $0000FF);\r\n startg := (AColor and $00FF00) shr 8;\r\n startb := (AColor and $FF0000) shr 16;\r\n\r\n endr := (AColorTo and $0000FF);\r\n endg := (AColorTo and $00FF00) shr 8;\r\n endb := (AColorTo and $FF0000) shr 16;\r\n\r\n diffr := endr - startr;\r\n diffg := endg - startg;\r\n diffb := endb - startb;\r\n\r\n rstepr := diffr / steps;\r\n rstepg := diffg / steps;\r\n rstepb := diffb / steps;\r\n\r\n if ADirection then\r\n rstepw := (R.Right - R.Left) / Steps\r\n else\r\n rstepw := (R.Bottom - R.Top) / Steps;\r\n\r\n with ACanvas do\r\n begin\r\n oldb := Brush.Color;\r\n oldbs := Brush.Style;\r\n oldp := Pen.Color;\r\n oldps := Pen.Style;\r\n Pen.Style := psSolid;\r\n Brush.Style := bsSolid;\r\n for i := 0 to Steps - 1 do\r\n begin\r\n endr := startr + Round(rstepr*i);\r\n endg := startg + Round(rstepg*i);\r\n endb := startb + Round(rstepb*i);\r\n stepw := Round(i*rstepw);\r\n Pen.Color := endr + (endg shl 8) + (endb shl 16);\r\n Brush.Color := Pen.Color;\r\n\r\n if ADirection then\r\n begin\r\n si := Trunc(rstepw);\r\n iend := R.Left + stepw + si;\r\n iend := Min(iend, R.Right);\r\n\r\n dr := r;\r\n\r\n if (I <= ARounding) and ((gcTopLeft in ACorners) or (gcBottomLeft in ACorners)) then\r\n begin\r\n a := SQRT(Power(ARounding, 2) - Power(ARounding - I, 2));\r\n\r\n if (gcTopLeft in ACorners) then\r\n dr.Top := dr.Top + Round(ARounding - a);\r\n\r\n if (gcBottomLeft in ACorners) then\r\n dr.Bottom := dr.Bottom - Round(ARounding - a);\r\n end\r\n else if (I >= Steps - ARounding) and ((gcBottomRight in ACorners) or (gcTopRight in ACorners)) then\r\n begin\r\n a := SQRT(Power(ARounding, 2) - Power(ARounding - (Steps - I), 2));\r\n\r\n if (gcTopRight in ACorners) then\r\n dr.Top := dr.Top + Round(ARounding - a);\r\n\r\n if (gcBottomRight in ACorners) then\r\n dr.Bottom := dr.Bottom - Round(ARounding - a);\r\n end;\r\n\r\n Rectangle(dr.Left + stepw, dr.Top, iend, dr.Bottom)\r\n end\r\n else\r\n begin\r\n si := Trunc(rstepw);\r\n iend := R.Top + stepw + si;\r\n iend := Min(iend, r.Bottom);\r\n\r\n dr := r;\r\n\r\n if (I <= ARounding) and ((gcTopLeft in ACorners) or (gcTopRight in ACorners)) then\r\n begin\r\n a := SQRT(Power(ARounding, 2) - Power(ARounding - I, 2));\r\n\r\n if (gcTopLeft in ACorners) then\r\n dr.Left := dr.Left + Round(ARounding - a);\r\n\r\n if (gcTopRight in ACorners) then\r\n dr.Right := dr.Right - Round(ARounding - a);\r\n end\r\n else if (I >= Steps - ARounding) and ((gcBottomLeft in ACorners) or (gcBottomRight in ACorners)) then\r\n begin\r\n a := SQRT(Power(ARounding, 2) - Power(ARounding - (Steps - I), 2));\r\n\r\n if (gcBottomLeft in ACorners) then\r\n dr.Left := dr.Left + Round(ARounding - a);\r\n\r\n if (gcBottomRight in ACorners) then\r\n dr.Right := dr.Right - Round(ARounding - a);\r\n end;\r\n\r\n Rectangle(dr.Left, dr.Top + stepw, dr.Right, iend);\r\n end;\r\n end;\r\n Brush.Color := oldb;\r\n Brush.Style := oldbs;\r\n Pen.Color := oldp;\r\n Pen.style := oldps;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction MakeGraphicsColor(ARed, AGreen, ABlue: Byte{$IFDEF FMXLIB};AAlpha: Byte = 255{$ENDIF}): TTMSFNCGraphicsColor;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := MakeColor(ARed, AGreen, ABlue, AAlpha);\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n Result := RGB(ARed, AGreen, ABlue);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Result := RGBToColor(ARed, AGreen, ABlue);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Result := RGB(ARed, AGreen, ABlue);\r\n {$ENDIF}\r\nend;\r\n\r\n{ TTMSFNCGraphicsFont }\r\n\r\nprocedure TTMSFNCGraphicsFont.BeginUpdate;\r\nbegin\r\n Inc(FUpdateCount);\r\nend;\r\n\r\nconstructor TTMSFNCGraphicsFont.Create;\r\nbegin\r\n inherited Create;\r\n {$IFDEF FMXLIB}\r\n FColor := gcBlack;\r\n inherited OnChanged := DoChanged;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n OnChange := @DoChanged;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsFont.EndUpdate;\r\nbegin\r\n Dec(FUpdateCount);\r\n DoChanged(Self);\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF LCLLIB}\r\nprocedure TTMSFNCGraphicsFont.Changed;\r\nbegin\r\n inherited;\r\n DoChanged(Self);\r\nend;\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCGraphicsFont.DoChanged(Sender: TObject);\r\nbegin\r\n if Assigned(OnChanged) and (FUpdateCount = 0) then\r\n OnChanged(Self);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsFont.AssignSource(Source: TPersistent);\r\nbegin\r\n Assign(Source);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsFont.Assign(Source: TPersistent);\r\nbegin\r\n inherited Assign(Source);\r\n {$IFDEF FMXLIB}\r\n if Source is TTMSFNCGraphicsFont then\r\n FColor := (Source as TTMSFNCGraphicsFont).Color;\r\n {$ENDIF}\r\n DoChanged(Self);\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCGraphicsFont.SetName(const Value: string);\r\nbegin\r\n Family := Value;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsFont.GetName: string;\r\nbegin\r\n Result := Family;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsFont.SetColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColor <> Value then\r\n begin\r\n FColor := Value;\r\n {$IFDEF CMNWEBLIB}\r\n if FColor = clNone then\r\n FColor := gcNull\r\n else if FColor = clDefault then\r\n FColor := clBtnFace;\r\n {$ENDIF}\r\n DoChanged(Self);\r\n end;\r\nend;\r\n\r\n{$ENDIF}\r\n\r\n{ TTMSFNCGraphicsSaveState }\r\n\r\nconstructor TTMSFNCGraphicsSaveState.Create;\r\nbegin\r\n inherited;\r\n FFill := TTMSFNCGraphicsFill.Create;\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\nend;\r\n\r\ndestructor TTMSFNCGraphicsSaveState.Destroy;\r\nbegin\r\n FFill.Free;\r\n FStroke.Free;\r\n FFont.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsSaveState.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsSaveState.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.AssignSource(Value);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsSaveState.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\n{ TTMSFNCCustomGraphicsFill }\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomGraphicsFill then\r\n begin\r\n FColor := (Source as TTMSFNCCustomGraphicsFill).Color;\r\n FColorTo := (Source as TTMSFNCCustomGraphicsFill).ColorTo;\r\n FColorMirror := (Source as TTMSFNCCustomGraphicsFill).ColorMirror;\r\n FColorMirrorTo := (Source as TTMSFNCCustomGraphicsFill).ColorMirrorTo;\r\n FKind := (Source as TTMSFNCCustomGraphicsFill).Kind;\r\n FOrientation := (Source as TTMSFNCCustomGraphicsFill).Orientation;\r\n FOpacity := (Source as TTMSFNCCustomGraphicsFill).Opacity;\r\n FTexture.Assign((Source as TTMSFNCCustomGraphicsFill).Texture);\r\n FTextureMode := (Source as TTMSFNCCustomGraphicsFill).TextureMode;\r\n end\r\n else if Source is TTMSFNCCustomGraphicsStroke then\r\n begin\r\n FColor := (Source as TTMSFNCCustomGraphicsStroke).Color;\r\n FColorTo := gcNull;\r\n FColorMirror := gcNull;\r\n FColorMirrorTo := gcNull;\r\n FKind := gfkSolid;\r\n FOrientation := gfoVertical;\r\n FOpacity := 1;\r\n end;\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.BeginUpdate;\r\nbegin\r\n inc(FUpdateCount);\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.Changed;\r\nbegin\r\n if Assigned(OnChanged) and (FUpdateCount = 0) then\r\n OnChanged(Self);\r\nend;\r\n\r\nconstructor TTMSFNCCustomGraphicsFill.Create(const AKind: TTMSFNCGraphicsFillKind = gfkSolid; const AColor: TTMSFNCGraphicsColor = gcWhite);\r\nbegin\r\n FKind := AKind;\r\n FColor := AColor;\r\n FOpacity := 1;\r\n FOrientation := gfoVertical;\r\n FColorTo := gcGray;\r\n FColorMirror := gcNull;\r\n FColorMirrorTo := gcNull;\r\n FTextureMode := gtmStretch;\r\n FTexture := TTMSFNCBitmap.Create;\r\n FTexture.OnChange := @TextureChanged;\r\nend;\r\n\r\ndestructor TTMSFNCCustomGraphicsFill.Destroy;\r\nbegin\r\n FTexture.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.EndUpdate;\r\nbegin\r\n Dec(FUpdateCount);\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColor <> Value then\r\n begin\r\n FColor := Value;\r\n {$IFDEF CMNWEBLIB}\r\n if FColor = clNone then\r\n FColor := gcNull\r\n else if FColor = clDefault then\r\n FColor := clBtnFace;\r\n {$ENDIF}\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetColorTo(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColorTo <> Value then\r\n begin\r\n FColorTo := Value;\r\n {$IFDEF CMNWEBLIB}\r\n if FColorTo = clNone then\r\n FColorTo := gcNull\r\n else if FColorTo = clDefault then\r\n FColorTo := clBtnFace;\r\n {$ENDIF}\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetColorMirror(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColorMirror <> Value then\r\n begin\r\n FColorMirror := Value;\r\n {$IFDEF CMNWEBLIB}\r\n if FColorMirror = clNone then\r\n FColorMirror := gcNull\r\n else if FColorMirror = clDefault then\r\n FColorMirror := clBtnFace;\r\n {$ENDIF}\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetColorMirrorTo(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColorMirrorTo <> Value then\r\n begin\r\n FColorMirrorTo := Value;\r\n {$IFDEF CMNWEBLIB}\r\n if FColorMirrorTo = clNone then\r\n FColorMirrorTo := gcNull\r\n else if FColorMirrorTo = clDefault then\r\n FColorMirrorTo := clBtnFace;\r\n {$ENDIF}\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetKind(const Value: TTMSFNCGraphicsFillKind);\r\nbegin\r\n if FKind <> Value then\r\n begin\r\n FKind := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetOrientation(const Value: TTMSFNCGraphicsFillOrientation);\r\nbegin\r\n if FOrientation <> Value then\r\n begin\r\n FOrientation := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetTexture(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FTexture <> Value then\r\n begin\r\n FTexture.Assign(Value);\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetTextureMode(\r\n const Value: TTMSFNCGraphicsTextureMode);\r\nbegin\r\n if FTextureMode <> Value then\r\n begin\r\n FTextureMode := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.TextureChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsFill.SetOpacity(const Value: Single);\r\nbegin\r\n if FOpacity <> Value then\r\n begin\r\n FOpacity := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomGraphicsFill.IsOpacityStored: Boolean;\r\nbegin\r\n Result := Opacity <> 1;\r\nend;\r\n\r\n{ TTMSFNCCustomGraphicsStroke }\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomGraphicsStroke then\r\n begin\r\n FColor := (Source as TTMSFNCCustomGraphicsStroke).Color;\r\n FKind := (Source as TTMSFNCCustomGraphicsStroke).Kind;\r\n FOpacity := (Source as TTMSFNCCustomGraphicsStroke).Opacity;\r\n FWidth := (Source as TTMSFNCCustomGraphicsStroke).Width;\r\n end\r\n else if Source is TTMSFNCCustomGraphicsFill then\r\n begin\r\n FColor := (Source as TTMSFNCCustomGraphicsFill).Color;\r\n FKind := gskSolid;\r\n FOpacity := 1;\r\n FWidth := 1;\r\n end;\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.BeginUpdate;\r\nbegin\r\n Inc(FUpdateCount);\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.Changed;\r\nbegin\r\n if Assigned(OnChanged) and (FUpdateCount = 0) then\r\n OnChanged(Self);\r\nend;\r\n\r\nconstructor TTMSFNCCustomGraphicsStroke.Create(const AKind: TTMSFNCGraphicsStrokeKind = gskSolid; const AColor: TTMSFNCGraphicsColor = gcSilver);\r\nbegin\r\n FKind := AKind;\r\n FColor := AColor;\r\n FOpacity := 1;\r\n FWidth := 1;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.EndUpdate;\r\nbegin\r\n Dec(FUpdateCount);\r\n Changed;\r\nend;\r\n\r\nfunction TTMSFNCCustomGraphicsStroke.IsWidthStored: Boolean;\r\nbegin\r\n Result := Width <> 1;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.SetColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColor <> Value then\r\n begin\r\n FColor := Value;\r\n {$IFDEF CMNWEBLIB}\r\n if FColor = clNone then\r\n FColor := gcNull\r\n else if FColor = clDefault then\r\n FColor := clBtnFace;\r\n {$ENDIF}\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.SetKind(const Value: TTMSFNCGraphicsStrokeKind);\r\nbegin\r\n if FKind <> Value then\r\n begin\r\n FKind := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.SetOpacity(const Value: Single);\r\nbegin\r\n if FOpacity <> Value then\r\n begin\r\n FOpacity := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomGraphicsStroke.IsOpacityStored: Boolean;\r\nbegin\r\n Result := Opacity <> 1;\r\nend;\r\n\r\nprocedure TTMSFNCCustomGraphicsStroke.SetWidth(const Value: Single);\r\nbegin\r\n if FWidth <> Value then\r\n begin\r\n FWidth := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCGraphicsPath }\r\n\r\nconstructor TTMSFNCGraphicsPath.Create;\r\nbegin\r\n inherited Create;\r\n FPoints := TTMSFNCGraphicsPathPoints.Create;\r\nend;\r\n\r\ndestructor TTMSFNCGraphicsPath.Destroy;\r\nbegin\r\n FPoints.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.Assign(Source: TPersistent);\r\nvar\r\n I: Integer;\r\nbegin\r\n if Source is TTMSFNCGraphicsPath then\r\n begin\r\n FPoints.Count := TTMSFNCGraphicsPath(Source).Count;\r\n for I := 0 to TTMSFNCGraphicsPath(Source).Count - 1 do\r\n FPoints[I] := TTMSFNCGraphicsPath(Source)[I];\r\n end\r\n else\r\n inherited\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.GetBounds: TRectF;\r\nconst\r\n SmallAmount = 0.001;\r\nvar\r\n I: Integer;\r\n pt: TTMSFNCGraphicsPathPoint;\r\nbegin\r\n if PathData.Count < 1 then\r\n Exit(RectF(0, 0, 0, 0));\r\n Result := RectF($FFFF, $FFFF, -$FFFF, -$FFFF);\r\n for I := 0 to PathData.Count - 1 do\r\n begin\r\n pt := PathData[I];\r\n if pt.Kind = TTMSFNCGraphicsPathPointKind.gppClose then\r\n Continue;\r\n\r\n if pt.Point.X < Result.Left then\r\n Result.Left := pt.Point.X;\r\n if pt.Point.X > Result.Right then\r\n Result.Right := pt.Point.X;\r\n if pt.Point.Y < Result.Top then\r\n Result.Top := pt.Point.Y;\r\n if pt.Point.Y > Result.Bottom then\r\n Result.Bottom := pt.Point.Y;\r\n end;\r\n // add small amount\r\n {$IFDEF WEBLIB}\r\n if SameValue(Result.Right - Result.Left, 0, SmallAmount) then\r\n Result.Right := Result.Left + SmallAmount;\r\n if SameValue(Result.Bottom - Result.Top, 0, SmallAmount) then\r\n Result.Bottom := Result.Top + SmallAmount;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if SameValue(Result.Width, 0, SmallAmount) then\r\n Result.Right := Result.Left + SmallAmount;\r\n if SameValue(Result.Height, 0, SmallAmount) then\r\n Result.Bottom := Result.Top + SmallAmount;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.GetCount: Integer;\r\nbegin\r\n Result := FPoints.Count;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.GetPoint(AIndex: Integer): TTMSFNCGraphicsPathPoint;\r\nbegin\r\n Result := TTMSFNCGraphicsPathPoint(FPoints[AIndex]);\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.IsClippable: Boolean;\r\nbegin\r\n Result := FClippable;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.IsPointVisible(const P: TPointF): Boolean;\r\nvar\r\n pt: TTMSFNCGraphicsPathPolygon;\r\nbegin\r\n SetLength(pt, 0);\r\n FlattenToPolygon(pt);\r\n Result := PointInPoly(p, pt);\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.IsRectVisible(const R: TRectF): Boolean;\r\nvar\r\n pt: TTMSFNCGraphicsPathPolygon;\r\nbegin\r\n SetLength(pt, 0);\r\n FlattenToPolygon(pt);\r\n Result := PolyInRect(pt, R);\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.LastPoint: TPointF;\r\nbegin\r\n if Count > 0 then\r\n Result := FPoints[FPoints.Count - 1].Point\r\n else\r\n begin\r\n Result := PointF(0, 0);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.MoveTo(const P: TPointF);\r\nvar\r\n pt: TTMSFNCGraphicsPathPoint;\r\nbegin\r\n pt.Kind := gppMoveTo;\r\n pt.Point := p;\r\n FPoints.Add(pt);\r\n FStartPoint := FPoints[FPoints.Count - 1].Point;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.LineTo(const P: TPointF);\r\nvar\r\n pt: TTMSFNCGraphicsPathPoint;\r\nbegin\r\n pt.Kind := gppLineTo;\r\n pt.Point := p;\r\n FPoints.Add(pt);\r\n if (P.X = FStartPoint.X) and (P.Y = FStartPoint.Y) then\r\n FClippable := True;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.QuadCurveTo(const ControlPoint, EndPoint: TPointF);\r\nconst\r\n OneThird = 1 / 3;\r\n TwoThirds = 2 / 3;\r\nvar\r\n LP, CP1, CP2: TPointF;\r\nbegin\r\n LP := LastPoint;\r\n CP1.X := OneThird * LP.X + TwoThirds * ControlPoint.X;\r\n CP1.Y := OneThird * LP.Y + TwoThirds * ControlPoint.Y;\r\n CP2.X := TwoThirds * ControlPoint.X + OneThird * EndPoint.X;\r\n CP2.Y := TwoThirds * ControlPoint.Y + OneThird * EndPoint.Y;\r\n CurveTo(CP1, CP2, EndPoint);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.CurveTo(const ControlPoint1, ControlPoint2, EndPoint: TPointF);\r\nvar\r\n pt: TTMSFNCGraphicsPathPoint;\r\nbegin\r\n pt.Kind := gppCurveTo;\r\n pt.Point := ControlPoint1;\r\n FPoints.Add(pt);\r\n pt.Kind := gppCurveTo;\r\n pt.Point := ControlPoint2;\r\n FPoints.Add(pt);\r\n pt.Kind := gppCurveTo;\r\n pt.Point := EndPoint;\r\n FPoints.Add(pt);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.SmoothCurveTo(const ControlPoint2, EndPoint: TPointF);\r\nvar\r\n ControlPoint1: TPointF;\r\nbegin\r\n if Count > 2 then\r\n begin\r\n ControlPoint1.X := LastPoint.X + (LastPoint.X - FPoints[FPoints.Count - 2].Point.X);\r\n ControlPoint1.Y := LastPoint.Y + (LastPoint.Y - FPoints[FPoints.Count - 2].Point.Y);\r\n end\r\n else\r\n ControlPoint1 := ControlPoint2;\r\n CurveTo(ControlPoint1, ControlPoint2, EndPoint);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.ClosePath;\r\nvar\r\n pt: TTMSFNCGraphicsPathPoint;\r\nbegin\r\n pt.Kind := gppClose;\r\n pt.Point := FStartPoint;\r\n FPoints.Add(pt);\r\n FClippable := True;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.AddPath(APath: TTMSFNCGraphicsPath);\r\nvar\r\n I: Integer;\r\nbegin\r\n FPoints.Capacity := FPoints.Count + APath.Count;\r\n for I := 0 to APath.Count - 1 do\r\n FPoints.Add(APath.Points[I]);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.AddPolygon(\r\n const APolygon: TTMSFNCGraphicsPathPolygon);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(APolygon) - 1 do\r\n LineTo(APolygon[I]);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.Clear;\r\nbegin\r\n FPoints.Clear;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.CalculateBezierCoefficients(const Bezier: TTMSFNCGraphicsPathCubicBezier; out AX, BX, CX, AY, BY, CY: Single);\r\nbegin\r\n CX := 3 * (Bezier[1].X - Bezier[0].X);\r\n CY := 3 * (Bezier[1].Y - Bezier[0].Y);\r\n BX := 3 * (Bezier[2].X - Bezier[1].X) - CX;\r\n BY := 3 * (Bezier[2].Y - Bezier[1].Y) - CY;\r\n AX := Bezier[3].X - Bezier[0].X - CX - BX;\r\n AY := Bezier[3].Y - Bezier[0].Y - CY - BY;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.PointOnBezier(const StartPoint: TPointF; const AX, BX, CX, AY, BY, CY, T: Single): TPointF;\r\nvar\r\n SquareT, CubeT: Single;\r\nbegin\r\n SquareT := T * T;\r\n CubeT := SquareT * T;\r\n Result.X := (AX * CubeT) + (BX * SquareT) + (CX * T) + StartPoint.X;\r\n Result.Y := (AY * CubeT) + (BY * SquareT) + (CY * T) + StartPoint.Y;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsPath.CreateBezier(const Bezier: TTMSFNCGraphicsPathCubicBezier; const PointCount: Integer): TTMSFNCGraphicsPathPolygon;\r\nvar\r\n AX, BX, CX, AY, BY, CY, DT, T: Single;\r\n I: Integer;\r\nbegin\r\n if PointCount = 0 then\r\n Exit;\r\n DT := 1 / (1 * PointCount - 1);\r\n T := 0;\r\n SetLength(Result, PointCount);\r\n CalculateBezierCoefficients(Bezier, AX, BX, CX, AY, BY, CY);\r\n for I := 0 to PointCount - 1 do\r\n begin\r\n Result[I] := PointOnBezier(Bezier[0], AX, BX, CX, AY, BY, CY, T);\r\n T := T + DT;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.Flatten(const Flatness: Single);\r\nvar\r\n J, I: Integer;\r\n BPts: TTMSFNCGraphicsPathPolygon;\r\n B: TTMSFNCGraphicsPathCubicBezier;\r\n F, Len: Single;\r\n SegCount: Integer;\r\n OldPathData: TTMSFNCGraphicsPathPoints;\r\n CurPoint: TPointF;\r\n x: TPointF;\r\nbegin\r\n if FPoints.Count > 0 then\r\n begin\r\n F := Max(Flatness, 0.05);\r\n OldPathData := TTMSFNCGraphicsPathPoints.Create;\r\n try\r\n OldPathData.Count := FPoints.Count;\r\n for J := 0 to FPoints.Count - 1 do\r\n OldPathData.Add(FPoints[J]);\r\n FPoints.Clear;\r\n J := 0;\r\n while J < OldPathData.Count do\r\n begin\r\n case OldPathData[J].Kind of\r\n gppMoveTo:\r\n begin\r\n MoveTo(OldPathData[J].Point);\r\n CurPoint := OldPathData[J].Point;\r\n end;\r\n gppLineTo:\r\n begin\r\n LineTo(OldPathData[J].Point);\r\n CurPoint := OldPathData[J].Point;\r\n end;\r\n gppCurveTo:\r\n begin\r\n B[0] := CurPoint;\r\n B[1] := OldPathData[J].Point;\r\n Inc(J);\r\n B[2] := OldPathData[J].Point;\r\n Inc(J);\r\n B[3] := OldPathData[J].Point;\r\n BPts := CreateBezier(B, 6);\r\n Len := 0;\r\n for I := 0 to High(BPts) - 1 do\r\n begin\r\n x.X := BPts[I].X - BPts[I + 1].X;\r\n x.Y := BPts[I].Y - BPts[I + 1].Y;\r\n Len := Len + GetPointLength(x);\r\n end;\r\n SegCount := Round(Len / F);\r\n if SegCount < 2 then\r\n LineTo(B[3])\r\n else\r\n begin\r\n BPts := CreateBezier(B, SegCount);\r\n for I := 0 to High(BPts) do\r\n LineTo(BPts[I]);\r\n CurPoint := OldPathData[J].Point;\r\n end;\r\n end;\r\n gppClose:\r\n ClosePath;\r\n end;\r\n Inc(J);\r\n end;\r\n finally\r\n OldPathData.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.FlattenToPolygon(var Polygon: TTMSFNCGraphicsPathPolygon; const Flatness: Single = 0.25);\r\n\r\n procedure AddPoint(const P: TPointF);\r\n begin\r\n if (Length(Polygon) > 0) and (SameValue(P.X, Polygon[High(Polygon)].X, PathPosition) and SameValue(P.Y,\r\n Polygon[High(Polygon)].Y, PathPosition)) then\r\n Exit;\r\n SetLength(Polygon, Length(Polygon) + 1);\r\n Polygon[High(Polygon)] := P;\r\n end;\r\n\r\nvar\r\n J, I: Integer;\r\n BPts: TTMSFNCGraphicsPathPolygon;\r\n B: TTMSFNCGraphicsPathCubicBezier;\r\n SP, CurPoint, X: TPointF;\r\n F, Len: Single;\r\n SegCount: Integer;\r\nbegin\r\n SetLength(Polygon, 0);\r\n if FPoints.Count > 0 then\r\n begin\r\n F := Max(Flatness, 0.05);\r\n J := 0;\r\n while J < FPoints.Count do\r\n begin\r\n case FPoints[J].Kind of\r\n gppMoveTo:\r\n begin\r\n if Length(Polygon) > 0 then\r\n AddPoint(PointF($FFFFFF, $FFFFFF));\r\n AddPoint(FPoints[J].Point);\r\n CurPoint := FPoints[J].Point;\r\n SP := CurPoint;\r\n end;\r\n gppLineTo:\r\n begin\r\n AddPoint(FPoints[J].Point);\r\n CurPoint := FPoints[J].Point;\r\n end;\r\n gppCurveTo:\r\n begin\r\n B[0] := CurPoint;\r\n B[1] := FPoints[J].Point;\r\n Inc(J);\r\n B[2] := FPoints[J].Point;\r\n Inc(J);\r\n B[3] := FPoints[J].Point;\r\n BPts := CreateBezier(B, 6);\r\n Len := 0;\r\n for I := 0 to High(BPts) - 1 do\r\n begin\r\n x.X := BPts[I].X - BPts[I + 1].X;\r\n x.Y := BPts[I].Y - BPts[I + 1].Y;\r\n Len := Len + GetPointLength(x);\r\n end;\r\n SegCount := Round(Len / F);\r\n if SegCount < 2 then\r\n begin\r\n AddPoint(B[0]);\r\n AddPoint(B[3]);\r\n end\r\n else\r\n begin\r\n BPts := CreateBezier(B, SegCount);\r\n for I := 0 to High(BPts) do\r\n AddPoint(BPts[I]);\r\n end;\r\n CurPoint := FPoints[J].Point;\r\n end;\r\n gppClose:\r\n begin\r\n AddPoint(SP);\r\n end;\r\n end;\r\n Inc(J);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.AddEllipse(const ARect: TRectF);\r\nvar\r\n CX, CY, PX, PY: Single;\r\n c: Single;\r\nbegin\r\n c := 0.5522847498;\r\n CX := (ARect.Left + ARect.Right) / 2;\r\n CY := (ARect.Top + ARect.Bottom) / 2;\r\n PX := c * ((ARect.Right - ARect.Left) / 2);\r\n PY := c * ((ARect.Bottom - ARect.Top) / 2);\r\n MoveTo(PointF(ARect.Left, CY));\r\n CurveTo(PointF(ARect.Left, CY - PY), PointF(CX - PX, ARect.Top), PointF(CX, ARect.Top));\r\n CurveTo(PointF(CX + PX, ARect.Top), PointF(ARect.Right, CY - PY), PointF(ARect.Right, CY));\r\n CurveTo(PointF(ARect.Right, CY + PY), PointF(CX + PX, ARect.Bottom), PointF(CX, ARect.Bottom));\r\n CurveTo(PointF(CX - PX, ARect.Bottom), PointF(ARect.Left, CY + PY), PointF(ARect.Left, CY));\r\n FClippable := True;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.AddLine(const StartPoint, EndPoint: TPointF);\r\nbegin\r\n if Count = 0 then\r\n MoveTo(StartPoint)\r\n else\r\n LineTo(StartPoint);\r\n\r\n LineTo(EndPoint);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.AddRectangle(const ARect: TRectF);\r\nbegin\r\n MoveTo(PointF(ARect.Left, ARect.Top));\r\n LineTo(PointF(ARect.Right, ARect.Top));\r\n LineTo(PointF(ARect.Right, ARect.Bottom));\r\n LineTo(PointF(ARect.Left, ARect.Bottom));\r\n ClosePath;\r\n FClippable := True;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.ApplyMatrix(AMatrix: TTMSFNCGraphicsMatrix);\r\nvar\r\n I: Integer;\r\n pt: TTMSFNCGraphicsPathPoint;\r\nbegin\r\n if PathData.Count > 0 then\r\n begin\r\n for I := 0 to PathData.Count - 1 do\r\n begin\r\n if PathData[I].Kind in [TTMSFNCGraphicsPathPointKind.gppMoveTo, TTMSFNCGraphicsPathPointKind.gppLineTo, TTMSFNCGraphicsPathPointKind.gppCurveTo] then\r\n begin\r\n pt := PathData[I];\r\n pt.Point := MatrixMultiply(pt.Point, AMatrix);\r\n PathData[I] := pt;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure DrawArcWithBezier(Path: TTMSFNCGraphicsPath; CenterX, CenterY, RadiusX, RadiusY, StartAngle, SweepRange: Single;\r\n UseMoveTo: Boolean);\r\nvar\r\n Coord: array of TPointF;\r\n Pts: array of TPointF;\r\n A, X, Y: Single;\r\n {$IFDEF LCLLIB}\r\n C, B, CC, SS: Extended;\r\n {$ELSE}\r\n C, B, CC, SS: Single;\r\n {$ENDIF}\r\n I: Integer;\r\nbegin\r\n if SweepRange = 0 then\r\n begin\r\n if UseMoveTo then\r\n begin\r\n if Path.FPoints.Count < 1 then\r\n Path.MoveTo(PointF(CenterX + RadiusX * Cos(StartAngle), CenterY - RadiusY * Sin(StartAngle)))\r\n else\r\n Path.LineTo(PointF(CenterX + RadiusX * Cos(StartAngle), CenterY - RadiusY * Sin(StartAngle)));\r\n end;\r\n Path.LineTo(PointF(CenterX + RadiusX * Cos(StartAngle), CenterY - RadiusY * Sin(StartAngle)));\r\n Exit;\r\n end;\r\n {$IFDEF WEBLIB}\r\n B := Sin(SweepRange / 2);\r\n C := Cos(SweepRange / 2);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n SinCos(SweepRange / 2, B, C);\r\n {$ENDIF}\r\n A := 1 - C;\r\n X := A * 4 / 3;\r\n Y := B - X * C / B;\r\n {$IFDEF WEBLIB}\r\n SS := Sin(StartAngle + SweepRange / 2);\r\n CC := Cos(StartAngle + SweepRange / 2);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n SinCos(StartAngle + SweepRange / 2, SS, CC);\r\n {$ENDIF}\r\n SetLength(Coord, 4);\r\n Coord[0] := PointF(C, -B);\r\n Coord[1] := PointF(C + X, -Y);\r\n Coord[2] := PointF(C + X, Y);\r\n Coord[3] := PointF(C, B);\r\n SetLength(Pts, 4);\r\n for I := 0 to 3 do\r\n begin\r\n Pts[I] := PointF(CenterX + RadiusX * (Coord[I].X * CC - Coord[I].Y * SS), CenterY + RadiusY * (Coord[I].X *\r\n SS + Coord[I].Y * CC));\r\n end;\r\n if UseMoveTo then\r\n begin\r\n if Path.FPoints.Count < 1 then\r\n Path.MoveTo(Pts[0])\r\n else\r\n Path.LineTo(Pts[0]);\r\n end;\r\n Path.CurveTo(Pts[1], Pts[2], Pts[3]);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPath.AddArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single);\r\nconst\r\n BezierArcAngleEpsilon = 0.01;\r\n MinSweepAngle = 1E-10;\r\nvar\r\n UseMoveTo: Boolean;\r\n I: Integer;\r\n F: Single;\r\n TotalSweep, LocalSweep, PrevSweep: Single;\r\n Done: Boolean;\r\nbegin\r\n StartAngle := DegToRad(StartAngle);\r\n SweepAngle := DegToRad(SweepAngle);\r\n I := Trunc(StartAngle / (2 * Pi));\r\n F := StartAngle - (I * 2 * Pi);\r\n StartAngle := F;\r\n if SweepAngle >= 2 * Pi then\r\n SweepAngle := 2 * Pi;\r\n if SweepAngle <= -2 * Pi then\r\n SweepAngle := -2 * Pi;\r\n if Abs(SweepAngle) < MinSweepAngle then\r\n Exit;\r\n TotalSweep := 0;\r\n Done := False;\r\n UseMoveTo := True;\r\n repeat\r\n if SweepAngle < 0 then\r\n begin\r\n PrevSweep := TotalSweep;\r\n LocalSweep := -Pi / 2;\r\n TotalSweep := TotalSweep - (Pi / 2);\r\n if TotalSweep <= SweepAngle + BezierArcAngleEpsilon then\r\n begin\r\n LocalSweep := SweepAngle - PrevSweep;\r\n Done := True;\r\n end;\r\n end\r\n else\r\n begin\r\n PrevSweep := TotalSweep;\r\n LocalSweep := Pi / 2;\r\n TotalSweep := TotalSweep + (Pi / 2);\r\n if TotalSweep >= SweepAngle - BezierArcAngleEpsilon then\r\n begin\r\n LocalSweep := SweepAngle - PrevSweep;\r\n Done := True;\r\n end;\r\n end;\r\n DrawArcWithBezier(Self, Center.X, Center.Y, Radius.X, Radius.Y, StartAngle, LocalSweep, UseMoveTo);\r\n UseMoveTo := False;\r\n StartAngle := StartAngle + LocalSweep;\r\n until Done;\r\nend;\r\n\r\n{ TTMSFNCGraphicsPathPoint }\r\n\r\n{$IFDEF LCLLIB}\r\nclass operator TTMSFNCGraphicsPathPoint.=(z1, z2: TTMSFNCGraphicsPathPoint)b: boolean;\r\nbegin\r\n Result := z1 = z2;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFNDEF WEBLIB}\r\n\r\n{ TTMSFNCGraphicsMatrix }\r\n\r\nclass function TTMSFNCGraphicsMatrix.CreateRotation(const AAngle: Single): TTMSFNCGraphicsMatrix;\r\nvar\r\n S, C: Single;\r\nbegin\r\n S := Sin(AAngle);\r\n C := Cos(AAngle);\r\n Result := Identity;\r\n Result.m11 := C;\r\n Result.m12 := S;\r\n Result.m21 := -S;\r\n Result.m22 := C;\r\nend;\r\n\r\nclass function TTMSFNCGraphicsMatrix.CreateScaling(const AScaleX, AScaleY: Single): TTMSFNCGraphicsMatrix;\r\nbegin\r\n Result := Identity;\r\n Result.m11 := AScaleX;\r\n Result.m22 := AScaleY;\r\nend;\r\n\r\nclass function TTMSFNCGraphicsMatrix.CreateTranslation(const ADeltaX, ADeltaY: Single): TTMSFNCGraphicsMatrix;\r\nbegin\r\n Result := Identity;\r\n Result.m31 := ADeltaX;\r\n Result.m32 := ADeltaY;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsMatrix.Scale(const AFactor: Single): TTMSFNCGraphicsMatrix;\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to 2 do\r\n begin\r\n Result.M[I].V[0] := Self.M[I].V[0] * AFactor;\r\n Result.M[I].V[1] := Self.M[I].V[1] * AFactor;\r\n Result.M[I].V[2] := Self.M[I].V[2] * AFactor;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsMatrix.Determinant: Single;\r\nbegin\r\n Result := Self.M[0].V[0] * (Self.M[1].V[1] * Self.M[2].V[2] - Self.M[2].V[1] * Self.M[1].V[2]) - Self.M[0].V[1]\r\n * (Self.M[1].V[0] * Self.M[2].V[2] - Self.M[2].V[0] * Self.M[1].V[2]) + Self.M[0].V[2] * (Self.M[1].V[0]\r\n * Self.M[2].V[1] - Self.M[2].V[0] * Self.M[1].V[1]);\r\nend;\r\n\r\nfunction TTMSFNCGraphicsMatrix.Adjoint: TTMSFNCGraphicsMatrix;\r\nvar\r\n a1, a2, a3, b1, b2, b3, c1, c2, c3: Single;\r\nbegin\r\n a1 := Self.M[0].V[0];\r\n a2 := Self.M[0].V[1];\r\n a3 := Self.M[0].V[2];\r\n b1 := Self.M[1].V[0];\r\n b2 := Self.M[1].V[1];\r\n b3 := Self.M[1].V[2];\r\n c1 := Self.M[2].V[0];\r\n c2 := Self.M[2].V[1];\r\n c3 := Self.M[2].V[2];\r\n\r\n Result.M[0].V[0] := (b2 * c3 - c2 * b3);\r\n Result.M[1].V[0] := -(b1 * c3 - c1 * b3);\r\n Result.M[2].V[0] := (b1 * c2 - c1 * b2);\r\n\r\n Result.M[0].V[1] := -(a2 * c3 - c2 * a3);\r\n Result.M[1].V[1] := (a1 * c3 - c1 * a3);\r\n Result.M[2].V[1] := -(a1 * c2 - c1 * a2);\r\n\r\n Result.M[0].V[2] := (a2 * b3 - b2 * a3);\r\n Result.M[1].V[2] := -(a1 * b3 - b1 * a3);\r\n Result.M[2].V[2] := (a1 * b2 - b1 * a2);\r\nend;\r\n\r\nclass function TTMSFNCGraphicsMatrix.Identity: TTMSFNCGraphicsMatrix;\r\nbegin\r\n Result.m11 := 1;\r\n Result.m12 := 0;\r\n Result.m13 := 0;\r\n Result.m21 := 0;\r\n Result.m22 := 1;\r\n Result.m23 := 0;\r\n Result.m31 := 0;\r\n Result.m32 := 0;\r\n Result.m33 := 1;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsMatrix.Inverse: TTMSFNCGraphicsMatrix;\r\nconst\r\n DefaultValue: TTMSFNCGraphicsMatrix = (m11: 1.0; m12: 0.0; m13: 0.0; m21: 0.0; m22: 1.0; m23: 0.0; m31: 0.0; m32: 0.0; m33: 1.0);\r\nvar\r\n Det: Single;\r\nbegin\r\n Det := Self.Determinant;\r\n if Abs(Det) < Epsilon then\r\n Result := DefaultValue\r\n else\r\n Result:= Self.Adjoint.Scale(1 / Det);\r\nend;\r\n\r\n{$IFDEF LCLLIB}\r\nclass operator TTMSFNCGraphicsMatrix.*(const APoint: TPointF;\r\n const AMatrix: TTMSFNCGraphicsMatrix): TPointF;\r\n{$ENDIF}\r\n{$IFNDEF LCLLIB}\r\nclass operator TTMSFNCGraphicsMatrix.Multiply(const APoint: TPointF;\r\n const AMatrix: TTMSFNCGraphicsMatrix): TPointF;\r\n{$ENDIF}\r\nbegin\r\n Result.X := APoint.X * AMatrix.M[0].V[0] + APoint.Y * AMatrix.M[1].V[0]\r\n + AMatrix.M[2].V[0];\r\n Result.Y := APoint.X * AMatrix.M[0].V[1] + APoint.Y * AMatrix.M[1].V[1]\r\n + AMatrix.M[2].V[1];\r\nend;\r\n\r\n{$IFDEF LCLLIB}\r\nclass operator TTMSFNCGraphicsMatrix.*(const AMatrix1, AMatrix2: TTMSFNCGraphicsMatrix): TTMSFNCGraphicsMatrix;\r\n{$ENDIF}\r\n{$IFNDEF LCLLIB}\r\nclass operator TTMSFNCGraphicsMatrix.Multiply(const AMatrix1, AMatrix2: TTMSFNCGraphicsMatrix): TTMSFNCGraphicsMatrix;\r\n{$ENDIF}\r\nbegin\r\n Result.m11 := AMatrix1.m11 * AMatrix2.m11 + AMatrix1.m12 * AMatrix2.m21 + AMatrix1.m13 * AMatrix2.m31;\r\n Result.m12 := AMatrix1.m11 * AMatrix2.m12 + AMatrix1.m12 * AMatrix2.m22 + AMatrix1.m13 * AMatrix2.m32;\r\n Result.m13 := AMatrix1.m11 * AMatrix2.m13 + AMatrix1.m12 * AMatrix2.m23 + AMatrix1.m13 * AMatrix2.m33;\r\n Result.m21 := AMatrix1.m21 * AMatrix2.m11 + AMatrix1.m22 * AMatrix2.m21 + AMatrix1.m23 * AMatrix2.m31;\r\n Result.m22 := AMatrix1.m21 * AMatrix2.m12 + AMatrix1.m22 * AMatrix2.m22 + AMatrix1.m23 * AMatrix2.m32;\r\n Result.m23 := AMatrix1.m21 * AMatrix2.m13 + AMatrix1.m22 * AMatrix2.m23 + AMatrix1.m23 * AMatrix2.m33;\r\n Result.m31 := AMatrix1.m31 * AMatrix2.m11 + AMatrix1.m32 * AMatrix2.m21 + AMatrix1.m33 * AMatrix2.m31;\r\n Result.m32 := AMatrix1.m31 * AMatrix2.m12 + AMatrix1.m32 * AMatrix2.m22 + AMatrix1.m33 * AMatrix2.m32;\r\n Result.m33 := AMatrix1.m31 * AMatrix2.m13 + AMatrix1.m32 * AMatrix2.m23 + AMatrix1.m33 * AMatrix2.m33;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCGraphicsPathPoints.GetItem(Index: Integer): TTMSFNCGraphicsPathPoint;\r\nbegin\r\n Result := TTMSFNCGraphicsPathPoint(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsPathPoints.SetItem(Index: Integer; const Value: TTMSFNCGraphicsPathPoint);\r\nbegin\r\n// inherited Items[Index] := Value;\r\n inherited Put(Index, Value);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCGraphicsColorObject }\r\n\r\nconstructor TTMSFNCGraphicsColorObject.Create(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n FColor := AColor;\r\nend;\r\n\r\nprocedure DestroyColorLookup;\r\nvar\r\n I: Integer;\r\n {$IFNDEF FMXLIB}\r\n obj: TTMSFNCGraphicsColorObject;\r\n {$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n for I := 0 to FColorLookup.Count - 1 do\r\n FColorLookup.Objects[I].DisposeOf;\r\n {$ELSE}\r\n for I := 0 to FColorLookup.Count - 1 do\r\n begin\r\n obj := TTMSFNCGraphicsColorObject(FColorLookup.Objects[I]);\r\n obj.Free;\r\n end;\r\n {$ENDIF}\r\n\r\n FColorLookup.Free;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\ninitialization\r\nbegin\r\n fcolorlookup := TStringList.Create;\r\n fcolorlookup.addobject('aliceblue', TTMSFNCGraphicsColorObject.Create(gcaliceblue));\r\n fcolorlookup.addobject('antiquewhite', TTMSFNCGraphicsColorObject.Create(gcantiquewhite));\r\n fcolorlookup.addobject('aqua', TTMSFNCGraphicsColorObject.Create(gcaqua));\r\n fcolorlookup.addobject('aquamarine', TTMSFNCGraphicsColorObject.Create(gcaquamarine));\r\n fcolorlookup.addobject('azure', TTMSFNCGraphicsColorObject.Create(gcazure));\r\n fcolorlookup.addobject('beige', TTMSFNCGraphicsColorObject.Create(gcbeige));\r\n fcolorlookup.addobject('bisque', TTMSFNCGraphicsColorObject.Create(gcbisque));\r\n fcolorlookup.addobject('black', TTMSFNCGraphicsColorObject.Create(gcblack));\r\n fcolorlookup.addobject('blanchedalmond', TTMSFNCGraphicsColorObject.Create(gcblanchedalmond));\r\n fcolorlookup.addobject('blue', TTMSFNCGraphicsColorObject.Create(gcblue));\r\n fcolorlookup.addobject('blueviolet', TTMSFNCGraphicsColorObject.Create(gcblueviolet));\r\n fcolorlookup.addobject('brown', TTMSFNCGraphicsColorObject.Create(gcbrown));\r\n fcolorlookup.addobject('burlywood', TTMSFNCGraphicsColorObject.Create(gcburlywood));\r\n fcolorlookup.addobject('cadetblue', TTMSFNCGraphicsColorObject.Create(gccadetblue));\r\n fcolorlookup.addobject('chartreuse', TTMSFNCGraphicsColorObject.Create(gcchartreuse));\r\n fcolorlookup.addobject('chocolate', TTMSFNCGraphicsColorObject.Create(gcchocolate));\r\n fcolorlookup.addobject('coral', TTMSFNCGraphicsColorObject.Create(gccoral));\r\n fcolorlookup.addobject('cornflowerblue', TTMSFNCGraphicsColorObject.Create(gccornflowerblue));\r\n fcolorlookup.addobject('cornsilk', TTMSFNCGraphicsColorObject.Create(gccornsilk));\r\n fcolorlookup.addobject('crimson', TTMSFNCGraphicsColorObject.Create(gccrimson));\r\n fcolorlookup.addobject('cyan', TTMSFNCGraphicsColorObject.Create(gccyan));\r\n fcolorlookup.addobject('darkblue', TTMSFNCGraphicsColorObject.Create(gcdarkblue));\r\n fcolorlookup.addobject('darkcyan', TTMSFNCGraphicsColorObject.Create(gcdarkcyan));\r\n fcolorlookup.addobject('darkgoldenrod', TTMSFNCGraphicsColorObject.Create(gcdarkgoldenrod));\r\n fcolorlookup.addobject('darkgray', TTMSFNCGraphicsColorObject.Create(gcdarkgray));\r\n fcolorlookup.addobject('darkgreen', TTMSFNCGraphicsColorObject.Create(gcdarkgreen));\r\n fcolorlookup.addobject('darkgrey', TTMSFNCGraphicsColorObject.Create(gcdarkgrey));\r\n fcolorlookup.addobject('darkkhaki', TTMSFNCGraphicsColorObject.Create(gcdarkkhaki));\r\n fcolorlookup.addobject('darkmagenta', TTMSFNCGraphicsColorObject.Create(gcdarkmagenta));\r\n fcolorlookup.addobject('darkolivegreen', TTMSFNCGraphicsColorObject.Create(gcdarkolivegreen));\r\n fcolorlookup.addobject('darkorange', TTMSFNCGraphicsColorObject.Create(gcdarkorange));\r\n fcolorlookup.addobject('darkorchid', TTMSFNCGraphicsColorObject.Create(gcdarkorchid));\r\n fcolorlookup.addobject('darkred', TTMSFNCGraphicsColorObject.Create(gcdarkred));\r\n fcolorlookup.addobject('darksalmon', TTMSFNCGraphicsColorObject.Create(gcdarksalmon));\r\n fcolorlookup.addobject('darkseagreen', TTMSFNCGraphicsColorObject.Create(gcdarkseagreen));\r\n fcolorlookup.addobject('darkslateblue', TTMSFNCGraphicsColorObject.Create(gcdarkslateblue));\r\n fcolorlookup.addobject('darkslategray', TTMSFNCGraphicsColorObject.Create(gcdarkslategray));\r\n fcolorlookup.addobject('darkslategrey', TTMSFNCGraphicsColorObject.Create(gcdarkslategrey));\r\n fcolorlookup.addobject('darkturquoise', TTMSFNCGraphicsColorObject.Create(gcdarkturquoise));\r\n fcolorlookup.addobject('darkviolet', TTMSFNCGraphicsColorObject.Create(gcdarkviolet));\r\n fcolorlookup.addobject('deeppink', TTMSFNCGraphicsColorObject.Create(gcdeeppink));\r\n fcolorlookup.addobject('deepskyblue', TTMSFNCGraphicsColorObject.Create(gcdeepskyblue));\r\n fcolorlookup.addobject('dimgray', TTMSFNCGraphicsColorObject.Create(gcdimgray));\r\n fcolorlookup.addobject('dimgrey', TTMSFNCGraphicsColorObject.Create(gcdimgrey));\r\n fcolorlookup.addobject('dodgerblue', TTMSFNCGraphicsColorObject.Create(gcdodgerblue));\r\n fcolorlookup.addobject('firebrick', TTMSFNCGraphicsColorObject.Create(gcfirebrick));\r\n fcolorlookup.addobject('floralwhite', TTMSFNCGraphicsColorObject.Create(gcfloralwhite));\r\n fcolorlookup.addobject('forestgreen', TTMSFNCGraphicsColorObject.Create(gcforestgreen));\r\n fcolorlookup.addobject('fuchsia', TTMSFNCGraphicsColorObject.Create(gcfuchsia));\r\n fcolorlookup.addobject('gainsboro', TTMSFNCGraphicsColorObject.Create(gcgainsboro));\r\n fcolorlookup.addobject('ghostwhite', TTMSFNCGraphicsColorObject.Create(gcghostwhite));\r\n fcolorlookup.addobject('gold', TTMSFNCGraphicsColorObject.Create(gcgold));\r\n fcolorlookup.addobject('goldenrod', TTMSFNCGraphicsColorObject.Create(gcgoldenrod));\r\n fcolorlookup.addobject('gray', TTMSFNCGraphicsColorObject.Create(gcgray));\r\n fcolorlookup.addobject('green', TTMSFNCGraphicsColorObject.Create(gcgreen));\r\n fcolorlookup.addobject('greenyellow', TTMSFNCGraphicsColorObject.Create(gcgreenyellow));\r\n fcolorlookup.addobject('grey', TTMSFNCGraphicsColorObject.Create(gcgrey));\r\n fcolorlookup.addobject('honeydew', TTMSFNCGraphicsColorObject.Create(gchoneydew));\r\n fcolorlookup.addobject('hotpink', TTMSFNCGraphicsColorObject.Create(gchotpink));\r\n fcolorlookup.addobject('indianred', TTMSFNCGraphicsColorObject.Create(gcindianred));\r\n fcolorlookup.addobject('indigo', TTMSFNCGraphicsColorObject.Create(gcindigo));\r\n fcolorlookup.addobject('ivory', TTMSFNCGraphicsColorObject.Create(gcivory));\r\n fcolorlookup.addobject('khaki', TTMSFNCGraphicsColorObject.Create(gckhaki));\r\n fcolorlookup.addobject('lavender', TTMSFNCGraphicsColorObject.Create(gcLavender));\r\n fcolorlookup.addobject('lavenderblush', TTMSFNCGraphicsColorObject.Create(gcLavenderblush));\r\n fcolorlookup.addobject('lawngreen', TTMSFNCGraphicsColorObject.Create(gcLawngreen));\r\n fcolorlookup.addobject('lemonchiffon', TTMSFNCGraphicsColorObject.Create(gclemonchiffon));\r\n fcolorlookup.addobject('lightblue', TTMSFNCGraphicsColorObject.Create(gclightblue));\r\n fcolorlookup.addobject('lightcoral', TTMSFNCGraphicsColorObject.Create(gclightcoral));\r\n fcolorlookup.addobject('lightcyan', TTMSFNCGraphicsColorObject.Create(gclightcyan));\r\n fcolorlookup.addobject('lightgoldenrodyellow', TTMSFNCGraphicsColorObject.Create(gclightgoldenrodyellow));\r\n fcolorlookup.addobject('lightgray', TTMSFNCGraphicsColorObject.Create(gclightgray));\r\n fcolorlookup.addobject('lightgreen', TTMSFNCGraphicsColorObject.Create(gclightgreen));\r\n fcolorlookup.addobject('lightgrey', TTMSFNCGraphicsColorObject.Create(gclightgrey));\r\n fcolorlookup.addobject('lightpink', TTMSFNCGraphicsColorObject.Create(gclightpink));\r\n fcolorlookup.addobject('lightsalmon', TTMSFNCGraphicsColorObject.Create(gclightsalmon));\r\n fcolorlookup.addobject('lightseagreen', TTMSFNCGraphicsColorObject.Create(gclightseagreen));\r\n fcolorlookup.addobject('lightskyblue', TTMSFNCGraphicsColorObject.Create(gclightskyblue));\r\n fcolorlookup.addobject('lightslategray', TTMSFNCGraphicsColorObject.Create(gclightslategray));\r\n fcolorlookup.addobject('lightslategrey', TTMSFNCGraphicsColorObject.Create(gclightslategrey));\r\n fcolorlookup.addobject('lightsteelblue', TTMSFNCGraphicsColorObject.Create(gclightsteelblue));\r\n fcolorlookup.addobject('lightyellow', TTMSFNCGraphicsColorObject.Create(gclightyellow));\r\n fcolorlookup.addobject('lime', TTMSFNCGraphicsColorObject.Create(gclime));\r\n fcolorlookup.addobject('limegreen', TTMSFNCGraphicsColorObject.Create(gclimegreen));\r\n fcolorlookup.addobject('linen', TTMSFNCGraphicsColorObject.Create(gclinen));\r\n fcolorlookup.addobject('magenta', TTMSFNCGraphicsColorObject.Create(gcmagenta));\r\n fcolorlookup.addobject('maroon', TTMSFNCGraphicsColorObject.Create(gcmaroon));\r\n fcolorlookup.addobject('mediumaquamarine', TTMSFNCGraphicsColorObject.Create(gcmediumaquamarine));\r\n fcolorlookup.addobject('mediumblue', TTMSFNCGraphicsColorObject.Create(gcmediumblue));\r\n fcolorlookup.addobject('mediumorchid', TTMSFNCGraphicsColorObject.Create(gcmediumorchid));\r\n fcolorlookup.addobject('mediumpurple', TTMSFNCGraphicsColorObject.Create(gcmediumpurple));\r\n fcolorlookup.addobject('mediumseagreen', TTMSFNCGraphicsColorObject.Create(gcmediumseagreen));\r\n fcolorlookup.addobject('mediumslateblue', TTMSFNCGraphicsColorObject.Create(gcmediumslateblue));\r\n fcolorlookup.addobject('mediumspringgreen', TTMSFNCGraphicsColorObject.Create(gcmediumspringgreen));\r\n fcolorlookup.addobject('mediumturquoise', TTMSFNCGraphicsColorObject.Create(gcmediumturquoise));\r\n fcolorlookup.addobject('mediumvioletred', TTMSFNCGraphicsColorObject.Create(gcmediumvioletred));\r\n fcolorlookup.addobject('midnightblue', TTMSFNCGraphicsColorObject.Create(gcmidnightblue));\r\n fcolorlookup.addobject('mintcream', TTMSFNCGraphicsColorObject.Create(gcmintcream));\r\n fcolorlookup.addobject('mistyrose', TTMSFNCGraphicsColorObject.Create(gcmistyrose));\r\n fcolorlookup.addobject('moccasin', TTMSFNCGraphicsColorObject.Create(gcmoccasin));\r\n fcolorlookup.addobject('navajowhite', TTMSFNCGraphicsColorObject.Create(gcnavajowhite));\r\n fcolorlookup.addobject('navy', TTMSFNCGraphicsColorObject.Create(gcnavy));\r\n fcolorlookup.addobject('oldlace', TTMSFNCGraphicsColorObject.Create(gcoldlace));\r\n fcolorlookup.addobject('olive', TTMSFNCGraphicsColorObject.Create(gcolive));\r\n fcolorlookup.addobject('olivedrab', TTMSFNCGraphicsColorObject.Create(gcolivedrab));\r\n fcolorlookup.addobject('orange', TTMSFNCGraphicsColorObject.Create(gcorange));\r\n fcolorlookup.addobject('orangered', TTMSFNCGraphicsColorObject.Create(gcorangered));\r\n fcolorlookup.addobject('orchid', TTMSFNCGraphicsColorObject.Create(gcorchid));\r\n fcolorlookup.addobject('palegoldenrod', TTMSFNCGraphicsColorObject.Create(gcpalegoldenrod));\r\n fcolorlookup.addobject('palegreen', TTMSFNCGraphicsColorObject.Create(gcpalegreen));\r\n fcolorlookup.addobject('paleturquoise', TTMSFNCGraphicsColorObject.Create(gcpaleturquoise));\r\n fcolorlookup.addobject('palevioletred', TTMSFNCGraphicsColorObject.Create(gcpalevioletred));\r\n fcolorlookup.addobject('papayawhip', TTMSFNCGraphicsColorObject.Create(gcpapayawhip));\r\n fcolorlookup.addobject('peachpuff', TTMSFNCGraphicsColorObject.Create(gcpeachpuff));\r\n fcolorlookup.addobject('peru', TTMSFNCGraphicsColorObject.Create(gcperu));\r\n fcolorlookup.addobject('pink', TTMSFNCGraphicsColorObject.Create(gcpink));\r\n fcolorlookup.addobject('plum', TTMSFNCGraphicsColorObject.Create(gcplum));\r\n fcolorlookup.addobject('powderblue', TTMSFNCGraphicsColorObject.Create(gcpowderblue));\r\n fcolorlookup.addobject('purple', TTMSFNCGraphicsColorObject.Create(gcpurple));\r\n fcolorlookup.addobject('red', TTMSFNCGraphicsColorObject.Create(gcred));\r\n fcolorlookup.addobject('rosybrown', TTMSFNCGraphicsColorObject.Create(gcrosybrown));\r\n fcolorlookup.addobject('royalblue', TTMSFNCGraphicsColorObject.Create(gcroyalblue));\r\n fcolorlookup.addobject('saddlebrown', TTMSFNCGraphicsColorObject.Create(gcsaddlebrown));\r\n fcolorlookup.addobject('salmon', TTMSFNCGraphicsColorObject.Create(gcsalmon));\r\n fcolorlookup.addobject('sandybrown', TTMSFNCGraphicsColorObject.Create(gcsandybrown));\r\n fcolorlookup.addobject('seagreen', TTMSFNCGraphicsColorObject.Create(gcseagreen));\r\n fcolorlookup.addobject('seashell', TTMSFNCGraphicsColorObject.Create(gcseashell));\r\n fcolorlookup.addobject('sienna', TTMSFNCGraphicsColorObject.Create(gcsienna));\r\n fcolorlookup.addobject('skyblue', TTMSFNCGraphicsColorObject.Create(gcskyblue));\r\n fcolorlookup.addobject('slateblue', TTMSFNCGraphicsColorObject.Create(gcslateblue));\r\n fcolorlookup.addobject('slategray', TTMSFNCGraphicsColorObject.Create(gcslategray));\r\n fcolorlookup.addobject('slategrey', TTMSFNCGraphicsColorObject.Create(gcslategrey));\r\n fcolorlookup.addobject('snow', TTMSFNCGraphicsColorObject.Create(gcsnow));\r\n fcolorlookup.addobject('springgreen', TTMSFNCGraphicsColorObject.Create(gcspringgreen));\r\n fcolorlookup.addobject('steelblue', TTMSFNCGraphicsColorObject.Create(gcsteelblue));\r\n fcolorlookup.addobject('violet', TTMSFNCGraphicsColorObject.Create(gcviolet));\r\n fcolorlookup.addobject('thistle', TTMSFNCGraphicsColorObject.Create(gcthistle));\r\n fcolorlookup.addobject('tan', TTMSFNCGraphicsColorObject.Create(gctan));\r\n fcolorlookup.addobject('tomato', TTMSFNCGraphicsColorObject.Create(gctomato));\r\n fcolorlookup.addobject('turquoise', TTMSFNCGraphicsColorObject.Create(gcturquoise));\r\n fcolorlookup.addobject('wheat', TTMSFNCGraphicsColorObject.Create(gcwheat));\r\n fcolorlookup.addobject('whitesmoke', TTMSFNCGraphicsColorObject.Create(gcwhitesmoke));\r\n fcolorlookup.addobject('yellowgreen', TTMSFNCGraphicsColorObject.Create(gcyellowgreen));\r\n fcolorlookup.addobject('red', TTMSFNCGraphicsColorObject.Create(gcred));\r\n fcolorlookup.addobject('black', TTMSFNCGraphicsColorObject.Create(gcblack));\r\n fcolorlookup.addobject('blue', TTMSFNCGraphicsColorObject.Create(gcblue));\r\n fcolorlookup.addobject('green', TTMSFNCGraphicsColorObject.Create(gcgreen));\r\n fcolorlookup.addobject('aqua', TTMSFNCGraphicsColorObject.Create(gcaqua));\r\n fcolorlookup.addobject('yellow', TTMSFNCGraphicsColorObject.Create(gcyellow));\r\n fcolorlookup.addobject('fuchsia', TTMSFNCGraphicsColorObject.Create(gcfuchsia));\r\n fcolorlookup.addobject('white', TTMSFNCGraphicsColorObject.Create(gcwhite));\r\n fcolorlookup.addobject('lime', TTMSFNCGraphicsColorObject.Create(gclime));\r\n fcolorlookup.addobject('silver', TTMSFNCGraphicsColorObject.Create(gcsilver));\r\n fcolorlookup.addobject('gray', TTMSFNCGraphicsColorObject.Create(gcgray));\r\n fcolorlookup.addobject('olive', TTMSFNCGraphicsColorObject.Create(gcolive));\r\n fcolorlookup.addobject('navy', TTMSFNCGraphicsColorObject.Create(gcnavy));\r\n fcolorlookup.addobject('purple', TTMSFNCGraphicsColorObject.Create(gcpurple));\r\n fcolorlookup.addobject('teal', TTMSFNCGraphicsColorObject.Create(gcteal));\r\n fcolorlookup.addobject('orange', TTMSFNCGraphicsColorObject.Create(gcorange));\r\n fcolorlookup.addobject('maroon', TTMSFNCGraphicsColorObject.Create(gcmaroon));\r\n FColorLookup.Sort;\r\nend;\r\n\r\nfinalization\r\nbegin\r\n DestroyColorLookup;\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCBitmapContainer;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCTypes, WEBLib.TMSFNCCustomComponent, WEBLib.Controls\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n , Generics.Collections\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n , fgl\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr.\r\n\r\n // version history\r\n // v1.0.0.0 : First Release\r\n\r\ntype\r\n TTMSFNCBitmapContainer = class;\r\n\r\n ITMSFNCBitmapContainer = interface\r\n ['{ED26710D-395F-4971-8AC9-A31083BF2A3C}']\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n end;\r\n\r\n TTMSFNCBitmapItem = class(TCollectionItem)\r\n private\r\n FBitmap: TTMSFNCBitmap;\r\n FTag: NativeInt;\r\n FName: string;\r\n procedure SetBitmap(const Value: TTMSFNCBitmap);\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure DoBitmapChanged(Sender: TObject); virtual;\r\n procedure Assign(Source: TPersistent); override;\r\n function GetDisplayName: string; override;\r\n published\r\n property Bitmap: TTMSFNCBitmap read FBitmap write SetBitmap;\r\n property Name: string read FName write FName;\r\n property Tag: NativeInt read FTag write FTag;\r\n end;\r\n\r\n TTMSFNCBitmapCollection = class(TOwnedCollection)\r\n private\r\n FOwner: TTMSFNCBitmapContainer;\r\n function GetItemEx(Index: Integer): TTMSFNCBitmapItem;\r\n procedure SetItemEx(Index: Integer; const Value: TTMSFNCBitmapItem);\r\n protected\r\n function GetBitmapItemClass: TCollectionItemClass; virtual;\r\n public\r\n constructor Create(AOwner: TTMSFNCBitmapContainer);\r\n function Add: TTMSFNCBitmapItem;\r\n function Insert(index: Integer): TTMSFNCBitmapItem;\r\n property Items[Index: Integer]: TTMSFNCBitmapItem read GetItemEx write SetItemEx; default;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TControlList = class(TList);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TControlList = class(TList);\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n TWinControl = TControl;\r\n {$ENDIF}\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCBitmapContainer = class(TTMSFNCCustomComponent)\r\n private\r\n FControls: TControlList;\r\n FItems: TTMSFNCBitmapCollection;\r\n FOnBitmapChanged: TNotifyEvent;\r\n procedure SetItems(const Value: TTMSFNCBitmapCollection);\r\n function GetBitmapName(AIndex: Integer): String;\r\n function GetBitmap(AIndex: Integer): TTMSFNCBitmap;\r\n function GetItems: TTMSFNCBitmapCollection;\r\n protected\r\n function GetInstance: NativeUInt; override;\r\n function GetVersion: string; override;\r\n function CreateItems: TTMSFNCBitmapCollection; virtual;\r\n procedure RegisterRuntimeClasses; override;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure DoBitmapChanged(Sender: TObject);\r\n procedure InvalidateMembers(AControl: TWinControl); virtual;\r\n public\r\n constructor Create; reintroduce; overload; virtual;\r\n constructor Create(AOwner: TComponent); overload; override;\r\n destructor Destroy; override;\r\n procedure Changed; virtual;\r\n procedure RegisterControl(AControl: TControl);\r\n function FindBitmap(s: string): TTMSFNCBitmap; virtual;\r\n function ItemCount: Integer;\r\n function RandomBitmapName: string;\r\n function RandomBitmap: TTMSFNCBitmap;\r\n procedure AddFromURL({%H-}URL, {%H-}BitmapName: string); virtual;\r\n procedure AddFromResource(ResourceName, BitmapName: string; AInstance: NativeUInt); overload;\r\n procedure AddFromResource(ResourceName, BitmapName: string); overload;\r\n {$IFNDEF WEBLIB}\r\n procedure AddFromFile(FileName, BitmapName: String);\r\n procedure AddFromFolder(AFolder: string);\r\n {$ENDIF}\r\n property BitmapNames[AIndex: Integer]: String read GetBitmapName;\r\n property Bitmaps[AIndex: Integer]: TTMSFNCBitmap read GetBitmap;\r\n published\r\n property Items: TTMSFNCBitmapCollection read GetItems write SetItems;\r\n property Version: string read GetVersion;\r\n property OnBitmapChanged: TNotifyEvent read FOnBitmapChanged write FOnBitmapChanged;\r\n end;\r\n\r\nimplementation\r\n\r\n{$R 'TMSFNCBitmapContainer.res'}\r\n\r\nuses\r\n TypInfo, WEBLib.Forms, SysUtils, WEBLib.TMSFNCUtils\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types\r\n {$ENDIF}\r\n ;\r\n\r\n {$IFDEF FMXLIB}\r\ntype\r\n TCustomFormHelper = class helper for TCustomForm\r\n private\r\n function GetControlCount: Integer;\r\n function GetControls(AIndex: Integer): TWinControl;\r\n public\r\n property ControlCount: Integer read GetControlCount;\r\n property Controls[Index: Integer]: TWinControl read GetControls;\r\n end;\r\n {$ENDIF}\r\n\r\n{ TTMSFNCBitmapItem }\r\n\r\nprocedure TTMSFNCBitmapItem.Assign(Source: TPersistent);\r\nbegin\r\n Name := (Source as TTMSFNCBitmapItem).Name;\r\n Tag := (Source as TTMSFNCBitmapItem).Tag;\r\n Bitmap.Assign((Source as TTMSFNCBitmapItem).Bitmap)\r\nend;\r\n\r\nconstructor TTMSFNCBitmapItem.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FBitmap := TTMSFNCBitmap.Create;\r\n FBitmap.OnChange := @DoBitmapChanged;\r\n FName := 'Item' + IntToStr(Collection.Count);\r\nend;\r\n\r\ndestructor TTMSFNCBitmapItem.Destroy;\r\nbegin\r\n FBitmap.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapItem.DoBitmapChanged(Sender: TObject);\r\nbegin\r\n if (Collection is TTMSFNCBitmapCollection) then\r\n begin\r\n if Assigned((Collection as TTMSFNCBitmapCollection).FOwner) then\r\n (Collection as TTMSFNCBitmapCollection).FOwner.DoBitmapChanged(Self);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCBitmapItem.GetDisplayName: string;\r\nbegin\r\n if FName <> '' then\r\n Result := FName\r\n {$IFDEF WEBLIB}\r\n else\r\n Result := '';\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n else\r\n Result := inherited;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCBitmapItem.SetBitmap(const Value: TTMSFNCBitmap);\r\nbegin\r\n FBitmap.Assign(Value);\r\nend;\r\n\r\n{ TTMSFNCBitmapCollection }\r\n\r\nfunction TTMSFNCBitmapCollection.Add: TTMSFNCBitmapItem;\r\nbegin\r\n Result := TTMSFNCBitmapItem(inherited Add);\r\nend;\r\n\r\nconstructor TTMSFNCBitmapCollection.Create(AOwner: TTMSFNCBitmapContainer);\r\nbegin\r\n inherited Create(AOwner, GetBitmapItemClass);\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCBitmapCollection.GetBitmapItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCBitmapItem;\r\nend;\r\n\r\nfunction TTMSFNCBitmapCollection.GetItemEx(Index: Integer): TTMSFNCBitmapItem;\r\nbegin\r\n Result := TTMSFNCBitmapItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCBitmapCollection.Insert(index: Integer): TTMSFNCBitmapItem;\r\nbegin\r\n Result := TTMSFNCBitmapItem(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TTMSFNCBitmapCollection.SetItemEx(Index: Integer; const Value: TTMSFNCBitmapItem);\r\nbegin\r\n inherited SetItem(Index, Value);\r\nend;\r\n\r\n{ TTMSFNCBitmapContainer }\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCBitmapContainer.AddFromFile(FileName, BitmapName: string);\r\nvar\r\n bmpi: TTMSFNCBitmapItem;\r\nbegin\r\n bmpi := Items.Add;\r\n bmpi.Bitmap.LoadFromFile(FileName);\r\n bmpi.Name := BitmapName;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.AddFromFolder(AFolder: string);\r\nvar\r\n SR: TSearchRec;\r\n\r\n procedure AddToList(s: string);\r\n begin\r\n with Items.Add do\r\n begin\r\n try\r\n Bitmap.LoadFromFile(s);\r\n Name := ExtractFileName(s);\r\n except\r\n Bitmap.Assign(nil);\r\n end;\r\n end;\r\n end;\r\n\r\nbegin\r\n if FindFirst(AFolder,faAnyFile and not faDirectory,SR) = 0 then\r\n begin\r\n AddToList(ExtractFilePath(AFolder) + SR.Name);\r\n while FindNext(SR) = 0 do\r\n AddToList(ExtractFilePath(AFolder) + SR.Name);\r\n end;\r\n FindClose(SR);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCBitmapContainer.AddFromURL(URL, BitmapName: string);\r\n{$IFDEF WEBLIB}\r\nvar\r\n bmpi: TTMSFNCBitmapItem;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF WEBLIB}\r\n bmpi := Self.Items.Add;\r\n bmpi.Bitmap.LoadFromURL(URL);\r\n bmpi.Name := BitmapName;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.AddFromResource(ResourceName, BitmapName: string; AInstance: NativeUInt);\r\nvar\r\n bmpi: TTMSFNCBitmapItem;\r\nbegin\r\n bmpi := Items.Add;\r\n bmpi.Bitmap.LoadFromResource(ResourceName, AInstance);\r\n bmpi.Name := BitmapName;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.AddFromResource(ResourceName, BitmapName: string);\r\nbegin\r\n AddFromResource(ResourceName, BitmapName, GetInstance);\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.Changed;\r\nvar\r\n i: integer;\r\nbegin\r\n for i := 0 to FControls.Count - 1 do\r\n {$IFDEF FMXLIB}\r\n FControls.Items[i].Invalidate;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n FControls.Items[i].Invalidate;\r\n {$ENDIF}\r\nend;\r\n\r\nconstructor TTMSFNCBitmapContainer.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FItems := CreateItems;\r\n FControls := TControlList.Create;\r\nend;\r\n\r\nconstructor TTMSFNCBitmapContainer.Create;\r\nbegin\r\n Create(nil);\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.CreateItems: TTMSFNCBitmapCollection;\r\nbegin\r\n Result := TTMSFNCBitmapCollection.Create(Self);\r\nend;\r\n\r\ndestructor TTMSFNCBitmapContainer.Destroy;\r\nbegin\r\n FControls.Free;\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.DoBitmapChanged(Sender: TObject);\r\nvar\r\n f: TCustomForm;\r\n I: Integer;\r\nbegin\r\n f := TTMSFNCUtils.GetParentForm(Self);\r\n if Assigned(f) then\r\n begin\r\n for I := 0 to f.ControlCount - 1 do\r\n if f.Controls[I] is TWinControl then\r\n InvalidateMembers(f.Controls[I] as TWinControl);\r\n end;\r\n\r\n if Assigned(OnBitmapChanged) then\r\n OnBitmapChanged(Self);\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.FindBitmap(s: string): TTMSFNCBitmap;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := nil;\r\n s := Uppercase(s);\r\n i := 1;\r\n while i <= Items.Count do\r\n begin\r\n if Uppercase(Items[i - 1].Name) = s then\r\n begin\r\n Result := Items[i - 1].Bitmap;\r\n Break;\r\n end;\r\n Inc(i);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.SetItems(const Value: TTMSFNCBitmapCollection);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.GetBitmap(AIndex: Integer): TTMSFNCBitmap;\r\nbegin\r\n Result := nil;\r\n if (AIndex >= 0) and (AIndex <= Items.Count - 1) then\r\n Result := Items[AIndex].Bitmap;\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.GetBitmapName(AIndex: Integer): String;\r\nbegin\r\n Result := '';\r\n if (AIndex >= 0) and (AIndex <= Items.Count - 1) then\r\n Result := Items[AIndex].Name;\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.GetInstance: NativeUInt;\r\nbegin\r\n Result := HInstance;\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.GetItems: TTMSFNCBitmapCollection;\r\nbegin\r\n Result := FItems;\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.GetVersion: string;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.InvalidateMembers(AControl: TWinControl);\r\nvar\r\n I: Integer;\r\nbegin\r\n if not Assigned(AControl) then\r\n Exit;\r\n\r\n if Assigned(GetPropInfo(AControl, 'BitmapContainer')) then\r\n AControl.Invalidate;\r\n\r\n for I := 0 to AControl.ControlCount - 1 do\r\n begin\r\n if AControl.Controls[I] is TWinControl then\r\n InvalidateMembers(AControl.Controls[I] as TWinControl);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.ItemCount: Integer;\r\nbegin\r\n Result := Items.Count;\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nvar\r\n i: integer;\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and Assigned(FControls) then\r\n begin\r\n for i := FControls.Count - 1 downto 0 do\r\n begin\r\n if (FControls.Items[i] = AComponent) then\r\n FControls.Delete(i);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.RandomBitmap: TTMSFNCBitmap;\r\nbegin\r\n Result := Bitmaps[Random(ItemCount)];\r\nend;\r\n\r\nfunction TTMSFNCBitmapContainer.RandomBitmapName: string;\r\nbegin\r\n Result := BitmapNames[Random(ItemCount)];\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.RegisterControl(\r\n AControl: TControl);\r\nbegin\r\n FControls.Add(AControl);\r\nend;\r\n\r\nprocedure TTMSFNCBitmapContainer.RegisterRuntimeClasses;\r\nbegin\r\n RegisterClass(TTMSFNCBitmapContainer);\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\n\r\n{ TCustomFormHelper }\r\n\r\nfunction TCustomFormHelper.GetControls(AIndex: Integer): TWinControl;\r\nvar\r\n c: TFmxObject;\r\nbegin\r\n Result := nil;\r\n c := Children[AIndex];\r\n if c is TWinControl then\r\n Result := c as TWinControl;\r\nend;\r\n\r\nfunction TCustomFormHelper.GetControlCount: Integer;\r\nbegin\r\n Result := ChildrenCount;\r\nend;\r\n\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCHTMLEngine;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCGraphics, Types, WEBLib.Graphics,\r\n WEBLib.TMSFNCTypes, WEBLib.TMSFNCBitmapContainer, WEBLib.TMSFNCGraphicsTypes\r\n {$IFDEF CMNLIB}\r\n , FMX.ImgList\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n , UITypes\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n ;\r\n\r\nvar\r\n TMSFNCHTMLENGINE_ATTR_DELIM: char = '\"';\r\n\r\nfunction HTMLDrawEx(AGraphics: TTMSFNCGraphics; s:string; fr:TRectF;\r\n XPos,YPos,FocusLink,HoverLink,ShadowOffset: Integer;\r\n CheckHotSpot,CheckHeight,{%H-}Print,Selected,Blink,HoverStyle,WordWrap: Boolean;\r\n {%H-}ResFactor:Double;\r\n URLColor,HoverColor,HoverFontColor,ShadowColor: TTMSFNCGraphicsColor;\r\n var AnchorVal,StripVal,FocusAnchor: string;\r\n var XSize,YSize: single; var HyperLinks,MouseLink: Integer;\r\n var HoverRect:TRectF;var LineCount: Integer; LineSpacing: Integer;\r\n BitmapContainer: TTMSFNCBitmapContainer; {%H-}Opacity: Single; HyperLinkUnderline: Boolean = True{$IFDEF CMNLIB}; ImageList: TCustomImageList = nil{$ENDIF};\r\n HighlightColor: TTMSFNCGraphicsColor = gcBlue;\r\n HighlightTextColor: TTMSFNCGraphicsColor = gcWhite;\r\n HighlightTextStyle: TFontStyles = []\r\n ): Boolean; overload;\r\n\r\nfunction HTMLDrawEx(AGraphics: TTMSFNCGraphics; s:string; fr:TRectF;\r\n XPos,YPos,FocusLink,HoverLink,ShadowOffset: Integer;\r\n CheckHotSpot,CheckHeight,{%H-}Print,Selected,Blink,HoverStyle,WordWrap, Down: Boolean;\r\n DownID: string;\r\n {%H-}ResFactor:Double;\r\n URLColor,HoverColor,HoverFontColor,ShadowColor: TTMSFNCGraphicsColor;\r\n var AnchorVal,StripVal,FocusAnchor: string;\r\n var XSize,YSize: single; var HyperLinks,MouseLink: Integer;\r\n var HoverRect, ControlRect:TRectF;var CID,CV,CT: string; var LineCount: Integer; LineSpacing: Integer;\r\n BitmapContainer: TTMSFNCBitmapContainer; {%H-}Opacity: Single; HyperLinkUnderline: Boolean = True{$IFDEF CMNLIB}; ImageList: TCustomImageList = nil{$ENDIF};\r\n HighlightColor: TTMSFNCGraphicsColor = gcBlue;\r\n HighlightTextColor: TTMSFNCGraphicsColor = gcWhite;\r\n HighlightTextStyle: TFontStyles = []\r\n ): Boolean; overload;\r\n\r\nfunction HiLight(s,h,tag:string;DoCase:boolean):string;\r\nfunction UnHiLight(s,tag:string):string;\r\nfunction GetControlValue(HTML,ControlID:string;var ControlValue:String): Boolean;\r\nfunction GetControlProp(HTML,ControlID:string): string;\r\nfunction GetControlMaxLen(HTML,ControlID:string): integer;\r\nfunction SetControlValue(var HTML:string;ControlID,ControlValue:string): Boolean;\r\nfunction ClearRadioControls(HTML: string): string;\r\nfunction GetNextControlID(HTML:string; ControlID: string): string;\r\nfunction HasHTMLControl(HTML: string): boolean;\r\nprocedure ParseControl(Tag: string; var ControlType,ControlID,ControlValue,ControlWidth,ControlHeight,ControlProp,ControlLen:string);\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, WEBLib.TMSFNCUtils\r\n {$IFDEF LCLLIB}\r\n ,LCLIntF\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,Windows\r\n {$ENDIF}\r\n ;\r\n\r\nfunction VarIPos(su,s:string;var Res:Integer):Integer;\r\nbegin\r\n Res := Pos(su, Uppercase(s));\r\n Result := Res;\r\nend;\r\n\r\nfunction StripPos2HTMLPos(s:string; i: Integer): Integer;\r\nvar\r\n j,k: Integer;\r\n Skip: Boolean;\r\nbegin\r\n Result := 0;\r\n k := 1;\r\n Skip := False;\r\n\r\n {$IFDEF FMXMOBILE}\r\n for j := 0 to Length(s) - 1 do\r\n {$ELSE}\r\n for j := 1 to Length(s) do\r\n {$ENDIF}\r\n begin\r\n if s[j] = '<' then\r\n Skip := True;\r\n\r\n if k = i then\r\n begin\r\n Result := j;\r\n Exit;\r\n end;\r\n\r\n if not Skip then\r\n Inc(k);\r\n\r\n if s[j] = '>' then\r\n Skip := False;\r\n\r\n end;\r\n\r\n if k = i then\r\n begin\r\n Result := Length(s) + 1;\r\n end;\r\nend;\r\n\r\n\r\nfunction PosFrom(su,s:string; h: Integer;DoCase: boolean; var Res: Integer): Integer;\r\nvar\r\n r: Integer;\r\nbegin\r\n Result := 0;\r\n Res := 0;\r\n\r\n if h > 0 then\r\n Delete(s,1,h);\r\n\r\n if DoCase then\r\n r := Pos(su,s)\r\n else\r\n r := Pos(AnsiUpperCase(su), AnsiUpperCase(s));\r\n\r\n if r > 0 then\r\n begin\r\n Res := h + r;\r\n Result := Res;\r\n end;\r\nend;\r\n\r\n\r\nfunction HiLight(s,h,tag:string;DoCase:boolean):string;\r\nvar\r\n hs: string;\r\n l,k: Integer;\r\nbegin\r\n hs := TTMSFNCUtils.HTMLStrip(s);\r\n\r\n l := 0;\r\n\r\n if (pos(h,s) > 0) and ((pos('<',hs) >0) or (pos('>',hs) > 0)) then\r\n begin\r\n hs := StringReplace(hs,'<','<',[rfReplaceAll]);\r\n hs := StringReplace(hs,'>','>',[rfReplaceAll]);\r\n s := hs;\r\n h := StringReplace(h,'<','<',[rfReplaceAll]);\r\n h := StringReplace(h,'>','>',[rfReplaceAll]);\r\n end;\r\n\r\n k := 0;\r\n while PosFrom(h,hs,l,DoCase,k) > 0 do\r\n begin\r\n l := k + Length(h);\r\n Insert('<'+tag+'>',s,StripPos2HTMLPos(s,k));\r\n Insert('',s,StripPos2HTMLPos(s,l));\r\n end;\r\n\r\n Result := s;\r\nend;\r\n\r\nfunction UnHiLight(s,tag:string):string;\r\nbegin\r\n Result := '';\r\n // replace line breaks by linefeeds\r\n tag := Uppercase(tag);\r\n while Pos('<'+tag+'>',Uppercase(s)) > 0 do s := StringReplace(s,'<'+tag+'>','',[rfIgnoreCase]);\r\n while Pos('',Uppercase(s)) > 0 do s := StringReplace(s,'','',[rfIgnoreCase]);\r\n\r\n s := StringReplace(s,'<','<',[rfReplaceAll]);\r\n s := StringReplace(s,'>','>',[rfReplaceAll]);\r\n\r\n Result := s;\r\nend;\r\n\r\nfunction IStrToInt(s:string):Integer;\r\nvar\r\n {%H-}Err,Res: Integer;\r\nbegin\r\n Val(s,Res,Err);\r\n Result := Res;\r\nend;\r\n\r\nfunction DBTagStrip(s:string):string;\r\nvar\r\n i,j: Integer;\r\nbegin\r\n i := Pos('<#',s);\r\n if i > 0 then\r\n begin\r\n Result := Copy(s,1,i - 1);\r\n Delete(s,1,i);\r\n j := Pos('>',s);\r\n if j > 0 then\r\n Delete(s,j,1);\r\n Result := Result + s;\r\n end\r\n else\r\n Result := s;\r\nend;\r\n\r\nfunction CRLFStrip(s:string;break:boolean):string;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := '';\r\n {$IFDEF FMXMOBILE}\r\n for i := 0 to Length(s) - 1 do\r\n {$ELSE}\r\n for i := 1 to Length(s) do\r\n {$ENDIF}\r\n begin\r\n if not ( (s[i] = #13) or (s[i] = #10)) then\r\n Result := Result + s[i]\r\n else\r\n if (s[i] = #13) and break then\r\n Result := Result + '
';\r\n end;\r\nend;\r\n\r\nprocedure ParseControl(Tag: string; var ControlType,ControlID,ControlValue,ControlWidth,ControlHeight,ControlProp,ControlLen:string);\r\nvar\r\n Prop: string;\r\n vp: integer;\r\nbegin\r\n ControlType := '';\r\n ControlWidth := '';\r\n ControlHeight := '';\r\n ControlValue := '';\r\n ControlID := '';\r\n ControlProp := '';\r\n ControlLen := '';\r\n\r\n vp := 0;\r\n if VarIPos('TYPE=',Tag,vp) > 0 then\r\n begin\r\n Prop := Copy(Tag,vp + 1,Length(Tag));\r\n Prop := Copy(Prop,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) - 1);\r\n ControlType := Uppercase(Prop);\r\n end;\r\n\r\n if VarIPos('WIDTH=',Tag,vp) > 0 then\r\n begin\r\n Prop := Copy(Tag,vp + 1,Length(Tag));\r\n Prop := Copy(Prop,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) - 1);\r\n ControlWidth := Prop;\r\n end;\r\n\r\n if VarIPos('HEIGHT=',Tag,vp) > 0 then\r\n begin\r\n Prop := Copy(Tag,vp + 1,Length(Tag));\r\n Prop := Copy(Prop,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) - 1);\r\n ControlHeight := Prop;\r\n end;\r\n\r\n if VarIPos('ID=',Tag,vp) > 0 then\r\n begin\r\n Prop := Copy(Tag,vp + 1,Length(Tag));\r\n Prop := Copy(Prop,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) - 1);\r\n ControlID := Prop;\r\n end;\r\n\r\n if VarIPos('VALUE=',Tag,vp) > 0 then\r\n begin\r\n Prop := Copy(Tag,vp + 1,Length(Tag));\r\n Prop := Copy(Prop,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) - 1);\r\n ControlValue := TTMSFNCUtils.UnFixMarkup(Prop);\r\n end;\r\n\r\n if VarIPos('PROP=',Tag,vp) > 0 then\r\n begin\r\n Prop := Copy(Tag,vp + 1,Length(Tag));\r\n Prop := Copy(Prop,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) - 1);\r\n ControlProp := TTMSFNCUtils.UnFixMarkup(Prop);\r\n end;\r\n\r\n if VarIPos('MAXLEN=',Tag,vp) > 0 then\r\n begin\r\n Prop := Copy(Tag,vp + 1,Length(Tag));\r\n Prop := Copy(Prop,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos(TMSFNCHTMLENGINE_ATTR_DELIM,Prop) - 1);\r\n ControlLen := Prop;\r\n end;\r\nend;\r\n\r\nfunction HasHTMLControl(HTML: string): boolean;\r\nvar\r\n lp: Integer;\r\nbegin\r\n lp := 0;\r\n Result := VarIPos(' 0;\r\nend;\r\n\r\nfunction GetNextControlID(HTML, ControlID:string): string;\r\nvar\r\n lp: Integer;\r\n Tag,CType,CID,CV,CW,CH,CP,CL: string;\r\n flg: boolean;\r\nbegin\r\n Result := '';\r\n flg := ControlID = '';\r\n\r\n lp := 0;\r\n while VarIPos(' 0 do\r\n begin\r\n Delete(html,1,lp);\r\n Tag := Copy(html,1,Pos('>',html));\r\n CType := '';\r\n CID := '';\r\n CV := '';\r\n CW := '';\r\n CH := '';\r\n CP := '';\r\n CL := '';\r\n ParseControl(Tag,CType,CID,CV,CW,CH,CP,CL);\r\n\r\n if flg and (CType <> 'BUTTON') and (CType <> 'CHECK') and (CType <> 'RADIO') then\r\n begin\r\n Result := CID;\r\n Exit;\r\n end;\r\n\r\n if (ControlID = CID) then\r\n flg := true;\r\n end;\r\nend;\r\n\r\nfunction GetControlValue(HTML,ControlID:string;var ControlValue:String): Boolean;\r\nvar\r\n lp: Integer;\r\n Tag,CType,CID,CV,CW,CH,CP,CL: string;\r\nbegin\r\n Result := False;\r\n lp := 0;\r\n while VarIPos(' 0 do\r\n begin\r\n Delete(html,1,lp);\r\n Tag := Copy(html,1,Pos('>',html));\r\n CType := '';\r\n CID := '';\r\n CV := '';\r\n CW := '';\r\n CH := '';\r\n CP := '';\r\n CL := '';\r\n ParseControl(Tag,CType,CID,CV,CW,CH,CP,CL);\r\n if (ControlID = CID) then\r\n begin\r\n ControlValue := CV;\r\n Result := True;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction GetControlProp(HTML,ControlID:string): string;\r\nvar\r\n lp: Integer;\r\n Tag,CType,CID,CV,CW,CH,CP,CL: string;\r\nbegin\r\n Result := '';\r\n lp := 0;\r\n while VarIPos(' 0 do\r\n begin\r\n Delete(html,1,lp);\r\n Tag := Copy(html,1,Pos('>',html));\r\n CType := '';\r\n CID := '';\r\n CV := '';\r\n CW := '';\r\n CH := '';\r\n CP := '';\r\n CL := '';\r\n ParseControl(Tag,CType,CID,CV,CW,CH,CP,CL);\r\n if (ControlID = CID) then\r\n begin\r\n Result := CP;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction GetControlMaxLen(HTML,ControlID:string): integer;\r\nvar\r\n lp, {%H-}e: Integer;\r\n Tag,CType,CID,CV,CW,CH,CP,CL: string;\r\nbegin\r\n Result := 0;\r\n lp := 0;\r\n e := 0;\r\n while VarIPos(' 0 do\r\n begin\r\n Delete(html,1,lp);\r\n Tag := Copy(html,1,Pos('>',html));\r\n CType := '';\r\n CID := '';\r\n CV := '';\r\n CW := '';\r\n CH := '';\r\n CP := '';\r\n CL := '';\r\n ParseControl(Tag,CType,CID,CV,CW,CH,CP,CL);\r\n\r\n if (ControlID = CID) then\r\n begin\r\n val(CL,Result,e);\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction SetControlValue(var HTML:string;ControlID,ControlValue:string): Boolean;\r\nvar\r\n lp: Integer;\r\n Tag,Temp,CType,CID,CV,CW,CH,CP,CL: string;\r\nbegin\r\n Result := False;\r\n Temp := '';\r\n ControlValue := TTMSFNCUtils.FixMarkup(ControlValue);\r\n lp := 0;\r\n while VarIPos(' 0 do\r\n begin\r\n Temp := Temp + Copy(html,1,lp);\r\n Delete(html,1,lp);\r\n Tag := Copy(html,1,Pos('>',html));\r\n CType := '';\r\n CID := '';\r\n CV := '';\r\n CW := '';\r\n CH := '';\r\n CP := '';\r\n CL := '';\r\n ParseControl(Tag,CType,CID,CV,CW,CH,CP,CL);\r\n if (ControlID = CID) then\r\n begin\r\n Temp := Temp + 'CONTROL ID='+TMSFNCHTMLENGINE_ATTR_DELIM+ControlID+TMSFNCHTMLENGINE_ATTR_DELIM+' VALUE='+TMSFNCHTMLENGINE_ATTR_DELIM+ControlValue+TMSFNCHTMLENGINE_ATTR_DELIM+' WIDTH='+TMSFNCHTMLENGINE_ATTR_DELIM+CW+TMSFNCHTMLENGINE_ATTR_DELIM+' TYPE=' + TMSFNCHTMLENGINE_ATTR_DELIM +CType+TMSFNCHTMLENGINE_ATTR_DELIM;\r\n if (CP <> '') then\r\n Temp := Temp + ' PROP='+TMSFNCHTMLENGINE_ATTR_DELIM+TTMSFNCUtils.FixMarkup(CP)+TMSFNCHTMLENGINE_ATTR_DELIM;\r\n if (CL <> '') then\r\n Temp := Temp + ' MAXLEN='+TMSFNCHTMLENGINE_ATTR_DELIM+CL+TMSFNCHTMLENGINE_ATTR_DELIM;\r\n\r\n Temp := Temp + '>';\r\n html := Temp + Copy(html,pos('>',html)+1,Length(html));\r\n Result := True;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction ClearRadioControls(HTML: string): string;\r\nvar\r\n lp: Integer;\r\n Tag,CType,CID,CV,CW,CH,CP,CL: string;\r\n sl: TStringList;\r\n s: string;\r\nbegin\r\n Result := '';\r\n\r\n s := HTML;\r\n\r\n sl := TStringList.Create;\r\n lp := 0;\r\n while VarIPos(' 0 do\r\n begin\r\n Delete(html,1,lp);\r\n Tag := Copy(html,1,Pos('>',html));\r\n CType := '';\r\n CID := '';\r\n CV := '';\r\n CW := '';\r\n CH := '';\r\n CP := '';\r\n CL := '';\r\n ParseControl(Tag,CType,CID,CV,CW,CH,CP,CL);\r\n\r\n if CType = 'RADIO' then\r\n sl.Add(CID);\r\n end;\r\n\r\n for lp := 0 to sl.Count - 1 do\r\n begin\r\n SetControlValue(s, sl.Strings[lp], 'FALSE');\r\n end;\r\n\r\n sl.Free;\r\n Result := s;\r\nend;\r\n\r\nfunction HTMLDrawEx(AGraphics: TTMSFNCGraphics; s:string; fr:TRectF;\r\n XPos,YPos,FocusLink,HoverLink,ShadowOffset: Integer;\r\n CheckHotSpot,CheckHeight,{%H-}Print,Selected,Blink,HoverStyle,WordWrap, Down: Boolean;\r\n DownID: string;\r\n {%H-}ResFactor:Double;\r\n URLColor,HoverColor,HoverFontColor,ShadowColor: TTMSFNCGraphicsColor;\r\n var AnchorVal,StripVal,FocusAnchor: string;\r\n var XSize,YSize: single; var HyperLinks,MouseLink: Integer;\r\n var HoverRect, ControlRect:TRectF;var CID,CV,CT: string; var LineCount: Integer; LineSpacing: Integer;\r\n BitmapContainer: TTMSFNCBitmapContainer; {%H-}Opacity: Single; HyperLinkUnderline: Boolean = True{$IFDEF CMNLIB}; ImageList: TCustomImageList = nil{$ENDIF};\r\n HighlightColor: TTMSFNCGraphicsColor = gcBlue;\r\n HighlightTextColor: TTMSFNCGraphicsColor = gcWhite;\r\n HighlightTextStyle: TFontStyles = []\r\n ): Boolean;\r\n\r\ntype\r\n TFloatStyle = (fsNone, fsLeft, fsRight);\r\n\r\nvar\r\n su: string;\r\n r,dr: TRectF;\r\n hr,rr: TRectF;\r\n htmlwidth,htmlheight,txtheight, ch: Single;\r\n rh: TRectF;\r\n Align: TAlignment;\r\n PIndent: Integer;\r\n OldFont: TTMSFNCGraphicsFont;\r\n OldFontColor: TTMSFNCGraphicsColor;\r\n CalcFont: TTMSFNCGraphicsFont;\r\n CalcFontColor: TTMSFNCGraphicsColor;\r\n DrawFont: TTMSFNCGraphicsFont;\r\n DrawFontCOlor: TTMSFNCGraphicsColor;\r\n FontColor: TTMSFNCGraphicsColor;\r\n OldPenColor: TTMSFNCGraphicsColor;\r\n OldCalcFont: TTMSFNCGraphicsFont;\r\n OldCalcFontColor: TTMSFNCGraphicsColor;\r\n BkColor,BGColor: TTMSFNCGraphicsColor;\r\n OldDrawFont: TTMSFNCGraphicsFont;\r\n OldDrawFontColor: TTMSFNCGraphicsColor;\r\n Hotspot, ImageHotspot: Boolean;\r\n Anchor,OldAnchor,MouseInAnchor,Error: Boolean;\r\n paracolor,pencolor,blnkcolor,hifcol,hibcol: TTMSFNCGraphicsColor;\r\n LastAnchor,OldAnchorVal,LType: string;\r\n IMGSize: TPoint;\r\n isSup,isSub,isPara,isShad: Boolean;\r\n hlcount,licount: Integer;\r\n imgali: single;\r\n subh, suph: Single;\r\n ListIndex: Integer;\r\n Invisible: Boolean;\r\n FoundTag: Boolean;\r\n nnFit: Integer;\r\n inspoint: Integer;\r\n hifStyles: TFontStyles;\r\n AltImg,ImgIdx,OldImgIdx: Integer;\r\n ColL,ColB: TTMSFNCGraphicsColor;\r\n ofsx,newofsx: integer;\r\n FHot: Boolean;\r\n floatrect: TRect;\r\n floatpt: TPoint;\r\n txtfloat,txtfloatbefore: TFloatStyle;\r\n imgfloat: TFloatStyle;\r\n\r\n\r\n function HTMLDrawLine(AGraphics: TTMSFNCGraphics; var s:string;r: TRectF;Calc:Boolean;\r\n var w,h,subh,suph,imgali:Single;var Align:TAlignment; var PIndent: Integer;\r\n XPos,YPos:Integer;var Hotspot,ImageHotSpot:Boolean;OffsetX: integer; var NewOffsetX: integer; var floatrect: TRect; var txtfloat: TFloatStyle):string;\r\n var\r\n su,Res,TagProp,Prop,Tagp,LineText,dsu:string;\r\n cr, ir: TRectF;\r\n {$IFDEF CMNLIB}\r\n crc: TRect;\r\n {$ENDIF}\r\n linebreak,imgbreak,linkbreak: Boolean;\r\n indent,bmpx,bmpy,imgw,imgh: Integer;\r\n err: integer;\r\n sw, th, errs: Single;\r\n rh: TRectF;\r\n TagPos,SpacePos,o,l: Integer;\r\n bmp: TTMSFNCBitmap;\r\n bmpcreated: boolean;\r\n NewColor: TTMSFNCGraphicsColor;\r\n TagWidth,TagHeight,WordLen: Integer;\r\n WordWidth: Single;\r\n TagChar: Char;\r\n LengthFits: Boolean;\r\n ptf1,ptf2: TPointF;\r\n imgalign,imgoffs, imgth: integer;\r\n ControlType,ControlWidth,ControlHeight,ControlID,ControlValue,ControlProp,ControlLen: string;\r\n begin\r\n Result := '';\r\n LineText := '';\r\n WordWidth := 0;\r\n r.Bottom := r.Bottom - Subh;\r\n\r\n w := 0;\r\n sw := 0;\r\n\r\n LineBreak := False;\r\n ImgBreak := False;\r\n LinkBreak := False;\r\n HotSpot := False;\r\n ImageHotSpot := False;\r\n\r\n// r.Left := r.Left + offsetX;\r\n\r\n cr := r;\r\n res := '';\r\n\r\n if not Calc then\r\n cr.Left := cr.Left + OffsetX;\r\n\r\n if isPara and not Calc then\r\n begin\r\n Pencolor := AGraphics.Stroke.Color;\r\n AGraphics.Stroke.Color := AGraphics.Fill.Color;\r\n AGraphics.DrawRectangle(Rectf(fr.Left,r.Top,fr.Right,r.Top + h));\r\n end;\r\n\r\n while (Length(s) > 0) and not LineBreak and not ImgBreak do\r\n begin\r\n // get next word or till next HTML tag\r\n TagPos := Pos('<',s);\r\n\r\n if WordWrap then\r\n SpacePos := Pos(' ',s)\r\n else\r\n SpacePos := 0;\r\n\r\n if (Tagpos > 0) and ((SpacePos > TagPos) or (SpacePos = 0)) then\r\n su := Copy(s,1,TagPos - 1)\r\n else\r\n begin\r\n if SpacePos > 0 then\r\n su := Copy(s,1,SpacePos)\r\n else\r\n su := s;\r\n end;\r\n\r\n WordLen := Length(su);\r\n\r\n while Pos(' ',su) > 0 do\r\n begin\r\n TTMSFNCUtils.TagReplacestring(' ',' ',su);\r\n end;\r\n\r\n while Pos('<',su) > 0 do\r\n begin\r\n TTMSFNCUtils.TagReplacestring('<','<',su);\r\n end;\r\n\r\n while Pos('>',su) > 0 do\r\n begin\r\n TTMSFNCUtils.TagReplacestring('>','>',su);\r\n end;\r\n\r\n //WordLenEx := Length(su);\r\n\r\n if WordLen > 0 then\r\n begin\r\n rh := AGraphics.CalculateText(su);\r\n th := rh.Bottom - rh.Top;\r\n\r\n if isSub and (subh < (th / 4)) then subh := th / 4;\r\n if isSup and (suph < (th / 4)) then suph := th / 4;\r\n\r\n if th > h then\r\n h := th;\r\n\r\n StripVal := StripVal + su;\r\n\r\n if Invisible then\r\n Delete(s,1,WordLen);\r\n\r\n if not Invisible then\r\n begin\r\n // draw mode\r\n if not Calc then\r\n begin\r\n if isSup then\r\n cr.Bottom := cr.Bottom - suph;\r\n\r\n if isSub then\r\n cr.Bottom := cr.Bottom + subh;\r\n\r\n cr.Bottom := cr.Bottom - imgali;\r\n\r\n rh := AGraphics.CalculateText(su);\r\n errs := rh.Right - rh.Left;\r\n\r\n if BkColor <> gcNull then\r\n begin\r\n AGraphics.Fill.Color := BkColor;\r\n AGraphics.Stroke.Color := BkColor;\r\n rh := AGraphics.CalculateText('gh');\r\n AGraphics.DrawRectangle(RectF(cr.Left, cr.Top, cr.Left + errs, cr.Top + (rh.Bottom - rh.Top)));\r\n end;\r\n\r\n BKColor := gcNull;\r\n\r\n if isShad then\r\n begin\r\n OffsetRectEx(cr,ShadowOffset,ShadowOffset);\r\n AGraphics.Font.Color := ShadowColor;\r\n AGraphics.DrawText(cr, su, False, gtaLeading, gtaCenter, gttNone, 0, -1, -1{$IFNDEF LIMITEDGRAPHICSMODE}, False{$ENDIF});\r\n OffsetRectEx(cr,-ShadowOffset,-ShadowOffset);\r\n AGraphics.Font.Color := OldFontColor;\r\n end;\r\n\r\n //errs := cr.Right;\r\n\r\n {$IFDEF FMXMOBILE}\r\n if (su <> '') and (su[length(su)-1] = ' ') and Anchor then\r\n {$ELSE}\r\n if (su <> '') and (su[length(su)] = ' ') and Anchor then\r\n {$ENDIF}\r\n dsu := su + #0\r\n else\r\n dsu := su;\r\n\r\n AGraphics.Font.Color := FontColor;\r\n AGraphics.DrawText(cr, dsu, False, gtaLeading, gtaCenter, gttNone, 0, -1, -1{$IFNDEF LIMITEDGRAPHICSMODE}, False{$ENDIF});\r\n\r\n cr.Right := cr.Left + errs;\r\n\r\n if Anchor and (Hyperlinks - 1 = FocusLink) then\r\n FocusAnchor := LastAnchor;\r\n\r\n if Error then\r\n begin\r\n AGraphics.Stroke.Color := gcRed;\r\n AGraphics.Stroke.Kind := gskSolid;\r\n AGraphics.Stroke.Width := 1;\r\n\r\n l := Round((cr.Left / 2) * 2);\r\n if (l mod 4)=0 then o := 2 else o := 0;\r\n\r\n while l < cr.Right do\r\n begin\r\n ptf1 := PointF(l,r.Bottom + o - 1);\r\n if o = 2 then o := 0 else o := 2;\r\n ptf2 := PointF(l + 2, r.Bottom + o - 1);\r\n AGraphics.DrawLine(ptf1, ptf2);\r\n Inc(l,2);\r\n end;\r\n end;\r\n\r\n cr.Left := cr.Right;\r\n cr.Right := r.Right;\r\n cr.Bottom := r.Bottom;\r\n cr.Top := r.Top;\r\n end\r\n else\r\n begin\r\n cr := r; //reinitialized each time !\r\n\r\n rh := AGraphics.CalculateText(su);\r\n cr.Right := cr.Left + (rh.Right - rh.Left);\r\n\r\n // preparations for editing purposes\r\n if (ypos > cr.Top) and (ypos < cr.bottom) and (xpos > w) then {scan charpos here}\r\n begin\r\n //this will get the character pos of the insertion point\r\n nnfit := 0;\r\n if nnfit = WordLen then\r\n InsPoint := InsPoint + WordLen\r\n else\r\n InsPoint := InsPoint + nnfit;\r\n end;\r\n\r\n //end of preparations for editing purposes\r\n\r\n // Calculated text width\r\n WordWidth := cr.Right - cr.Left;\r\n w := w + WordWidth;\r\n\r\n //errs := XPos - cr.Left;\r\n //errs := r.Right - XPos - cr.Left;\r\n\r\n if (XPos - cr.Left >= w - WordWidth) and (XPos - cr.Left <= w) and Anchor then\r\n begin\r\n HotSpot := True;\r\n if (YPos > cr.Top){ and (YPos < cr.Bottom)} then\r\n begin\r\n Anchorval := LastAnchor;\r\n MouseInAnchor := True;\r\n end;\r\n end;\r\n end;\r\n\r\n LengthFits := (w < r.Right - r.Left - OfsX) or (r.Right - r.Left - OfsX <= WordWidth);\r\n\r\n// if not LengthFits and\r\n// ((Length(LineText) > 0) and (LineText[Length(LineText)] <> ' ')) then\r\n// LengthFits := True;\r\n\r\n LineText := LineText + su;\r\n\r\n// if not LengthFits and not Wordwrap then\r\n// begin\r\n// LineBreak := true;\r\n// end;\r\n\r\n if LengthFits or not WordWrap then\r\n begin\r\n Res := Res + Copy(s,1,WordLen);\r\n\r\n //if not LengthFits and Calc and (LineText <> su) then\r\n // s := '';\r\n\r\n Delete(s,1,WordLen);\r\n\r\n if Length(su) >= WordLen then\r\n begin\r\n\r\n if Copy(su, WordLen, 1) = ' ' then\r\n begin\r\n rh := AGraphics.CalculateText(' ');\r\n sw := (rh.Right - rh.Left);\r\n end\r\n else\r\n sw := 0;\r\n end\r\n else\r\n sw := 0;\r\n end\r\n else\r\n begin\r\n LineBreak := True;\r\n w := w - WordWidth;\r\n end;\r\n end;\r\n end;\r\n\r\n TagPos := Pos('<',s);\r\n\r\n if (TagPos = 1) and (Length(s) <= 2) then\r\n s := '';\r\n\r\n if not LineBreak and (TagPos = 1) and (Length(s) > 2) then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if (s[1] = '/') and (Length(s) > 3) then\r\n {$ELSE}\r\n if (s[2] = '/') and (Length(s) > 3) then\r\n {$ENDIF}\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n case UpCase(s[2]) of\r\n {$ELSE}\r\n case UpCase(s[3]) of\r\n {$ENDIF}\r\n 'A':begin\r\n if (not HoverStyle or (Hoverlink = Hyperlinks)) and not Calc then\r\n begin\r\n AGraphics.Font.Style := AGraphics.Font.Style - [TFontStyle.fsUnderline];\r\n if Hovercolor <> gcNull then\r\n BkColor := HoverColor;\r\n if HoverFontColor <> gcNull then\r\n FontColor := HoverFontColor;\r\n end;\r\n\r\n if not Selected then\r\n FontColor := OldFontColor;\r\n\r\n Anchor := False;\r\n\r\n if MouseInAnchor then\r\n begin\r\n hr.Bottom := r.Bottom;\r\n hr.Right := r.Left + w;\r\n if r.Top <> hr.Top then\r\n begin\r\n hr.Left := r.Left;\r\n hr.Top := r.Top;\r\n end;\r\n\r\n HoverRect := hr;\r\n MouseLink := HyperLinks;\r\n MouseInAnchor := False;\r\n end;\r\n\r\n if Focuslink = Hyperlinks - 1 then\r\n begin\r\n rr.Right := cr.Left;\r\n rr.Bottom := cr.Bottom - ImgAli;\r\n rh := AGraphics.CalculateText('gh');\r\n rr.Top := rr.Bottom - (rh.Bottom - rh.Top);\r\n InflateRectEx(rr,1,0);\r\n //if not Calc then AGraphics.DrawFocusRect(rr);\r\n end;\r\n end;\r\n 'E':begin\r\n if not Calc then\r\n Error := False;\r\n end;\r\n 'B':begin\r\n {$IFDEF FMXMOBILE}\r\n if s[3] <> '>' then\r\n {$ELSE}\r\n if s[4] <> '>' then\r\n {$ENDIF}\r\n FontColor := OldFontColor\r\n else\r\n AGraphics.Font.Style := AGraphics.Font.Style - [TFontStyle.fsBold];\r\n end;\r\n 'S':begin\r\n {$IFDEF FMXMOBILE}\r\n TagChar := UpCase(s[3]);\r\n {$ELSE}\r\n TagChar := UpCase(s[4]);\r\n {$ENDIF}\r\n\r\n if (TagChar = 'U') then\r\n begin\r\n isSup := False;\r\n isSub := False;\r\n end\r\n else\r\n if (TagChar = 'H') then\r\n isShad := False\r\n else\r\n AGraphics.Font.Style := AGraphics.Font.Style - [TFontStyle.fsStrikeOut];\r\n end;\r\n 'F':begin\r\n AGraphics.Font.Name := OldFont.Name;\r\n AGraphics.Font.Size := OldFont.Size;\r\n if not Calc and not Selected then\r\n begin\r\n FontColor := OldFontColor;\r\n AGraphics.Fill.Color := BGColor;\r\n end;\r\n end;\r\n 'H':begin\r\n if not Calc then\r\n begin\r\n FontColor := hifCol;\r\n BkColor := hibCol;\r\n AGraphics.Font.Style := hifStyles;\r\n AGraphics.Fill.Color := hibCol;\r\n end;\r\n end;\r\n 'I':begin\r\n AGraphics.Font.Style := AGraphics.Font.Style - [TFontStyle.fsItalic];\r\n end;\r\n 'L':begin\r\n LineBreak := True;\r\n end;\r\n 'O':begin\r\n NewOffsetX := 0;\r\n end;\r\n 'P':begin\r\n LineBreak := True;\r\n if not Calc then\r\n begin\r\n AGraphics.Fill.Color := ParaColor;\r\n isPara := false;\r\n end;\r\n end;\r\n 'U':begin\r\n {$IFDEF FMXMOBILE}\r\n if (s[3] <> '>') and (ListIndex > 0) then\r\n {$ELSE}\r\n if (s[4] <> '>') and (ListIndex > 0) then\r\n {$ENDIF}\r\n Dec(Listindex)\r\n else\r\n AGraphics.Font.Style := AGraphics.Font.Style - [TFontStyle.fsUnderline];\r\n end;\r\n 'R':begin\r\n //EndRotated(Canvas);\r\n end;\r\n 'Z':Invisible := False;\r\n end;\r\n end\r\n else\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n case Upcase(s[1]) of\r\n {$ELSE}\r\n case Upcase(s[2]) of\r\n {$ENDIF}\r\n 'A':begin\r\n // only do this when at hover position in xpos,ypos\r\n if (FocusLink = HyperLinks) and not Calc then\r\n begin\r\n rr.Left := cr.Left;\r\n rr.Top := cr.Top;\r\n end;\r\n\r\n Inc(HyperLinks);\r\n if (not HoverStyle or (Hoverlink = HyperLinks)) and not Calc then\r\n begin\r\n if HyperLinkUnderline then\r\n AGraphics.Font.Style := AGraphics.Font.Style + [TFontStyle.fsUnderline];\r\n\r\n if (Hovercolor <> gcNull) and not Calc then\r\n BkColor := HoverColor;\r\n\r\n if HoverFontColor <> gcNull then\r\n FontColor := HoverFontColor;\r\n end;\r\n\r\n if not Selected and ((HoverFontColor = gcNull) or (HoverLink <> HyperLinks) or not HoverStyle) then\r\n begin\r\n OldFontColor := FontColor;\r\n FontColor := URLColor;\r\n end;\r\n\r\n TagProp := Copy(s,3,Pos('>',s) - 1); // \r\n Prop := Copy(TagProp,Pos('\"',TagProp) + 1,Length(TagProp));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n LastAnchor := Prop;\r\n Anchor := True;\r\n\r\n hr.Left := w;\r\n hr.Top := r.Top;\r\n end;\r\n 'B':begin\r\n {$IFDEF FMXMOBILE}\r\n TagChar := Upcase(s[2]);\r\n {$ELSE}\r\n TagChar := Upcase(s[3]);\r\n {$ENDIF}\r\n case TagChar of\r\n '>': AGraphics.Font.Style := AGraphics.Font.Style + [TFontStyle.fsBold]; // tag\r\n 'R': //
tag\r\n begin\r\n LineBreak := true;\r\n StripVal := StripVal + #13;\r\n end;\r\n 'L': if not Blink then\r\n FontColor := BlnkColor; // tag\r\n 'O':\r\n begin\r\n\r\n bmpy := 0;\r\n Res := Res + Copy(s,1,pos('>',s));\r\n if not Calc and not Selected then\r\n begin\r\n TagProp := Uppercase(Copy(s,6,pos('>',s)-1));\r\n\r\n if (Pos('BACKGROUND',TagProp) > 0) then\r\n begin\r\n Prop := Copy(TagProp,Pos('BACKGROUND',TagProp)+10,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop)+1,Length(prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop)-1);\r\n\r\n if Pos('IDX:', UpperCase(Prop)) > 0 then\r\n begin\r\n Delete(Prop, 1, 4);\r\n (*\r\n if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then\r\n begin\r\n IMGSize.X := MulDiv(FImages.Width, GetDeviceCaps(AGraphics.Handle, LOGPIXELSX), 96);\r\n IMGSize.Y := MulDiv(FImages.Height, GetDeviceCaps(AGraphics.Handle, LOGPIXELSY), 96);\r\n\r\n if not Calc and not Print then\r\n FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop), True);\r\n\r\n if not Calc and Print then\r\n begin\r\n CR.Right := CR.Left + Round(resfactor * FImages.Width);\r\n CR.Bottom := CR.Top + Round(resfactor * FImages.Height);\r\n\r\n ABitmap := TBitmap.Create;\r\n FImages.GetBitmap(IStrToInt(Prop), ABitmap);\r\n PrintBitmap(Canvas, CR, ABitmap);\r\n ABitmap.Free;\r\n CR := r;\r\n end;\r\n end;\r\n *)\r\n end;\r\n\r\n bmp := nil;\r\n bmpcreated := false;\r\n\r\n if (Pos(':',Prop) = 0) and Assigned(BitmapContainer) then\r\n begin\r\n bmp := BitmapContainer.FindBitmap(Prop);\r\n end;\r\n\r\n {$IFNDEF WEBLIB}\r\n if (Pos('FILE://',Uppercase(Prop)) > 0) then\r\n begin\r\n Delete(Prop,1,7);\r\n\r\n if FileExists(Prop) then\r\n begin\r\n bmp := TTMSFNCBitmap.Create;\r\n bmp.LoadFromFile(Prop);\r\n bmpcreated := true;\r\n end;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n if (Pos('URL://',Uppercase(Prop)) > 0) then\r\n begin\r\n Delete(Prop,1,6);\r\n bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromURL(Prop));\r\n bmpcreated := true;\r\n end;\r\n {$ENDIF}\r\n\r\n if Assigned(bmp) then\r\n begin\r\n if not IsBitmapEmpty(bmp) and (bmp.Width > 0) and (bmp.Height > 0) then\r\n begin\r\n // do the tiling here\r\n //hrgn := CreateRectRgn(fr.left, fr.top, fr.right,fr.bottom);\r\n //SelectClipRgn(AGraphics.Handle, hrgn);\r\n while (bmpy < fr.bottom-fr.top) do\r\n begin\r\n bmpx := 0;\r\n while (bmpx < fr.right - fr.left) do\r\n begin\r\n AGraphics.DrawBitmap(RectF(Round(fr.left+bmpx),Round(fr.top+bmpy), Round(fr.Left + bmpx) + bmp.Width,Round(fr.top+bmpy) + bmp.Height), BitmapToDrawBitmap(bmp));\r\n //AGraphics.Draw(fr.left+bmpx,fr.top+bmpy,bmp);\r\n bmpx := bmpx + bmp.width;\r\n end;\r\n bmpy := bmpy + bmp.height;\r\n end;\r\n //SelectClipRgn(AGraphics.handle, 0);\r\n //DeleteObject(hrgn);\r\n end;\r\n\r\n if bmpcreated then\r\n bmp.Free;\r\n end; //end of bmp <> nil\r\n end; //end of background\r\n\r\n if (Pos('BGTOPLEFT', TagProp) > 0) then\r\n begin\r\n Prop := Copy(TagProp, Pos('BGTOPLEFT', TagProp) + 10, Length(TagProp));\r\n Prop := Copy(Prop, Pos('\"', Prop) + 1, Length(Prop));\r\n Prop := Copy(Prop, 1, Pos('\"', Prop) - 1);\r\n\r\n bmp := nil;\r\n\r\n if (Pos(':', Prop) = 0) and Assigned(BitmapContainer) then\r\n begin\r\n bmp := BitmapContainer.FindBitmap(Prop);\r\n end;\r\n\r\n if Assigned(bmp) then\r\n begin\r\n if not IsBitmapEmpty(bmp) and (bmp.Width > 0) and (bmp.Height > 0) then\r\n begin\r\n AGraphics.DrawBitmap(RectF(Round(fr.Left), Round(fr.Top + bmpy),Round(fr.Left) + bmp.Width ,Round(fr.Top) + bmp.Height), BitmapToDrawBitmap(bmp));\r\n end;\r\n end;\r\n end; //end of bgtopleft\r\n\r\n if (Pos('BGTOPRIGHT', TagProp) > 0) then\r\n begin\r\n Prop := Copy(TagProp, Pos('BGTOPRIGHT', TagProp) + 10, Length(TagProp));\r\n Prop := Copy(Prop, Pos('\"', Prop) + 1, Length(Prop));\r\n Prop := Copy(Prop, 1, Pos('\"', Prop) - 1);\r\n\r\n bmp := nil;\r\n\r\n if (Pos(':', Prop) = 0) and Assigned(BitmapContainer) then\r\n begin\r\n bmp := BitmapContainer.FindBitmap(Prop);\r\n end;\r\n\r\n\r\n if Assigned(bmp) then\r\n begin\r\n if not IsBitmapEmpty(bmp) and (bmp.Width > 0) and (bmp.Height > 0) then\r\n begin\r\n AGraphics.DrawBitmap(RectF(Round(fr.Right) - bmp.Width, Round(fr.Top + bmpy), Round(fr.Right), Round(fr.Top) + bmp.Height ), BitmapToDrawBitmap(bmp));\r\n end;\r\n end;\r\n end; //end of bgtopright\r\n\r\n if TTMSFNCUtils.VarPos('BGCOLOR',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos + 5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n\r\n NewColor := gcNull;\r\n\r\n if Length(Prop) > 0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if Prop[0] = '#' then\r\n {$ELSE}\r\n if Prop[1] = '#' then\r\n {$ENDIF}\r\n NewColor := TTMSFNCGraphics.HTMLToColor(Prop)\r\n else\r\n begin\r\n {$IFDEF WEBLIB}\r\n NewColor := TTMSFNCGraphics.TextToColor(LowerCase(prop));\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n NewColor := TTMSFNCGraphics.TextToColor(AnsiLowerCase(prop));\r\n {$ENDIF}\r\n end;\r\n end;\r\n\r\n if TTMSFNCUtils.VarPos('BGCOLORTO',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos + 5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n\r\n Prop := 'H';\r\n if TTMSFNCUtils.VarPos('DIR',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos + 3,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n end;\r\n\r\n AGraphics.Stroke.Color := Newcolor;\r\n //DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Rect(fr.left,fr.top,fr.right,fr.bottom),Prop = 'H');\r\n //AGraphics.Brush.Style := bsClear\r\n end\r\n else\r\n begin\r\n BGColor := AGraphics.Fill.Color;\r\n AGraphics.Fill.Color := NewColor;\r\n PenColor:=AGraphics.Stroke.Color;\r\n AGraphics.Stroke.Color := Newcolor;\r\n AGraphics.DrawRectangle(Rectf(fr.left - 2,fr.top,fr.right,fr.bottom));\r\n AGraphics.Stroke.Color := PenColor;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n 'E':begin\r\n if not Calc then\r\n Error := True;\r\n end;\r\n 'C':begin\r\n TagProp := Copy(s,9,pos('>',s)-1);\r\n ControlType := '';\r\n ControlID := '';\r\n ControlValue := '';\r\n ControlWidth := '';\r\n ControlHeight := '';\r\n ControlProp := '';\r\n ControlLen := '';\r\n ParseControl(TagProp,ControlType,ControlID,ControlValue,ControlWidth,ControlHeight,ControlProp,ControlLen);\r\n\r\n ch := 25;\r\n\r\n if ControlHeight <> '' then\r\n begin\r\n val(ControlHeight,ch,err);\r\n if err <> 0 then\r\n ch := 25;\r\n end;\r\n\r\n if (ControlWidth <> '') or (ControlType = 'CHECK') or (ControlType = 'RADIO') then\r\n begin\r\n val(ControlWidth,Indent,err);\r\n\r\n if err = 0 then\r\n begin\r\n IMGSize.x := Indent;\r\n IMGSize.y := Round(AGraphics.CalculateTextHeight('gh')) + 10;\r\n end;\r\n\r\n if (ControlType = 'CHECK') or (ControlType = 'RADIO') then\r\n h := 16\r\n else\r\n h := 23;\r\n\r\n if (ch > 25) then\r\n h := ch - 2;\r\n\r\n if not Calc then\r\n begin\r\n if (ControlType = 'EDIT') or (ControlType = 'PASSWORD') or (ControlType = 'MASK') then\r\n begin\r\n end;\r\n\r\n if ControlType = 'COMBO' then\r\n begin\r\n end;\r\n\r\n if ControlType = 'CHECK' then\r\n begin\r\n IMGSize.x := Round(16 * ResFactor) + 2;\r\n IMGSize.y := IMGSize.x;\r\n Indent := IMGSize.x;\r\n ir := RectF(cr.Left + 1, cr.Top + ((cr.Bottom - cr.Top) - (ImgSize.Y - 2)) / 2, cr.Left + IMGSize.X - 1, cr.Top + ((cr.Bottom - cr.Top) - (ImgSize.Y - 2)) / 2 + (IMGSize.Y - 2));\r\n ir := RectF(Round(ir.Left), Round(ir.Top), Round(ir.Right), Round(ir.Bottom));\r\n AGraphics.DrawCheckBox(ir, UpperCase(ControlValue) = 'TRUE', (Down and (DownID = ControlID)), True);\r\n end;\r\n\r\n if ControlType = 'RADIO' then\r\n begin\r\n IMGSize.x := Round(16 * ResFactor) + 2;\r\n IMGSize.y := IMGSize.x;\r\n Indent := IMGSize.x;\r\n ir := RectF(cr.Left + 1, cr.Top + ((cr.Bottom - cr.Top) - (ImgSize.Y - 2)) / 2, cr.Left + IMGSize.X - 1, cr.Top + ((cr.Bottom - cr.Top) - (ImgSize.Y - 2)) / 2 + (IMGSize.Y - 2));\r\n ir := RectF(Round(ir.Left), Round(ir.Top), Round(ir.Right), Round(ir.Bottom));\r\n AGraphics.DrawRadioButton(ir, UpperCase(ControlValue) = 'TRUE', (Down and (DownID = ControlID)), True);\r\n end;\r\n\r\n if ControlType = 'BUTTON' then\r\n begin\r\n IMGSize.y := 22;\r\n ir := RectF(cr.Left + 2,cr.Top + ((cr.Bottom - cr.Top) - IMGSize.Y) / 2,cr.Left + Indent -2, cr.Top + ((cr.Bottom - cr.Top) - IMGSize.Y) / 2+ IMGSize.Y);\r\n FHot := PtInRectEx(ir, PointF(XPos, YPos));\r\n ir := RectF(Round(ir.Left), Round(ir.Top), Round(ir.Right), Round(ir.Bottom));\r\n AGraphics.DrawButton(ir, Down and (DownID = ControlID), FHot, True);\r\n InflateRectEx(ir,-2,-2);\r\n AGraphics.DrawText(ir, ControlValue, False, gtaCenter, gtaCenter);\r\n end;\r\n end;\r\n\r\n if (ControlType = 'BUTTON') then\r\n IMGSize.y := 22;\r\n\r\n if (ControlType = 'COMBO') then\r\n IMGSize.y := 25;\r\n\r\n if (ControlType = 'CHECK') or (ControlType = 'RADIO') then\r\n begin\r\n IMGSize.x := Round(16 * ResFactor) + 2;\r\n IMGSize.y := IMGSize.X;\r\n end;\r\n\r\n if ((XPos - r.Left > w) and (XPos - r.Left < w + IMGSize.x) and\r\n (YPos > cr.Top) and (YPos < cr.Top + IMGSize.Y)) or\r\n (CheckHotSpot and (CID = ControlID)) then\r\n begin\r\n ImageHotSpot := True;\r\n AnchorVal := 'ctrl';\r\n AltImg := ImgIdx;\r\n\r\n ir.Left := r.left + w;\r\n ir.Right := ir.Left + ImgSize.X;\r\n ir.Top := cR.Top;\r\n ir.Bottom := cr.top + ImgSize.Y;\r\n\r\n ControlRect := ir;\r\n CV := ControlValue;\r\n CID := ControlID;\r\n CT := ControlType;\r\n end;\r\n\r\n if (w + IMGSize.x > r.Right-r.Left) and\r\n (IMGSize.x < r.Right - r.Left) then\r\n begin\r\n ImgBreak := True;\r\n end\r\n else\r\n begin\r\n w := w + IMGSize.x;\r\n cr.left := cr.left + IMGSize.x;\r\n if IMGSize.y > h then\r\n h := IMGSize.y;\r\n end;\r\n end;\r\n end;\r\n 'H':begin\r\n {$IFDEF FMXMOBILE}\r\n case Upcase(s[2]) of\r\n {$ELSE}\r\n case Upcase(s[3]) of\r\n {$ENDIF}\r\n 'R':\r\n begin\r\n LineBreak := True;\r\n if not Calc then\r\n begin\r\n TagProp := Copy(s,4,Pos('>',s) - 1);\r\n\r\n NewColor := gcBlack;\r\n\r\n if TTMSFNCUtils.VarPos('COLOR',Uppercase(TagProp),TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos+5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',prop)+1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',prop)-1);\r\n\r\n if Length(Prop) > 0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if Prop[0] = '#' then\r\n {$ELSE}\r\n if Prop[1] = '#' then\r\n {$ENDIF}\r\n NewColor := TTMSFNCGraphics.HTMLToColor(Prop)\r\n else\r\n begin\r\n {$IFDEF WEBLIB}\r\n NewColor := TTMSFNCGraphics.TextToColor(LowerCase(prop));\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n NewColor := TTMSFNCGraphics.TextToColor(AnsiLowerCase(prop));\r\n {$ENDIF}\r\n end;\r\n end;\r\n end;\r\n\r\n AGraphics.Stroke.Kind := gskSolid;\r\n Pencolor := AGraphics.Stroke.color;\r\n AGraphics.Stroke.Color := Newcolor;\r\n ptf1 := PointF(r.Left, cr.Bottom + 1);\r\n ptf2 := PointF(r.Right, cr.Bottom + 1);\r\n AGraphics.DrawLine(ptf1,ptf2);\r\n AGraphics.Stroke.Color := Pencolor;\r\n end;\r\n end;\r\n 'I':\r\n begin\r\n if not Calc then\r\n begin\r\n hifCol := FontColor;\r\n hibCol := BkColor;\r\n hifStyles := AGraphics.Font.Style;\r\n BkColor := HighlightColor;\r\n FontColor := HighlightTextColor;\r\n end;\r\n AGraphics.Font.Style := HighlightTextStyle;\r\n end;\r\n end;\r\n end;\r\n 'I':begin\r\n {$IFDEF FMXMOBILE}\r\n TagChar := Upcase(s[2]);\r\n {$ELSE}\r\n TagChar := Upcase(s[3]);\r\n {$ENDIF}\r\n\r\n if TagChar = '>' then // tag\r\n AGraphics.Font.Style := AGraphics.Font.Style + [TFontStyle.fsItalic]\r\n else\r\n if TagChar = 'N' then // tag\r\n begin\r\n TagProp := Copy(s,3,pos('>',s) - 1);\r\n\r\n Prop := Copy(TagProp,TTMSFNCUtils.ipos('x',TagProp) + 2,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n\r\n val(Prop,indent,err);\r\n if err = 0 then\r\n begin\r\n if indent > w then\r\n begin\r\n w := Indent;\r\n cr.left := fr.left + Indent;\r\n end;\r\n end;\r\n end\r\n else\r\n if TagChar = 'M' then\r\n begin\r\n imgalign := 0;\r\n imgoffs := 0;\r\n imgfloat := fsNone;\r\n imgth := Round(AGraphics.CalculateTextHeight('gh'));\r\n inc(ImgIdx);\r\n\r\n ir := cr;\r\n\r\n TagProp := Copy(s,3,Pos('>',s) - 1);\r\n Prop := Copy(TagProp,Pos('SRC',Uppercase(TagProp)) + 4,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n\r\n TagProp := Uppercase(TagProp);\r\n\r\n if (Pos('ALT',TagProp) > 0) and (AltImg = ImgIdx) then\r\n begin\r\n Prop := Copy(TagProp,Pos('ALT',TagProp) + 4,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n end;\r\n\r\n TagWidth := 0;\r\n TagHeight := 0;\r\n\r\n if Pos('WIDTH',TagProp) > 0 then\r\n begin\r\n Tagp := Copy(TagProp,Pos('WIDTH',TagProp) + 6,Length(TagProp));\r\n Tagp := Copy(Tagp,Pos('\"',tagp) + 1,Length(Tagp));\r\n Tagp := Copy(Tagp,1,Pos('\"',tagp) - 1);\r\n Val(Tagp,TagWidth,Err);\r\n end;\r\n\r\n if Pos('HEIGHT',TagProp) > 0 then\r\n begin\r\n Tagp := Copy(TagProp,TTMSFNCUtils.ipos('HEIGHT',TagProp) + 7,Length(TagProp));\r\n Tagp := Copy(Tagp,pos('\"',Tagp) + 1,Length(Tagp));\r\n Tagp := Copy(Tagp,1,pos('\"',Tagp) - 1);\r\n Val(Tagp,TagHeight,Err);\r\n end;\r\n\r\n if Pos('ALIGN',TagProp) > 0 then\r\n begin\r\n Tagp := Copy(TagProp,TTMSFNCUtils.ipos('ALIGN',TagProp) + 6,Length(TagProp));\r\n Tagp := Copy(Tagp,pos('\"',Tagp) + 1,Length(Tagp));\r\n Tagp := Copy(Tagp,1,pos('\"',Tagp) - 1);\r\n\r\n if TagP = 'MIDDLE' then\r\n imgalign := 1;\r\n\r\n if TagP = 'TOP' then\r\n imgalign := 2;\r\n end;\r\n\r\n if Pos('FLOAT',TagProp) > 0 then\r\n begin\r\n Tagp := Copy(TagProp,TTMSFNCUtils.ipos('FLOAT',TagProp) + 6,Length(TagProp));\r\n Tagp := Copy(Tagp,pos('\"',Tagp) + 1,Length(Tagp));\r\n Tagp := Copy(Tagp,1,pos('\"',Tagp) - 1);\r\n\r\n if TagP = 'LEFT' then\r\n begin\r\n imgfloat := fsLeft;\r\n ir.left := fr.Left;\r\n end;\r\n\r\n if TagP = 'RIGHT' then\r\n imgfloat := fsRight;\r\n end;\r\n\r\n IMGSize.x := 0;\r\n IMGSize.y := 0;\r\n\r\n if Pos('IDX:',Uppercase(Prop)) > 0 then\r\n begin\r\n Delete(Prop,1,4);\r\n {$IFDEF CMNLIB}\r\n if Assigned(ImageList) and (IStrToInt(Prop) < ImageList.Count) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n {$IFDEF VCLLIB}\r\n IMGSize.x := MulDiv(ImageList.Width,GetDeviceCaps(AGraphics.Canvas.Handle,LOGPIXELSX),96);\r\n IMGSize.y := MulDiv(ImageList.Height,GetDeviceCaps(AGraphics.Canvas.Handle,LOGPIXELSY),96);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n IMGSize.x := ImageList.Width;\r\n IMGSize.y := ImageList.Height;\r\n {$ENDIF}\r\n\r\n if (imgth > ImageList.Height) then\r\n begin\r\n if imgalign = 0 then // bottom\r\n imgoffs := (imgth - ImageList.Height);\r\n\r\n if imgalign = 1 then // center\r\n imgoffs := (imgth - ImageList.Height) div 2;\r\n end;\r\n\r\n if not Calc and not Print then\r\n begin\r\n crc := ConvertToRect(ir);\r\n ImageList.Draw(AGraphics.Canvas,crc.Left,crc.Top + imgoffs,IStrToInt(Prop),True);\r\n end;\r\n {$ENDIF}\r\n end;\r\n {$ENDIF}\r\n end;\r\n\r\n bmp := nil;\r\n bmpcreated := false;\r\n\r\n if (Pos(':',Prop) = 0) and Assigned(BitmapContainer) then\r\n begin\r\n bmp := BitmapContainer.FindBitmap(Prop);\r\n end;\r\n\r\n {$IFNDEF WEBLIB}\r\n if (Pos('FILE://',Uppercase(Prop)) > 0) then\r\n begin\r\n Delete(Prop,1,7);\r\n\r\n if FileExists(Prop) then\r\n begin\r\n bmp := TTMSFNCBitmap.Create;\r\n bmp.LoadFromFile(Prop);\r\n bmpcreated := true;\r\n end;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n if (Pos('URL://',Uppercase(Prop)) > 0) then\r\n begin\r\n Delete(Prop,1,6);\r\n bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromURL(Prop));\r\n bmpcreated := true;\r\n end;\r\n {$ENDIF}\r\n\r\n imgw := 0;\r\n imgh := 0;\r\n\r\n if Assigned(bmp) then\r\n begin\r\n if not IsBitmapEmpty(bmp) then\r\n begin\r\n if (TagWidth > 0) and (TagHeight > 0) then\r\n begin\r\n imgw := TagWidth;\r\n imgh := TagHeight;\r\n end;\r\n if (TagWidth > 0) and (TagHeight = 0) then\r\n begin\r\n imgw := TagWidth;\r\n imgh := Round(TagWidth/bmp.Width * bmp.Height);\r\n end;\r\n if (TagWidth = 0) and (TagHeight > 0) then\r\n begin\r\n imgw := Round(TagHeight/bmp.Height * bmp.Width);\r\n imgh := TagHeight;\r\n end;\r\n if (TagWidth = 0) and (TagHeight = 0) then\r\n begin\r\n imgw := bmp.Width;\r\n imgh := bmp.Height;\r\n end;\r\n\r\n if imgfloat = fsRight then\r\n ir.Left := r.Right - imgw;\r\n\r\n if not Calc {and not Print} then\r\n begin\r\n if (TagWidth > 0) or (TagHeight > 0) then\r\n begin\r\n AGraphics.DrawBitmap(RectF(Round(ir.Left),Round(ir.Top),Round(ir.Left) + imgw,Round(ir.Top) + imgh), BitmapToDrawBitmap(bmp));\r\n end\r\n else\r\n if (TagWidth > 0) and (TagHeight = 0) then\r\n begin\r\n AGraphics.DrawBitmap(RectF(Round(ir.Left),Round(ir.Top),Round(ir.Left) + TagWidth,Round(ir.Top) + TagHeight),BitmapToDrawBitmap(bmp));\r\n end\r\n else\r\n begin\r\n AGraphics.DrawBitmap(RectF(Round(ir.Left),Round(ir.Top),Round(ir.Left) + bmp.Width, Round(ir.Top) + bmp.Height),BitmapToDrawBitmap(bmp));\r\n end;\r\n end;\r\n\r\n if (TagWidth > 0) or (TagHeight > 0) then\r\n begin\r\n IMGSize.x := imgw;\r\n IMGSize.y := imgh;\r\n end\r\n else\r\n begin\r\n IMGSize.x := bmp.Width;\r\n IMGSize.y := bmp.Height;\r\n end;\r\n end;\r\n\r\n if bmpcreated then\r\n bmp.Free;\r\n end;\r\n\r\n if (XPos - r.Left > w) and (XPos - r.Left < w + IMGSize.x) and\r\n (YPos > cr.Top) and (YPos < cr.Top + IMGSize.Y) and Anchor then\r\n begin\r\n ImageHotSpot := True;\r\n AnchorVal := LastAnchor;\r\n AltImg := ImgIdx;\r\n end;\r\n\r\n if (w + IMGSize.x > r.Right-r.Left) and\r\n (IMGSize.x < r.Right - r.Left) then\r\n begin\r\n ImgBreak := True;\r\n end\r\n else\r\n begin\r\n w := w + IMGSize.x;\r\n cr.left := cr.left + IMGSize.x;\r\n if IMGSize.y > h then\r\n h := IMGSize.y;\r\n end;\r\n\r\n if Pos('ALIGN',TagProp) > 0 then\r\n begin\r\n if Pos('\"TOP',TagProp) > 0 then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n ImgAli := h - (rh.Bottom - rh.Top);\r\n end\r\n else\r\n begin\r\n if Pos('\"MIDDLE',TagProp) > 0 then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n ImgAli := (h - (rh.Bottom - rh.Top)) / 2;\r\n end;\r\n end;\r\n end;\r\n\r\n if (Pos('WRAP',TagProp) > 0) then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n h := rh.Bottom - rh.Top;\r\n ImgAli := 0;\r\n end;\r\n\r\n if imgfloat = fsLeft then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n ImgAli := h - (rh.Bottom - rh.Top);\r\n floatrect.left := imgw;\r\n floatrect.bottom := imgh;\r\n if not calc then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n h := (rh.Bottom - rh.Top);\r\n end;\r\n end;\r\n\r\n if imgfloat = fsRight then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n ImgAli := h - (rh.Bottom - rh.Top);\r\n floatrect.right := imgw;\r\n floatrect.bottom := imgh;\r\n if not calc then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n h := rh.Bottom - rh.Top;\r\n end;\r\n w := fr.Right;\r\n end;\r\n\r\n end;\r\n end;\r\n 'L':begin\r\n NewColor := gcNull;\r\n LType := '';\r\n\r\n if (TTMSFNCUtils.VarPos('>',s,TagPos)>0) then\r\n begin\r\n TagProp := Uppercase(Copy(s,3,TagPos-1));\r\n\r\n if TTMSFNCUtils.VarPos('TYPE',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos+4,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',prop)+1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',prop)-1);\r\n LType := Prop;\r\n end;\r\n if TTMSFNCUtils.VarPos('COLOR',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos+5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',prop)+1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',prop)-1);\r\n\r\n if Length(Prop) > 0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if Prop[0] = '#' then\r\n {$ELSE}\r\n if Prop[1] = '#' then\r\n {$ENDIF}\r\n NewColor := TTMSFNCGraphics.HTMLToColor(Prop)\r\n else\r\n NewColor := TTMSFNCGraphics.TextToColor(prop);\r\n end;\r\n end;\r\n end;\r\n\r\n w := w + 12 * ListIndex;\r\n if Linkbreak then\r\n Imgbreak := True else Linkbreak := True;\r\n\r\n cr.left := cr.left + 12 * (ListIndex - 1);\r\n\r\n if not calc and not Invisible then\r\n begin\r\n if LType = '' then\r\n begin\r\n if (NewColor <> gcNull) then\r\n begin\r\n ColL := AGraphics.Font.Color;\r\n FontColor := NewColor;\r\n end;\r\n Prop := AGraphics.Font.Name;\r\n AGraphics.Font.Name := 'Symbol';\r\n\r\n if Odd(ListIndex) then\r\n AGraphics.DrawText(cr, '·', False, gtaLeading, gtaCenter, gttNone, 0, -1, -1{$IFNDEF LIMITEDGRAPHICSMODE}, False{$ENDIF})\r\n else\r\n AGraphics.DrawText(cr, 'o', False, gtaLeading, gtaCenter, gttNone, 0, -1, -1{$IFNDEF LIMITEDGRAPHICSMODE}, False{$ENDIF});\r\n\r\n AGraphics.Font.Name := prop;\r\n if NewColor <> gcNull then\r\n FontColor := ColL;\r\n end\r\n else\r\n begin\r\n ColB := gcNull;\r\n\r\n if LTYPE = 'SQUARE' then\r\n begin\r\n ColB := AGraphics.Fill.Color;\r\n AGraphics.Stroke.Color := NewColor;\r\n AGraphics.Fill.Color := NewColor;\r\n AGraphics.DrawRectangle(RectF(cr.Left, cr.Top + 2, cr.Left + 8, cr.Top + 10));\r\n AGraphics.Fill.Color := ColB;\r\n end;\r\n\r\n if LTYPE = 'CIRCLE' then\r\n begin\r\n ColB := AGraphics.Fill.Color;\r\n AGraphics.Stroke.Color := NewColor;\r\n AGraphics.Fill.Color := NewColor;\r\n AGraphics.DrawEllipse(RectF(cr.Left, cr.Top + 2, cr.Left + 8, cr.Top + 10));\r\n AGraphics.Fill.Color := ColB;\r\n end;\r\n end;\r\n end;\r\n cr.Left := cr.Left + 12;\r\n end;\r\n 'U':begin\r\n {$IFDEF FMXMOBILE}\r\n if s[2] <> '>' then\r\n {$ELSE}\r\n if s[3] <> '>' then\r\n {$ENDIF}\r\n begin\r\n Inc(ListIndex);\r\n LineBreak := true;\r\n end\r\n else\r\n AGraphics.Font.Style := AGraphics.Font.Style + [TFontStyle.fsUnderline];\r\n end;\r\n 'O':begin\r\n {$IFDEF FMXMOBILE}\r\n TagChar := Upcase(s[2]);\r\n {$ELSE}\r\n TagChar := Upcase(s[3]);\r\n {$ENDIF}\r\n if TagChar = 'F' then // tag\r\n begin\r\n TagProp := Copy(s,3,pos('>',s) - 1);\r\n Prop := Copy(TagProp,TTMSFNCUtils.ipos('x',TagProp) + 2,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n val(Prop,NewOffsetX,err);\r\n cr.Left := NewOffsetX;\r\n w := NewOffsetX;\r\n end\r\n end;\r\n 'P':begin\r\n if (TTMSFNCUtils.VarPos('>',s,TagPos)>0) then\r\n begin\r\n TagProp := Uppercase(Copy(s,3,TagPos-1));\r\n\r\n if TTMSFNCUtils.VarPos('ALIGN',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos+5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',prop)+1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',prop)-1);\r\n\r\n if Pos('RIGHT',Prop) > 0 then Align := taRightJustify;\r\n if Pos('LEFT',Prop) > 0 then Align := taLeftJustify;\r\n if Pos('CENTER',Prop) > 0 then Align := taCenter;\r\n end;\r\n\r\n if TTMSFNCUtils.VarPos('INDENT',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos+6,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',prop)+1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',prop)-1);\r\n PIndent := IStrToInt(Prop);\r\n end;\r\n\r\n if TTMSFNCUtils.VarPos('FLOAT',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos+5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',prop)+1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',prop)-1);\r\n\r\n if Prop = 'LEFT' then\r\n txtfloat := fsLeft;\r\n\r\n if Prop = 'RIGHT' then\r\n txtfloat := fsRight;\r\n\r\n floatpt := Point(Round(r.Left), Round(r.Top));\r\n end;\r\n\r\n if TTMSFNCUtils.VarPos('BGCOLOR',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos + 5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n\r\n NewColor := gcNull;\r\n\r\n if Length(Prop) > 0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if Prop[0] = '#' then\r\n {$ELSE}\r\n if Prop[1] = '#' then\r\n {$ENDIF}\r\n NewColor := TTMSFNCGraphics.HTMLToColor(Prop)\r\n else\r\n NewColor := TTMSFNCGraphics.TextToColor(prop);\r\n end;\r\n\r\n if TTMSFNCUtils.VarPos('BGCOLORTO',TagProp,TagPos) > 0 then\r\n begin\r\n Prop := Copy(TagProp,TagPos + 5,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',Prop) + 1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n\r\n if not Calc then\r\n begin\r\n isPara := True;\r\n AGraphics.Stroke.Color := Newcolor;\r\n\r\n //DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Rect(fr.left,r.top,fr.right,r.bottom+2),true);\r\n //AGraphics.Brush.Style := bsClear\r\n end;\r\n end\r\n else\r\n begin\r\n if not Calc then\r\n begin\r\n isPara := True;\r\n paracolor := AGraphics.Fill.Color;\r\n //if AGraphics.Brush.Style = bsClear then ParaColor := clNone;\r\n AGraphics.Fill.color := NewColor;\r\n PenColor := AGraphics.Stroke.Color;\r\n AGraphics.Stroke.Color := Newcolor;\r\n AGraphics.DrawRectangle(RectF(fr.left,r.top,fr.right,r.bottom));\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n 'F':begin\r\n if (TTMSFNCUtils.VarPos('>',s,TagPos)>0) then\r\n begin\r\n TagProp := UpperCase(Copy(s,6,TagPos-6));\r\n\r\n if (TTMSFNCUtils.VarPos('FACE',TagProp,TagPos) > 0) then\r\n begin\r\n Prop := Copy(TagProp,TagPos+4,Length(TagProp));\r\n Prop := Copy(prop,pos('\"',prop)+1,Length(prop));\r\n Prop := Copy(prop,1,pos('\"',prop)-1);\r\n AGraphics.Font.Name := Prop;\r\n end;\r\n\r\n if (TTMSFNCUtils.VarPos(' COLOR',TagProp,TagPos) > 0) and not Selected then\r\n begin\r\n Prop := Copy(TagProp,TagPos+6,Length(TagProp));\r\n Prop := Copy(Prop,Pos('\"',prop)+1,Length(prop));\r\n Prop := Copy(Prop,1,Pos('\"',prop)-1);\r\n OldFontColor := AGraphics.Font.Color;\r\n\r\n if Length(Prop) > 0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if Prop[0] = '#' then\r\n {$ELSE}\r\n if Prop[1] = '#' then\r\n {$ENDIF}\r\n FontColor := TTMSFNCGraphics.HTMLToColor(Prop)\r\n else\r\n FontColor := TTMSFNCGraphics.TextToColor(Prop);\r\n end;\r\n end;\r\n\r\n if (TTMSFNCUtils.VarPos('BGCOLOR',TagProp,TagPos)>0) and not Calc and not Selected then\r\n begin\r\n Prop := Copy(TagProp,TagPos+7,Length(TagProp));\r\n Prop := Copy(prop,pos('\"',prop)+1,Length(prop));\r\n Prop := Copy(prop,1,pos('\"',prop)-1);\r\n\r\n if Length(Prop) > 0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if Prop[0] = '#' then\r\n {$ELSE}\r\n if Prop[1] = '#' then\r\n {$ENDIF}\r\n BkColor := TTMSFNCGraphics.HTMLToColor(Prop)\r\n else\r\n BkColor := TTMSFNCGraphics.TextToColor(prop);\r\n end;\r\n\r\n end;\r\n\r\n if (TTMSFNCUtils.VarPos('SIZE',TagProp,TagPos)>0) then\r\n begin\r\n Prop := Copy(TagProp,TagPos+4,Length(TagProp));\r\n Prop := Copy(Prop,Pos('=',Prop)+1,Length(Prop));\r\n Prop := Copy(Prop,Pos('\"',Prop)+1,Length(Prop));\r\n Prop := Copy(Prop,1,Pos('\"',Prop) - 1);\r\n\r\n case IStrToInt(Prop) of\r\n 1: TTMSFNCUtils.SetFontSize(AGraphics.Font, 8);\r\n 2: TTMSFNCUtils.SetFontSize(AGraphics.Font, 10);\r\n 3: TTMSFNCUtils.SetFontSize(AGraphics.Font, 12);\r\n 4: TTMSFNCUtils.SetFontSize(AGraphics.Font, 14);\r\n 5: TTMSFNCUtils.SetFontSize(AGraphics.Font, 16);\r\n else\r\n TTMSFNCUtils.SetFontSize(AGraphics.Font, IStrToInt(Prop));\r\n end;\r\n end;\r\n end;\r\n end;\r\n 'S':begin\r\n {$IFDEF FMXMOBILE}\r\n TagChar := Upcase(s[2]);\r\n {$ELSE}\r\n TagChar := Upcase(s[3]);\r\n {$ENDIF}\r\n\r\n if TagChar = '>' then\r\n AGraphics.Font.Style := AGraphics.font.Style + [TFontStyle.fsStrikeOut]\r\n else\r\n begin\r\n if TagChar = 'H' then\r\n isShad := True\r\n else\r\n begin\r\n if TTMSFNCUtils.ipos('',s)=1 then\r\n isSub := True\r\n else\r\n if TTMSFNCUtils.ipos('',s)=1 then\r\n isSup := True;\r\n end;\r\n end;\r\n end;\r\n 'R':begin\r\n TagProp := Copy(s,3,pos('>',s)-1);\r\n prop := Copy(TagProp,TTMSFNCUtils.ipos('a',TagProp)+2,Length(TagProp));\r\n prop := Copy(prop,pos('\"',prop)+1,Length(prop));\r\n prop := Copy(prop,1,pos('\"',prop)-1);\r\n //StartRotated(Canvas,indent);\r\n end;\r\n 'Z':Invisible := True;\r\n end;\r\n end;\r\n\r\n if (TTMSFNCUtils.VarPos('>',s,TagPos)>0) and not ImgBreak then\r\n begin\r\n Res := Res + Copy(s,1,TagPos);\r\n Delete(s,1,TagPos);\r\n end\r\n else\r\n if not Imgbreak then\r\n Delete(s,1,Length(s));\r\n end;\r\n end;\r\n\r\n w := w - sw;\r\n\r\n if w > xsize then\r\n xsize := w + 2;\r\n\r\n if (FocusLink = Hyperlinks - 1) and Anchor and not Calc then\r\n begin\r\n rr.Right := cr.Left;\r\n rr.Bottom := cr.Bottom;\r\n InflateRectEx(rr,1,0);\r\n //if not Calc then\r\n // AGraphics.DrawFocusRect(rr);\r\n rr.Left := r.Left + 1;\r\n rr.Top := rr.Bottom;\r\n end;\r\n\r\n Result := Res;\r\n end;\r\n\r\nbegin\r\n Anchor := False;\r\n Error := False;\r\n OldFont := TTMSFNCGraphicsFont.Create;\r\n OldFont.AssignSource(AGraphics.Font);\r\n OldFontColor := AGraphics.Font.Color;\r\n DrawFont := TTMSFNCGraphicsFont.Create;\r\n DrawFont.AssignSource(AGraphics.Font);\r\n DrawFontColor := AGraphics.Font.Color;\r\n CalcFont := TTMSFNCGraphicsFont.Create;\r\n CalcFont.AssignSource(AGraphics.Font);\r\n CalcFontColor := AGraphics.Font.Color;\r\n OldDrawfont := TTMSFNCGraphicsFont.Create;\r\n OldDrawFont.AssignSource(AGraphics.Font);\r\n OldDrawFontColor := AGraphics.Font.Color;\r\n OldCalcFont := TTMSFNCGraphicsFont.Create;\r\n OldCalcFont.AssignSource(AGraphics.Font);\r\n OldCalcFontColor := AGraphics.Font.Color;\r\n BlnkColor := AGraphics.Fill.color;\r\n OldPenColor := AGraphics.Stroke.Color;\r\n BGColor := gcNull;\r\n BkColor := gcNull;\r\n ParaColor := gcNull;\r\n isPara := False;\r\n isShad := False;\r\n Invisible := False;\r\n\r\n OldFontColor := AGraphics.Font.Color;\r\n\r\n ControlRect := RectF(0,0,0,0);\r\n CV := '';\r\n CT := '';\r\n if not CheckHotSpot then\r\n CID := '';\r\n\r\n OfsX := 0;\r\n NewOfsX := 0;\r\n\r\n txtfloat := fsNone;\r\n floatrect := Rect(0,0,0,0);\r\n\r\n Result := False;\r\n\r\n r := fr;\r\n\r\n Align := taLeftJustify;\r\n PIndent := 0;\r\n\r\n XSize := 0;\r\n YSize := 0;\r\n HyperLinks := 0;\r\n HlCount := 0;\r\n ListIndex := 0;\r\n LiCount := 0;\r\n StripVal := '';\r\n FocusAnchor := '';\r\n MouseLink := -1;\r\n MouseInAnchor := False;\r\n\r\n ImgIdx := 0;\r\n AltImg := -1;\r\n\r\n if Pos('&',s) > 0 then\r\n begin\r\n repeat\r\n Foundtag := False;\r\n\r\n if TTMSFNCUtils.TagReplacestring('&','&',s) then Foundtag := True;\r\n if TTMSFNCUtils.TagReplacestring('"','\"',s) then Foundtag := True;\r\n\r\n if TTMSFNCUtils.TagReplacestring('§','§',s) then Foundtag := True;\r\n if TTMSFNCUtils.TagReplacestring('‰','®‰',s) then Foundtag := True;\r\n if TTMSFNCUtils.TagReplacestring('®','®',s) then Foundtag := True;\r\n\r\n if TTMSFNCUtils.TagReplacestring('©','©',s) then Foundtag := True;\r\n if TTMSFNCUtils.TagReplacestring('¶','¶',s) then Foundtag := True;\r\n\r\n if TTMSFNCUtils.TagReplacestring('™','™',s) then Foundtag := True;\r\n if TTMSFNCUtils.TagReplacestring('€','€',s) then Foundtag := True;\r\n\r\n until not Foundtag;\r\n end;\r\n\r\n s := DBTagStrip(s);\r\n s := CRLFStrip(s,True);\r\n\r\n InsPoint := 0;\r\n LineCount := 0;\r\n\r\n while Length(s) > 0 do\r\n begin\r\n //calculate part of the HTML text fitting on the next line\r\n OldFont.AssignSource(OldCalcFont);\r\n OldFontColor := OldCalcFontColor;\r\n AGraphics.Font.AssignSource(CalcFont);\r\n FontColor := CalcFontColor;\r\n OldAnchor := Anchor;\r\n OldAnchorVal := LastAnchor;\r\n suph := 0;\r\n subh := 0;\r\n imgali := 0;\r\n isSup := False;\r\n isSub := False;\r\n HotSpot := False;\r\n ImageHotSpot := False;\r\n HTMLWidth := 0;\r\n rh := AGraphics.CalculateText('gh');\r\n HtmlHeight := rh.Bottom - rh.Top;\r\n txtHeight := HtmlHeight;\r\n\r\n OldImgIdx := ImgIdx;\r\n\r\n s := Trim(s);\r\n\r\n txtfloatbefore := txtfloat;\r\n\r\n su := HTMLDrawLine(AGraphics,s,r,True,HtmlWidth,HtmlHeight,subh,suph,imgali,Align,PIndent,XPos,YPos,HotSpot,ImageHotSpot,ofsx,newofsx, floatrect,txtfloat);\r\n Inc(LineCount);\r\n\r\n Anchor := OldAnchor;\r\n LastAnchor := OldAnchorVal;\r\n\r\n CalcFont.AssignSource(AGraphics.Font);\r\n CalcFontColor := AGraphics.Font.Color;\r\n OldCalcFont.AssignSource(OldFont);\r\n OldCalcFontColor := OldFontColor;\r\n\r\n HTMLHeight := HTMLHeight + LineSpacing;\r\n\r\n dr := r;\r\n\r\n case Align of\r\n taCenter:if (r.right - r.left - htmlwidth > 0) then\r\n dr.left := r.left+((r.right - r.left - htmlwidth) / 2);\r\n taRightJustify:if r.right - htmlwidth > r.left then\r\n dr.left := r.right - htmlwidth;\r\n end;\r\n\r\n dr.Left := dr.Left + PIndent;\r\n\r\n dr.Bottom := dr.Top + HtmlHeight + Subh + Suph;\r\n\r\n if not CheckHeight then\r\n begin\r\n OldFont.AssignSource(OldDrawFont);\r\n OldFontColor := OldDrawFontColor;\r\n AGraphics.Font.AssignSource(DrawFont);\r\n FontColor := DrawFontColor;\r\n\r\n HyperLinks := HlCount;\r\n ListIndex := LiCount;\r\n ImgIdx := OldImgIdx;\r\n\r\n HTMLDrawLine(AGraphics,su,dr,CheckHotSpot,HtmlWidth,HtmlHeight,subh,suph,ImgAli,Align,PIndent,XPos,YPos,HotSpot,ImageHotspot,ofsx,newofsx, floatrect,txtfloat);\r\n\r\n HlCount := HyperLinks;\r\n LiCount := ListIndex;\r\n\r\n r.left := fr.Left + floatrect.left;\r\n\r\n r.right := fr.Right - floatrect.right;\r\n\r\n if dr.Top > floatrect.bottom then\r\n begin\r\n floatrect.Left := 0;\r\n floatrect.Right := 0;\r\n r.Left := fr.Left;\r\n end;\r\n\r\n rh := AGraphics.CalculateText('gh');\r\n\r\n if (HotSpot and\r\n (YPos > dr.Bottom - ImgAli - (rh.Bottom - rh.Top)) and\r\n (YPos < dr.Bottom - ImgAli)) or ImageHotSpot then\r\n begin\r\n Result := True;\r\n end;\r\n\r\n ofsx := newofsx;\r\n\r\n DrawFont.AssignSource(AGraphics.Font);\r\n DrawFontColor := FontColor;\r\n OldDrawFont.AssignSource(OldFont);\r\n OldDrawFontColor := OldFontColor;\r\n end;\r\n\r\n if (txtfloat <> fsNone) and (txtfloat <> txtfloatbefore) then\r\n begin\r\n r.Left := floatpt.x;\r\n r.Top := floatpt.y;\r\n txtfloat := fsNone;\r\n end\r\n else\r\n begin\r\n r.top := r.top + HtmlHeight + subh + suph;\r\n ysize := ysize + HtmlHeight + subh + suph;\r\n end;\r\n\r\n //do not draw below bottom\r\n if (r.top + TxtHeight > r.bottom + 1) and not CheckHeight then\r\n s := '';\r\n end;\r\n\r\n if (ysize = 0) then\r\n begin\r\n rh := AGraphics.CalculateText('gh');\r\n ysize := rh.Bottom - rh.Top;\r\n end;\r\n\r\n //ysize := ysize + 2;\r\n\r\n InsPoint := InsPoint shr 1;\r\n\r\n AGraphics.Stroke.Color := OldPenColor;\r\n AGraphics.Fill.Color := BlnkColor;\r\n AGraphics.Font.AssignSource(OldFont);\r\n OldFont.Free;\r\n DrawFont.Free;\r\n CalcFont.Free;\r\n OldDrawfont.Free;\r\n OldCalcfont.Free;\r\nend;\r\n\r\nfunction HTMLDrawEx(AGraphics: TTMSFNCGraphics; s:string; fr:TRectF;\r\n XPos,YPos,FocusLink,HoverLink,ShadowOffset: Integer;\r\n CheckHotSpot,CheckHeight,{%H-}Print,Selected,Blink,HoverStyle,WordWrap: Boolean;\r\n {%H-}ResFactor:Double;\r\n URLColor,HoverColor,HoverFontColor,ShadowColor: TTMSFNCGraphicsColor;\r\n var AnchorVal,StripVal,FocusAnchor: string;\r\n var XSize,YSize: single; var HyperLinks,MouseLink: Integer;\r\n var HoverRect: TRectF; var LineCount: Integer; LineSpacing: Integer;\r\n BitmapContainer: TTMSFNCBitmapContainer; {%H-}Opacity: Single; HyperLinkUnderline: Boolean = True{$IFDEF CMNLIB}; ImageList: TCustomImageList = nil{$ENDIF};\r\n HighlightColor: TTMSFNCGraphicsColor = gcBlue;\r\n HighlightTextColor: TTMSFNCGraphicsColor = gcWhite;\r\n HighlightTextStyle: TFontStyles = []\r\n ): Boolean;\r\nvar\r\n cr: TRectF;\r\n cid: string;\r\n cv: string;\r\n ct: string;\r\nbegin\r\n cid := '';\r\n cv := '';\r\n ct := '';\r\n cr := RectF(0, 0, 0, 0);\r\n Result := HTMLDrawEx(AGraphics, s, fr, XPos, YPos, FocusLink, HoverLink, ShadowOffset, CheckHotSpot, CheckHeight, Print, Selected, Blink, HoverStyle, WordWrap, False, '',\r\n ResFactor, URLColor, HoverColor, HoverFontColor, ShadowColor, AnchorVal, StripVal, FocusAnchor, XSize, YSize, HyperLinks, MouseLink, HoverRect, cr, cid, cv, ct, LineCount, LineSpacing, BitmapContainer,\r\n Opacity, HyperLinkUnderline{$IFDEF CMNLIB}, ImageList{$ENDIF}, HighlightColor, HighlightTextColor, HighlightTextStyle);\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 - 2017 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCGraphics;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n Windows,\r\n {$ENDIF}\r\n Classes, WEBLib.TMSFNCGraphicsTypes, WEBLib.Graphics,\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n WEBLib.TMSFNCBitmapContainer,\r\n {$ENDIF}\r\n Types, WEBLib.TMSFNCTypes\r\n {$IFDEF CMNLIB}\r\n ,FMX.ImgList\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n ,UITypes\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n ;\r\n\r\ntype\r\n TTMSFNCGraphics = class;\r\n\r\n TTMSFNCGraphicsContext = class\r\n private\r\n {$IFDEF AUTOREFCOUNT}\r\n [Weak]FGraphics: TTMSFNCGraphics;\r\n {$ELSE}\r\n FGraphics: TTMSFNCGraphics;\r\n {$ENDIF}\r\n function GetCanvas: TCanvas;\r\n function GetGraphics: TTMSFNCGraphics;\r\n protected\r\n function GetNativeCanvas: Pointer; virtual; abstract;\r\n public\r\n constructor Create(const AGraphics: TTMSFNCGraphics); virtual;\r\n function CreatePath: Pointer; virtual; abstract;\r\n function ConvertToPath(APath: TTMSFNCGraphicsPath; const Flatness: Single = 0.25): Pointer;\r\n function GetFillColor: TTMSFNCGraphicsColor; virtual; abstract;\r\n function CalculateText(AText: string; ARect: TRectF; AWordWrapping: Boolean): TRectF; virtual; abstract;\r\n function SetTextAngle(ARect: TRectF; AAngle: Single): TRectF; virtual; abstract;\r\n procedure Render; virtual; abstract;\r\n procedure PathOpen(APath: Pointer); virtual; abstract;\r\n procedure PathMoveTo(APath: Pointer; APoint: TPointF); virtual; abstract;\r\n procedure PathLineTo(APath: Pointer; APoint: TPointF); virtual; abstract;\r\n procedure PathClose(APath: Pointer); virtual; abstract;\r\n procedure ResetClip; virtual; abstract;\r\n procedure ResetTransform; virtual; abstract;\r\n procedure ScaleTransform(AX, AY: Single); virtual; abstract;\r\n procedure RotateTransform(AAngle: Single); virtual; abstract;\r\n procedure TranslateTransform(AX, AY: Single); virtual; abstract;\r\n procedure SetTextQuality(ATextQuality: TTMSFNCGraphicsTextQuality); virtual; abstract;\r\n procedure SetAntiAliasing(AAntiAliasing: Boolean); virtual; abstract;\r\n procedure SetShowAcceleratorChar(AShowAcceleratorChar: Boolean); virtual; abstract;\r\n procedure SetSize(AWidth, AHeight: Single); virtual; abstract;\r\n procedure ResetTextAngle(AAngle: Single); virtual; abstract;\r\n procedure BeginScene; virtual; abstract;\r\n procedure EndScene; virtual; abstract;\r\n procedure StartSpecialPen; virtual; abstract;\r\n procedure StopSpecialPen; virtual; abstract;\r\n procedure RestoreState(AState: TTMSFNCGraphicsSaveState); virtual; abstract;\r\n procedure SaveState(AState: TTMSFNCGraphicsSaveState); virtual; abstract;\r\n procedure SetFontSize(ASize: Integer); virtual; abstract;\r\n procedure SetFontColor(AColor: TTMSFNCGraphicsColor); virtual; abstract;\r\n procedure SetFontName(AName: string); virtual; abstract;\r\n procedure SetFont(AFont: TTMSFNCGraphicsFont); virtual; abstract;\r\n procedure SetFontStyles(AStyle: TFontStyles); virtual; abstract;\r\n procedure SetFill(AFill: TTMSFNCGraphicsFill); virtual; abstract;\r\n procedure SetFillKind(AKind: TTMSFNCGraphicsFillKind); virtual; abstract;\r\n procedure SetFillColor(AColor: TTMSFNCGraphicsColor); virtual; abstract;\r\n procedure SetStroke(AStroke: TTMSFNCGraphicsStroke); virtual; abstract;\r\n procedure SetStrokeKind(AKind: TTMSFNCGraphicsStrokeKind); virtual; abstract;\r\n procedure SetStrokeColor(AColor: TTMSFNCGraphicsColor); virtual; abstract;\r\n procedure SetStrokeWidth(AWidth: Single); virtual; abstract;\r\n procedure DrawLine(AStroke: TTMSFNCGraphicsStroke; AFromPoint: TPointF; AToPoint: TPointF; AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode = gcpmRightDown; AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode = gcpmRightDown); virtual; abstract;\r\n procedure DrawPolygon(AStroke: TTMSFNCGraphicsStroke; APolygon: TTMSFNCGraphicsPathPolygon); virtual; abstract;\r\n procedure FillPolygon(AFill: TTMSFNCGraphicsFill; APolygon: TTMSFNCGraphicsPathPolygon); virtual; abstract;\r\n procedure DrawPolyline(AStroke: TTMSFNCGraphicsStroke; APolyline: TTMSFNCGraphicsPathPolygon); virtual; abstract;\r\n procedure FillPolyline(AFill: TTMSFNCGraphicsFill; APolyline: TTMSFNCGraphicsPathPolygon); virtual; abstract;\r\n procedure FillArc(AFill: TTMSFNCGraphicsFill; ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single); virtual; abstract;\r\n procedure DrawArc(AStroke: TTMSFNCGraphicsStroke; ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single); virtual; abstract;\r\n procedure FillRect(AFill: TTMSFNCGraphicsFill; ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); virtual; abstract;\r\n procedure DrawRect(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ASides: TTMSFNCGraphicsSides; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); virtual; abstract;\r\n procedure FillRoundRect(AFill: TTMSFNCGraphicsFill; ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); virtual; abstract;\r\n procedure DrawRoundRect(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); virtual; abstract;\r\n procedure FillEllipse(AFill: TTMSFNCGraphicsFill; ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); virtual; abstract;\r\n procedure DrawEllipse(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); virtual; abstract;\r\n procedure DrawBitmap(ABitmap: TTMSFNCDrawBitmap; ASrcRect, ADstRect: TRectF; AOpacity: Single); virtual; abstract;\r\n procedure ClipRect(ARect: TRectF); virtual; abstract;\r\n procedure ClipPath(APath: TTMSFNCGraphicsPath); virtual; abstract;\r\n procedure DrawFocusPath(AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath; AColor: TTMSFNCGraphicsColor); virtual; abstract;\r\n procedure DrawFocusRectangle(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; AColor: TTMSFNCGraphicsColor; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); virtual; abstract;\r\n procedure DrawText(AText: string; ARect: TRectF; AWordWrapping: Boolean; AHorizontalAlign, AVerticalAlign: TTMSFNCGraphicsTextAlign; ATrimming: TTMSFNCGraphicsTextTrimming; AAngle: Single); virtual; abstract;\r\n procedure DrawPath(AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon); virtual; abstract;\r\n procedure FillPath(AFill: TTMSFNCGraphicsFill; APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon); virtual; abstract;\r\n property Canvas: TCanvas read GetCanvas;\r\n property NativeCanvas: Pointer read GetNativeCanvas;\r\n property Graphics: TTMSFNCGraphics read GetGraphics;\r\n end;\r\n\r\n TTMSFNCGraphicsContextClass = class of TTMSFNCGraphicsContext;\r\n\r\n TTMSFNCGraphics = class\r\n private\r\n FActiveCanvas: TCanvas;\r\n FBlockUpdate: Integer;\r\n FNative: Boolean;\r\n FContextNative, FContextGeneral: TTMSFNCGraphicsContext;\r\n FBitmap: TBitmap;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FFont: TTMSFNCGraphicsFont;\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n FHighlightColor: TTMSFNCGraphicsColor;\r\n FOptimizedHTMLDrawing: Boolean;\r\n FHighlightTextColor: TTMSFNCGraphicsColor;\r\n FHighlightFontStyles: TFontStyles;\r\n FURLUnderline: Boolean;\r\n FURLColor: TTMSFNCGraphicsColor;\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n {$IFDEF CMNLIB}\r\n FImageList: TCustomImageList;\r\n {$ENDIF}\r\n {$ENDIF}\r\n function GetCanvas: TCanvas;\r\n function GetContext: TTMSFNCGraphicsContext;\r\n protected\r\n procedure FontChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure InitializeDefaultAppearance;\r\n function InternalCalculateText(AText: String; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TRectF; overload; virtual;\r\n function InternalDrawText(ARect: TRectF; AText: String; var AControlID: String; var AControlValue: String; var AControlType: string;AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n procedure DrawTexture(ARect: TRectF; ATexture: TTMSFNCBitmap; ATextureMode: TTMSFNCGraphicsTextureMode);\r\n class procedure ConvertBitmapToGrayScale(ABitmap: TTMSFNCBitmap);\r\n public class var\r\n DefaultSelectionFillColor: TTMSFNCGraphicsColor;\r\n DefaultTextFontColor: TTMSFNCGraphicsColor;\r\n DefaultPopupFillColor: TTMSFNCGraphicsColor;\r\n DefaultPopupStrokeColor: TTMSFNCGraphicsColor;\r\n DefaultButtonStrokeColorFocused: TTMSFNCGraphicsColor;\r\n DefaultButtonFillColorFocused: TTMSFNCGraphicsColor;\r\n DefaultButtonStrokeColorDisabled: TTMSFNCGraphicsColor;\r\n DefaultButtonFillColorDisabled: TTMSFNCGraphicsColor;\r\n DefaultButtonStrokeColor: TTMSFNCGraphicsColor;\r\n DefaultButtonFillColor: TTMSFNCGraphicsColor;\r\n public\r\n constructor Create(ACanvas: TCanvas; ANative: Boolean = False); virtual;\r\n constructor CreateNative(ACanvas: TCanvas); virtual;\r\n constructor CreateBitmapCanvas(AWidth: Integer = 1; AHeight: Integer = 1; ANative: Boolean = False; {%H-}AHighDPI: Boolean = True); virtual;\r\n constructor CreateNativeBitmapCanvas(AWidth: Integer = 1; AHeight: Integer = 1); virtual;\r\n destructor Destroy; override;\r\n procedure StartSpecialPen;\r\n procedure StopSpecialPen;\r\n procedure BeginScene; virtual;\r\n procedure EndScene; virtual;\r\n procedure Assign(Source: TTMSFNCGraphics); virtual;\r\n procedure SetFill(AFill: TTMSFNCGraphicsFill); virtual;\r\n procedure SetStroke(AStroke: TTMSFNCGraphicsStroke); virtual;\r\n procedure RestoreState(AState: TTMSFNCGraphicsSaveState; ACanvasOnly: Boolean = False); virtual;\r\n procedure SetFillKind(AKind: TTMSFNCGraphicsFillKind); virtual;\r\n procedure SetFillColor(AColor: TTMSFNCGraphicsColor); virtual;\r\n procedure SetFontColor(AColor: TTMSFNCGraphicsColor); virtual;\r\n procedure SetFontName(AName: string); virtual;\r\n procedure SetFont(AFont: TTMSFNCGraphicsFont); virtual;\r\n procedure SetFontSize(ASize: Integer); virtual;\r\n procedure SetFontStyles(AStyle: TFontStyles); virtual;\r\n procedure SetStrokeKind(AKind: TTMSFNCGraphicsStrokeKind); virtual;\r\n procedure SetStrokeColor(AColor: TTMSFNCGraphicsColor); virtual;\r\n procedure SetStrokeWidth(AWidth: Single); virtual;\r\n procedure DrawLine(AFromPoint: TPoint; AToPoint: TPoint; {%H-}AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode = gcpmRightDown; {%H-}AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode = gcpmRightDown); overload; virtual;\r\n procedure DrawLine(AFromPoint: TPointF; AToPoint: TPointF; {%H-}AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode = gcpmRightDown; {%H-}AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode = gcpmRightDown); overload; virtual;\r\n procedure DrawFocusRectangle(ALeft, ATop, ARight, ABottom: Integer; AColor: TTMSFNCGraphicsColor = gcBlack; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawFocusRectangle(ARect: TRect; AColor: TTMSFNCGraphicsColor = gcBlack; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawFocusRectangle(ALeft, ATop, ARight, ABottom: Double; AColor: TTMSFNCGraphicsColor = gcBlack; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawFocusRectangle(ARect: TRectF; AColor: TTMSFNCGraphicsColor = gcBlack; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawFocusPath(APath: TTMSFNCGraphicsPath; AColor: TTMSFNCGraphicsColor = gcBlack); virtual;\r\n procedure DrawPolygon(APolygon: TTMSFNCGraphicsPathPolygon); virtual;\r\n procedure DrawPolyline(APolyline: TTMSFNCGraphicsPathPolygon); virtual;\r\n procedure DrawPath(APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon); virtual;\r\n procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single); overload; virtual;\r\n procedure DrawArc(const Center, Radius: TPoint; StartAngle, SweepAngle: Integer); overload; virtual;\r\n procedure DrawRectangle(ALeft, ATop, ARight, ABottom: Double; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRectangle(ALeft, ATop, ARight, ABottom: Double; ASides: TTMSFNCGraphicsSides; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawEllipse(ALeft, ATop, ARight, ABottom: Double; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRectangle(ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRectangle(ARect: TRectF; ASides: TTMSFNCGraphicsSides; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRectangle(ALeft, ATop, ARight, ABottom: Integer; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRectangle(ALeft, ATop, ARight, ABottom: Integer; ASides: TTMSFNCGraphicsSides; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawEllipse(ALeft, ATop, ARight, ABottom: Integer; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRectangle(ARect: TRect; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRectangle(ARect: TRect; ASides: TTMSFNCGraphicsSides; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRoundRectangle(ALeft, ATop, ARight, ABottom: Double; ARounding: Single = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRoundRectangle(ARect: TRectF; ARounding: Single = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRoundRectangle(ALeft, ATop, ARight, ABottom: Integer; ARounding: Integer = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawRoundRectangle(ARect: TRect; ARounding: Integer = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawEllipse(ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawBitmapPart(ASourceLeft, ASourceTop, ASourceRight, ASourceBottom: Double; ADestinationLeft, ADestinationTop, ADestinationRight, ADestinationBottom: Double;\r\n ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmapPart(ASourceRect: TRectF; ADestinationRect: TRectF; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmap(ALeft, ATop, ARight, ABottom: Double; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmap(ARect: TRectF; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawEllipse(ARect: TRect; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); overload; virtual;\r\n procedure DrawBitmapPart(ASourceLeft, ASourceTop, ASourceRight, ASourceBottom: Integer; ADestinationLeft, ADestinationTop, ADestinationRight, ADestinationBottom: Integer;\r\n ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmapPart(ASourceRect: TRect; ADestinationRect: TRect; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmap(ALeft, ATop, ARight, ABottom: Integer; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmap(ARect: TRect; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmap(ALeft, ATop: Integer; ABitmap: TTMSFNCDrawBitmap); overload; virtual;\r\n procedure DrawBitmap(ALeft, ATop: Single; ABitmap: TTMSFNCDrawBitmap); overload; virtual;\r\n {$IFDEF CMNLIB}\r\n procedure DrawBitmap(ALeft, ATop: Integer; ABitmap: TTMSFNCBitmap); overload; virtual;\r\n procedure DrawBitmap(ALeft, ATop: Single; ABitmap: TTMSFNCBitmap); overload; virtual;\r\n {$ENDIF}\r\n procedure DrawCheckBox(ARect: TRectF; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True); overload; virtual;\r\n procedure DrawButton(ARect: TRectF; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawCloseButton(ARect: TRectF; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawExpanderButton(ARect: TRectF; AState: TTMSFNCGraphicsExpanderState = gesExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawCompactButton(ARect: TRectF; AState: TTMSFNCGraphicsCompactState = gcsExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawDropDownButton(ARect: TRectF; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; ACenter: Boolean = False; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawRadioButton(ARect: TRectF; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True); overload; virtual;\r\n procedure DrawProgressBar(ARect: TRectF; AValue: Single; AFormat: string = '%.0f%%'; AMax: Single = 100; AColor: TTMSFNCGraphicsColor = gcYellowgreen; ATextColor: TTMSFNCGraphicsColor = gcBlack; AShowText: Boolean = True; AEnabled: Boolean = True); overload; virtual;\r\n procedure DrawCheckBox(ARect: TRect; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True); overload; virtual;\r\n procedure DrawButton(ARect: TRect; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawCloseButton(ARect: TRect; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawExpanderButton(ARect: TRect; AState: TTMSFNCGraphicsExpanderState = gesExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawCompactButton(ARect: TRect; AState: TTMSFNCGraphicsCompactState = gcsExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawDropDownButton(ARect: TRect; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; ACenter: Boolean = False; AAdaptToStyle: Boolean = True); overload; virtual;\r\n procedure DrawRadioButton(ARect: TRect; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True); overload; virtual;\r\n procedure DrawProgressBar(ARect: TRect; AValue: Single; AFormat: string = '%.0f%%'; AMax: Single = 100; AColor: TTMSFNCGraphicsColor = gcYellowgreen; ATextColor: TTMSFNCGraphicsColor = gcBlack; AShowText: Boolean = True; AEnabled: Boolean = True); overload; virtual;\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n procedure DrawBitmapWithName(ALeft, ATop, ARight, ABottom: Double; ABitmapName: string; AApplyScale: Boolean = False; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmapWithName(ARect: TRectF; ABitmapName: string; AApplyScale: Boolean = False; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawScaledBitmap(ARect: TRectF; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawScaledBitmap(ALeft, ATop, ARight, ABottom: Double; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmapWithName(ALeft, ATop, ARight, ABottom: Integer; ABitmapName: string; AApplyScale: Boolean = False; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawBitmapWithName(ARect: TRect; ABitmapName: string; AApplyScale: Boolean = False; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawScaledBitmap(ARect: TRect; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n procedure DrawScaledBitmap(ALeft, ATop, ARight, ABottom: Integer; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False); overload; virtual;\r\n {$ENDIF}\r\n function GetBitmapDrawRectangle(ALeft, ATop, ARight, ABottom: Double; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRectF; overload; virtual;\r\n function GetBitmapDrawRectangle(ARect: TRectF; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRectF; overload; virtual;\r\n function GetBitmapDrawRectangle(ALeft, ATop, ARight, ABottom: Integer; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRect; overload; virtual;\r\n function GetBitmapDrawRectangle(ARect: TRect; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRect; overload; virtual;\r\n procedure ClipRect(ARect: TRectF); overload; virtual;\r\n function CalculateTextSize(AText: string; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TSizeF; overload; virtual;\r\n function CalculateTextWidth(AText: string; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Single; overload; virtual;\r\n function CalculateTextHeight(AText: string; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Single; overload; virtual;\r\n function CalculateText(AText: String; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TRectF; overload; virtual;\r\n function CalculateTextSize(AText: string): TSizeF; overload; virtual;\r\n function CalculateTextWidth(AText: string): Single; overload; virtual;\r\n function CalculateTextHeight(AText: string): Single; overload; virtual;\r\n function CalculateText(AText: String): TRectF; overload; virtual;\r\n procedure ClipRect(ARect: TRect); overload; virtual;\r\n function CalculateTextSize(AText: string; ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TSize; overload; virtual;\r\n function CalculateTextWidth(AText: string; ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Integer; overload; virtual;\r\n function CalculateTextHeight(AText: string; ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Integer; overload; virtual;\r\n function CalculateText(AText: String; ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TRect; overload; virtual;\r\n function CalculateTextSizeInt(AText: string): TSize; overload; virtual;\r\n function CalculateTextWidthInt(AText: string): Integer; overload; virtual;\r\n function CalculateTextHeightInt(AText: string): Integer; overload; virtual;\r\n function CalculateTextInt(AText: String): TRect; overload; virtual;\r\n function DrawText(APoint: TPointF; AText: String; AAngle: Single = 0 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ARect: TRectF; AText: String; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ALeft, ATop, ARight, ABottom: Double; AText: String; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ARect: TRect; AText: String; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ALeft, ATop, ARight, ABottom: Integer; AText: String; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ARect: TRectF; AText: String; var AControlID: String; var AControlValue: String; var AControlType: string;AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ALeft, ATop, ARight, ABottom: Double; AText: String; var AControlID: String; var AControlValue: String; var AControlType: string; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ARect: TRect; AText: String; var AControlID: String; var AControlValue: String; var AControlType: string; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function DrawText(ALeft, ATop, ARight, ABottom: Integer; AText: String; var AControlID: String; var AControlValue: String; var AControlType: string; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading; AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1 {$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String; overload; virtual;\r\n function SaveState(ACanvasOnly: Boolean = False): TTMSFNCGraphicsSaveState; virtual;\r\n property Fill: TTMSFNCGraphicsFill read FFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke;\r\n property Font: TTMSFNCGraphicsFont read FFont;\r\n property Canvas: TCanvas read GetCanvas;\r\n property Context: TTMSFNCGraphicsContext read GetContext;\r\n property Bitmap: TBitmap read FBitmap;\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n property OptimizedHTMLDrawing: Boolean read FOptimizedHTMLDrawing write FOptimizedHTMLDrawing;\r\n property HighlightColor: TTMSFNCGraphicsColor read FHighlightColor write FHighlightColor;\r\n property HighlightTextColor: TTMSFNCGraphicsColor read FHighlightTextColor write FHighlightTextColor;\r\n property HighlightFontStyle: TFontStyles read FHighlightFontStyles write FHighlightFontStyles;\r\n {$IFDEF CMNLIB}\r\n property ImageList: TCustomImageList read FImageList write FImageList;\r\n {$ENDIF}\r\n property BitmapContainer: TTMSFNCBitmapContainer read FBitmapContainer write FBitmapContainer;\r\n property URLColor: TTMSFNCGraphicsColor read FURLColor write FURLColor default gcBlue;\r\n property URLUnderline: Boolean read FURLUnderline write FURLUnderline default True;\r\n class function ApplyHilight(AText, AHilight, ATag: string; ADoCase: Boolean): string;\r\n class function GetBitmapFromBitmapContainer(ABitmapContainer: TTMSFNCBitmapContainer; AName: string; AApplyScale: Boolean = False; AScale: Single = 0): TTMSFNCBitmap; virtual;\r\n class function GetScaledBitmap(ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0; ABitmapContainer: TTMSFNCBitmapContainer = nil): TTMSFNCBitmap;\r\n {$ENDIF}\r\n class procedure GetAspectSize(var AWidth: Single; var AHeight: Single; AOriginalWidth: Single; AOriginalHeight: Single; ANewWidth: Single; ANewHeight: Single; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACropping: Boolean = False); virtual;\r\n class procedure DrawSample(ACanvas: TCanvas; ARect: TRectF); virtual;\r\n class procedure SetDefaultGraphicColors; virtual;\r\n class function PointInPath(APoint: TPointF; APath: TTMSFNCGraphicsPath): Boolean; overload; virtual;\r\n class function PointInPath(APoint: TPoint; APath: TTMSFNCGraphicsPath): Boolean; overload; virtual;\r\n class function PointInPolygon(APoint: TPointF; APolygon: TTMSFNCGraphicsPathPolygon): Boolean; overload; virtual;\r\n class function PointInPolygon(APoint: TPoint; APolygon: TTMSFNCGraphicsPathPolygon): Boolean; overload; virtual;\r\n class function PointInRect(APoint: TPointF; ARect: TRectF): Boolean; overload; virtual;\r\n class function PointInRect(APoint: TPoint; ARect: TRect): Boolean; overload; virtual;\r\n class function GetColorRed(AColor: TTMSFNCGraphicsColor): Byte; virtual;\r\n class function GetColorGreen(AColor: TTMSFNCGraphicsColor): Byte; virtual;\r\n class function GetColorBlue(AColor: TTMSFNCGraphicsColor): Byte; virtual;\r\n {$IFDEF FMXLIB}\r\n class function GetColorAlpha(AColor: TTMSFNCGraphicsColor): Byte; virtual;\r\n {$ENDIF}\r\n class function ColorToHTML(AColor: TTMSFNCGraphicsColor): string; virtual;\r\n class function HTMLToColor(AHTML: string): TTMSFNCGraphicsColor; virtual;\r\n class function TextToColor(AText: string): TTMSFNCGraphicsColor; virtual;\r\n end;\r\n\r\n ITMSFNCGraphicsExport = interface\r\n ['{481CA803-8B50-4545-B212-57AC0D065D09}']\r\n procedure &Export({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF);\r\n end;\r\n\r\n{$IFDEF WEBLIB}\r\nconst\r\n TMSFNCGRAPHICSCLOSE = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJ'+\r\n 'cEhZcwAACxIAAAsSAdLdfvwAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuOWwzfk4AAABVSURBVDhPYxh+'+\r\n 'QBSI/0OYWAFIThjCxA5ACmAYHeCTQwHYFGITwwuQNSBjkgBFmkGAIgNAGv5BaZINQdYMA0Qbgk0zDBBlCCiR4FMA'+\r\n 'khOCMIcJYGAAAHvVMBv6PIFYAAAAAElFTkSuQmCC';\r\n TMSFNCGRAPHICSDOWN = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBA'+\r\n 'JqcGAAAAGdJREFUOI3tzjsOwjAURNGDUqSgTxU5K2AVrJtswjUsgHSR0qdxAZZFPrS+3ZvRzBsqf9MUtBtazJk+oM'+\r\n 'e0VTriiZCFX8nbpENMgfARjsn74vKj5IFruhfc8d6zIF9S/Hyk5HS4spMVeFcOjszaOwMAAAAASUVORK5CYII=';\r\n TMSFNCGRAPHICSDOWN2 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAA'+\r\n 'RnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMT'+\r\n 'ZEaa/1AAAAdElEQVQ4T6XMsQ2AMBBD0UxBBwyA2L9jCWpY5bCLSJfgSFgUr+AHX4mIX2R0yOiQ0SGjQ8Ud5q7RCl'+\r\n 'vX5IEDLlhS4/gGvuV/5YEJTuCAR+qYjW/N/81Hko8Mx/QKST0yHJOMCYfDMcnokNEho0NGh4zfRXkAxSYKjdpwcI'+\r\n 'UAAAAASUVORK5CYII=';\r\n TMSFNCGRAPHICSUP = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJq'+\r\n 'cGAAAAEZJREFUOI3tjLEJACAMwLLo5EM+rTjpXV7g0oI4tYKbgYwJfJ6Txet4iu6Jxk10TTSuQACidzKAIrGik24ZpC'+\r\n 'PeJ8ky+DhZ1JENPrPndiwAAAAASUVORK5CYII=';\r\n TMSFNCGRAPHICSUP2 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARn'+\r\n 'QU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa'+\r\n '/1AAAAcklEQVQ4T6XMMQ6AMAiF4S46eSEvremk5/IC+GggKfE1ER2+gZ9AEZFfaMygMYPGDBozaOyshu0aGo0eXmb4'+\r\n 'hEbw42qGTx4B/HiHCWYYPgmDOWEDPfbmT46uNWEwC/THTp/oLvQwfEFjBo0ZNGbQ+J6UG5Y9CmuVGrAsAAAAAElFTkS'+\r\n 'uQmCC';\r\n TMSFNCGRAPHICSPIN = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAARnQ'+\r\n 'U1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1'+\r\n 'AAABKklEQVQ4T2PAB0JDQ5mjoqIEgUxGiAiRIDo6WiY8PHwdEGvW19czQYUJA6AGhbCwsO9Aek1ISIiZvb09C1QKPwB'+\r\n 'qaAbi/1DNJ4HYiqDNIE1ADZ9AGqGa/wLp6xERESZAaVQ/AyUUgDgIiOdCbQFrQsL/gPgxUM4OFACSQMYdIP4FFPwNxH'+\r\n '+gpqNoAortAYayHNSfjAwgNwMFvaCaMTQA8W+g+M7IyEgNiLuQAMgUoNsDgYruoWkCOe1gcHCwHlQpJgA6wwCo6DySJ'+\r\n 'hD+BDQwCaoEEwA1SQAVzQLiq0BcBMRXgBhk25PAwEBJqDJUkJaWxgr0QzoQbwYqdABGNCeQrQPSDKTv44w3oFPEgYqm'+\r\n 'Amk9UNqECjMCxWSBeAeUjx1ANWAkZCSD0AADAwDRpKHlJfOjAwAAAABJRU5ErkJggg==';\r\n TMSFNCGRAPHICSPIN2 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAARn'+\r\n 'QU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa'+\r\n '/1AAAA/UlEQVQ4T33Su2oCQRTGcddLYWmlQhTLCBIsQgoLSW2nj2Bj7yv4DGkCeYOQxiaBNJapbCI2ooU+gY3gbf1/'+\r\n 'w47MjosHfsvM7DlzY1JhGN6TQQGBM2bEOgke8IU60tGY4SYlqWGHT7wgC/PPT/SNoFDxH1owKyclWyrawsYJczwj8J'+\r\n 'O1tR4+oFX8OGONtpLLWGCPA47Q7H78ogqd06yoPXeg4qQCTfaDR1x3ZxuapYsl3NDWJnjCtUjcThNTuKHL6cPNM2yj'+\r\n 'hHfMMMQ/tNoGuoNYkeiTwwBjvCKPBlS8QuzFWPoU8QadQ29TY3qbFXxH/Ru2oYKbhww7kSdMXQD8wIToOQZE/AAAAA'+\r\n 'BJRU5ErkJggg==';\r\n TMSFNCGRAPHICSRIGHT = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMB'+\r\n 'AJqcGAAAAFNJREFUOI3tzzsSQFAQRNFDqSezHUuwYBJLsBuhEomE4/ll3HBq+nY1PxENRrS5xzK4L1jPSiISesxP'+\r\n 'JcORJJqwU9xthjrX/ko4mpBQocN0tf1rbDeZDIfcSud0AAAAAElFTkSuQmCC';\r\n TMSFNCGRAPHICSLEFT = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBA'+\r\n 'JqcGAAAAEpJREFUOI3lzKENgEAQAMEJBkkIDdDTSxp6gqMyCkB8IQgMFdwZAutn+U19Bi84MUbxhZrBawSXB+8RDD'+\r\n 'MaDkyvmQyZyYYuOvh6N24uDUKEV//MAAAAAElFTkSuQmCC';\r\n TMSFNCGRAPHICSEXPAND = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOvwAADr8'+\r\n 'BOAVTJAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4zjOaXUAAAACVJREFUGFdj+P//P07MEBYW9h8Xxi'+\r\n '8JAjglYACnBAzglMAEDAwARZ1DA4NRF38AAAAASUVORK5CYII=';\r\n{$ENDIF}\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, Math\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n ,WEBLib.TMSFNCUtils\r\n ,WEBLib.TMSFNCHTMLEngine\r\n {$ENDIF}\r\n ,WEBLib.TMSFNCGraphics.General\r\n {$IFDEF WEBLIB}\r\n ,WEBLib.TMSFNCGraphics.WEB\r\n {$ENDIF}\r\n {$IFDEF MSWINDOWS}\r\n ,WEBLib.TMSFNCGraphics.Win\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n ,WEBLib.TMSFNCGraphics.iOS\r\n {$ENDIF}\r\n {$IFNDEF IOS}\r\n ,WEBLib.TMSFNCGraphics.Mac\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF ANDROID}\r\n ,WEBLib.TMSFNCGraphics.Android\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF UNIX}\r\n {$IFDEF LINUX}\r\n ,WEBLib.TMSFNCGraphics.Unix\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFNDEF MSWINDOWS}\r\n ,LCLIntF\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\n{$IFNDEF LIMITEDGRAPHICSMODE}\r\n{$R TMSFNCGraphics.res}\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCGraphics.EndScene;\r\nbegin\r\n Context.EndScene;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.BeginScene;\r\nbegin\r\n Context.BeginScene;\r\nend;\r\n\r\nconstructor TTMSFNCGraphics.CreateNativeBitmapCanvas(AWidth: Integer = 1; AHeight: Integer = 1);\r\nbegin\r\n CreateBitmapCanvas(AWidth, AHeight, True);\r\nend;\r\n\r\nconstructor TTMSFNCGraphics.CreateBitmapCanvas(AWidth: Integer = 1; AHeight: Integer = 1; ANative: Boolean = False; AHighDPI: Boolean = True);\r\nbegin\r\n FNative := ANative;\r\n FBitmap := TBitmap.Create{$IFDEF FMXLIB}(AWidth, AHeight){$ENDIF};\r\n {$IFDEF FMXLIB}\r\n if AHighDPI then\r\n FBitmap.BitmapScale := TTMSFNCUtils.GetDPIScale;\r\n {$ENDIF}\r\n FBitmap.Width := AWidth;\r\n FBitmap.Height := AHeight;\r\n FActiveCanvas := FBitmap.Canvas;\r\n if not ANative then\r\n begin\r\n FContextGeneral := TTMSFNCGraphicsContextGeneral.Create(Self);\r\n FContextGeneral.SetSize(AWidth, AHeight);\r\n end\r\n else\r\n begin\r\n FContextNative := GetNativeContextClass.Create(Self);\r\n FContextNative.SetSize(AWidth, AHeight);\r\n end;\r\n FFill := TTMSFNCGraphicsFill.Create;\r\n FFill.OnChanged := @FillChanged;\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FStroke.OnChanged := @StrokeChanged;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @FontChanged;\r\n InitializeDefaultAppearance;\r\nend;\r\n\r\nconstructor TTMSFNCGraphics.CreateNative(ACanvas: TCanvas);\r\nbegin\r\n Create(ACanvas, True);\r\nend;\r\n\r\nconstructor TTMSFNCGraphics.Create(ACanvas: TCanvas; ANative: Boolean = False);\r\nbegin\r\n FNative := ANative;\r\n FActiveCanvas := ACanvas;\r\n if not ANative then\r\n begin\r\n FContextGeneral := TTMSFNCGraphicsContextGeneral.Create(Self);\r\n FContextGeneral.SetSize(1, 1);\r\n end\r\n else\r\n begin\r\n FContextNative := GetNativeContextClass.Create(Self);\r\n FContextNative.SetSize(1, 1);\r\n end;\r\n FFill := TTMSFNCGraphicsFill.Create;\r\n FFill.OnChanged := @FillChanged;\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FStroke.OnChanged := @StrokeChanged;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @FontChanged;\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n FHighlightColor := gcBlue;\r\n FHighlightTextColor := gcWhite;\r\n FHighlightFontStyles := [];\r\n {$eNDIF}\r\n InitializeDefaultAppearance;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.RestoreState(AState: TTMSFNCGraphicsSaveState; ACanvasOnly: Boolean = False);\r\nbegin\r\n if not ACanvasOnly then\r\n begin\r\n SetFill(AState.Fill);\r\n SetStroke(AState.Stroke);\r\n SetFont(AState.Font);\r\n end;\r\n\r\n Context.RestoreState(AState);\r\n\r\n AState.Free;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.SaveState(ACanvasOnly: Boolean = False): TTMSFNCGraphicsSaveState;\r\nbegin\r\n Result := TTMSFNCGraphicsSaveState.Create;\r\n\r\n if not ACanvasOnly then\r\n begin\r\n Result.Fill.Assign(FFill);\r\n Result.Stroke.Assign(FStroke);\r\n Result.Font.AssignSource(FFont);\r\n end;\r\n\r\n Context.SaveState(Result);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.StopSpecialPen;\r\nbegin\r\n Context.StopSpecialPen;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.StartSpecialPen;\r\nbegin\r\n Context.StartSpecialPen;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.Assign(Source: TTMSFNCGraphics);\r\nbegin\r\n if Source is TTMSFNCGraphics then\r\n begin\r\n FFill.BeginUpdate;\r\n FFill.Assign((Source as TTMSFNCGraphics).Fill);\r\n FFill.EndUpdate;\r\n FStroke.BeginUpdate;\r\n FStroke.Assign((Source as TTMSFNCGraphics).Stroke);\r\n FStroke.EndUpdate;\r\n FFont.BeginUpdate;\r\n FFont.AssignSource((Source as TTMSFNCGraphics).Font);\r\n FFont.EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFill(AFill: TTMSFNCGraphicsFill);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFill(AFill);\r\n FFill.Assign(AFill);\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFillKind(AKind: TTMSFNCGraphicsFillKind);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFillKind(AKind);\r\n FFill.Kind := AKind;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFillColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFillColor(AColor);\r\n FFill.Color := AColor;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetStrokeKind(AKind: TTMSFNCGraphicsStrokeKind);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetStrokeKind(AKind);\r\n FStroke.Kind := AKind;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetStroke(AStroke: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetStroke(AStroke);\r\n FStroke.Assign(AStroke);\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetStrokeWidth(AWidth: Single);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetStrokeWidth(AWidth);\r\n FStroke.Width := AWidth;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetStrokeColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetStrokeColor(AColor);\r\n FStroke.Color := AColor;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawLine(AFromPoint: TPoint; AToPoint: TPoint; AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode = gcpmRightDown;\r\n AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode = gcpmRightDown);\r\nbegin\r\n DrawLine(ConvertToPointF(AFromPoint), ConvertToPointF(AToPoint), AModifyPointModeFrom, AModifyPointModeTo);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawLine(AFromPoint: TPointF; AToPoint: TPointF; AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode = gcpmRightDown;\r\n AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode = gcpmRightDown);\r\nbegin\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawLine(FStroke, AFromPoint, AToPoint, AModifyPointModeFrom, AModifyPointModeTo);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawPolyline(APolyline: TTMSFNCGraphicsPathPolygon);\r\nbegin\r\n if (FFill.Color <> gcNull) and (FFill.Kind <> gfkNone) then\r\n Context.FillPolyline(FFill, APolyline);\r\n\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawPolyline(FStroke, APolyline);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawPolygon(APolygon: TTMSFNCGraphicsPathPolygon);\r\nvar\r\n pth: TTMSFNCGraphicsPath;\r\nbegin\r\n if ((FFill.Color <> gcNull) and (FFill.Kind <> gfkNone)) or (FFill.Kind = gfkTexture) then\r\n begin\r\n case FFill.Kind of\r\n gfkTexture:\r\n begin\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n pth.AddPolygon(APolygon);\r\n DrawTexture(pth.GetBounds, FFill.Texture, FFill.TextureMode);\r\n finally\r\n pth.Free;\r\n end;\r\n end;\r\n else\r\n Context.FillPolygon(FFill, APolygon);\r\n end;\r\n end;\r\n\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawPolygon(FStroke, APolygon);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawPath(APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon);\r\nbegin\r\n if ((FFill.Color <> gcNull) and (FFill.Kind <> gfkNone)) or (FFill.Kind = gfkTexture) then\r\n begin\r\n case FFill.Kind of\r\n gfkTexture: DrawTexture(APath.GetBounds, FFill.Texture, FFill.TextureMode);\r\n else\r\n Context.FillPath(FFill, APath, APathMode);\r\n end;\r\n end;\r\n\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawPath(FStroke, APath, APathMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawArc(const Center: TPoint; const Radius: TPoint; StartAngle: Integer; SweepAngle: Integer);\r\nbegin\r\n DrawArc(ConvertToPointF(Center), ConvertToPointF(Radius), StartAngle, SweepAngle);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawArc(const Center: TPointF; const Radius: TPointF; StartAngle: Single; SweepAngle: Single);\r\nvar\r\n pth: TTMSFNCGraphicsPath;\r\nbegin\r\n if (FFill.Color <> gcNull) and (FFill.Kind <> gfkNone) then\r\n begin\r\n case FFill.Kind of\r\n gfkTexture:\r\n begin\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n pth.AddArc(Center, Radius, StartAngle, SweepAngle);\r\n DrawTexture(pth.GetBounds, FFill.Texture, FFill.TextureMode);\r\n finally\r\n pth.Free;\r\n end;\r\n end;\r\n else\r\n Context.FillArc(FFill, Center, Radius, StartAngle, SweepAngle);\r\n end;\r\n end;\r\n\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawArc(FStroke, Center, Radius, StartAngle, SweepAngle);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRoundRectangle(ARect: TRect; ARounding: Integer = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRoundRectangle(ConvertToRectF(ARect), ARounding, ACorners);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRoundRectangle(ARect: TRectF; ARounding: Single = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRoundRectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, ARounding, ACorners, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRectangle(RectF(ALeft, ATop, ARight, ABottom), AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRectangle(ALeft, ATop, ARight, ABottom, AllSides, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; ASides: TTMSFNCGraphicsSides; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRectangle(RectF(ALeft, ATop, ARight, ABottom), ASides, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; ASides: TTMSFNCGraphicsSides; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nvar\r\n r: TRectF;\r\n pth: TTMSFNCGraphicsPath;\r\nbegin\r\n r := RectF(ALeft, ATop, ARight, ABottom);\r\n if ((FFill.Color <> gcNull) and (FFill.Kind <> gfkNone)) or (FFill.Kind = gfkTexture) then\r\n begin\r\n case FFill.Kind of\r\n gfkTexture:\r\n begin\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n pth.AddRectangle(r);\r\n DrawTexture(r, FFill.Texture, FFill.TextureMode);\r\n finally\r\n pth.Free;\r\n end;\r\n end;\r\n else\r\n Context.FillRect(FFill, r, AModifyRectMode);\r\n end;\r\n end;\r\n\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawRect(FStroke, r, ASides, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRoundRectangle(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; ARounding: Integer = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRoundRectangle(RectF(ALeft, ATop, ARight, ABottom), ARounding, ACorners);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRoundRectangle(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; ARounding: Single = 10; ACorners: TTMSFNCGraphicsCorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight]; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nvar\r\n r: TRectF;\r\n rc: Single;\r\n pth: TTMSFNCGraphicsPath;\r\nbegin\r\n r := RectF(ALeft, ATop, ARight, ABottom);\r\n if ((FFill.Color <> gcNull) and (FFill.Kind <> gfkNone)) or (FFill.Kind = gfkTexture) then\r\n begin\r\n case FFill.Kind of\r\n gfkTexture:\r\n begin\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n rc := ARounding;\r\n if gcBottomLeft in ACorners then\r\n begin\r\n pth.MoveTo(PointF(r.Left + rc, r.Bottom));\r\n pth.AddArc(PointF(r.Left + rc, r.Bottom - rc), PointF(rc, rc), -270, 90);\r\n pth.LineTo(PointF(r.Left, r.Bottom - rc));\r\n end\r\n else\r\n begin\r\n pth.MoveTo(PointF(r.Left, r.Bottom));\r\n end;\r\n\r\n if gcTopLeft in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Left, r.Top + rc));\r\n pth.AddArc(PointF(r.Left + rc, r.Top + rc), PointF(rc, rc), -180, 90);\r\n pth.LineTo(PointF(r.Left + rc, r.Top));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Left, r.Top));\r\n\r\n if gcTopRight in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Right - rc, r.Top));\r\n pth.AddArc(PointF(r.Right - rc, r.Top + rc), PointF(rc, rc), -90, 90);\r\n pth.LineTo(PointF(r.Right, r.Top + rc));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Right, r.Top));\r\n\r\n if gcBottomRight in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Right, r.Bottom - rc));\r\n pth.AddArc(PointF(r.Right - rc, r.Bottom - rc), PointF(rc, rc), 0, 90);\r\n pth.LineTo(PointF(r.Right - rc, r.Bottom));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Right, r.Bottom));\r\n\r\n if gcBottomLeft in ACorners then\r\n pth.LineTo(PointF(r.Left + rc, r.Bottom))\r\n else\r\n pth.LineTo(PointF(r.Left, r.Bottom));\r\n\r\n pth.ClosePath;\r\n\r\n DrawTexture(r, FFill.Texture, FFill.TextureMode);\r\n finally\r\n pth.Free;\r\n end;\r\n end;\r\n else\r\n Context.FillRoundRect(FFill, r, ARounding, ACorners, AModifyRectMode);\r\n end;\r\n end;\r\n\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawRoundRect(FStroke, r, ARounding, ACorners, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ARect: TRect; ASides: TTMSFNCGraphicsSides; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRectangle(ConvertToRectF(ARect), ASides, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ARect: TRectF; ASides: TTMSFNCGraphicsSides; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, ASides, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ARect: TRect; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRectangle(ConvertToRectF(ARect), AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRectangle(ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawRectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFontSize(ASize: Integer);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFontSize(ASize);\r\n FFont.Size := ASize;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFontColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFontColor(AColor);\r\n FFont.Color := AColor;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFontName(AName: string);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFontName(AName);\r\n FFont.Name := AName;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFont(AFont: TTMSFNCGraphicsFont);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFont(AFont);\r\n FFont.AssignSource(AFont);\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.SetFontStyles(AStyle: TFontStyles);\r\nbegin\r\n if FBlockUpdate > 0 then\r\n Exit;\r\n\r\n Inc(FBlockUpdate);\r\n Context.SetFontStyles(AStyle);\r\n FFont.Style := AStyle;\r\n Dec(FBlockUpdate);\r\nend;\r\n\r\ndestructor TTMSFNCGraphics.Destroy;\r\nbegin\r\n if Assigned(FContextNative) then\r\n begin\r\n FContextNative.Free;\r\n FContextNative := nil;\r\n end;\r\n\r\n if Assigned(FContextGeneral) then\r\n begin\r\n FContextGeneral.Free;\r\n FContextGeneral := nil;\r\n end;\r\n\r\n if Assigned(FFont) then\r\n begin\r\n FFont.Free;\r\n FFont := nil;\r\n end;\r\n\r\n if Assigned(FFill) then\r\n begin\r\n FFill.OnChanged := nil;\r\n FFill.Free;\r\n FFill := nil;\r\n end;\r\n\r\n if Assigned(FStroke) then\r\n begin\r\n FStroke.OnChanged := nil;\r\n FStroke.Free;\r\n FStroke := nil;\r\n end;\r\n\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n FBitmapContainer := nil;\r\n {$IFDEF CMNLIB}\r\n FImageList := nil;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n if Assigned(FBitmap) then\r\n begin\r\n FBitmap.Free;\r\n FBitmap := nil;\r\n end;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawCloseButton(ARect: TRect; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nbegin\r\n DrawCloseButton(ConvertToRectF(ARect), ADown, AFocused, AEnabled, AAdaptToStyle);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawCloseButton(ARect: TRectF; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nvar\r\n bmp: TTMSFNCBitmap;\r\n bmpa: TBitmap;\r\n r: TRectF;\r\n g: TTMSFNCGraphics;\r\nbegin\r\n DrawButton(ARect, ADown, AFocused, AEnabled, AAdaptToStyle);\r\n if AAdaptToStyle then\r\n begin\r\n bmpa := TBitmap.Create;\r\n bmpa.SetSize(16, 16);\r\n {$IFDEF CMNLIB}\r\n bmpa.TransparentMode := tmFixed;\r\n bmpa.Transparent := True;\r\n bmpa.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n g := TTMSFNCGraphics.Create(bmpa.Canvas);\r\n try\r\n g.BeginScene;\r\n {$IFDEF CMNLIB}\r\n g.Fill.Color := gcWhite;\r\n g.Fill.Kind := gfkSolid;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(0, 0, bmpa.Width, bmpa.Height);\r\n {$ENDIF}\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := TTMSFNCGraphics.DefaultSelectionFillColor;\r\n g.Stroke.Width := 2;\r\n g.DrawLine(PointF(3, 3), PointF(12, 12), gcpmRightDown);\r\n g.DrawLine(PointF(3, 12), PointF(12, 3), gcpmRightDown);\r\n finally\r\n g.EndScene;\r\n g.Free;\r\n end;\r\n\r\n try\r\n r := ARect;\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, TTMSFNCBitmap(bmpa));\r\n {$ELSE}\r\n DrawBitmap(r, bmpa);\r\n {$ENDIF}\r\n finally\r\n bmpa.Free;\r\n end;\r\n end\r\n else\r\n begin\r\n bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSCLOSE));\r\n\r\n try\r\n r := ARect;\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, BitmapToDrawBitmap(TTMSFNCBitmap(bmp)));\r\n {$ELSE}\r\n DrawBitmap(r, BitmapToDrawBitmap(bmp));\r\n {$ENDIF}\r\n finally\r\n bmp.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawExpanderButton(ARect: TRect; AState: TTMSFNCGraphicsExpanderState = gesExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nbegin\r\n DrawExpanderButton(ConvertToRectF(ARect), AState, ADown, AFocused, AEnabled, AAdaptToStyle);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawExpanderButton(ARect: TRectF; AState: TTMSFNCGraphicsExpanderState = gesExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nvar\r\n bmpa: TBitmap;\r\n bmp: TTMSFNCBitmap;\r\n r: TRectF;\r\n g: TTMSFNCGraphics;\r\nbegin\r\n DrawButton(ARect, ADown, AFocused, AEnabled, AAdaptToStyle);\r\n if AAdaptToStyle then\r\n begin\r\n bmpa := TBitmap.Create;\r\n bmpa.SetSize(16, 16);\r\n {$IFDEF CMNLIB}\r\n bmpa.TransparentMode := tmFixed;\r\n bmpa.Transparent := True;\r\n bmpa.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n g := TTMSFNCGraphics.Create(bmpa.Canvas);\r\n try\r\n g.BeginScene;\r\n {$IFDEF CMNLIB}\r\n g.Fill.Color := gcWhite;\r\n g.Fill.Kind := gfkSolid;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(0, 0, bmpa.Width, bmpa.Height);\r\n {$ENDIF}\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Width := 2;\r\n g.Stroke.Color := TTMSFNCGraphics.DefaultSelectionFillColor;\r\n case AState of\r\n gesCollapsed:\r\n begin\r\n g.DrawLine(PointF(5, 6), PointF(8, 9), gcpmRightDown);\r\n g.DrawLine(PointF(8, 9), PointF(11, 6), gcpmRightDown);\r\n end;\r\n gesExpanded:\r\n begin\r\n g.DrawLine(PointF(5, 9), PointF(8, 6), gcpmRightDown);\r\n g.DrawLine(PointF(8, 6), PointF(11, 9), gcpmRightDown);\r\n end;\r\n end;\r\n finally\r\n g.EndScene;\r\n g.Free;\r\n end;\r\n\r\n if Assigned(bmpa) then\r\n begin\r\n try\r\n r := ARect;\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, TTMSFNCBitmap(bmpa));\r\n {$ELSE}\r\n DrawBitmap(r, bmpa);\r\n {$ENDIF}\r\n finally\r\n bmpa.Free;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n case AState of\r\n gesCollapsed: bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSDOWN));\r\n gesExpanded: bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSUP));\r\n else\r\n bmp := nil;\r\n end;\r\n\r\n if Assigned(bmp) then\r\n begin\r\n try\r\n r := ARect;\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, BitmapToDrawBitmap(TTMSFNCBitmap(bmp)));\r\n {$ELSE}\r\n DrawBitmap(r, BitmapToDrawBitmap(bmp));\r\n {$ENDIF}\r\n finally\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawCompactButton(ARect: TRect; AState: TTMSFNCGraphicsCompactState = gcsExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nbegin\r\n DrawCompactButton(ConvertToRectF(ARect), AState, ADown, AFocused, AEnabled, AAdaptToStyle);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawCompactButton(ARect: TRectF; AState: TTMSFNCGraphicsCompactState = gcsExpanded; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nvar\r\n bmpa: TBitmap;\r\n bmp: TTMSFNCBitmap;\r\n r: TRectF;\r\n g: TTMSFNCGraphics;\r\nbegin\r\n DrawButton(ARect, ADown, AFocused, AEnabled, AAdaptToStyle);\r\n if AAdaptToStyle then\r\n begin\r\n bmpa := TBitmap.Create;\r\n bmpa.SetSize(16, 16);\r\n {$IFDEF CMNLIB}\r\n bmpa.TransparentMode := tmFixed;\r\n bmpa.Transparent := True;\r\n bmpa.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n g := TTMSFNCGraphics.Create(bmpa.Canvas);\r\n try\r\n g.BeginScene;\r\n {$IFDEF CMNLIB}\r\n g.Fill.Color := gcWhite;\r\n g.Fill.Kind := gfkSolid;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(0, 0, bmpa.Width, bmpa.Height);\r\n {$ENDIF}\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Width := 2;\r\n g.Stroke.Color := TTMSFNCGraphics.DefaultSelectionFillColor;\r\n case AState of\r\n gcsCollapsed:\r\n begin\r\n g.DrawLine(PointF(6, 5), PointF(9, 8), gcpmRightDown);\r\n g.DrawLine(PointF(9, 8), PointF(6, 11), gcpmRightDown);\r\n end;\r\n gcsExpanded:\r\n begin\r\n g.DrawLine(PointF(9, 5), PointF(6, 8), gcpmRightDown);\r\n g.DrawLine(PointF(6, 8), PointF(9, 11), gcpmRightDown);\r\n end;\r\n end;\r\n finally\r\n g.EndScene;\r\n g.Free;\r\n end;\r\n\r\n if Assigned(bmpa) then\r\n begin\r\n try\r\n r := ARect;\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, TTMSFNCBitmap(bmpa));\r\n {$ELSE}\r\n DrawBitmap(r, bmpa);\r\n {$ENDIF}\r\n finally\r\n bmpa.Free;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n case AState of\r\n gcsCollapsed: bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSRIGHT));\r\n gcsExpanded: bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSLEFT));\r\n else\r\n bmp := nil;\r\n end;\r\n\r\n if Assigned(bmp) then\r\n begin\r\n try\r\n r := ARect;\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, BitmapToDrawBitmap(TTMSFNCBitmap(bmp)));\r\n {$ELSE}\r\n DrawBitmap(r, BitmapToDrawBitmap(bmp));\r\n {$ENDIF}\r\n finally\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawDropDownButton(ARect: TRect; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; ACenter: Boolean = False; AAdaptToStyle: Boolean = True);\r\nbegin\r\n DrawDropDownButton(ConvertToRectF(ARect), ADown, AFocused, AEnabled, ACenter, AAdaptToStyle);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawDropDownButton(ARect: TRectF; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; ACenter: Boolean = False; AAdaptToStyle: Boolean = True);\r\nvar\r\n bmp: TTMSFNCBitmap;\r\n bmpa: TBitmap;\r\n r: TRectF;\r\n g: TTMSFNCGraphics;\r\nbegin\r\n DrawButton(ARect, ADown, AFocused, AEnabled, AAdaptToStyle);\r\n if AAdaptToStyle then\r\n begin\r\n bmpa := TBitmap.Create;\r\n bmpa.SetSize(7, 7);\r\n {$IFDEF CMNLIB}\r\n bmpa.TransparentMode := tmFixed;\r\n bmpa.Transparent := True;\r\n bmpa.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n g := TTMSFNCGraphics.Create(bmpa.Canvas);\r\n try\r\n g.BeginScene;\r\n {$IFDEF CMNLIB}\r\n g.Fill.Color := gcWhite;\r\n g.Fill.Kind := gfkSolid;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(0, 0, bmpa.Width, bmpa.Height);\r\n {$ENDIF}\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := TTMSFNCGraphics.DefaultSelectionFillColor;\r\n g.DrawLine(PointF(0, 1), PointF(6, 1), gcpmRightDown);\r\n g.DrawLine(PointF(0, 2), PointF(6, 2), gcpmRightDown);\r\n g.DrawLine(PointF(1, 3), PointF(5, 3), gcpmRightDown);\r\n g.DrawLine(PointF(2, 4), PointF(4, 4), gcpmRightDown);\r\n g.DrawLine(PointF(3, 5), PointF(3, 5), gcpmRightDown);\r\n finally\r\n g.EndScene;\r\n g.Free;\r\n end;\r\n\r\n try\r\n if (ARect.Right - bmpa.Width - 10 > ARect.Left) and not ACenter then\r\n r := RectF(ARect.Right - bmpa.Width - 10, ARect.Top, ARect.Right, ARect.Bottom)\r\n else\r\n r := ARect;\r\n\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, TTMSFNCBitmap(bmpa));\r\n {$ELSE}\r\n DrawBitmap(r, bmpa);\r\n {$ENDIF}\r\n finally\r\n bmpa.Free;\r\n end;\r\n end\r\n else\r\n begin\r\n bmp := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSEXPAND));\r\n try\r\n if (ARect.Right - bmp.Width - 10 > ARect.Left) and not ACenter then\r\n r := RectF(ARect.Right - bmp.Width - 10, ARect.Top, ARect.Right, ARect.Bottom)\r\n else\r\n r := ARect;\r\n\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, BitmapToDrawBitmap(TTMSFNCBitmap(bmp)));\r\n {$ELSE}\r\n DrawBitmap(r, BitmapToDrawBitmap(bmp));\r\n {$ENDIF}\r\n finally\r\n bmp.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawButton(ARect: TRect; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nbegin\r\n DrawButton(ConvertToRectF(ARect), ADown, AFocused, AEnabled, AAdaptToStyle);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawButton(ARect: TRectF; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True; AAdaptToStyle: Boolean = True);\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := ARect;\r\n Stroke.Kind := gskSolid;\r\n Stroke.Width := 1;\r\n Fill.Kind := gfkSolid;\r\n\r\n if AAdaptToStyle then\r\n begin\r\n if AEnabled then\r\n begin\r\n if not AFocused then\r\n begin\r\n Stroke.Color := TTMSFNCGraphics.DefaultButtonStrokeColor;\r\n Fill.Color := TTMSFNCGraphics.DefaultButtonFillColor;\r\n end\r\n else\r\n begin\r\n Stroke.Color := TTMSFNCGraphics.DefaultButtonStrokeColorFocused;\r\n Fill.Color := TTMSFNCGraphics.DefaultButtonFillColorFocused;\r\n end;\r\n end\r\n else\r\n begin\r\n Stroke.Color := TTMSFNCGraphics.DefaultButtonStrokeColorDisabled;\r\n Fill.Color := TTMSFNCGraphics.DefaultButtonFillColorDisabled;\r\n end;\r\n end\r\n else\r\n begin\r\n if AEnabled then\r\n begin\r\n if not AFocused then\r\n begin\r\n Stroke.Color := gcDarkGray;\r\n Fill.Color := MakeGraphicsColor(225, 225, 225);\r\n end\r\n else\r\n begin\r\n Stroke.Color := MakeGraphicsColor(60, 127, 177);\r\n Fill.Color := MakeGraphicsColor(229, 241, 251);\r\n end;\r\n end\r\n else\r\n begin\r\n Stroke.Color := gcDarkGray;\r\n Fill.Color := gcLightgray;\r\n end;\r\n end;\r\n\r\n DrawRectangle(r);\r\n InflateRectEx(r, -1, -1);\r\n Fill.Kind := gfkNone;\r\n\r\n if not ADown then\r\n Stroke.Color := Fill.Color\r\n else\r\n Stroke.Color := Lighter(Stroke.Color, 40);\r\n\r\n DrawRectangle(r);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawCheckBox(ARect: TRect; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True);\r\nbegin\r\n DrawCheckBox(ConvertToRectF(ARect), AChecked, AFocused, AEnabled);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawCheckBox(ARect: TRectF; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True);\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\n r: TRectF;\r\nbegin\r\n r := ARect;\r\n InflateRectEx(r, -1, -1);\r\n\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n c := gcSteelBlue\r\n else\r\n c := gcBlack;\r\n end\r\n else\r\n c := gcDarkgray;\r\n\r\n Fill.Kind := gfkSolid;\r\n if AEnabled then\r\n Fill.Color := Lighter(gcLightgray, 85)\r\n else\r\n Fill.Color := gcLightgray;\r\n\r\n Stroke.Width := 1;\r\n Stroke.Kind := gskSolid;\r\n Stroke.Color := c;\r\n DrawRectangle(r);\r\n InflateRectEx(r, -(r.Right - r.Left) / 5, -(r.Bottom - r.Top) / 5);\r\n Stroke.Width := 2;\r\n Stroke.Color := c;\r\n if AChecked then\r\n begin\r\n {$IFDEF FMXLIB}\r\n DrawLine(PointF(r.Left + 1, r.Top + 1), PointF(r.Right - 1, r.Bottom - 1));\r\n DrawLine(PointF(r.Right - 1, r.Top + 1), PointF(r.Left + 1, r.Bottom - 1));\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n DrawLine(PointF(r.Left, r.Top), PointF(r.Right - 1, r.Bottom - 1));\r\n DrawLine(PointF(r.Right - 1, r.Top), PointF(r.Left, r.Bottom - 1));\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawProgressBar(ARect: TRect; AValue: Single; AFormat: string = '%.0f%%'; AMax: Single = 100; AColor: TTMSFNCGraphicsColor = gcYellowgreen; ATextColor: TTMSFNCGraphicsColor = gcBlack; AShowText: Boolean = True; AEnabled: Boolean = True);\r\nbegin\r\n DrawProgressBar(ConvertToRectF(ARect), AValue, AFormat, AMax, AColor, ATextColor, AShowText, AEnabled);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawProgressBar(ARect: TRectF; AValue: Single; AFormat: string = '%.0f%%'; AMax: Single = 100; AColor: TTMSFNCGraphicsColor = gcYellowgreen; ATextColor: TTMSFNCGraphicsColor = gcBlack; AShowText: Boolean = True; AEnabled: Boolean = True);\r\nvar\r\n r, rp: TRectF;\r\n v: Single;\r\nbegin\r\n r := ARect;\r\n rp := r;\r\n if AEnabled then\r\n Fill.Color := Lighter(gcLightGray, 75)\r\n else\r\n Fill.Color := gcLightGray;\r\n\r\n Fill.Kind := gfkSolid;\r\n Stroke.Kind := gskSolid;\r\n Stroke.Color := gcDarkgray;\r\n\r\n DrawRectangle(r);\r\n\r\n v := Max(0, Min(AValue, AMax));\r\n\r\n if (v >= 0) and (v <= AMax) and (AMax > 0) then\r\n begin\r\n InflateRectEx(rp, -1, -1);\r\n rp.Right := rp.Left + (rp.Right - r.Left) * v / AMax;\r\n\r\n Fill.Color := AColor;\r\n Stroke.Color := Fill.Color;\r\n\r\n DrawRectangle(rp);\r\n\r\n if AShowText then\r\n begin\r\n Font.Color := ATextColor;\r\n DrawText(r, Format(AFormat, [v / AMax * 100]), False, gtaCenter, gtaCenter);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRadioButton(ARect: TRect; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True);\r\nbegin\r\n DrawRadioButton(ConvertToRectF(ARect), AChecked, AFocused, AEnabled);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawRadioButton(ARect: TRectF; AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True);\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\n r: TRectF;\r\nbegin\r\n r := ARect;\r\n InflateRectEx(r, -1, -1);\r\n\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n c := gcSteelBlue\r\n else\r\n c := gcBlack;\r\n end\r\n else\r\n c := gcDarkgray;\r\n\r\n Fill.Kind := gfkSolid;\r\n if AEnabled then\r\n Fill.Color := Lighter(gcLightgray, 85)\r\n else\r\n Fill.Color := gcLightgray;\r\n\r\n Stroke.Kind := gskSolid;\r\n Stroke.Width := 1;\r\n Stroke.Color := c;\r\n DrawEllipse(r);\r\n InflateRectEx(r, -(r.Right - r.Left) / 5, -(r.Bottom - r.Top) / 5);\r\n Fill.Kind := gfkSolid;\r\n Fill.Color := c;\r\n if AChecked then\r\n begin\r\n DrawEllipse(r);\r\n end;\r\nend;\r\n\r\n{$IFDEF CMNLIB}\r\nprocedure TTMSFNCGraphics.DrawBitmap(ALeft, ATop: Single; ABitmap: TTMSFNCBitmap);\r\nbegin\r\n DrawBitmap(ALeft, ATop, BitmapToDrawBitmap(ABitmap));\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmap(ALeft, ATop: Integer; ABitmap: TTMSFNCBitmap);\r\nbegin\r\n DrawBitmap(ALeft, ATop, BitmapToDrawBitmap(ABitmap));\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmap(ALeft, ATop: Single; ABitmap: TTMSFNCDrawBitmap);\r\nbegin\r\n DrawBitmap(RectF(ALeft, ATop, ALeft + ABitmap.Width, ATop + ABitmap.Height), ABitmap);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmap(ALeft, ATop: Integer; ABitmap: TTMSFNCDrawBitmap);\r\nbegin\r\n DrawBitmap(Rect(ALeft, ATop, ALeft + ABitmap.Width, ATop + ABitmap.Height), ABitmap);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmap(ARect: TRect; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawBitmap(ConvertToRectF(ARect), ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmap(ARect: TRectF; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawBitmap(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmap(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawBitmap(RectF(ALeft, ATop, ARight, ABottom), ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmap(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nvar\r\n r: TRectF;\r\nbegin\r\n if not Assigned(ABitmap) then\r\n Exit;\r\n\r\n r := RectF(ALeft, ATop, ARight, ABottom);\r\n r := GetBitmapDrawRectangle(r, ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\n Context.DrawBitmap(ABitmap, RectF(0, 0, ABitmap.Width, ABitmap.Height), r, 1);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapPart(ASourceRect: TRect; ADestinationRect: TRect; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawBitmapPart(ConvertToRectF(ASourceRect), ConvertToRectF(ADestinationRect), ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapPart(ASourceRect: TRectF; ADestinationRect: TRectF; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True;\r\n AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawBitmapPart(ASourceRect.Left, ASourceRect.Top, ASourceRect.Right, ASourceRect.Bottom, ADestinationRect.Left, ADestinationRect.Top, ADestinationRect.Right, ADestinationRect.Bottom,\r\n ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapPart(ASourceLeft: Integer; ASourceTop: Integer; ASourceRight: Integer; ASourceBottom: Integer; ADestinationLeft: Integer; ADestinationTop: Integer;\r\n ADestinationRight: Integer; ADestinationBottom: Integer; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True; AStretch: Boolean = False;\r\n ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawBitmapPart(RectF(ASourceLeft, ASourceTop, ASourceRight, ASourceBottom), RectF(ADestinationLeft, ADestinationTop, ADestinationRight, ADestinationBottom), ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapPart(ASourceLeft: Double; ASourceTop: Double; ASourceRight: Double; ASourceBottom: Double; ADestinationLeft: Double; ADestinationTop: Double;\r\n ADestinationRight: Double; ADestinationBottom: Double; ABitmap: TTMSFNCDrawBitmap; AAspectRatio: Boolean = True; AStretch: Boolean = False;\r\n ACenter: Boolean = True; ACropping: Boolean = False);\r\nvar\r\n r, rs: TRectF;\r\n g: TTMSFNCGraphics;\r\nbegin\r\n r := RectF(ADestinationLeft, ADestinationTop, ADestinationRight, ADestinationBottom);\r\n rs := RectF(ASourceLeft, ASourceTop, ASourceRight, ASourceBottom);\r\n if RectIsEmpty(r) or RectIsEmpty(rs) then\r\n Exit;\r\n\r\n g := TTMSFNCGraphics.CreateBitmapCanvas(Round(ASourceRight - ASourceLeft), Round(ASourceBottom - ASourceTop), FNative);\r\n try\r\n g.BeginScene;\r\n g.DrawBitmap(-ASourceLeft, -ASourceTop, -ASourceLeft + g.Bitmap.Width, -ASourceTop + g.Bitmap.Height, ABitmap, False, False, False, False);\r\n g.EndScene;\r\n {$IFDEF WEBLIB}\r\n DrawBitmap(r, TTMSFNCBitmap(g.Bitmap), AAspectRatio, AStretch, ACenter, ACropping);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n DrawBitmap(r, g.Bitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\n {$ENDIF}\r\n finally\r\n g.Free;\r\n end;\r\nend;\r\n\r\nclass procedure TTMSFNCGraphics.GetAspectSize(var AWidth: Single; var AHeight: Single; AOriginalWidth: Single; AOriginalHeight: Single; ANewWidth: Single; ANewHeight: Single;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACropping: Boolean = False);\r\nvar\r\n arc, ar: Single;\r\nbegin\r\n if AAspectRatio then\r\n begin\r\n if (AOriginalWidth > 0) and (AOriginalHeight > 0) and (ANewWidth > 0) and (ANewHeight > 0) then\r\n begin\r\n if (AOriginalWidth < ANewWidth) and (AOriginalHeight < ANewHeight) and (not AStretch) then\r\n begin\r\n AWidth := AOriginalWidth;\r\n AHeight := AOriginalHeight;\r\n end\r\n else\r\n begin\r\n if AOriginalWidth / AOriginalHeight < ANewWidth / ANewHeight then\r\n begin\r\n AHeight := ANewHeight;\r\n AWidth := ANewHeight * AOriginalWidth / AOriginalHeight;\r\n end\r\n else\r\n begin\r\n AWidth := ANewWidth;\r\n AHeight := ANewWidth * AOriginalHeight / AOriginalWidth;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n AWidth := 0;\r\n AHeight := 0;\r\n end;\r\n end\r\n else\r\n begin\r\n if AStretch then\r\n begin\r\n AWidth := ANewWidth;\r\n AHeight := ANewHeight;\r\n end\r\n else\r\n begin\r\n AWidth := AOriginalWidth;\r\n AHeight := AOriginalHeight;\r\n\r\n if ACropping then\r\n begin\r\n if (AWidth >= AHeight) and (AWidth > 0) then\r\n begin\r\n AHeight := AOriginalWidth / AWidth * AHeight;\r\n AWidth := AOriginalWidth;\r\n end\r\n else\r\n if (AHeight >= AWidth) and (AHeight > 0) then\r\n begin\r\n AWidth := AOriginalHeight / AHeight * AWidth;\r\n AHeight := AOriginalHeight;\r\n end;\r\n\r\n if AHeight = 0 then\r\n ar := 1\r\n else\r\n ar := AWidth / AHeight;\r\n\r\n if AOriginalHeight = 0 then\r\n arc := 1\r\n else\r\n arc := AOriginalWidth / AOriginalHeight;\r\n\r\n if (ar < 1) or (arc > ar) then\r\n begin\r\n AHeight := AOriginalWidth / ar;\r\n AWidth := AOriginalWidth;\r\n end\r\n else\r\n begin\r\n AWidth := ar * AOriginalHeight;\r\n AHeight := AOriginalHeight;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.GetBitmapDrawRectangle(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; ABitmap: TTMSFNCDrawBitmap;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRect;\r\nbegin\r\n Result := ConvertToRect(GetBitmapDrawRectangle(RectF(ALeft, ATop, ARight, ABottom), ABitmap, AAspectRatio, AStretch, ACenter, ACropping));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.GetBitmapDrawRectangle(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; ABitmap: TTMSFNCDrawBitmap;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRectF;\r\nvar\r\n bmp: TTMSFNCDrawBitmap;\r\n rdest: TRectF;\r\n w, h: Single;\r\n x, y: Single;\r\nbegin\r\n Result := RectF(0, 0, 0, 0);\r\n bmp := ABitmap;\r\n if Assigned(bmp) then\r\n begin\r\n x := 0;\r\n y := 0;\r\n w := 0;\r\n h := 0;\r\n GetAspectSize(w, h, bmp.Width, bmp.Height, ARight - ALeft, ABottom - ATop, AAspectRatio, AStretch, ACropping);\r\n if ACenter or ACropping then\r\n begin\r\n x := Round((ARight - ALeft - w) / 2);\r\n y := Round((ABottom - ATop - h) / 2);\r\n end;\r\n\r\n rdest := RectF(ALeft + x, ATop + y, ALeft + x + w, ATop + y + h);\r\n Result := rdest;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.GetBitmapDrawRectangle(ARect: TRect; ABitmap: TTMSFNCDrawBitmap;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRect;\r\nbegin\r\n Result := ConvertToRect(GetBitmapDrawRectangle(ConvertToRectF(ARect), ABitmap, AAspectRatio, AStretch, ACenter, ACropping));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.GetBitmapDrawRectangle(ARect: TRectF; ABitmap: TTMSFNCDrawBitmap;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False): TRectF;\r\nbegin\r\n Result := GetBitmapDrawRectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, ABitmap, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nfunction TTMSFNCGraphics.GetContext: TTMSFNCGraphicsContext;\r\nbegin\r\n if FNative then\r\n Result := FContextNative\r\n else\r\n Result := FContextGeneral;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.GetCanvas: TCanvas;\r\nbegin\r\n Result := FActiveCanvas;\r\nend;\r\n\r\n{$IFNDEF LIMITEDGRAPHICSMODE}\r\nclass function TTMSFNCGraphics.GetScaledBitmap(ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0; ABitmapContainer: TTMSFNCBitmapContainer = nil): TTMSFNCBitmap;\r\nvar\r\n b: TTMSFNCScaledBitmap;\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n Result := nil;\r\n if Assigned(ABitmaps) then\r\n begin\r\n if AScale > 0 then\r\n b := ABitmaps.GetItemByScale(AScale)\r\n else\r\n b := ABitmaps.GetItemByScale(TTMSFNCUtils.GetDPIScale);\r\n\r\n if Assigned(b) then\r\n begin\r\n if Assigned(b.Bitmap) and not IsBitmapEmpty(b.Bitmap) then\r\n Result := b.Bitmap\r\n else\r\n begin\r\n bmp := GetBitmapFromBitmapContainer(ABitmapContainer, b.BitmapName, True, AScale);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n Result := bmp\r\n else\r\n begin\r\n bmp := GetBitmapFromBitmapContainer(ABitmapContainer, b.BitmapName, False);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n Result := bmp\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCGraphics.ApplyHilight(AText: string; AHilight: string; ATag: string; ADoCase: Boolean): String;\r\nbegin\r\n Result := HiLight(AText, AHilight, ATag, ADoCase);\r\nend;\r\n\r\nclass function TTMSFNCGraphics.GetBitmapFromBitmapContainer(ABitmapContainer: TTMSFNCBitmapContainer; AName: string; AApplyScale: Boolean = False; AScale: Single = 0): TTMSFNCBitmap;\r\nbegin\r\n Result := nil;\r\n if Assigned(ABitmapContainer) and (AName <> '') then\r\n begin\r\n if AApplyScale then\r\n begin\r\n if AScale > 0 then\r\n Result := ABitmapContainer.FindBitmap(AName + '_' + FloatToStr(AScale))\r\n else\r\n Result := ABitmapContainer.FindBitmap(AName + '_' + FloatToStr(TTMSFNCUtils.GetDPIScale));\r\n end;\r\n\r\n if not Assigned(Result) then\r\n Result := ABitmapContainer.FindBitmap(AName);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapWithName(ARect: TRect; ABitmapName: string; AApplyScale: Boolean = False; AScale: Single = 0;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawBitmapWithName(ConvertToRectF(ARect), ABitmapName, AApplyScale, AScale, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapWithName(ARect: TRectF; ABitmapName: string; AApplyScale: Boolean = False; AScale: Single = 0;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nvar\r\n b: TTMSFNCBitmap;\r\nbegin\r\n b := GetBitmapFromBitmapContainer(FBitmapContainer, ABitmapName, AApplyScale, AScale);\r\n if Assigned(b) then\r\n DrawBitmap(ARect, BitmapToDrawBitmap(b), AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapWithName(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; ABitmapName: string;\r\n AApplyScale: Boolean = False; AScale: Single = 0; AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True;\r\n ACropping: Boolean = False);\r\nbegin\r\n DrawBitmapWithName(RectF(ALeft, ATop, ARight, ABottom), ABitmapName, AApplyScale, AScale, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawBitmapWithName(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; ABitmapName: string;\r\n AApplyScale: Boolean = False; AScale: Single = 0; AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True;\r\n ACropping: Boolean = False);\r\nvar\r\n b: TTMSFNCBitmap;\r\nbegin\r\n b := GetBitmapFromBitmapContainer(FBitmapContainer, ABitmapName, AApplyScale, AScale);\r\n if Assigned(b) then\r\n DrawBitmap(ALeft, ATop, ARight, ABottom, BitmapToDrawBitmap(b), AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawScaledBitmap(ARect: TRect; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawScaledBitmap(ConvertToRectF(ARect), ABitmaps, AScale, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawScaledBitmap(ARect: TRectF; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nvar\r\n b: TTMSFNCScaledBitmap;\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n if Assigned(ABitmaps) then\r\n begin\r\n if AScale > 0 then\r\n b := ABitmaps.GetItemByScale(AScale)\r\n else\r\n b := ABitmaps.GetItemByScale(TTMSFNCUtils.GetDPIScale);\r\n\r\n if Assigned(b) then\r\n begin\r\n if Assigned(b.Bitmap) and not IsBitmapEmpty(b.Bitmap) then\r\n DrawBitmap(ARect, BitmapToDrawBitmap(b.Bitmap), AAspectRatio, AStretch, ACenter, ACropping)\r\n else\r\n begin\r\n bmp := GetBitmapFromBitmapContainer(FBitmapContainer, b.BitmapName, True, AScale);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n DrawBitmap(ARect, BitmapToDrawBitmap(bmp), AAspectRatio, AStretch, ACenter, ACropping)\r\n else\r\n DrawBitmapWithName(ARect, b.BitmapName, False, b.Scale, AAspectRatio, AStretch, ACenter, ACropping);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawScaledBitmap(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nbegin\r\n DrawScaledBitmap(RectF(ALeft, ATop, ARight, ABottom), ABitmaps, AScale, AAspectRatio, AStretch, ACenter, ACropping);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawScaledBitmap(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; ABitmaps: TTMSFNCScaledBitmaps; AScale: Single = 0;\r\n AAspectRatio: Boolean = True; AStretch: Boolean = False; ACenter: Boolean = True; ACropping: Boolean = False);\r\nvar\r\n b: TTMSFNCScaledBitmap;\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n if Assigned(ABitmaps) then\r\n begin\r\n if AScale > 0 then\r\n b := ABitmaps.GetItemByScale(AScale)\r\n else\r\n b := ABitmaps.GetItemByScale(TTMSFNCUtils.GetDPIScale);\r\n\r\n if Assigned(b) then\r\n begin\r\n if Assigned(b.Bitmap) and not IsBitmapEmpty(b.Bitmap) then\r\n DrawBitmap(ALeft, ATop, ARight, ABottom, BitmapToDrawBitmap(b.Bitmap), AAspectRatio, AStretch, ACenter, ACropping)\r\n else\r\n begin\r\n bmp := GetBitmapFromBitmapContainer(FBitmapContainer, b.BitmapName, True, AScale);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n DrawBitmap(ALeft, ATop, ARight, ABottom, BitmapToDrawBitmap(bmp), AAspectRatio, AStretch, ACenter, ACropping)\r\n else\r\n DrawBitmapWithName(ALeft, ATop, ARight, ABottom, b.BitmapName, False, b.Scale, AAspectRatio, AStretch, ACenter, ACropping);\r\n end;\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCGraphics.ClipRect(ARect: TRect);\r\nbegin\r\n ClipRect(ConvertToRect(ARect));\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.ClipRect(ARect: TRectF);\r\nbegin\r\n Context.ClipRect(ARect);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawFocusPath(APath: TTMSFNCGraphicsPath; AColor: TTMSFNCGraphicsColor = gcBlack);\r\nbegin\r\n Context.DrawFocusPath(FStroke, APath, AColor);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawFocusRectangle(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; AColor: TTMSFNCGraphicsColor = gcBlack; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawFocusRectangle(Rect(ALeft, ATop, ARight, ABottom), AColor, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawFocusRectangle(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; AColor: TTMSFNCGraphicsColor = gcBlack; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := RectF(ALeft, ATop, ARight, ABottom);\r\n Context.DrawFocusRectangle(FStroke, r, AColor, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawFocusRectangle(ARect: TRect; AColor: TTMSFNCGraphicsColor = gcBlack; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawFocusRectangle(ConvertToRectF(ARect), AColor, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawFocusRectangle(ARect: TRectF; AColor: TTMSFNCGraphicsColor = gcBlack; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawFocusRectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, AColor, AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.FontChanged(Sender: TObject);\r\nbegin\r\n SetFont(Sender as TTMSFNCGraphicsFont);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.StrokeChanged(Sender: TObject);\r\nbegin\r\n SetStroke(Sender as TTMSFNCGraphicsStroke);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.FillChanged(Sender: TObject);\r\nbegin\r\n SetFill(Sender as TTMSFNCGraphicsFill);\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ALeft, ATop, ARight, ABottom: Integer; AText: String; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nvar\r\n AControlID, AControlValue, AControlType: string;\r\nbegin\r\n AControlID := '';\r\n AControlValue := '';\r\n AControlType := '';\r\n Result := DrawText(RectF(ALeft, ATop, ARight, ABottom), AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming,\r\n AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ALeft, ATop, ARight, ABottom: Double; AText: String; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nvar\r\n AControlID, AControlValue, AControlType: string;\r\nbegin\r\n AControlID := '';\r\n AControlValue := '';\r\n AControlType := '';\r\n Result := DrawText(RectF(ALeft, ATop, ARight, ABottom), AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming,\r\n AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ALeft, ATop, ARight, ABottom: Integer; AText: String; var AControlID: string; var AControlValue: string; var AControlType: string; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nbegin\r\n Result := DrawText(RectF(ALeft, ATop, ARight, ABottom), AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming,\r\n AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ALeft, ATop, ARight, ABottom: Double; AText: String; var AControlID: string; var AControlValue: string; var AControlType: string; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nbegin\r\n Result := DrawText(RectF(ALeft, ATop, ARight, ABottom), AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming,\r\n AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.InitializeDefaultAppearance;\r\nbegin\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n FURLColor := gcBlue;\r\n FURLUnderline := True;\r\n {$ENDIF}\r\n SetFill(Fill);\r\n SetStroke(Stroke);\r\n SetFont(Font);\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nclass function TTMSFNCGraphics.GetColorAlpha(AColor: TTMSFNCGraphicsColor): Byte;\r\nbegin\r\n Result := TAlphaColorRec(AColor).A;\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TTMSFNCGraphics.GetColorRed(AColor: TTMSFNCGraphicsColor): Byte;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := TAlphaColorRec(AColor).R;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n AColor := ColorToRGB(AColor);\r\n Result := GetRValue(AColor);\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCGraphics.GetColorGreen(AColor: TTMSFNCGraphicsColor): Byte;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := TAlphaColorRec(AColor).G;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n AColor := ColorToRGB(AColor);\r\n Result := GetGValue(AColor);\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCGraphics.GetColorBlue(AColor: TTMSFNCGraphicsColor): Byte;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := TAlphaColorRec(AColor).B;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n AColor := ColorToRGB(AColor);\r\n Result := GetBValue(AColor);\r\n {$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCGraphics.TextToColor(AText: string): TTMSFNCGraphicsColor;\r\nvar\r\n i: integer;\r\n s: string;\r\n c: TStringList;\r\nbegin\r\n s := AText;\r\n\r\n s := LowerCase(s);\r\n if pos('cl',s) = 1 then\r\n Delete(s,1,2);\r\n\r\n if pos('cla',s) = 1 then\r\n Delete(s,1,3);\r\n\r\n if pos('gc',s) = 1 then\r\n Delete(s,1,2);\r\n\r\n Result := gcBlack;\r\n c := ColorLookup;\r\n if Assigned(c) then\r\n begin\r\n i := c.IndexOf(LowerCase(s));\r\n if (i >= 0) and (i <= c.Count - 1) then\r\n Result := TTMSFNCGraphicsColorObject(c.Objects[i]).Color;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCGraphics.HTMLToColor(AHTML: string): TTMSFNCGraphicsColor;\r\n\r\nfunction HexVal(s:string): Integer;\r\nvar\r\n i,j: Integer;\r\n i1, i2: Integer;\r\nbegin\r\n if Length(s) < 2 then\r\n begin\r\n Result := 0;\r\n Exit;\r\n end;\r\n\r\n {$IFDEF FMXMOBILE}\r\n i1 := 0;\r\n i2 := 1;\r\n {$ELSE}\r\n i1 := 1;\r\n i2 := 2;\r\n {$ENDIF}\r\n\r\n if s[i1] >= 'A' then\r\n i := ord(s[i1]) - ord('A') + 10\r\n else\r\n i := ord(s[i1]) - ord('0');\r\n\r\n if s[i2] >= 'A' then\r\n j := ord(s[i2]) - ord('A') + 10\r\n else\r\n j := ord(s[i2]) - ord('0');\r\n\r\n Result := i shl 4 + j;\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n r,g,b: Integer;\r\nbegin\r\n r := Hexval(Copy(AHTML,2,2));\r\n g := Hexval(Copy(AHTML,4,2)) shl 8;\r\n b := Hexval(Copy(AHTML,6,2)) shl 16;\r\n Result := TColor(b + g + r);\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nconst\r\n Alpha = TTMSFNCGraphicsColor($FF000000);\r\nvar\r\n r,g,b: Integer;\r\nbegin\r\n r := Hexval(Copy(AHTML,2,2)) shl 16;\r\n g := Hexval(Copy(AHTML,4,2)) shl 8;\r\n b := Hexval(Copy(AHTML,6,2));\r\n Result := Alpha or TTMSFNCGraphicsColor(b + g + r);\r\n{$ENDIF}\r\nend;\r\n\r\nclass function TTMSFNCGraphics.ColorToHTML(AColor: TTMSFNCGraphicsColor): string;\r\nconst\r\n HTMLHexColor = '#RRGGBB';\r\n HexDigit: array[0..$F] of Char = '0123456789ABCDEF';\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\n i: Integer;\r\nbegin\r\n {$IFDEF FMXMOBILE}\r\n i := 0;\r\n {$ELSE}\r\n i := 1;\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n c := AColor;\r\n {$ENDIF}\r\n {$IFNDEF FMXLIB}\r\n c := ColorToRGB(AColor);\r\n {$ENDIF}\r\n Result := HtmlHexColor;\r\n Result[1 + i] := HexDigit[GetColorRed(c) shr 4];\r\n Result[2 + i] := HexDigit[GetColorRed(c) and $F];\r\n Result[3 + i] := HexDigit[GetColorGreen(c) shr 4];\r\n Result[4 + i] := HexDigit[GetColorGreen(c) and $F];\r\n Result[5 + i] := HexDigit[GetColorBlue(c) shr 4];\r\n Result[6 + i] := HexDigit[GetColorBlue(c) and $F];\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawTexture(ARect: TRectF; ATexture: TTMSFNCBitmap; ATextureMode: TTMSFNCGraphicsTextureMode);\r\nvar\r\n LR, R, IR: TRectF;\r\n I, J: Integer;\r\nbegin\r\n if IsBitmapEmpty(ATexture) then\r\n Exit;\r\n\r\n LR := ARect;\r\n case ATextureMode of\r\n gtmOriginal:\r\n begin\r\n R := RectF(ARect.Left, ARect.Top, ARect.Left + ATexture.Width, ARect.Top + ATexture.Height);\r\n IntersectRectEx(IR, LR, R);\r\n DrawBitmapPart(RectF(0, 0, (IR.Right - IR.Left), (IR.Bottom - IR.Top)), RectF(R.Left, R.Top, R.Left + (IR.Right - IR.Left), R.Top + (IR.Bottom - IR.Top)), BitmapToDrawBitmap(ATexture), False, False, False, False);\r\n end;\r\n gtmFit:\r\n begin\r\n R := RectF(0, 0, ATexture.Width, ATexture.Height);\r\n R := RectSnapToPixelEx(RectFitIntoEx(R, ARect), 1, False);\r\n DrawBitmapPart(RectF(0, 0, ATexture.Width, ATexture.Height), R, BitmapToDrawBitmap(ATexture), False, True, False, False);\r\n end;\r\n gtmStretch: DrawBitmapPart(RectF(0, 0, ATexture.Width, ATexture.Height), ARect, BitmapToDrawBitmap(ATexture), False, True, False, False);\r\n gtmTile:\r\n begin\r\n for I := 0 to Trunc((LR.Right - LR.Left) / ATexture.Width) + 1 do\r\n begin\r\n for J := 0 to Trunc((LR.Bottom - LR.Top) / ATexture.Height) + 1 do\r\n begin\r\n R := RectF(LR.Left, LR.Top, LR.Left + ATexture.Width, LR.Top + ATexture.Height);\r\n OffsetRectEx(R, I * ATexture.Width, J * ATexture.Height);\r\n IntersectRectEx(IR, LR, R);\r\n if IntersectRectEx(IR, R) then\r\n DrawBitmap(RectF(R.Left, R.Top, (R.Left + (IR.Right - IR.Left)), (R.Top + (IR.Bottom - IR.Top))), BitmapToDrawBitmap(ATexture), False, False, False, False);\r\n end;\r\n end;\r\n end;\r\n gtmCenter:\r\n begin\r\n R := RectF(0, 0, ATexture.Width, ATexture.Height);\r\n R := RectSnapToPixelEx(RectCenterAtEx(R, ARect), 1, False);\r\n DrawBitmapPart(RectF(0, 0, ATexture.Width, ATexture.Height), R, BitmapToDrawBitmap(ATexture), True, False, True, False);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ARect: TRect; AText: String; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nvar\r\n AControlID, AControlValue, AControlType: string;\r\nbegin\r\n AControlID := '';\r\n AControlValue := '';\r\n AControlType := '';\r\n Result := DrawText(ConvertToRectF(ARect), AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming, AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ARect: TRect; AText: String; var AControlID: string; var AControlValue: string; var AControlType: string; AWordWrapping: Boolean = False; AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nbegin\r\n Result := DrawText(ConvertToRectF(ARect), AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming, AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(APoint: TPointF; AText: String; AAngle: Single = 0{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nvar\r\n AControlID, AControlValue, AControlType: string;\r\nbegin\r\n AControlID := '';\r\n AControlValue := '';\r\n AControlType := '';\r\n Result := DrawText(RectF(APoint.X, APoint.Y, APoint.X + 10000, APoint.Y + 10000), AText, AControlID, AControlValue, AControlType, False, gtaLeading, gtaLeading, gttNone, AAngle, -1, -1{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ARect: TRectF; AText: String; AWordWrapping: Boolean = False;AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nvar\r\n AControlID, AControlValue, AControlType: string;\r\nbegin\r\n AControlID := '';\r\n AControlValue := '';\r\n AControlType := '';\r\n Result := DrawText(ARect, AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming, AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.DrawText(ARect: TRectF; AText: String; var AControlID: string; var AControlValue: string; var AControlType: string; AWordWrapping: Boolean = False;AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nvar\r\n lst: TStringList;\r\n i, l, p: Integer;\r\n b: Boolean;\r\n r, rd: TRectF;\r\nconst\r\n arr: array[0..1] of string = ('
', '
');\r\nbegin\r\n rd := ARect;\r\n\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n b := (not ATestAnchor) and OptimizedHTMLDrawing;\r\n {$ELSE}\r\n b := OptimizedHTMLDrawing;\r\n {$ENDIF}\r\n\r\n b := b and TTMSFNCUtils.IsHTML(AText);\r\n\r\n if b then\r\n begin\r\n for I := 0 to Length(arr) - 1 do\r\n begin\r\n p := Pos(arr[I], UpperCase(AText));\r\n l := Length(arr[I]);\r\n end;\r\n\r\n if (p > 0) and (l > 0) then\r\n begin\r\n lst := TStringList.Create;\r\n try\r\n lst.LineBreak := Copy(AText, p, l);\r\n lst.Text := AText;\r\n\r\n for I := 0 to lst.Count - 1 do\r\n begin\r\n r := CalculateText(lst[I], rd, AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF});\r\n InternalDrawText(RectF(r.Left, r.Top, r.Right + 1, r.Bottom), lst[I], AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign,\r\n ATrimming, AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\n\r\n rd.Top := rd.Top + (r.Bottom - r.Top);\r\n end;\r\n\r\n finally\r\n lst.Free;\r\n end;\r\n end\r\n else\r\n b := False;\r\n end;\r\n\r\n if not b then\r\n begin\r\n Result := InternalDrawText(ARect, AText, AControlID, AControlValue, AControlType, AWordWrapping, AHorizontalAlign, AVerticalAlign,\r\n ATrimming, AAngle, AMinWidth, AMinHeight{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML, ATestAnchor, AX, AY{$ENDIF});\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.InternalDrawText(ARect: TRectF; AText: String; var AControlID: string; var AControlValue: string; var AControlType: string; AWordWrapping: Boolean = False;AHorizontalAlign: TTMSFNCGraphicsTextAlign = gtaLeading;\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign = gtaCenter; ATrimming: TTMSFNCGraphicsTextTrimming = gttNone; AAngle: Single = 0;\r\n AMinWidth: Single = -1; AMinHeight: Single = -1{$IFNDEF LIMITEDGRAPHICSMODE};ASupportHTML: Boolean = True; ATestAnchor: Boolean = False; AX: Single = -1; AY: Single = - 1{$ENDIF}): String;\r\nvar\r\n{$IFNDEF LIMITEDGRAPHICSMODE}\r\n a, s: String;\r\n fa: String;\r\n XSize, YSize: Single;\r\n hl, ml: Integer;\r\n hr, cr: TRectF;\r\n xs, ys: Single;\r\n lc: Integer;\r\n htmlr: TRectF;\r\n isanchor: boolean;\r\n st: TTMSFNCGraphicsSaveState;\r\n{$ENDIF}\r\n oldc: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n\r\n oldc := Context.GetFillColor;\r\n Context.SetFillColor(FFont.Color);\r\n\r\n {$IFDEF WEBLIB}\r\n if (AMinHeight > -1) and (ARect.Bottom - ARect.Top < AMinHeight) then\r\n ARect.Bottom := ARect.Top + AMinHeight;\r\n\r\n if (AMinWidth > -1) and (ARect.Right - ARect.Left < AMinWidth) then\r\n ARect.Right := ARect.Left + AMinWidth;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if (AMinHeight > -1) and (ARect.Height < AMinHeight) then\r\n ARect.Height := AMinHeight;\r\n\r\n if (AMinWidth > -1) and (ARect.Width < AMinWidth) then\r\n ARect.Width := AMinWidth;\r\n {$ENDIF}\r\n\r\n ARect := Context.SetTextAngle(ARect, AAngle);\r\n\r\n Result := '';\r\n\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n if ((AnsiPos(' 0) or (AnsiPos('/>', AText) > 0) or (AnsiPos('
', UpperCase(AText)) > 0)) and ASupportHTML then\r\n begin\r\n hr := RectF(0, 0, 0, 0);\r\n XSize := 0;\r\n YSize := 0;\r\n hl := -1;\r\n ml := -1;\r\n fa := '';\r\n s := '';\r\n a := '';\r\n lc := 0;\r\n cr := RectF(0, 0, 0, 0);\r\n AControlID := '';\r\n AControlValue := '';\r\n AControlType := '';\r\n HTMLDrawEx(Self, AText, ARect,0, 0,-1,-1,0,False,True,False,False,False,False,AWordWrapping,False, '', 1.0,URLColor,\r\n gcNull,gcNull,gcNull,a,s,fa,XSize,YSize,hl,ml,hr, cr, AControlID, AControlValue, AControlType, lc, 0, FBitmapContainer, 1, URLUnderline{$IFDEF CMNLIB}, FImageList{$ENDIF},\r\n HighlightColor, HighlightTextColor, HighlightFontStyle);\r\n\r\n YSize := YSize + 1;\r\n\r\n if (AWordWrapping and (lc <= 1)) or (not AWordWrapping) then\r\n begin\r\n xs := ARect.Left;\r\n ys := ARect.Top;\r\n\r\n case AHorizontalAlign of\r\n gtaCenter: xs := xs + ((ARect.Right - ARect.Left) - XSize) / 2;\r\n gtaTrailing: xs := ARect.Left + (ARect.Right - ARect.Left) - XSize;\r\n end;\r\n\r\n case AVerticalAlign of\r\n gtaCenter: ys := ys + ((ARect.Bottom - ARect.Top) - YSize) / 2;\r\n gtaTrailing: ys := ys + (ARect.Bottom - ARect.Top) - YSize;\r\n end;\r\n\r\n htmlr := RectF(xs, ys, xs + XSize, ys + YSize);\r\n end\r\n else\r\n htmlr := ARect;\r\n\r\n st := SaveState(True);\r\n ClipRect(ARect);\r\n isanchor := HTMLDrawEx(Self, AText, htmlr,Round(AX), Round(AY),-1,-1,0,ATestAnchor,False,False,False,False,False,AWordWrapping,False, '', 1.0,URLColor,\r\n gcNull,gcNull,gcNull,a,s,fa,XSize,YSize,hl,ml,hr,cr, AControlID, AControlValue, AControlType, lc, 0, FBitmapContainer, 1, URLUnderline{$IFDEF CMNLIB}, FImageList{$ENDIF},\r\n HighlightColor, HighlightTextColor, HighlightFontStyle);\r\n RestoreState(st, True);\r\n\r\n if isanchor then\r\n Result := a;\r\n end\r\n else if not ATestAnchor then\r\n {$ENDIF}\r\n Context.DrawText(AText, ARect, AWordWrapping, AHorizontalAlign, AVerticalAlign, ATrimming, AAngle);\r\n\r\n Context.ResetTextAngle(AAngle);\r\n Context.SetFillColor(oldc);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawEllipse(ALeft: Integer; ATop: Integer; ARight: Integer; ABottom: Integer; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawEllipse(RectF(ALeft, ATop, ARight, ABottom), AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawEllipse(ALeft: Double; ATop: Double; ARight: Double; ABottom: Double; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nvar\r\n r: TRectF;\r\n pth: TTMSFNCGraphicsPath;\r\nbegin\r\n r := RectF(ALeft, ATop, ARight, ABottom);\r\n if ((FFill.Color <> gcNull) and (FFill.Kind <> gfkNone)) or (FFill.Kind = gfkTexture) then\r\n begin\r\n case FFill.Kind of\r\n gfkTexture:\r\n begin\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n pth.AddEllipse(r);\r\n DrawTexture(r, FFill.Texture, FFill.TextureMode);\r\n finally\r\n pth.Free;\r\n end;\r\n end;\r\n else\r\n Context.FillEllipse(FFill, r, AModifyRectMode);\r\n end;\r\n end;\r\n\r\n if (FStroke.Color <> gcNull) and (FStroke.Kind <> gskNone) then\r\n Context.DrawEllipse(FStroke, r, AModifyRectMode);\r\nend;\r\n\r\nclass procedure TTMSFNCGraphics.SetDefaultGraphicColors;\r\nbegin\r\n TTMSFNCGraphics.DefaultPopupFillColor := gcWhite;\r\n TTMSFNCGraphics.DefaultPopupStrokeColor := gcSilver;\r\n TTMSFNCGraphics.DefaultButtonFillColor := MakeGraphicsColor(225, 225, 225);\r\n TTMSFNCGraphics.DefaultButtonStrokeColor := gcDarkgray;\r\n TTMSFNCGraphics.DefaultTextFontColor := gcBlack;\r\n TTMSFNCGraphics.DefaultSelectionFillColor := gcBlack;\r\n TTMSFNCGraphics.DefaultButtonFillColorFocused := MakeGraphicsColor(229, 241, 251);\r\n TTMSFNCGraphics.DefaultButtonStrokeColorFocused := MakeGraphicsColor(60, 127, 177);\r\n TTMSFNCGraphics.DefaultButtonStrokeColorDisabled := gcDarkGray;\r\n TTMSFNCGraphics.DefaultButtonFillColorDisabled := gcLightgray;\r\nend;\r\n\r\nclass procedure TTMSFNCGraphics.ConvertBitmapToGrayScale(ABitmap: TTMSFNCBitmap);\r\ntype\r\n TTMSFNCGraphicsColorToGrayscale = (ctgLightness, ctgAverage, ctgLuminosity);\r\n\r\n function MinColor(const A, B, C: Integer): Integer;\r\n begin\r\n Result := Min(A, Min(B, C));\r\n end;\r\n\r\n function MaxColor(const A, B, C: Integer): Integer;\r\n begin\r\n Result := Max(A, Max(B, C));\r\n end;\r\n\r\n function ColorToGray(AColor: TTMSFNCGraphicsColor; AMode: TTMSFNCGraphicsColorToGrayscale = ctgLuminosity): TTMSFNCGraphicsColor;\r\n var\r\n R, G, B, X: Byte;\r\n {$IFNDEF CMNLIB}\r\n A: Byte;\r\n {$ENDIF}\r\n begin\r\n {$IFDEF FMXLIB}\r\n R := TAlphaColorRec(AColor).R;\r\n G := TAlphaColorRec(AColor).G;\r\n B := TAlphaColorRec(AColor).B;\r\n A := TAlphaColorRec(AColor).A;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n R := AColor and $FF;\r\n G := (AColor and $FF00) shr 8;\r\n B := (AColor and $FF0000) shr 16;\r\n {$ENDIF}\r\n case AMode of\r\n ctgLightness: X := (MaxColor(R, G, B) + MinColor(R, G, B)) div 2;\r\n ctgAverage: X := (R + G + B) div 3;\r\n ctgLuminosity: X := Round(0.21 *R + 0.71*G + 0.07*B);\r\n else\r\n X := 0;\r\n end;\r\n {$IFDEF FMXLIB}\r\n Result := MakeGraphicsColor(X, X, X, A);\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n Result := TTMSFNCGraphicsColor(RGB(X, X, X));\r\n {$ENDIF}\r\n end;\r\n\r\nvar\r\n I, J: Integer;\r\n {$IFDEF FMXLIB}\r\n m: TBitmapData;\r\n {$ENDIF}\r\nbegin\r\n if Assigned(ABitmap) and not IsBitmapEmpty(ABitmap) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n if ABitmap.Map(TMapAccess.ReadWrite, m) then\r\n begin\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n begin\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n begin\r\n {$ENDIF}\r\n for I := 0 to ABitmap.Width - 1 do\r\n begin\r\n for J := 0 to ABitmap.Height - 1 do\r\n begin\r\n {$IFDEF CMNLIB}\r\n ABitmap.Bitmap.Canvas.Pixels[I, J] := ColorToGray(ABitmap.Bitmap.Canvas.Pixels[I, J]);\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n m.SetPixel(I, J, ColorToGray(m.GetPixel(I, J)));\r\n {$ENDIF}\r\n end;\r\n end;\r\n {$IFDEF FMXLIB}\r\n ABitmap.Unmap(m);\r\n {$ENDIF}\r\n end;\r\n end;\r\nend;\r\n\r\nclass procedure TTMSFNCGraphics.DrawSample(ACanvas: TCanvas; ARect: TRectF);\r\nvar\r\n g: TTMSFNCGraphics;\r\nbegin\r\n g := TTMSFNCGraphics.Create(ACanvas);\r\n try\r\n g.Font.Name := 'Courier New';\r\n g.Font.Size := 20;\r\n g.Font.Color := gcWhite;\r\n g.Fill.Kind := gfkGradient;\r\n g.Fill.Color := gcDarkorange;\r\n g.Fill.ColorTo := gcSteelblue;\r\n g.Stroke.Color := gcDarkblue;\r\n g.DrawRectangle(ARect);\r\n g.DrawText(ARect, 'Sample', False, gtaCenter);\r\n finally\r\n g.Free;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCGraphics.PointInPolygon(APoint: TPoint; APolygon: TTMSFNCGraphicsPathPolygon): Boolean;\r\nbegin\r\n Result := PointInPolygon(ConvertToPointF(APoint), APolygon);\r\nend;\r\n\r\nclass function TTMSFNCGraphics.PointInPolygon(APoint: TPointF; APolygon: TTMSFNCGraphicsPathPolygon): Boolean;\r\nbegin\r\n Result := PointInPolygon(APoint, APolygon);\r\nend;\r\n\r\nclass function TTMSFNCGraphics.PointInRect(APoint: TPoint; ARect: TRect): Boolean;\r\nbegin\r\n Result := PointInRect(ConvertToPointF(APoint), ConvertToRectF(ARect));\r\nend;\r\n\r\nclass function TTMSFNCGraphics.PointInRect(APoint: TPointF; ARect: TRectF): Boolean;\r\nbegin\r\n Result := PtInRectEx(ARect, APoint);\r\nend;\r\n\r\nclass function TTMSFNCGraphics.PointInPath(APoint: TPoint; APath: TTMSFNCGraphicsPath): Boolean;\r\nbegin\r\n Result := PointInPath(ConvertToPointF(APoint), APath);\r\nend;\r\n\r\nclass function TTMSFNCGraphics.PointInPath(APoint: TPointF; APath: TTMSFNCGraphicsPath): Boolean;\r\nbegin\r\n Result := APath.IsPointVisible(APoint);\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextSizeInt(AText: String): TSize;\r\nbegin\r\n Result := ConvertToSize(CalculateTextSize(AText));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextSize(AText: String): TSizeF;\r\nbegin\r\n Result := CalculateTextSize(AText, RectF(0, 0, 10000, 10000));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextHeightInt(AText: String): Integer;\r\nbegin\r\n Result := Round(CalculateTextHeight(AText));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextHeight(AText: String): Single;\r\nbegin\r\n Result := CalculateTextHeight(AText, RectF(0, 0, 10000, 10000));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextWidthInt(AText: String): Integer;\r\nbegin\r\n Result := Round(CalculateTextWidth(AText));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextWidth(AText: String): Single;\r\nbegin\r\n Result := CalculateTextWidth(AText, RectF(0, 0, 10000, 10000));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextSize(AText: String; ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TSize;\r\nbegin\r\n Result := ConvertToSize(CalculateTextSize(AText, ConvertToRectF(ARect), AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF}));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextSize(AText: String; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TSizeF;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := CalculateText(AText, ARect, AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF});\r\n Result.cx := r.Right - r.Left;\r\n Result.cy := r.Bottom - r.Top;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextHeight(AText: String; ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Integer;\r\nbegin\r\n Result := Round(CalculateTextHeight(AText, ConvertToRectF(ARect), AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF}));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextHeight(AText: String; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Single;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := CalculateText(AText, ARect, AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF});\r\n Result := r.Bottom - r.Top;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextWidth(AText: String; ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Integer;\r\nbegin\r\n Result := Round(CalculateTextWidth(AText, ConvertToRectF(ARect), AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF}));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextWidth(AText: String; ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): Single;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := CalculateText(AText, ARect, AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF});\r\n Result := r.Right - r.Left;\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateTextInt(AText: String): TRect;\r\nbegin\r\n Result := ConvertToRect(CalculateText(AText));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateText(AText: String): TRectF;\r\nbegin\r\n Result := CalculateText(AText, RectF(0, 0, 10000, 10000));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateText(AText: String;\r\n ARect: TRect; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TRect;\r\nbegin\r\n Result := ConvertToRect(CalculateText(AText, ConvertToRectF(ARect), AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF}));\r\nend;\r\n\r\nfunction TTMSFNCGraphics.CalculateText(AText: String;\r\n ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TRectF;\r\nvar\r\n lst: TStringList;\r\n i, l, p: Integer;\r\n b: Boolean;\r\n r: TRectF;\r\nconst\r\n arr: array[0..1] of string = ('
', '
');\r\nbegin\r\n Result := ARect;\r\n\r\n b := OptimizedHTMLDrawing and TTMSFNCUtils.IsHTML(AText);\r\n if b then\r\n begin\r\n for I := 0 to Length(arr) - 1 do\r\n begin\r\n p := Pos(arr[I], UpperCase(AText));\r\n l := Length(arr[I]);\r\n end;\r\n\r\n if (p > 0) and (l > 0) then\r\n begin\r\n lst := TStringList.Create;\r\n try\r\n lst.LineBreak := Copy(AText, p, l);\r\n lst.Text := AText;\r\n\r\n Result.Bottom := 0;\r\n for I := 0 to lst.Count - 1 do\r\n begin\r\n r := InternalCalculateText(lst[I], ARect, AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF});\r\n Result.Bottom := Result.Bottom + (r.Bottom - r.Top);\r\n end;\r\n\r\n finally\r\n lst.Free;\r\n end;\r\n end\r\n else\r\n b := False;\r\n end;\r\n\r\n if not b then\r\n Result := InternalCalculateText(AText, ARect, AWordWrapping{$IFNDEF LIMITEDGRAPHICSMODE}, ASupportHTML{$ENDIF});\r\nend;\r\n\r\nfunction TTMSFNCGraphics.InternalCalculateText(AText: String;\r\n ARect: TRectF; AWordWrapping: Boolean = False{$IFNDEF LIMITEDGRAPHICSMODE}; ASupportHTML: Boolean = True{$ENDIF}): TRectF;\r\n{$IFNDEF LIMITEDGRAPHICSMODE}\r\nvar\r\n a, s: String;\r\n fa: String;\r\n XSize, YSize: Single;\r\n hl, ml: Integer;\r\n hr, cr: TRectF;\r\n lc: Integer;\r\n AControlID, AControlType, AControlValue: string;\r\n{$ENDIF}\r\nbegin\r\n Result := ARect;\r\n\r\n if Round(Result.Right - Result.Left) <= 0 then\r\n begin\r\n Result.Bottom := Result.Top;\r\n Exit;\r\n end;\r\n\r\n if AText <> '' then\r\n begin\r\n {$IFNDEF LIMITEDGRAPHICSMODE}\r\n if ASupportHTML and ((AnsiPos(' 0) or (AnsiPos('/>', AText) > 0) or (AnsiPos('
', UpperCase(AText)) > 0)) then\r\n begin\r\n hr := RectF(0, 0, 0, 0);\r\n XSize := 0;\r\n YSize := 0;\r\n hl := -1;\r\n ml := -1;\r\n fa := '';\r\n s := '';\r\n a := '';\r\n lc := 0;\r\n cr := RectF(0, 0, 0, 0);\r\n AControlID := '';\r\n AControlValue := '';\r\n AControlType := '';\r\n HTMLDrawEx(Self, AText, ARect, 0, 0,-1,-1,0,False,True,False,False,False,False,AWordWrapping,False, '', 1.0,URLColor,\r\n gcNull,gcNull,gcNull,a,s,fa,XSize,YSize,hl,ml,hr,cr, AControlID, AControlValue, AControlType, lc, 0, FBitmapContainer, 1, URLUnderline{$IFDEF CMNLIB}, FImageList{$ENDIF},\r\n HighlightColor, HighlightTextColor, HighlightFontStyle);\r\n\r\n YSize := YSize + 1;\r\n\r\n Result.Right := Result.Left + XSize;\r\n Result.Bottom := Result.Top + YSize;\r\n end\r\n else\r\n {$ENDIF}\r\n begin\r\n Result := Context.CalculateText(AText, ARect, AWordWrapping);\r\n Result.Bottom := Result.Bottom + 1;\r\n end;\r\n end\r\n else\r\n begin\r\n Result.Right := Result.Left;\r\n Result.Bottom := Result.Top;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawEllipse(ARect: TRect; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawEllipse(ConvertToRectF(ARect), AModifyRectMode);\r\nend;\r\n\r\nprocedure TTMSFNCGraphics.DrawEllipse(ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll);\r\nbegin\r\n DrawEllipse(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, AModifyRectMode);\r\nend;\r\n\r\n{ TTMSFNCGraphicsContext }\r\n\r\nfunction TTMSFNCGraphicsContext.ConvertToPath(APath: TTMSFNCGraphicsPath; const Flatness: Single = 0.25): Pointer;\r\nvar\r\n J, I: Integer;\r\n BPts: TTMSFNCGraphicsPathPolygon;\r\n B: TTMSFNCGraphicsPathCubicBezier;\r\n F, Len: Single;\r\n SegCount: Integer;\r\n CurPoint: TPointF;\r\n x: TPointF;\r\nbegin\r\n Result := CreatePath;\r\n PathOpen(Result);\r\n if APath.Count > 0 then\r\n begin\r\n F := Max(Flatness, 0.05);\r\n J := 0;\r\n while J < APath.Count do\r\n begin\r\n case APath[J].Kind of\r\n gppMoveTo:\r\n begin\r\n PathMoveTo(Result, APath[J].Point);\r\n CurPoint := APath[J].Point;\r\n end;\r\n gppLineTo:\r\n begin\r\n PathLineTo(Result, APath[J].Point);\r\n CurPoint := APath[J].Point;\r\n end;\r\n gppCurveTo:\r\n begin\r\n B[0] := CurPoint;\r\n B[1] := APath[J].Point;\r\n Inc(J);\r\n B[2] := APath[J].Point;\r\n Inc(J);\r\n B[3] := APath[J].Point;\r\n BPts := APath.CreateBezier(B, 6);\r\n Len := 0;\r\n for I := 0 to High(BPts) - 1 do\r\n begin\r\n x.X := BPts[I].X - BPts[I + 1].X;\r\n x.Y := BPts[I].Y - BPts[I + 1].Y;\r\n Len := Len + GetPointLength(x);\r\n end;\r\n SegCount := Round(Len / F);\r\n if SegCount < 2 then\r\n PathLineTo(Result, B[3])\r\n else\r\n begin\r\n BPts := APath.CreateBezier(B, SegCount);\r\n for I := 0 to High(BPts) do\r\n PathLineTo(Result, BPts[I]);\r\n CurPoint := APath[J].Point;\r\n end;\r\n end;\r\n gppClose: PathClose(Result);\r\n end;\r\n Inc(J);\r\n end;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCGraphicsContext.Create(const AGraphics: TTMSFNCGraphics);\r\nbegin\r\n FGraphics := AGraphics;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContext.GetGraphics: TTMSFNCGraphics;\r\nbegin\r\n Result := FGraphics;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContext.GetCanvas: TCanvas;\r\nbegin\r\n Result := Graphics.Canvas;\r\nend;\r\n\r\n{$IFDEF WEBLIB}\r\ninitialization\r\nbegin\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSCLOSE);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSDOWN);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSUP);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSRIGHT);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSLEFT);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSEXPAND);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSPIN);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSPIN2);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSDOWN);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSDOWN2);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSUP);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCGRAPHICSUP2);\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2017 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCGraphics.General;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF FMXLIB}\r\n{$IFDEF MSWINDOWS}\r\n{$DEFINE FMXWINDOWS}\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCGraphicsTypes,\r\n Types, WEBLib.Graphics, WEBLib.TMSFNCGraphics,\r\n WEBLib.TMSFNCTypes\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types, FMX.TextLayout, System.Math.Vectors\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n ,UITypes\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n ;\r\n\r\ntype\r\n TTMSFNCGraphicsContextGeneral = class(TTMSFNCGraphicsContext)\r\n private\r\n {%H-}FShowAcceleratorChar: Boolean;\r\n {$IFDEF CMNLIB}\r\n FOldPenHandle: THandle;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n FOldPenStyle: TPenStyle;\r\n FOldPenWidth: Integer;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n FMatrix: TMatrix;\r\n FMatrixSaved: Boolean;\r\n FTextMatrix: TMatrix;\r\n FTextLayout: TTextLayout;\r\n {$ENDIF}\r\n protected\r\n function GetNativeCanvas: Pointer; override;\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n procedure DrawRotatedText(ACanvas: TCanvas; ARect: TRectF; AText: String; AAngle: Single; AHorizontalAlign, AVerticalAlign: TTMSFNCGraphicsTextAlign);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n procedure DrawRotatedText(ACanvas: TCanvas; ARect: TRect; AText: String; AAngle: Single; AHorizontalAlign, AVerticalAlign: TTMSFNCGraphicsTextAlign);\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXWINDOWS}\r\n function CalculateTextWin(AText: string; ARect: TRectF; AWordWrapping: Boolean): TRectF; virtual;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n procedure SaveMatrix;\r\n procedure RestoreMatrix;\r\n {$ENDIF}\r\n public\r\n destructor Destroy; override;\r\n function GetFillColor: TTMSFNCGraphicsColor; override;\r\n function CalculateText(AText: string; ARect: TRectF; AWordWrapping: Boolean): TRectF; override;\r\n function SetTextAngle(ARect: TRectF; {%H-}AAngle: Single): TRectF; override;\r\n function CreatePath: Pointer; override;\r\n procedure Render; override;\r\n procedure PathOpen({%H-}APath: Pointer); override;\r\n procedure PathMoveTo(APath: Pointer; APoint: TPointF); override;\r\n procedure PathLineTo(APath: Pointer; APoint: TPointF); override;\r\n procedure PathClose(APath: Pointer); override;\r\n procedure ResetTransform; override;\r\n procedure ResetClip; override;\r\n procedure ScaleTransform({%H-}AX, {%H-}AY: Single); override;\r\n procedure RotateTransform({%H-}AAngle: Single); override;\r\n procedure TranslateTransform({%H-}AX, {%H-}AY: Single); override;\r\n procedure SetTextQuality({%H-}ATextQuality: TTMSFNCGraphicsTextQuality); override;\r\n procedure SetAntiAliasing({%H-}AAntiAliasing: Boolean); override;\r\n procedure SetShowAcceleratorChar({%H-}AShowAcceleratorChar: Boolean); override;\r\n procedure SetSize({%H-}AWidth, {%H-}AHeight: Single); override;\r\n procedure ResetTextAngle({%H-}AAngle: Single); override;\r\n procedure BeginScene; override;\r\n procedure EndScene; override;\r\n procedure StartSpecialPen; override;\r\n procedure StopSpecialPen; override;\r\n procedure RestoreState(AState: TTMSFNCGraphicsSaveState); override;\r\n procedure SaveState({%H-}AState: TTMSFNCGraphicsSaveState); override;\r\n procedure SetFontSize(ASize: Integer); override;\r\n procedure SetFontColor(AColor: TTMSFNCGraphicsColor); override;\r\n procedure SetFontName(AName: string); override;\r\n procedure SetFont(AFont: TTMSFNCGraphicsFont); override;\r\n procedure SetFontStyles(AStyle: TFontStyles); override;\r\n procedure SetFill(AFill: TTMSFNCGraphicsFill); override;\r\n procedure SetFillKind(AKind: TTMSFNCGraphicsFillKind); override;\r\n procedure SetFillColor(AColor: TTMSFNCGraphicsColor); override;\r\n procedure SetStroke(AStroke: TTMSFNCGraphicsStroke); override;\r\n procedure SetStrokeKind(AKind: TTMSFNCGraphicsStrokeKind); override;\r\n procedure SetStrokeColor(AColor: TTMSFNCGraphicsColor); override;\r\n procedure SetStrokeWidth(AWidth: Single); override;\r\n procedure DrawLine({%H-}AStroke: TTMSFNCGraphicsStroke; AFromPoint: TPointF; AToPoint: TPointF; {%H-}AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode = gcpmRightDown; {%H-}AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode = gcpmRightDown); override;\r\n procedure DrawPolygon({%H-}AStroke: TTMSFNCGraphicsStroke; APolygon: TTMSFNCGraphicsPathPolygon); override;\r\n procedure FillPolygon({%H-}AFill: TTMSFNCGraphicsFill; APolygon: TTMSFNCGraphicsPathPolygon); override;\r\n procedure DrawPolyline({%H-}AStroke: TTMSFNCGraphicsStroke; APolyline: TTMSFNCGraphicsPathPolygon); override;\r\n procedure FillPolyline({%H-}AFill: TTMSFNCGraphicsFill; APolyline: TTMSFNCGraphicsPathPolygon); override;\r\n procedure FillArc({%H-}AFill: TTMSFNCGraphicsFill; ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single); override;\r\n procedure DrawArc({%H-}AStroke: TTMSFNCGraphicsStroke; ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single); override;\r\n procedure FillRect({%H-}AFill: TTMSFNCGraphicsFill; ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawRect({%H-}AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ASides: TTMSFNCGraphicsSides; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure FillRoundRect({%H-}AFill: TTMSFNCGraphicsFill; ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawRoundRect({%H-}AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure FillEllipse({%H-}AFill: TTMSFNCGraphicsFill; ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawEllipse({%H-}AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawBitmap(ABitmap: TTMSFNCDrawBitmap; {%H-}ASrcRect, ADstRect: TRectF; {%H-}AOpacity: Single); override;\r\n procedure ClipRect(ARect: TRectF); override;\r\n procedure ClipPath({%H-}APath: TTMSFNCGraphicsPath); override;\r\n procedure DrawFocusPath({%H-}AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath; AColor: TTMSFNCGraphicsColor); override;\r\n procedure DrawFocusRectangle({%H-}AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; AColor: TTMSFNCGraphicsColor; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawText(AText: string; ARect: TRectF; AWordWrapping: Boolean; AHorizontalAlign, AVerticalAlign: TTMSFNCGraphicsTextAlign; ATrimming: TTMSFNCGraphicsTextTrimming; AAngle: Single); override;\r\n procedure DrawPath({%H-}AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon); override;\r\n procedure FillPath({%H-}AFill: TTMSFNCGraphicsFill; APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon); override;\r\n end;\r\n\r\nfunction GetNativeContextClass: TTMSFNCGraphicsContextClass;\r\n\r\nimplementation\r\n\r\nuses\r\n Math\r\n {$IFDEF MSWINDOWS}\r\n {$IFNDEF LCLLIB}\r\n ,Windows\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXWINDOWS}\r\n ,SysUtils, WinApi.D2D1, WinApi.D3D10, WinApi.Dxgi,WinApi.DxgiFormat,\r\n WinApi.ActiveX, FMX.Canvas.D2D, Winapi.D3D10_1,\r\n FMX.Consts\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,LCLIntF, LCLType\r\n {$ENDIF}\r\n ;\r\n\r\n{$IFDEF FMXWINDOWS}\r\ntype\r\n TDirect3DLevel = (lUndetermined, lUnsupported, lDirect3D10, lDirect3D10_1);\r\n TDirect3DSupport = (sUndetermined, sDirect3D10Legacy, sDirect3D10, sDirect3D10_1);\r\n\r\nvar\r\n FSharedDevice: ID3D10Device;\r\n FSharedDXGIFactory: IDXGIFactory;\r\n FSharedFactory: ID2D1Factory;\r\n FSharedDWriteFactory: IDWriteFactory;\r\n FDirect3DLevel: TDirect3DLevel;\r\n FDirect3DSupport: TDirect3DSupport;\r\n FDirect3DHardware: Boolean;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXWINDOWS}\r\nfunction TTMSFNCGraphicsContextGeneral.CalculateTextWin(AText: string; ARect: TRectF; AWordWrapping: Boolean): TRectF;\r\nvar\r\n TextRange: TDWriteTextRange;\r\n TextFormat: IDWriteTextFormat;\r\n LocaleName: string;\r\n TrimOptions: TDwriteTrimming;\r\n TrimmingSign: IDWriteInlineObject;\r\n FLayout: IDWriteTextLayout;\r\n FMetrics: TDWriteTextMetrics;\r\n FOverhangMetrics: TDwriteOverhangMetrics;\r\n PrevFPUState: TArithmeticExceptionMask;\r\n\r\n procedure SaveClearFPUState;\r\n begin\r\n PrevFPUState:= GetExceptionMask;\r\n SetExceptionMask(exAllArithmeticExceptions);\r\n end;\r\n\r\n procedure RestoreFPUState;\r\n begin\r\n SetExceptionMask(PrevFPUState);\r\n end;\r\n\r\n function D2FontWeight(const Style: TFontStyles): TDWriteFontWeight; inline;\r\n begin\r\n Result := DWRITE_FONT_WEIGHT_REGULAR;\r\n if TFontStyle.fsBold in Style then\r\n Result := DWRITE_FONT_WEIGHT_BOLD;\r\n end;\r\n\r\n function D2FontStyle(const Style: TFontStyles): TDWriteFontStyle; inline;\r\n begin\r\n Result := 0;\r\n if TFontStyle.fsItalic in Style then\r\n Result := Result + DWRITE_FONT_STYLE_OBLIQUE;\r\n end;\r\n\r\n procedure UpdateDirect3DLevel;\r\n var\r\n DXLib: THandle;\r\n begin\r\n if FDirect3DLevel = TDirect3DLevel.lUndetermined then\r\n begin\r\n {$HINTS OFF}\r\n if {$IF COMPILERVERSION > 27}GlobalUseDX{$ELSE}GlobalUseDX10{$IFEND} then\r\n {$HINTS ON}\r\n begin\r\n FDirect3DLevel := TDirect3DLevel.lUndetermined;\r\n\r\n // Direct3D 10.1\r\n DXLib := LoadLibrary(D3D10_1_dll);\r\n if DXLib <> 0 then\r\n try\r\n if GetProcAddress(DXLib, 'D3D10CreateDevice1') <> nil then\r\n FDirect3DLevel := TDirect3DLevel.lDirect3D10_1;\r\n finally\r\n FreeLibrary(DXLib);\r\n end;\r\n\r\n if FDirect3DLevel = TDirect3DLevel.lUndetermined then\r\n begin // Direct3D 10.0\r\n DXLib := LoadLibrary(D3D10dll);\r\n if DXLib <> 0 then\r\n try\r\n if GetProcAddress(DXLib, 'D3D10CreateDevice') <> nil then\r\n FDirect3DLevel := TDirect3DLevel.lDirect3D10;\r\n finally\r\n FreeLibrary(DXLib);\r\n end;\r\n end;\r\n\r\n if FDirect3DLevel = TDirect3DLevel.lUndetermined then\r\n FDirect3DLevel := TDirect3DLevel.lUnsupported;\r\n end\r\n else\r\n FDirect3DLevel := TDirect3DLevel.lUnsupported;\r\n end;\r\n end;\r\n\r\n procedure CreateDirect3DDevice;\r\n\r\n function CreateDevice(const DriverType: D3D10_DRIVER_TYPE): HResult;\r\n var\r\n Flags: Cardinal;\r\n begin\r\n Result := S_OK;\r\n Flags := D3D10_CREATE_DEVICE_BGRA_SUPPORT;\r\n\r\n if FDirect3DLevel = TDirect3DLevel.lDirect3D10_1 then\r\n begin\r\n // Direct3D 10.1 with full hardware support\r\n Result := D3D10CreateDevice1(nil, DriverType, 0, Flags, D3D10_FEATURE_LEVEL_10_1,\r\n D3D10_1_SDK_VERSION, ID3D10Device1(FSharedDevice));\r\n\r\n if Succeeded(Result) then\r\n FDirect3DSupport := TDirect3DSupport.sDirect3D10_1;\r\n\r\n if Failed(Result) then\r\n begin\r\n // Direct3D 10.1 with hardware support of 10.0\r\n Result := D3D10CreateDevice1(nil, DriverType, 0, Flags, D3D10_FEATURE_LEVEL_10_0,\r\n D3D10_1_SDK_VERSION, ID3D10Device1(FSharedDevice));\r\n\r\n if Succeeded(Result) then\r\n FDirect3DSupport := TDirect3DSupport.sDirect3D10;\r\n end;\r\n end;\r\n\r\n if (FDirect3DLevel = TDirect3DLevel.lDirect3D10) or Failed(Result) then\r\n begin\r\n // Legacy Direct3D 10.0 (on unpatched version of Vista)\r\n Result := D3D10CreateDevice(nil, DriverType, 0, Flags, D3D10_SDK_VERSION, FSharedDevice);\r\n\r\n if Succeeded(Result) then\r\n begin\r\n FDirect3DLevel := TDirect3DLevel.lDirect3D10;\r\n FDirect3DSupport := TDirect3DSupport.sDirect3D10Legacy;\r\n end;\r\n end;\r\n end;\r\n\r\nvar\r\n Res: HResult;\r\nbegin\r\n if FDirect3DLevel < TDirect3DLevel.lDirect3D10 then\r\n raise Exception.CreateFmt('Cannot determine Direct3D support level.', [ClassType]);\r\n\r\n SaveClearFPUState;\r\n try\r\n {$HINTS OFF}\r\n if {$IF COMPILERVERSION > 27}GlobalUseDXSoftware{$ELSE}GlobalUseDX10Software{$IFEND} then\r\n {$HINTS ON}\r\n begin\r\n Res := CreateDevice(D3D10_DRIVER_TYPE_WARP);\r\n if Failed(Res) then\r\n begin\r\n // WARP device might not be supported on pre-DX10.1 system, which may still support DX10 in hardware.\r\n Res := CreateDevice(D3D10_DRIVER_TYPE_HARDWARE);\r\n if Succeeded(Res) then\r\n FDirect3DHardware := True;\r\n end\r\n else\r\n FDirect3DHardware := False;\r\n end\r\n else\r\n begin\r\n Res := CreateDevice(D3D10_DRIVER_TYPE_HARDWARE);\r\n if Failed(Res) then\r\n begin\r\n Res := CreateDevice(D3D10_DRIVER_TYPE_WARP);\r\n if Succeeded(Res) then\r\n FDirect3DHardware := False;\r\n end\r\n else\r\n FDirect3DHardware := True;\r\n end;\r\n\r\n if Failed(Res) then\r\n raise ECannotCreateD3DDevice.CreateFmt(SCannotCreateD3DDevice, [ClassType]);\r\n finally\r\n RestoreFPUState;\r\n end;\r\nend;\r\n\r\nprocedure AcquireDXGIFactory;\r\nvar\r\n DXGIDevice: IDXGIDevice;\r\n DXGIAdapter: IDXGIAdapter;\r\nbegin\r\n if Succeeded(FSharedDevice.QueryInterface(IDXGIDevice, DXGIDevice)) and (DXGIDevice <> nil) and\r\n Succeeded(DXGIDevice.GetParent(IDXGIAdapter, DXGIAdapter)) and (DXGIAdapter <> nil) then\r\n DXGIAdapter.GetParent(IDXGIFactory, FSharedDXGIFactory);\r\nend;\r\n\r\nprocedure CreateDirect2DFactory;\r\nvar\r\n FactoryOptions: PD2D1FactoryOptions;\r\n Res: HResult;\r\nbegin\r\n FactoryOptions := nil;\r\n Res := D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, ID2D1Factory, FactoryOptions, FSharedFactory);\r\n if Failed(Res) or (FSharedFactory = nil) then\r\n raise Exception.CreateFmt('Cannot create Direct2D Factory object for ''%s''.', [ClassType]);\r\n\r\n if Failed(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, IDWriteFactory, IUnknown(FSharedDWriteFactory))) then\r\n raise Exception.CreateFmt('Cannot create DirectWrite Factory object for ''%s''.', [ClassType]);\r\nend;\r\n\r\nprocedure CreateSharedResources;\r\nbegin\r\n UpdateDirect3DLevel;\r\n if FSharedDevice = nil then\r\n begin\r\n CreateDirect3DDevice;\r\n AcquireDXGIFactory;\r\n end;\r\n if FSharedFactory = nil then\r\n CreateDirect2DFactory;\r\nend;\r\n\r\nfunction SharedDWriteFactory: IDWriteFactory;\r\nbegin\r\n if FSharedDWriteFactory = nil then\r\n CreateSharedResources;\r\n Result := FSharedDWriteFactory;\r\nend;\r\n\r\nvar\r\n r: TRectF;\r\n dwVersion:Dword;\r\n dwWindowsMajorVersion: Dword;\r\nbegin\r\n dwVersion := GetVersion;\r\n dwWindowsMajorVersion := DWORD(LOBYTE(LOWORD(dwVersion)));\r\n if (dwWindowsMajorVersion = 5) then\r\n begin\r\n r := ARect;\r\n Canvas.MeasureText(r, AText, AWordWrapping, [], TTextAlign.Leading, TTextAlign.Leading);\r\n Result := r;\r\n end\r\n else\r\n begin\r\n Result := RectF(0, 0, 0, 0);\r\n FLayout := nil;\r\n if Succeeded(SharedDWriteFactory.CreateTextFormat(PChar(Canvas.Font.Family), nil, D2FontWeight(Canvas.Font.Style),\r\n D2FontStyle(Canvas.Font.Style), DWRITE_FONT_STRETCH_NORMAL, Canvas.Font.Size, PChar(LocaleName), TextFormat)) then\r\n try\r\n TextFormat.SetReadingDirection(DWRITE_READING_DIRECTION_LEFT_TO_RIGHT);\r\n\r\n if not AWordWrapping then\r\n TextFormat.SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP)\r\n else\r\n TextFormat.SetWordWrapping(DWRITE_WORD_WRAPPING_WRAP);\r\n\r\n FillChar(TrimOptions, SizeOf(TDwriteTrimming), 0);\r\n TrimOptions.granularity := DWRITE_TRIMMING_GRANULARITY_NONE;\r\n\r\n TrimmingSign := nil;\r\n TextFormat.SetTrimming(TrimOptions, TrimmingSign);\r\n TrimmingSign := nil;\r\n\r\n if Succeeded(SharedDWriteFactory.CreateTextLayout(PChar(AText), AText.Length, TextFormat, ARect.Width,\r\n ARect.Height, FLayout)) then\r\n begin\r\n TextRange.StartPosition := 0;\r\n TextRange.Length := AText.Length;\r\n FLayout.SetStrikethrough(TFontStyle.fsStrikeOut in Canvas.Font.Style, TextRange);\r\n FLayout.SetUnderline(TFontStyle.fsUnderline in Canvas.Font.Style, TextRange);\r\n FLayout.GetMetrics(FMetrics);\r\n FLayout.GetOverhangMetrics(FOverhangMetrics);\r\n\r\n Result := TRectF.Create(FMetrics.left, FMetrics.top,\r\n FMetrics.left + {Max(}FMetrics.widthIncludingTrailingWhitespace{, FOverhangMetrics.Right + AMaxRect.Width)},\r\n FMetrics.top + Min(FMetrics.height, FMetrics.layoutHeight));\r\n Result.Offset(ARect.TopLeft);\r\n if FMetrics.top < 0 then\r\n Result.Offset(0, Abs(FMetrics.top));\r\n end;\r\n finally\r\n TextFormat := nil;\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCGraphicsContextGeneral.SaveMatrix;\r\nbegin\r\n if not FMatrixSaved then\r\n begin\r\n FMatrixSaved := True;\r\n FMatrix := Canvas.Matrix;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.RestoreMatrix;\r\nbegin\r\n if FMatrixSaved then\r\n begin\r\n FMatrixSaved := False;\r\n Canvas.SetMatrix(FMatrix);\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF WEBLIB}\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawRotatedText(ACanvas: TCanvas; ARect: TRectF; AText: String; AAngle: Single; AHorizontalAlign, AVerticalAlign: TTMSFNCGraphicsTextAlign);\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawRotatedText(ACanvas: TCanvas; ARect: TRect; AText: String; AAngle: Single; AHorizontalAlign, AVerticalAlign: TTMSFNCGraphicsTextAlign);\r\n{$ENDIF}\r\nvar\r\n tw, th: Single;\r\n so: Integer;\r\n s: String;\r\n xs, ys, angle: Single;\r\nbegin\r\n s := AText;\r\n angle := -10 * AAngle;\r\n {$IFDEF CMNLIB}\r\n so := ACanvas.Font.Orientation;\r\n ACanvas.Font.Orientation := Round(angle);\r\n {$ENDIF}\r\n\r\n xs := ARect.Left;\r\n ys := ARect.Top;\r\n tw := ACanvas.TextWidth(s);\r\n th := ACanvas.TextHeight(s);\r\n\r\n {$IFDEF CMNLIB}\r\n if angle < 0 then\r\n begin\r\n case AHorizontalAlign of\r\n gtaCenter: ys := ys + (ARect.Bottom - ARect.Top - tw) / 2;\r\n gtaTrailing: ys := ys + (ARect.Bottom - ARect.Top - tw);\r\n end;\r\n\r\n case AVerticalAlign of\r\n gtaCenter: xs := xs + (ARect.Right - ARect.Left) / 2 + th / 2;\r\n gtaLeading: xs := xs + (ARect.Right - ARect.Left);\r\n gtaTrailing: xs := xs + th;\r\n end;\r\n end\r\n else\r\n begin\r\n case AHorizontalAlign of\r\n gtaCenter: ys := ys + (ARect.Bottom - ARect.Top - tw) / 2 + tw;\r\n gtaLeading: ys := ys + (ARect.Bottom - ARect.Top);\r\n gtaTrailing: ys := ys + tw;\r\n end;\r\n\r\n case AVerticalAlign of\r\n gtaCenter: xs := xs + (ARect.Right - ARect.Left) / 2 - th / 2;\r\n gtaTrailing: xs := xs + (ARect.Right - ARect.Left - th);\r\n end;\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n ACanvas.TextOut(xs, ys, s);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n ACanvas.TextOut(Round(xs), Round(ys), s);\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n ACanvas.Font.Orientation := so;\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCGraphicsContext }\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.BeginScene;\r\nbegin\r\n {$IFDEF FMXWEBLIB}\r\n if Assigned(Canvas) then\r\n begin\r\n Canvas.BeginScene;\r\n Canvas.Clear(gcNull);\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextGeneral.CalculateText(AText: string; ARect: TRectF;\r\n AWordWrapping: Boolean): TRectF;\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n {$IFDEF VCLLIB}\r\n r: TRect;\r\n dstyle: TTextFormat;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n r: TRect;\r\n dstyle: Word;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n r: TCanvasRectF;\r\n {$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := ARect;\r\n {$IFDEF FMXWINDOWS}\r\n Result := CalculateTextWin(AText, Result, AWordWrapping)\r\n {$ELSE}\r\n Canvas.MeasureText(Result, AText, AWordWrapping, [], TTextAlign.Leading, TTextAlign.Leading)\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n r := Canvas.TextRect(r, AText, AWordWrapping, True);\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n dstyle := [tfCalcRect];\r\n if AWordWrapping then\r\n dstyle := dstyle + [tfWordBreak]\r\n else\r\n dstyle := dstyle + [tfSingleLine];\r\n\r\n if not FShowAcceleratorChar then\r\n dstyle := dstyle + [tfNoPrefix];\r\n\r\n Canvas.TextRect(r, AText, dstyle);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n dstyle := DT_CALCRECT;\r\n if AWordWrapping then\r\n dstyle := dstyle or DT_WORDBREAK\r\n else\r\n dstyle := dstyle or DT_SINGLELINE;\r\n\r\n if not FShowAcceleratorChar then\r\n dstyle := dstyle or DT_NOPREFIX;\r\n\r\n LCLIntF.DrawText(Canvas.Handle, PChar(AText), Length(AText), r, dstyle);\r\n {$ENDIF}\r\n Result := RectF(r.Left, r.Top, r.Right, r.Bottom);\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.ClipPath(APath: TTMSFNCGraphicsPath);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.ClipRect(ARect: TRectF);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.IntersectClipRect(ARect);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF VCLLIB}\r\n IntersectClipRect(Canvas.Handle, Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Canvas.Clipping := True;\r\n Canvas.ClipRect := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Canvas.ClipRect := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextGeneral.CreatePath: Pointer;\r\nbegin\r\n Result := TTMSFNCGraphicsPath.Create;\r\nend;\r\n\r\ndestructor TTMSFNCGraphicsContextGeneral.Destroy;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if Assigned(FTextLayout) then\r\n begin\r\n FTextLayout.Free;\r\n FTextLayout := nil;\r\n end;\r\n {$ENDIF}\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawArc(AStroke: TTMSFNCGraphicsStroke; ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single);\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n {$IFDEF CMNLIB}\r\n x, y, xs, ys, sx, sy, sxs, sys: Integer;\r\n {$ENDIF}\r\n bs: TBrushStyle;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.DrawArc(ACenter, ARadius, AStartAngle, ASweepAngle, AStroke.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF WEBLIB}\r\n sx := Floor(ACenter.X - ARadius.X);\r\n sy := Floor(ACenter.Y - ARadius.Y);\r\n sxs := Floor(ACenter.X + ARadius.X);\r\n sys := Floor(ACenter.Y + ARadius.Y);\r\n\r\n x := Floor(ACenter.X + (ARadius.X * COS(DegToRad(-AStartAngle - ASweepAngle))));\r\n y := Floor(ACenter.Y - (ARadius.Y * SIN(DegToRad(-AStartAngle - ASweepAngle))));\r\n xs := Floor(ACenter.X + (ARadius.X * COS(DegToRad(-AStartAngle))));\r\n ys := Floor(ACenter.Y - (ARadius.Y * SIN(DegToRad(- AStartAngle))));\r\n {$ENDIF}\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n {$IFNDEF WEBLIB}\r\n Canvas.Arc(sx, sy, sxs, sys, x, y, xs, ys);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Canvas.AngleArc(ACenter.X, ACenter.Y, ARadius.X, AStartAngle, ASweepAngle);\r\n {$ENDIF}\r\n Canvas.Brush.Style := bs;\r\n Canvas.Brush.Color := c;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawBitmap(ABitmap: TTMSFNCDrawBitmap; ASrcRect, ADstRect: TRectF; AOpacity: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.DrawBitmap(ABitmap, ASrcRect, ADstRect, AOpacity, True);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n Canvas.StretchDraw(CreateCanvasRectF(ADstRect.Left, ADstRect.Top, ADstRect.Right, ADstRect.Bottom), ABitmap);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Canvas.StretchDraw(Bounds(Round(ADstRect.Left), Round(ADstRect.Top), Round(ADstRect.Right - ADstRect.Left), Round(ADstRect.Bottom - ADstRect.Top)), ABitmap);\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawEllipse(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF;\r\n AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n{$IFDEF FMXLIB}\r\n r: TRectF;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF WEBLIB}\r\n r: TCanvasRectF;\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\n r: TRect;\r\n{$ENDIF}\r\n bs: TBrushStyle;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n ARect := ModifyRect(ARect, AModifyRectMode);\r\n {$IFDEF FMXLIB}\r\n r := ARect;\r\n Canvas.DrawEllipse(r, AStroke.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n Canvas.Ellipse(r);\r\n Canvas.Brush.Style := bs;\r\n Canvas.Brush.Color := c;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawFocusPath(AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath; AColor: TTMSFNCGraphicsColor);\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n bs: TBrushStyle;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n Canvas.Stroke.Color := AColor;\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Canvas.Stroke.Dash := TStrokeDash.Dot;\r\n {$ELSE}\r\n Canvas.StrokeDash := TStrokeDash.Dot;\r\n {$IFEND}\r\n {$HINTS ON}\r\n DrawPath(AStroke, APath);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n Canvas.Pen.Color := AColor;\r\n StartSpecialPen;\r\n DrawPath(AStroke, APath);\r\n StopSpecialPen;\r\n Canvas.Brush.Color := c;\r\n Canvas.Brush.Style := bs;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawFocusRectangle(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; AColor: TTMSFNCGraphicsColor; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n{$IFDEF FMXLIB}\r\n r: TRectF;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF WEBLIB}\r\n r: TCanvasRectF;\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\n r: TRect;\r\n{$ENDIF}\r\n c: TTMSFNCGraphicsColor;\r\n bs: TBrushStyle;\r\n{$ENDIF}\r\nbegin\r\n ARect := ModifyRect(ARect, AModifyRectMode);\r\n {$IFDEF FMXLIB}\r\n r := ARect;\r\n Canvas.Stroke.Thickness := 1;\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n Canvas.Stroke.Color := AColor;\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Canvas.Stroke.Dash := TStrokeDash.Dot;\r\n {$ELSE}\r\n Canvas.StrokeDash := TStrokeDash.Dot;\r\n {$IFEND}\r\n {$HINTS ON}\r\n Canvas.DrawRect(r, 0, 0, AllCorners, 1);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n Canvas.Pen.Color := AColor;\r\n StartSpecialPen;\r\n Canvas.Rectangle(r);\r\n StopSpecialPen;\r\n Canvas.Brush.Color := c;\r\n Canvas.Brush.Style := bs;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawLine(AStroke: TTMSFNCGraphicsStroke; AFromPoint, AToPoint: TPointF;\r\n AModifyPointModeFrom, AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n AFromPoint := ModifyPoint(AFromPoint, AModifyPointModeFrom);\r\n AToPoint := ModifyPoint(AToPoint, AModifyPointModeTo);\r\n Canvas.DrawLine(AFromPoint, AToPoint, AStroke.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n Canvas.MoveTo(AFromPoint.X, AFromPoint.Y);\r\n Canvas.LineTo(AToPoint.X, AToPoint.Y);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Canvas.MoveTo(Round(AFromPoint.X), Round(AFromPoint.Y));\r\n Canvas.LineTo(Round(AToPoint.X), Round(AToPoint.Y));\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawPath(AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath;\r\n APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon);\r\nvar\r\n p: TTMSFNCGraphicsPathPolygon;\r\nbegin\r\n if Assigned(APath) then\r\n begin\r\n SetLength(p, 0);\r\n APath.FlattenToPolygon(p);\r\n case APathMode of\r\n pdmPolygon: DrawPolygon(AStroke, p);\r\n pdmPolyline: DrawPolyline(AStroke, p);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawPolygon(AStroke: TTMSFNCGraphicsStroke; APolygon: TTMSFNCGraphicsPathPolygon);\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n{$IFDEF WEBLIB}\r\n pts: array of TCanvasPointF;\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\n pts: array of TPoint;\r\n{$ENDIF}\r\n I: Integer;\r\n bs: TBrushStyle;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.DrawPolygon(TPolygon(APolygon), AStroke.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n SetLength(pts, Length(APolygon));\r\n for I := 0 to Length(APolygon) - 1 do\r\n begin\r\n {$IFDEF WEBLIB}\r\n pts[I] := CreateCanvasPointF(APolygon[I].X, APolygon[I].Y);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n pts[I] := Point(Round(APolygon[I].X), Round(APolygon[I].Y));\r\n {$ENDIF}\r\n end;\r\n\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n Canvas.Polygon(pts);\r\n Canvas.Brush.Style := bs;\r\n Canvas.Brush.Color := c;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawPolyline(AStroke: TTMSFNCGraphicsStroke; APolyline: TTMSFNCGraphicsPathPolygon);\r\nvar\r\n I: Integer;\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF WEBLIB}\r\n pts: array of TCanvasPointF;\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\n pts: array of TPoint;\r\n{$ENDIF}\r\n bs: TBrushStyle;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n for I := 0 to High(APolyline) - 1 do\r\n DrawLine(AStroke, APolyline[I], APolyline[I + 1]);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n SetLength(pts, Length(APolyline));\r\n for I := 0 to Length(APolyline) - 1 do\r\n begin\r\n {$IFDEF WEBLIB}\r\n pts[I] := CreateCanvasPointF(APolyline[I].X, APolyline[I].Y);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n pts[I] := Point(Round(APolyline[I].X), Round(APolyline[I].Y));\r\n {$ENDIF}\r\n end;\r\n\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n Canvas.Polyline(pts);\r\n Canvas.Brush.Style := bs;\r\n Canvas.Brush.Color := c;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawRect(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ASides: TTMSFNCGraphicsSides; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n{$IFDEF FMXWEBLIB}\r\n r: TRectF;\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n r: TRect;\r\n{$ENDIF}\r\nbegin\r\n ARect := ModifyRect(ARect, AModifyRectMode);\r\n {$IFDEF FMXWEBLIB}\r\n r := ARect;\r\n if gsTop in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Top), PointF(r.Right, r.Top));\r\n if gsLeft in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Top), PointF(r.Left, r.Bottom));\r\n if gsBottom in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Bottom), PointF(r.Right, r.Bottom));\r\n if gsRight in ASides then\r\n DrawLine(AStroke, PointF(r.Right, r.Top), PointF(r.Right, r.Bottom));\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n if gsTop in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Top), PointF(r.Right - 1, r.Top));\r\n if gsLeft in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Top), PointF(r.Left, r.Bottom - 1));\r\n if gsBottom in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Bottom - 1), PointF(r.Right - 1, r.Bottom - 1));\r\n if gsRight in ASides then\r\n DrawLine(AStroke, PointF(r.Right - 1, r.Top), PointF(r.Right - 1, r.Bottom));\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawRoundRect(AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ARounding: Single;\r\n ACorners: TTMSFNCGraphicsCorners; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n{$IFDEF FMXLIB}\r\n r: TRectF;\r\n c: TCorners;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r, rg: TCanvasRectF;\r\n rc: Single;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r, rg: TRect;\r\n rc: Integer;\r\n {$ENDIF}\r\n cl: TTMSFNCGraphicsColor;\r\n bs: TBrushStyle;\r\n\r\n {$IFDEF WEBLIB}\r\n procedure CanvasArc(ACanvas: TCanvas; Center, Radius: TPointF; StartAngle, SweepAngle: Integer);\r\n begin\r\n ACanvas.AngleArc(Center.X, Center.Y, Radius.X, DegToRad(StartAngle), DegToRad(SweepAngle));\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n procedure CanvasArc(ACanvas: TCanvas; Center, Radius: TPoint; StartAngle, SweepAngle: Integer);\r\n var\r\n sx, sy, sxs, sys, x, y, xs, ys: Integer;\r\n begin\r\n sx := Center.X - Radius.X;\r\n sy := Center.Y - Radius.Y;\r\n sxs := Center.X + Radius.X;\r\n sys := Center.Y + Radius.Y;\r\n\r\n x := Center.X + Round(Radius.X * COS(DegToRad(-StartAngle - SweepAngle)));\r\n y := Center.Y - Round(Radius.Y * SIN(DegToRad(-StartAngle - SweepAngle)));\r\n xs := Center.X + Round(Radius.X * COS(DegToRad(-StartAngle)));\r\n ys := Center.Y - Round(Radius.Y * SIN(DegToRad(- StartAngle)));\r\n\r\n ACanvas.Arc(sx, sy, sxs, sys, x, y, xs, ys);\r\n {$ENDIF}\r\n end;\r\n{$ENDIF}\r\nbegin\r\n ARect := ModifyRect(ARect, AModifyRectMode);\r\n {$IFDEF FMXLIB}\r\n r := ARect;\r\n\r\n c := [];\r\n if gcTopLeft in ACorners then\r\n c := c + [TCorner.TopLeft];\r\n\r\n if gcTopRight in ACorners then\r\n c := c + [TCorner.TopRight];\r\n\r\n if gcBottomLeft in ACorners then\r\n c := c + [TCorner.BottomLeft];\r\n\r\n if gcBottomRight in ACorners then\r\n c := c + [TCorner.BottomRight];\r\n\r\n Canvas.DrawRect(r, ARounding, ARounding, c, AStroke.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n\r\n rg := r;\r\n rg.Bottom := rg.Bottom - 1;\r\n rg.Right := rg.Right - 1;\r\n\r\n cl := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n\r\n rc := Round(ARounding);\r\n if ACorners = [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight] then\r\n Canvas.RoundRect(r, rc * 2, rc * 2)\r\n else if ACorners = [] then\r\n Canvas.Rectangle(r)\r\n else\r\n begin\r\n {$IFNDEF WEBLIB}\r\n r.Right := r.Right - 1;\r\n r.Bottom := r.Bottom - 1;\r\n rc := rc - 1;\r\n {$ENDIF}\r\n if gcBottomLeft in ACorners then\r\n begin\r\n Canvas.MoveTo(r.Left + rc, r.Bottom);\r\n {$IFDEF WEBLIB}\r\n CanvasArc(Canvas, PointF(r.Left + rc, r.Bottom - rc), PointF(rc, rc), -270, 90);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n CanvasArc(Canvas, Point(r.Left + rc, r.Bottom - rc), Point(rc, rc), -270, 90);\r\n {$ENDIF}\r\n Canvas.MoveTo(r.Left, r.Bottom - rc);\r\n end\r\n else\r\n begin\r\n Canvas.MoveTo(r.Left, r.Bottom);\r\n end;\r\n\r\n if gcTopLeft in ACorners then\r\n begin\r\n {$IFDEF WEBLIB}\r\n Canvas.LineTo(r.Left, r.Top + rc);\r\n CanvasArc(Canvas, PointF(r.Left + rc, r.Top + rc), PointF(rc, rc), -180, 90);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Canvas.LineTo(r.Left, r.Top + rc - 2);\r\n CanvasArc(Canvas, Point(r.Left + rc, r.Top + rc), Point(rc, rc), -180, 90);\r\n {$ENDIF}\r\n Canvas.MoveTo(r.Left + rc, r.Top);\r\n end\r\n else\r\n Canvas.LineTo(r.Left, r.Top);\r\n\r\n if gcTopRight in ACorners then\r\n begin\r\n Canvas.LineTo(r.Right - rc, r.Top);\r\n {$IFDEF WEBLIB}\r\n CanvasArc(Canvas, PointF(r.Right - rc, r.Top + rc), PointF(rc, rc), -90, 90);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n CanvasArc(Canvas, Point(r.Right - rc, r.Top + rc), Point(rc, rc), -90, 90);\r\n {$ENDIF}\r\n Canvas.MoveTo(r.Right, r.Top + rc);\r\n end\r\n else\r\n Canvas.LineTo(r.Right, r.Top);\r\n\r\n if gcBottomRight in ACorners then\r\n begin\r\n {$IFDEF WEBLIB}\r\n Canvas.LineTo(r.Right, r.Bottom - rc);\r\n CanvasArc(Canvas, PointF(r.Right - rc, r.Bottom - rc), PointF(rc, rc), 0, 90);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Canvas.LineTo(r.Right, r.Bottom - rc + 1);\r\n CanvasArc(Canvas, Point(r.Right - rc, r.Bottom - rc + 1), Point(rc, rc), 0, 90);\r\n {$ENDIF}\r\n Canvas.MoveTo(r.Right - rc, r.Bottom);\r\n end\r\n else\r\n begin\r\n Canvas.LineTo(r.Right, r.Bottom);\r\n end;\r\n\r\n if gcBottomLeft in ACorners then\r\n begin\r\n {$IFDEF WEBLIB}\r\n Canvas.LineTo(r.Left + rc, r.Bottom)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Canvas.LineTo(r.Left + rc - 2, r.Bottom)\r\n {$ENDIF}\r\n end\r\n else\r\n Canvas.LineTo(r.Left, r.Bottom);\r\n end;\r\n\r\n Canvas.Brush.Color := cl;\r\n Canvas.Brush.Style := bs;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.DrawText(AText: string; ARect: TRectF;\r\n AWordWrapping: Boolean; AHorizontalAlign,\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign;\r\n ATrimming: TTMSFNCGraphicsTextTrimming; AAngle: Single);\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n rcalc: TRectF;\r\n rh: Integer;\r\n {$IFDEF WEBLIB}\r\n r: TRectF;\r\n st: TTMSFNCGraphicsSaveState;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r: TRect;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {%H-}dstyle: TTextStyle;\r\n {$IFNDEF MSWINDOWS} \r\n crr: TRect;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n dstyle: TTextFormat;\r\n {$ENDIF}\r\n c: TTMSFNCGraphicsColor;\r\n bs: TBrushStyle;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if not Assigned(FTextLayout) then\r\n FTextLayout := TTextLayoutManager.DefaultTextLayout.Create(Canvas);\r\n\r\n FTextLayout.BeginUpdate;\r\n try\r\n FTextLayout.TopLeft := PointF(Round(ARect.Left), Round(ARect.Top));\r\n FTextLayout.Text := AText;\r\n FTextLayout.MaxSize := PointF(Round(ARect.Width), Round(ARect.Height));\r\n FTextLayout.WordWrap := AWordWrapping;\r\n FTextLayout.Opacity := 1;\r\n FTextLayout.HorizontalAlign := TTextAlign(Integer(AHorizontalAlign));\r\n FTextLayout.VerticalAlign := TTextAlign(Integer(AVerticalAlign));\r\n FTextLayout.Font.Assign(Canvas.Font);\r\n FTextLayout.Color := Canvas.Fill.Color;\r\n if not AWordWrapping then\r\n FTextLayout.Trimming := TTextTrimming(Integer(ATrimming))\r\n else\r\n FTextLayout.Trimming := TTextTrimming.None;\r\n finally\r\n FTextLayout.EndUpdate;\r\n end;\r\n FTextLayout.RenderLayout(Canvas);\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n\r\n {$IFDEF WEBLIB}\r\n r := RectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n dstyle := [];\r\n if AWordWrapping then\r\n dstyle := dstyle + [tfWordBreak]\r\n else\r\n dstyle := dstyle + [tfSingleLine];\r\n\r\n if not FShowAcceleratorChar then\r\n dstyle := dstyle + [tfNoPrefix];\r\n\r\n case AHorizontalAlign of\r\n gtaCenter: dstyle := dstyle + [tfCenter];\r\n gtaLeading: dstyle := dstyle + [tfLeft];\r\n gtaTrailing: dstyle := dstyle + [tfRight];\r\n end;\r\n\r\n case AVerticalAlign of\r\n gtaCenter: dstyle := dstyle + [tfVerticalCenter];\r\n gtaLeading: dstyle := dstyle + [tfTop];\r\n gtaTrailing: dstyle := dstyle + [tfBottom];\r\n end;\r\n\r\n case ATrimming of\r\n gttCharacter: dstyle := dstyle + [tfEndEllipsis];\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n gttWord: dstyle := dstyle + [tfWordEllipsis];\r\n {$IFEND}\r\n {$HINTS ON}\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF LCLLIB}\r\n dStyle.RightToLeft := False;\r\n dStyle.WordBreak := AWordWrapping;\r\n dStyle.SingleLine := not AWordWrapping;\r\n dStyle.Clipping := True;\r\n dStyle.EndEllipsis := False;\r\n dStyle.SystemFont := False;\r\n dStyle.ShowPrefix := FShowAcceleratorChar;\r\n\r\n case AHorizontalAlign of\r\n gtaCenter: dstyle.Alignment := taCenter;\r\n gtaLeading: dstyle.Alignment := taLeftJustify;\r\n gtaTrailing: dstyle.Alignment := taRightJustify;\r\n end;\r\n\r\n case AVerticalAlign of\r\n gtaCenter: dstyle.Layout := tlCenter;\r\n gtaLeading: dstyle.Layout := tlTop;\r\n gtaTrailing: dstyle.Layout := tlBottom;\r\n end;\r\n\r\n case ATrimming of\r\n gttCharacter: dstyle.EndEllipsis := True;\r\n end;\r\n {$ENDIF}\r\n\r\n if AWordWrapping then\r\n begin\r\n case AVerticalAlign of\r\n gtaCenter:\r\n begin\r\n rcalc := CalculateText(AText, ARect, AWordWrapping);\r\n rh := Round(rcalc.Bottom - rcalc.Top);\r\n {$IFDEF WEBLIB}\r\n r.Top := r.Top + Max(0, ((r.Bottom - r.Top) - rh) / 2);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r.Top := r.Top + Max(0, ((r.Bottom - r.Top) - rh) div 2);\r\n {$ENDIF}\r\n r.Bottom := Max(0, Min(Round(ARect.Bottom), r.Top + rh));\r\n end;\r\n gtaTrailing:\r\n begin\r\n rcalc := CalculateText(AText, ARect, AWordWrapping);\r\n rh := Round(rcalc.Bottom - rcalc.Top);\r\n r.Top := r.Top + r.Bottom - rh;\r\n r.Bottom := r.Top + rh;\r\n end;\r\n end;\r\n end;\r\n\r\n if AAngle <> 0 then\r\n DrawRotatedText(Canvas, r, AText, AAngle, AHorizontalAlign, AVerticalAlign)\r\n else\r\n begin\r\n {$IFDEF GDIPLUSDRAWING}\r\n b := CreateGDIPFontFill(Font);\r\n ft := CreateGDIPFont(Font);\r\n sf := CreateGPStringFormat(AHorizontalAlign, AVerticalAlign, AWordWrapping);\r\n try\r\n rt := MakeRect(ARect.Left, ARect.Top, ARect.Width, ARect.Height);\r\n FGDIPCanvas.DrawString(AText, Length(AText), ft, rt, sf, b);\r\n finally\r\n sf.Free;\r\n ft.Free;\r\n b.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF GDIPLUSDRAWING}\r\n {$IFDEF WEBLIB}\r\n st := TTMSFNCGraphicsSaveState.Create;\r\n try\r\n SaveState(st);\r\n ClipRect(r);\r\n case AHorizontalAlign of\r\n gtaLeading:\r\n begin\r\n case AVerticalAlign of\r\n gtaLeading: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taLeftJustify, taAlignTop);\r\n gtaCenter: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taLeftJustify, taVerticalCenter);\r\n gtaTrailing: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taLeftJustify, taAlignBottom);\r\n end;\r\n end;\r\n gtaCenter:\r\n begin\r\n case AVerticalAlign of\r\n gtaLeading: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taCenter, taAlignTop);\r\n gtaCenter: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taCenter, taVerticalCenter);\r\n gtaTrailing: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taCenter, taAlignBottom);\r\n end;\r\n end;\r\n gtaTrailing:\r\n begin\r\n case AVerticalAlign of\r\n gtaLeading: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taRightJustify, taAlignTop);\r\n gtaCenter: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taRightJustify, taVerticalCenter);\r\n gtaTrailing: Canvas.TextRect(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom), AText, AWordWrapping, False, taRightJustify, taAlignBottom);\r\n end;\r\n end;\r\n end;\r\n finally\r\n RestoreState(st);\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n Canvas.TextRect(r, AText, dstyle);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFNDEF MSWINDOWS}\r\n crr := Rect(0, 0, 0, 0);\r\n if not Canvas.Clipping or (IntersectRect(crr, Canvas.ClipRect, r) and Canvas.Clipping) then\r\n {$ENDIF}\r\n Canvas.TextRect(r, r.Left, r.Top, AText, dstyle);\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\n\r\n Canvas.Brush.Color := c;\r\n Canvas.Brush.Style := bs;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.EndScene;\r\nbegin\r\n {$IFDEF FMXWEBLIB}\r\n Canvas.EndScene;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.FillArc(AFill: TTMSFNCGraphicsFill; ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single);\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n {$IFNDEF WEBLIB}\r\n x, y, xs, ys, sx, sy, sxs, sys: Integer;\r\n {$ENDIF}\r\n ps: TPenStyle;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.FillArc(ACenter, ARadius, AStartAngle, ASweepAngle, AFill.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF WEBLIB}\r\n sx := Floor(ACenter.X - ARadius.X);\r\n sy := Floor(ACenter.Y - ARadius.Y);\r\n sxs := Floor(ACenter.X + ARadius.X);\r\n sys := Floor(ACenter.Y + ARadius.Y);\r\n\r\n x := Floor(ACenter.X + (ARadius.X * COS(DegToRad(-AStartAngle - ASweepAngle))));\r\n y := Floor(ACenter.Y - (ARadius.Y * SIN(DegToRad(-AStartAngle - ASweepAngle))));\r\n xs := Floor(ACenter.X + (ARadius.X * COS(DegToRad(-AStartAngle))));\r\n ys := Floor(ACenter.Y - (ARadius.Y * SIN(DegToRad(- AStartAngle))));\r\n {$ENDIF}\r\n\r\n ps := Canvas.Pen.Style;\r\n Canvas.Pen.Style := psClear;\r\n {$IFNDEF WEBLIB}\r\n Canvas.Arc(sx, sy, sxs, sys, x, y, xs, ys);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Canvas.AngleArc(ACenter.X, ACenter.Y, ARadius.X, AStartAngle, ASweepAngle);\r\n {$ENDIF}\r\n Canvas.Pen.Style := ps;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.FillEllipse(AFill: TTMSFNCGraphicsFill; ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n{$IFDEF FMXLIB}\r\n r: TRectF;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n{$IFDEF WEBLIB}\r\n r: TCanvasRectF;\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\n r: TRect;\r\n{$ENDIF}\r\n ps: TPenStyle;\r\n{$ENDIF}\r\nbegin\r\n ARect := ModifyRect(ARect, AModifyRectMode);\r\n {$IFDEF FMXLIB}\r\n r := ARect;\r\n Canvas.FillEllipse(r, AFill.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r := CreateCanvasRectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n\r\n ps := Canvas.Pen.Style;\r\n Canvas.Pen.Style := psClear;\r\n Canvas.Ellipse(r);\r\n Canvas.Pen.Style := ps;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.FillPath(AFill: TTMSFNCGraphicsFill;\r\n APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode);\r\nvar\r\n p: TTMSFNCGraphicsPathPolygon;\r\nbegin\r\n if Assigned(APath) then\r\n begin\r\n SetLength(p, 0);\r\n APath.FlattenToPolygon(p);\r\n case APathMode of\r\n pdmPolygon: FillPolygon(AFill, p);\r\n pdmPolyline: FillPolyline(AFill, p);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.FillPolygon(AFill: TTMSFNCGraphicsFill; APolygon: TTMSFNCGraphicsPathPolygon);\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n {$IFDEF WEBLIB}\r\n pts: array of TCanvasPointF;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n pts: array of TPoint;\r\n {$ENDIF}\r\n I: Integer;\r\n ps: TPenStyle;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.FillPolygon(TPolygon(APolygon), AFill.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n SetLength(pts, Length(APolygon));\r\n for I := 0 to Length(APolygon) - 1 do\r\n begin\r\n {$IFDEF WEBLIB}\r\n pts[I] := CreateCanvasPointF(APolygon[I].X, APolygon[I].Y);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n pts[I] := Point(Round(APolygon[I].X), Round(APolygon[I].Y));\r\n {$ENDIF}\r\n end;\r\n\r\n ps := Canvas.Pen.Style;\r\n Canvas.Pen.Style := psClear;\r\n Canvas.Polygon(pts);\r\n Canvas.Pen.Style := ps;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.FillPolyline(AFill: TTMSFNCGraphicsFill; APolyline: TTMSFNCGraphicsPathPolygon);\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n {$IFDEF WEBLIB}\r\n pts: array of TCanvasPointF;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n pts: array of TPoint;\r\n {$ENDIF}\r\n I: Integer;\r\n ps: TPenStyle;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.FillPolygon(TPolygon(APolyline), AFill.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n SetLength(pts, Length(APolyline));\r\n for I := 0 to Length(APolyline) - 1 do\r\n begin\r\n {$IFDEF WEBLIB}\r\n pts[I] := CreateCanvasPointF(APolyline[I].X, APolyline[I].Y);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n pts[I] := Point(Round(APolyline[I].X), Round(APolyline[I].Y));\r\n {$ENDIF}\r\n end;\r\n\r\n ps := Canvas.Pen.Style;\r\n Canvas.Pen.Style := psClear;\r\n Canvas.Polyline(pts);\r\n Canvas.Pen.Style := ps;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.FillRect(AFill: TTMSFNCGraphicsFill; ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n{$IFDEF FMXLIB}\r\n r: TRectF;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r: TRectF;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r: TRect;\r\n {$ENDIF}\r\n c: TTMSFNCGraphicsColor;\r\n bs: TBrushStyle;\r\n ps: TPenStyle;\r\n{$ENDIF}\r\nbegin\r\n ARect := ModifyRect(ARect, AModifyRectMode);\r\n {$IFDEF FMXLIB}\r\n r := ARect;\r\n Canvas.FillRect(r, 0, 0, AllCorners, AFill.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r := RectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n\r\n c := gcNull;\r\n bs := bsClear;\r\n if (AFill.Kind = gfkGradient) then\r\n begin\r\n if (AFill.Color <> gcNull) and (AFill.ColorTo <> gcNull) then\r\n begin\r\n if (AFill.ColorMirror <> gcNull) and (AFill.ColorMirrorTo <> gcNull) then\r\n begin\r\n case AFill.Orientation of\r\n gfoHorizontal:\r\n begin\r\n {$IFDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, RectF(r.Left, r.Top, r.Left + (r.Right - r.Left) / 2, r.Bottom), 0, [], True);\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, RectF(r.Left + (r.Right - r.Left) / 2, r.Top, r.Right, r.Bottom), 0, [], True);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, Rect(r.Left, r.Top, r.Left + (r.Right - r.Left) div 2, r.Bottom), 0, [], True);\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, Rect(r.Left + (r.Right - r.Left) div 2, r.Top, r.Right, r.Bottom), 0, [], True);\r\n {$ENDIF}\r\n end;\r\n gfoVertical:\r\n begin\r\n {$IFDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, RectF(r.Left, r.Top, r.Right, r.Top + (r.Bottom - r.Top) / 2), 0, [], False);\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, RectF(r.Left, r.Top + (r.Bottom - r.Top) / 2, r.Right, r.Bottom), 0, [], False);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, Rect(r.Left, r.Top, r.Right, r.Top + (r.Bottom - r.Top) div 2), 0, [], False);\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, Rect(r.Left, r.Top + (r.Bottom - r.Top) div 2, r.Right, r.Bottom), 0, [], False);\r\n {$ENDIF}\r\n end;\r\n end;\r\n end\r\n else\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, r, 0, [], AFill.Orientation = gfoHorizontal);\r\n end;\r\n\r\n c := Canvas.Brush.Color;\r\n bs := Canvas.Brush.Style;\r\n Canvas.Brush.Style := bsClear;\r\n end;\r\n\r\n ps := Canvas.Pen.Style;\r\n Canvas.Pen.Style := psClear;\r\n if (AFill.Color <> gcNull) and (AFill.Kind = gfkSolid) then\r\n begin\r\n {$IFDEF WEBLIB}\r\n Canvas.Rectangle(CreateCanvasRectF(r.Left, r.Top, r.Right, r.Bottom));\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Canvas.Rectangle(r);\r\n {$ENDIF}\r\n end;\r\n Canvas.Pen.Style := ps;\r\n\r\n if AFill.Kind = gfkGradient then\r\n begin\r\n Canvas.Brush.Color := c;\r\n Canvas.Brush.Style := bs;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.FillRoundRect(AFill: TTMSFNCGraphicsFill; ARect: TRectF; ARounding: Single;\r\n ACorners: TTMSFNCGraphicsCorners; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n{$IFDEF FMXLIB}\r\n r: TRectF;\r\n c: TCorners;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r, rg: TRectF;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r, rg: TRect;\r\n {$ENDIF}\r\n c: TTMSFNCGraphicsCorners;\r\n{$ENDIF}\r\nbegin\r\n ARect := ModifyRect(ARect, AModifyRectMode);\r\n {$IFDEF FMXLIB}\r\n r := ARect;\r\n\r\n c := [];\r\n if gcTopLeft in ACorners then\r\n c := c + [TCorner.TopLeft];\r\n\r\n if gcTopRight in ACorners then\r\n c := c + [TCorner.TopRight];\r\n\r\n if gcBottomLeft in ACorners then\r\n c := c + [TCorner.BottomLeft];\r\n\r\n if gcBottomRight in ACorners then\r\n c := c + [TCorner.BottomRight];\r\n\r\n Canvas.FillRect(r, ARounding, ARounding, c, AFill.Opacity);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF WEBLIB}\r\n r := RectF(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n r := Rect(Round(ARect.Left), Round(ARect.Top), Round(ARect.Right), Round(ARect.Bottom));\r\n {$ENDIF}\r\n\r\n rg := r;\r\n rg.Bottom := rg.Bottom - 1;\r\n rg.Right := rg.Right - 1;\r\n\r\n if (AFill.Kind = gfkGradient) then\r\n begin\r\n if (AFill.Color <> gcNull) and (AFill.ColorTo <> gcNull) then\r\n begin\r\n if (AFill.ColorMirror <> gcNull) and (AFill.ColorMirrorTo <> gcNull) then\r\n begin\r\n case AFill.Orientation of\r\n gfoHorizontal:\r\n begin\r\n c := [];\r\n if gcTopLeft in ACorners then\r\n c := c + [gcTopLeft];\r\n if gcBottomLeft in ACorners then\r\n c := c + [gcBottomLeft];\r\n\r\n {$IFDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, RectF(rg.Left, rg.Top, rg.Left + (rg.Right - rg.Left) / 2, r.Bottom), ARounding, c, True);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, Rect(rg.Left, rg.Top, rg.Left + (rg.Right - rg.Left) div 2, r.Bottom), ARounding, c, True);\r\n {$ENDIF}\r\n\r\n c := [];\r\n if gcTopRight in ACorners then\r\n c := c + [gcTopRight];\r\n if gcBottomRight in ACorners then\r\n c := c + [gcBottomRight];\r\n\r\n {$IFDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, RectF(rg.Left + (rg.Right - r.Left) / 2, rg.Top, rg.Right, rg.Bottom), ARounding, c, True);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, Rect(rg.Left + (rg.Right - r.Left) div 2, rg.Top, rg.Right, rg.Bottom), ARounding, c, True);\r\n {$ENDIF}\r\n end;\r\n gfoVertical:\r\n begin\r\n c := [];\r\n if gcTopLeft in ACorners then\r\n c := c + [gcTopLeft];\r\n if gcTopRight in ACorners then\r\n c := c + [gcTopRight];\r\n\r\n {$IFDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, RectF(rg.Left, rg.Top, rg.Right, rg.Top + (rg.Bottom - rg.Top) / 2), ARounding, c, False);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, Rect(rg.Left, rg.Top, rg.Right, rg.Top + (rg.Bottom - rg.Top) div 2), ARounding, c, False);\r\n {$ENDIF}\r\n\r\n c := [];\r\n if gcBottomLeft in ACorners then\r\n c := c + [gcBottomLeft];\r\n if gcBottomRight in ACorners then\r\n c := c + [gcBottomRight];\r\n\r\n {$IFDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, RectF(rg.Left, rg.Top + (rg.Bottom - rg.Top) / 2, rg.Right, rg.Bottom), ARounding, c, False);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n DrawGradient(Canvas, AFill.ColorMirror, AFill.ColorMirrorTo, Rect(rg.Left, rg.Top + (rg.Bottom - rg.Top) div 2, rg.Right, rg.Bottom), ARounding, c, False);\r\n {$ENDIF}\r\n end;\r\n end;\r\n end\r\n else\r\n DrawGradient(Canvas, AFill.Color, AFill.ColorTo, rg, ARounding, ACorners, AFill.Orientation = gfoHorizontal);\r\n end;\r\n end\r\n else if (AFill.Color <> gcNull) and (AFill.Kind = gfkSolid) then\r\n DrawGradient(Canvas, AFill.Color, AFill.Color, r, ARounding, ACorners, AFill.Orientation = gfoHorizontal);\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.StartSpecialPen;\r\n{$IFDEF CMNLIB}\r\nvar\r\n hpen: THandle;\r\n lb: TLogBrush;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF CMNLIB}\r\n lb.lbColor := ColorToRGB(Canvas.Pen.Color);\r\n lb.lbStyle := BS_SOLID;\r\n\r\n hpen := ExtCreatePen(PS_COSMETIC or PS_ALTERNATE, 1, lb, 0, nil);\r\n FOldPenHandle := SelectObject(Canvas.Handle, hpen);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n FOldPenStyle := Canvas.Pen.Style;\r\n FOldPenWidth := Canvas.Pen.Width;\r\n Canvas.Pen.Style := psDot;\r\n Canvas.Pen.Width := 1;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.StopSpecialPen;\r\nbegin\r\n {$IFDEF CMNLIB}\r\n DeleteObject(SelectObject(Canvas.Handle, FOldPenHandle));\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Canvas.Pen.Style := FOldPenStyle;\r\n Canvas.Pen.Width := FOldPenWidth;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.TranslateTransform(AX, AY: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n SaveMatrix;\r\n Canvas.MultiplyMatrix(TMatrix.CreateTranslation(AX, AY));\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextGeneral.GetFillColor: TTMSFNCGraphicsColor;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := Canvas.Fill.Color;\r\n {$ENDIF}\r\n {$IFNDEF FMXLIB}\r\n Result := Canvas.Brush.Color;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextGeneral.GetNativeCanvas: Pointer;\r\nbegin\r\n Result := Canvas;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.PathClose(APath: Pointer);\r\nbegin\r\n TTMSFNCGraphicsPath(APath).ClosePath;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.PathLineTo(APath: Pointer;\r\n APoint: TPointF);\r\nbegin\r\n TTMSFNCGraphicsPath(APath).LineTo(APoint);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.PathMoveTo(APath: Pointer;\r\n APoint: TPointF);\r\nbegin\r\n TTMSFNCGraphicsPath(APath).MoveTo(APoint);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.PathOpen(APath: Pointer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.Render;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.ResetClip;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.ResetTextAngle(AAngle: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if AAngle <> 0 then\r\n Canvas.SetMatrix(FTextMatrix);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n if AAngle <> 0 then\r\n Canvas.SetTransform(1, 0, 0, 1, 0, 0);\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.ResetTransform;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n RestoreMatrix;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.RestoreState(AState: TTMSFNCGraphicsSaveState);\r\nbegin\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF VCLLIB}\r\n RestoreDC(Canvas.Handle, AState.SaveDC);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Canvas.Clipping := False;\r\n Canvas.RestoreHandleState;\r\n {$ENDIF}\r\n AState.SaveDC := 0;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n Canvas.RestoreState(AState.SaveDC);\r\n AState.SaveDC := nil;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Canvas.Restore;\r\n {$ENDIF}\r\n\r\n {$IFNDEF GDIPLUSDRAWING}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Refresh;\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.RotateTransform(AAngle: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n SaveMatrix;\r\n Canvas.MultiplyMatrix(TMatrix.CreateRotation(DegToRad(AAngle)));\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SaveState(AState: TTMSFNCGraphicsSaveState);\r\nbegin\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Refresh;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n AState.SaveDC := Canvas.SaveState;\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n AState.SaveDC := SaveDC(Canvas.Handle);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Canvas.SaveHandleState;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Canvas.Save;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.ScaleTransform(AX, AY: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n SaveMatrix;\r\n Canvas.MultiplyMatrix(TMatrix.CreateScaling(AX, AY));\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextGeneral.SetTextAngle(ARect: TRectF; AAngle: Single): TRectF;\r\n{$IFDEF FMXWEBLIB}\r\nvar\r\n ar: Single;\r\n cx: TPointF;\r\n {$IFDEF FMXLIB}\r\n rm: TMatrix;\r\n {$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n Result := ARect;\r\n {$IFDEF FMXWEBLIB}\r\n if AAngle <> 0 then\r\n begin\r\n ar := DegToRad(AAngle);\r\n cx.X := Result.Left + (Result.Right - Result.Left) / 2;\r\n cx.Y := Result.Top + (Result.Bottom - Result.Top) / 2;\r\n {$IFDEF FMXLIB}\r\n FTextMatrix := Canvas.Matrix;\r\n rm := TMatrix.CreateRotation(ar) * TMatrix.CreateTranslation(cx.X, cx.Y);\r\n Canvas.MultiplyMatrix(rm);\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Canvas.Transform(Cos(ar), Sin(ar), -Sin(ar), Cos(ar), cx.X, cx.Y);\r\n {$ENDIF}\r\n if (Result.Right - Result.Left) < (Result.Bottom - Result.Top) then\r\n Result := RectF(-(Result.Bottom - Result.Top) / 2, -(Result.Right - Result.Left) / 2, (Result.Bottom - Result.Top) / 2, (Result.Right - Result.Left) / 2)\r\n else\r\n Result := RectF(-(Result.Right - Result.Left) / 2, -(Result.Bottom - Result.Top) / 2, (Result.Right - Result.Left) / 2, (Result.Bottom - Result.Top) / 2);\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetTextQuality(\r\n ATextQuality: TTMSFNCGraphicsTextQuality);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetSize(AWidth, AHeight: Single);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetShowAcceleratorChar(AShowAcceleratorChar: Boolean);\r\nbegin\r\n FShowAcceleratorChar := AShowAcceleratorChar;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetAntiAliasing(AAntiAliasing: Boolean);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFill(AFill: TTMSFNCGraphicsFill);\r\n{$IFDEF FMXLIB}\r\nvar\r\n pt: TGradientPoint;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Fill.Color := AFill.Color;\r\n case AFill.Kind of\r\n gfkSolid:\r\n begin\r\n Canvas.Fill.Kind := TBrushKind.Solid;\r\n end;\r\n gfkGradient:\r\n begin\r\n Canvas.Fill.Kind := TBrushKind.Gradient;\r\n Canvas.Fill.Gradient.Points.Clear;\r\n\r\n if (AFill.ColorMirror <> gcNull) and (AFill.ColorMirrorTo <> gcNull) then\r\n begin\r\n pt := TGradientPoint(Canvas.Fill.Gradient.Points.Add);\r\n pt.Color := AFill.Color;\r\n pt.Offset := 0;\r\n\r\n pt := TGradientPoint(Canvas.Fill.Gradient.Points.Add);\r\n pt.Color := AFill.ColorTo;\r\n pt.Offset := 0.5;\r\n\r\n pt := TGradientPoint(Canvas.Fill.Gradient.Points.Add);\r\n pt.Color := AFill.ColorMirror;\r\n pt.Offset := 0.5;\r\n\r\n pt := TGradientPoint(Canvas.Fill.Gradient.Points.Add);\r\n pt.Color := AFill.ColorMirrorTo;\r\n pt.Offset := 1;\r\n end\r\n else\r\n begin\r\n pt := TGradientPoint(Canvas.Fill.Gradient.Points.Add);\r\n pt.Color := AFill.Color;\r\n pt.Offset := 0;\r\n\r\n pt := TGradientPoint(Canvas.Fill.Gradient.Points.Add);\r\n pt.Color := AFill.ColorTo;\r\n pt.Offset := 1;\r\n end;\r\n\r\n case AFill.Orientation of\r\n gfoHorizontal:\r\n begin\r\n Canvas.Fill.Gradient.StartPosition.Point := PointF(0, 0.5);\r\n Canvas.Fill.Gradient.StopPosition.Point := PointF(1, 0.5);\r\n end;\r\n gfoVertical:\r\n begin\r\n Canvas.Fill.Gradient.StartPosition.Point := PointF(0.5, 0);\r\n Canvas.Fill.Gradient.StopPosition.Point := PointF(0.5, 1);\r\n end;\r\n end;\r\n end\r\n else\r\n Canvas.Fill.Kind := TBrushKind.None;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Brush.Color := AFill.Color;\r\n case AFill.Kind of\r\n gfkSolid, gfkGradient: Canvas.Brush.Style := bsSolid;\r\n gfkNone: Canvas.Brush.Style := bsClear;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFillColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Fill.Color := AColor;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Brush.Color := AColor;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFillKind(AKind: TTMSFNCGraphicsFillKind);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Fill.Kind := TBrushKind(Integer(AKind));\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n case AKind of\r\n gfkNone: Canvas.Brush.Style := bsClear;\r\n gfkSolid, gfkGradient: Canvas.Brush.Style := bsSolid;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFont(AFont: TTMSFNCGraphicsFont);\r\nbegin\r\n Canvas.Font.Assign(AFont);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFontColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Fill.Color := AColor;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Font.Color := AColor;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFontName(AName: string);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Font.Family := AName;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Font.Name := AName;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFontSize(ASize: Integer);\r\nbegin\r\n Canvas.Font.Size := ASize;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetFontStyles(AStyle: TFontStyles);\r\nbegin\r\n Canvas.Font.Style := AStyle;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetStroke(AStroke: TTMSFNCGraphicsStroke);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Stroke.Color := AStroke.Color;\r\n Canvas.Stroke.Thickness := AStroke.Width;\r\n case AStroke.Kind of\r\n gskSolid:\r\n begin\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n Canvas.Stroke.Dash := TStrokeDash.Solid;\r\n end;\r\n gskNone: Canvas.Stroke.Kind := TBrushKind.None;\r\n else\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n end;\r\n\r\n case AStroke.Kind of\r\n gskDash: Canvas.Stroke.Dash := TStrokeDash.Dash;\r\n gskDot: Canvas.Stroke.Dash := TStrokeDash.Dot;\r\n gskDashDot: Canvas.Stroke.Dash := TStrokeDash.DashDot;\r\n gskDashDotDot: Canvas.Stroke.Dash := TStrokeDash.DashDotDot;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Pen.Color := AStroke.Color;\r\n Canvas.Pen.Width := Round(AStroke.Width);\r\n case AStroke.Kind of\r\n gskSolid: Canvas.Pen.Style := psSolid;\r\n gskNone: Canvas.Pen.Style := psClear;\r\n gskDash: Canvas.Pen.Style := psDash;\r\n gskDot: Canvas.Pen.Style := psDot;\r\n gskDashDot: Canvas.Pen.Style := psDashDot;\r\n gskDashDotDot: Canvas.Pen.Style := psDashDotDot;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetStrokeColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Stroke.Color := AColor;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Pen.Color := AColor;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetStrokeKind(\r\n AKind: TTMSFNCGraphicsStrokeKind);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n case AKind of\r\n gskNone: Canvas.Stroke.Kind := TBrushKind.None;\r\n gskSolid:\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Canvas.Stroke.Dash := TStrokeDash.Solid;\r\n {$ELSE}\r\n Canvas.StrokeDash := TStrokeDash.Solid;\r\n {$IFEND}\r\n {$HINTS ON}\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n end;\r\n gskDash:\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Canvas.Stroke.Dash := TStrokeDash.Dash;\r\n {$ELSE}\r\n Canvas.StrokeDash := TStrokeDash.Dash;\r\n {$IFEND}\r\n {$HINTS ON}\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n end;\r\n gskDot:\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Canvas.Stroke.Dash := TStrokeDash.Dot;\r\n {$ELSE}\r\n Canvas.StrokeDash := TStrokeDash.Dot;\r\n {$IFEND}\r\n {$HINTS ON}\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n end;\r\n gskDashDot:\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Canvas.Stroke.Dash := TStrokeDash.DashDot;\r\n {$ELSE}\r\n Canvas.StrokeDash := TStrokeDash.DashDot;\r\n {$IFEND}\r\n {$HINTS ON}\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n end;\r\n gskDashDotDot:\r\n begin\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 31}\r\n Canvas.Stroke.Dash := TStrokeDash.DashDotDot;\r\n {$ELSE}\r\n Canvas.StrokeDash := TStrokeDash.DashDotDot;\r\n {$IFEND}\r\n {$HINTS ON}\r\n Canvas.Stroke.Kind := TBrushKind.Solid;\r\n end;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n case AKind of\r\n gskNone: Canvas.Pen.Style := psClear;\r\n gskSolid: Canvas.Pen.Style := psSolid;\r\n gskDash: Canvas.Pen.Style := psDash;\r\n gskDot: Canvas.Pen.Style := psDot;\r\n gskDashDot: Canvas.Pen.Style := psDashDot;\r\n gskDashDotDot: Canvas.Pen.Style := psDashDotDot;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextGeneral.SetStrokeWidth(AWidth: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Canvas.Stroke.Thickness := AWidth;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Canvas.Pen.Width := Round(AWidth);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction GetNativeContextClass: TTMSFNCGraphicsContextClass;\r\nbegin\r\n Result := TTMSFNCGraphicsContextGeneral;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2017 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCGraphics.WEB;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\n{$IFDEF WEBLIB}\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCGraphicsTypes, WEBLib.TMSFNCUtils, {%H-}Types, WEBLib.TMSFNCTypes,\r\n WEBLib.TMSFNCGraphics, WEBLib.Graphics;\r\n\r\ntype\r\n TTMSFNCGraphicsContextWEB = class(TTMSFNCGraphicsContext)\r\n private\r\n FActivePath: TTMSFNCGraphicsPath;\r\n FScale: Single;\r\n FNeedsRendering: Boolean;\r\n FFont: TTMSFNCGraphicsFont;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FContextSize: TSizeF;\r\n FNCanvas: Pointer;\r\n FBitmap: TBitmap;\r\n protected\r\n function GetNativeCanvas: Pointer; override;\r\n procedure DestroyResources;\r\n function DrawTextInternal(AText: String; ARect: TRectF; {%H-}AWordWrap: Boolean; AHorizontalAlignment: TTMSFNCGraphicsTextAlign; ACalculate: Boolean): TRectF;\r\n procedure DrawLinearGradient(ARect: TRectF);\r\n procedure FontChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure RestoreContext;\r\n procedure SaveContext;\r\n procedure ApplyStroke;\r\n procedure ApplyFill;\r\n public\r\n constructor Create(const AGraphics: TTMSFNCGraphics); override;\r\n destructor Destroy; override;\r\n function GetFillColor: TTMSFNCGraphicsColor; override;\r\n function CalculateText(AText: string; ARect: TRectF; AWordWrapping: Boolean): TRectF; override;\r\n function SetTextAngle(ARect: TRectF; {%H-}AAngle: Single): TRectF; override;\r\n function CreatePath: Pointer; override;\r\n procedure Render; override;\r\n procedure PathOpen({%H-}APath: Pointer); override;\r\n procedure PathMoveTo({%H-}APath: Pointer; APoint: TPointF); override;\r\n procedure PathLineTo({%H-}APath: Pointer; APoint: TPointF); override;\r\n procedure PathClose({%H-}APath: Pointer); override;\r\n procedure ResetClip; override;\r\n procedure ResetTransform; override;\r\n procedure ScaleTransform(AX, AY: Single); override;\r\n procedure RotateTransform(AAngle: Single); override;\r\n procedure TranslateTransform(AX, AY: Single); override;\r\n procedure SetTextQuality({%H-}ATextQuality: TTMSFNCGraphicsTextQuality); override;\r\n procedure SetAntiAliasing(AAntiAliasing: Boolean); override;\r\n procedure SetShowAcceleratorChar({%H-}AShowAcceleratorChar: Boolean); override;\r\n procedure SetSize(AWidth, AHeight: Single); override;\r\n procedure ResetTextAngle({%H-}AAngle: Single); override;\r\n procedure BeginScene; override;\r\n procedure EndScene; override;\r\n procedure StartSpecialPen; override;\r\n procedure StopSpecialPen; override;\r\n procedure RestoreState({%H-}AState: TTMSFNCGraphicsSaveState); override;\r\n procedure SaveState({%H-}AState: TTMSFNCGraphicsSaveState); override;\r\n procedure SetFontSize(ASize: Integer); override;\r\n procedure SetFontColor(AColor: TTMSFNCGraphicsColor); override;\r\n procedure SetFontName(AName: string); override;\r\n procedure SetFont(AFont: TTMSFNCGraphicsFont); override;\r\n procedure SetFontStyles(AStyle: TFontStyles); override;\r\n procedure SetFill(AFill: TTMSFNCGraphicsFill); override;\r\n procedure SetFillKind(AKind: TTMSFNCGraphicsFillKind); override;\r\n procedure SetFillColor(AColor: TTMSFNCGraphicsColor); override;\r\n procedure SetStroke(AStroke: TTMSFNCGraphicsStroke); override;\r\n procedure SetStrokeKind(AKind: TTMSFNCGraphicsStrokeKind); override;\r\n procedure SetStrokeColor(AColor: TTMSFNCGraphicsColor); override;\r\n procedure SetStrokeWidth(AWidth: Single); override;\r\n procedure DrawLine({%H-}AStroke: TTMSFNCGraphicsStroke; AFromPoint: TPointF; AToPoint: TPointF; {%H-}AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode = gcpmRightDown; {%H-}AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode = gcpmRightDown); override;\r\n procedure DrawPolygon({%H-}AStroke: TTMSFNCGraphicsStroke; APolygon: TTMSFNCGraphicsPathPolygon); override;\r\n procedure FillPolygon({%H-}AFill: TTMSFNCGraphicsFill; APolygon: TTMSFNCGraphicsPathPolygon); override;\r\n procedure DrawPolyline({%H-}AStroke: TTMSFNCGraphicsStroke; APolyline: TTMSFNCGraphicsPathPolygon); override;\r\n procedure FillPolyline({%H-}AFill: TTMSFNCGraphicsFill; APolyline: TTMSFNCGraphicsPathPolygon); override;\r\n procedure FillArc({%H-}AFill: TTMSFNCGraphicsFill; {%H-}ACenter, {%H-}ARadius: TPointF; {%H-}AStartAngle, {%H-}ASweepAngle: Single); override;\r\n procedure DrawArc({%H-}AStroke: TTMSFNCGraphicsStroke; ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single); override;\r\n procedure FillRect({%H-}AFill: TTMSFNCGraphicsFill; ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawRect({%H-}AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ASides: TTMSFNCGraphicsSides; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure FillRoundRect({%H-}AFill: TTMSFNCGraphicsFill; ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawRoundRect({%H-}AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure FillEllipse({%H-}AFill: TTMSFNCGraphicsFill; ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawEllipse({%H-}AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawBitmap(ABitmap: TTMSFNCDrawBitmap; {%H-}ASrcRect, ADstRect: TRectF; {%H-}AOpacity: Single); override;\r\n procedure ClipRect(ARect: TRectF); override;\r\n procedure ClipPath({%H-}APath: TTMSFNCGraphicsPath); override;\r\n procedure DrawFocusPath({%H-}AStroke: TTMSFNCGraphicsStroke; {%H-}APath: TTMSFNCGraphicsPath; {%H-}AColor: TTMSFNCGraphicsColor); override;\r\n procedure DrawFocusRectangle({%H-}AStroke: TTMSFNCGraphicsStroke; {%H-}ARect: TRectF; {%H-}AColor: TTMSFNCGraphicsColor; {%H-}AModifyRectMode: TTMSFNCGraphicsModifyRectMode = gcrmShrinkAll); override;\r\n procedure DrawText(AText: string; ARect: TRectF; AWordWrapping: Boolean; AHorizontalAlign, AVerticalAlign: TTMSFNCGraphicsTextAlign; {%H-}ATrimming: TTMSFNCGraphicsTextTrimming; {%H-}AAngle: Single); override;\r\n procedure DrawPath({%H-}AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon); override;\r\n procedure FillPath({%H-}AFill: TTMSFNCGraphicsFill; APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode = pdmPolygon); override;\r\n end;\r\n\r\nfunction GetNativeContextClass: TTMSFNCGraphicsContextClass;\r\n\r\n{$ENDIF}\r\n\r\nimplementation\r\n\r\n{$IFDEF WEBLIB}\r\n\r\nuses\r\n SysUtils, Math;\r\n\r\nfunction GetNativeContextClass: TTMSFNCGraphicsContextClass;\r\nbegin\r\n Result := TTMSFNCGraphicsContextWEB;\r\nend;\r\n\r\n{ TTMSFNCGraphicsContextWEB }\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ApplyFill;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n case FFill.Kind of\r\n gfkSolid:\r\n begin\r\n// cairo_set_source_rgba(FNCanvas, TTMSFNCGraphics.GetColorRed(FFill.Color) / 255, TTMSFNCGraphics.GetColorGreen(FFill.Color) / 255,\r\n// TTMSFNCGraphics.GetColorBlue(FFill.Color) / 255, FFill.Opacity);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ApplyStroke;\r\nvar\r\n f: array of Double;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// cairo_set_line_width(FNCanvas, FStroke.Width);\r\n// cairo_set_source_rgba(FNCanvas, TTMSFNCGraphics.GetColorRed(FStroke.Color) / 255, TTMSFNCGraphics.GetColorGreen(FStroke.Color) / 255,\r\n// TTMSFNCGraphics.GetColorBlue(FStroke.Color) / 255, FStroke.Opacity);\r\n\r\n// case FStroke.Kind of\r\n// gskSolid, gskNone: cairo_set_dash(FNCanvas, nil,0, 0);\r\n// gskDash:\r\n// begin\r\n// SetLength(f, 2);\r\n// f[0] := 3;\r\n// f[1] := 1;\r\n// cairo_set_dash(FNCanvas, @f[0], Length(f), 0);\r\n// end;\r\n// gskDot:\r\n// begin\r\n// SetLength(f, 2);\r\n// f[0] := 1;\r\n// f[1] := 1;\r\n// cairo_set_dash(FNCanvas, @f[0], Length(f), 0);\r\n// end;\r\n// gskDashDot:\r\n// begin\r\n// SetLength(f, 4);\r\n// f[0] := 3;\r\n// f[1] := 1;\r\n// f[2] := 1;\r\n// f[3] := 1;\r\n// cairo_set_dash(FNCanvas, @f[0], Length(f), 0);\r\n// end;\r\n// gskDashDotDot:\r\n// begin\r\n// SetLength(f, 6);\r\n// f[0] := 3;\r\n// f[1] := 1;\r\n// f[2] := 1;\r\n// f[3] := 1;\r\n// f[4] := 1;\r\n// f[5] := 1;\r\n// cairo_set_dash(FNCanvas, @f[0], Length(f), 0);\r\n// end;\r\n// end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.BeginScene;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextWEB.CalculateText(AText: string; ARect: TRectF;\r\n AWordWrapping: Boolean): TRectF;\r\nbegin\r\n Result := RectF(0, 0, 0, 0);\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\n Result := DrawTextInternal(AText, ARect, AWordWrapping, gtaLeading, True);\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ClipPath(APath: TTMSFNCGraphicsPath);\r\n//var\r\n// pth: ^cairo_path_t;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// pth := ConvertToPath(APath);\r\n try\r\n SaveContext;\r\n// cairo_append_path(FNCanvas, pth);\r\n// cairo_clip(FNCanvas);\r\n finally\r\n\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ClipRect(ARect: TRectF);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_rectangle(FNCanvas, ARect.Left, ARect.Top, ARect.Width, ARect.Height);\r\n// cairo_clip(FNCanvas);\r\nend;\r\n\r\nconstructor TTMSFNCGraphicsContextWEB.Create(const AGraphics: TTMSFNCGraphics);\r\nbegin\r\n inherited;\r\n FScale := TTMSFNCUtils.GetDPIScale;\r\n FNeedsRendering := True;\r\n FContextSize.cx := 0;\r\n FContextSize.cy := 0;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @FontChanged;\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FStroke.OnChanged := @StrokeChanged;\r\n FFill := TTMSFNCGraphicsFill.Create;\r\n FFill.OnChanged := @FillChanged;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextWEB.CreatePath: Pointer;\r\nbegin\r\n// cairo_new_path(FNCanvas);\r\n// Result := cairo_copy_path(FNCanvas);\r\nend;\r\n\r\ndestructor TTMSFNCGraphicsContextWEB.Destroy;\r\nbegin\r\n Render;\r\n\r\n if Assigned(FFont) then\r\n begin\r\n FFont.Free;\r\n FFont := nil;\r\n end;\r\n\r\n if Assigned(FFill) then\r\n begin\r\n FFill.Free;\r\n FFill := nil;\r\n end;\r\n\r\n if Assigned(FStroke) then\r\n begin\r\n FStroke.Free;\r\n FStroke := nil;\r\n end;\r\n\r\n DestroyResources;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DestroyResources;\r\nbegin\r\n if Assigned(FNCanvas) then\r\n begin\r\n RestoreContext;\r\n// cairo_destroy(FNCanvas);\r\n FNCanvas := nil;\r\n end;\r\n\r\n if Assigned(FBitmap) then\r\n begin\r\n FBitmap.Free;\r\n FBitmap := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawArc(AStroke: TTMSFNCGraphicsStroke;\r\n ACenter, ARadius: TPointF; AStartAngle, ASweepAngle: Single);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_arc(FNCanvas, ACenter.X, ACenter.Y, ARadius.X, DegToRad(AStartAngle), DegToRad(AStartAngle + ASweepAngle));\r\n ApplyStroke;\r\n// cairo_stroke(FNCanvas);\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawBitmap(ABitmap: TTMSFNCDrawBitmap;\r\n ASrcRect, ADstRect: TRectF; AOpacity: Single);\r\nvar\r\n R: TRectF;\r\n// img: Pcairo_surface_t;\r\n//\r\n// function GraphicToARGB32(Source: TGraphic; buf: PByte): Boolean;\r\n// var\r\n// p: PDWord;\r\n// x, y: Integer;\r\n// c: TFPColor;\r\n// Img: TLazIntfImage;\r\n// begin\r\n// Img := TRasterImage(Source).CreateIntfImage;\r\n// try\r\n// if Img.DataDescription.Format = ricfNone then begin\r\n// Result := False;\r\n// Exit;\r\n// end;\r\n// p := Pointer(buf);\r\n// for y := 0 to Source.Height-1 do begin\r\n// for x := 0 to Source.Width-1 do begin\r\n// c := Img.Colors[x, y];\r\n// p^ := Hi(c.alpha) shl 24 + Hi(c.red) shl 16 + Hi(c.green) shl 8 + Hi(c.blue);\r\n// inc(p);\r\n// end;\r\n// end;\r\n// finally\r\n// Img.Free;\r\n// end;\r\n// Result := True;\r\n// end;\r\n\r\n// function CreateCairoImage: Pcairo_surface_t;\r\n// var\r\n// buf: PByte;\r\n// begin\r\n// try\r\n// buf := GetMem(ABitmap.Width*ABitmap.Height*4);\r\n//\r\n// if not GraphicToARGB32(ABitmap, buf) then\r\n// Exit;\r\n//\r\n// Result := cairo_image_surface_create_for_data(buf, CAIRO_FORMAT_ARGB32, ABitmap.Width, ABitmap.Height, ABitmap.Width * 4);\r\n// finally\r\n// Freemem(buf);\r\n// end;\r\n// end;\r\nbegin\r\n if not Assigned(ABitmap) or not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\n R := ADstRect;\r\n// img := CreateCairoImage;\r\n try\r\n// cairo_translate(FNCanvas, R.Left, R.Top);\r\n// cairo_scale(FNCanvas, r.Width / ABitmap.Width, r.Height / ABitmap.Height);\r\n// cairo_set_source_surface(FNCanvas, img, 0, 0);\r\n// cairo_paint(FNCanvas);\r\n finally\r\n// cairo_surface_destroy(img);\r\n end;\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawEllipse(AStroke: TTMSFNCGraphicsStroke;\r\n ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n r: TRectF;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n r := ARect;\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_arc(FNCanvas, r.Left + r.Width / 2, r.Top + r.Height / 2, r.Width / 2, 0, 2 * PI);\r\n ApplyStroke;\r\n// cairo_stroke(FNCanvas);\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawFocusPath(\r\n AStroke: TTMSFNCGraphicsStroke; APath: TTMSFNCGraphicsPath;\r\n AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawFocusRectangle(\r\n AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; AColor: TTMSFNCGraphicsColor;\r\n AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawLine(AStroke: TTMSFNCGraphicsStroke;\r\n AFromPoint: TPointF; AToPoint: TPointF;\r\n AModifyPointModeFrom: TTMSFNCGraphicsModifyPointMode;\r\n AModifyPointModeTo: TTMSFNCGraphicsModifyPointMode);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_move_to(FNCanvas, AFromPoint.X, AFromPoint.Y);\r\n// cairo_line_to(FNCanvas, AToPoint.X, AToPoint.Y);\r\n// cairo_stroke(FNCanvas);\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawLinearGradient(ARect: TRectF);\r\n//var\r\n// pat: Pcairo_pattern_t;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n case FFill.Orientation of\r\n gfoHorizontal: {pat := cairo_pattern_create_linear(ARect.Left, ARect.Top + ARect.Height / 2, ARect.Right, ARect.Top + ARect.Height / 2)};\r\n gfoVertical: {pat := cairo_pattern_create_linear(ARect.Left + ARect.Width / 2, ARect.Top, ARect.Left + ARect.Width / 2, ARect.Bottom)};\r\n end;\r\n\r\n if (FFill.ColorTo <> gcnull) and (FFill.ColorMirror <> gcNull) then\r\n begin\r\n// cairo_pattern_add_color_stop_rgba(pat, 0, TTMSFNCGraphics.GetColorRed(FFill.Color) / 255, TTMSFNCGraphics.GetColorGreen(FFill.Color) / 255, TTMSFNCGraphics.GetColorBlue(FFill.Color) / 255, FFill.Opacity);\r\n// cairo_pattern_add_color_stop_rgba(pat, 0.5, TTMSFNCGraphics.GetColorRed(FFill.ColorTo) / 255, TTMSFNCGraphics.GetColorGreen(FFill.ColorTo) / 255, TTMSFNCGraphics.GetColorBlue(FFill.ColorTo) / 255, FFill.Opacity);\r\n// cairo_pattern_add_color_stop_rgba(pat, 0.5, TTMSFNCGraphics.GetColorRed(FFill.ColorMirror) / 255, TTMSFNCGraphics.GetColorGreen(FFill.ColorMirror) / 255, TTMSFNCGraphics.GetColorBlue(FFill.ColorMirror) / 255, FFill.Opacity);\r\n// cairo_pattern_add_color_stop_rgba(pat, 1, TTMSFNCGraphics.GetColorRed(FFill.ColorMirrorTo) / 255, TTMSFNCGraphics.GetColorGreen(FFill.ColorMirrorTo) / 255, TTMSFNCGraphics.GetColorBlue(FFill.ColorMirrorTo) / 255, FFill.Opacity);\r\n end\r\n else if FFill.ColorTo <> gcNull then\r\n begin\r\n// cairo_pattern_add_color_stop_rgba(pat, 0, TTMSFNCGraphics.GetColorRed(FFill.Color) / 255, TTMSFNCGraphics.GetColorGreen(FFill.Color) / 255, TTMSFNCGraphics.GetColorBlue(FFill.Color) / 255, FFill.Opacity);\r\n// cairo_pattern_add_color_stop_rgba(pat, 1, TTMSFNCGraphics.GetColorRed(FFill.ColorTo) / 255, TTMSFNCGraphics.GetColorGreen(FFill.ColorTo) / 255, TTMSFNCGraphics.GetColorBlue(FFill.ColorTo) / 255, FFill.Opacity);\r\n end;\r\n\r\n// cairo_rectangle(FNCanvas, ARect.Left, ARect.Top, ARect.Width, ARect.Height);\r\n// cairo_set_source(FNCanvas, pat);\r\n// cairo_fill(FNCanvas);\r\n// cairo_pattern_destroy(pat);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawPath(AStroke: TTMSFNCGraphicsStroke;\r\n APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode);\r\nvar\r\n p: TTMSFNCGraphicsPathPolygon;\r\nbegin\r\n if Assigned(APath) then\r\n begin\r\n FActivePath := APath;\r\n SetLength(p, 0);\r\n APath.FlattenToPolygon(p);\r\n case APathMode of\r\n pdmPolygon: DrawPolygon(AStroke, p);\r\n pdmPolyline: DrawPolyline(AStroke, p);\r\n end;\r\n FActivePath := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawPolygon(AStroke: TTMSFNCGraphicsStroke;\r\n APolygon: TTMSFNCGraphicsPathPolygon);\r\nvar\r\n I: Integer;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n if Length(APolygon) = 0 then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_move_to(FNCanvas, APolygon[0].X, APolygon[0].Y);\r\n// for I := 1 to Length(APolygon) - 1 do\r\n// cairo_line_to(FNCanvas, APolygon[I].X, APolygon[I].Y);\r\n// cairo_close_path(FNCanvas);\r\n ApplyStroke;\r\n// cairo_stroke(FNCanvas);\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawPolyline(AStroke: TTMSFNCGraphicsStroke;\r\n APolyline: TTMSFNCGraphicsPathPolygon);\r\nvar\r\n I: Integer;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n if Length(APolyline) = 0 then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_move_to(FNCanvas, APolyline[0].X, APolyline[0].Y);\r\n// for I := 1 to Length(APolyline) - 1 do\r\n// cairo_line_to(FNCanvas, APolyline[I].X, APolyline[I].Y);\r\n ApplyStroke;\r\n// cairo_stroke(FNCanvas);\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawRect(AStroke: TTMSFNCGraphicsStroke;\r\n ARect: TRectF; ASides: TTMSFNCGraphicsSides;\r\n AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n r: TRectF;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n r := ARect;\r\n if gsTop in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Top), PointF(r.Right, r.Top));\r\n if gsLeft in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Top), PointF(r.Left, r.Bottom));\r\n if gsBottom in ASides then\r\n DrawLine(AStroke, PointF(r.Left, r.Bottom), PointF(r.Right, r.Bottom));\r\n if gsRight in ASides then\r\n DrawLine(AStroke, PointF(r.Right, r.Top), PointF(r.Right, r.Bottom));\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawRoundRect(\r\n AStroke: TTMSFNCGraphicsStroke; ARect: TRectF; ARounding: Single;\r\n ACorners: TTMSFNCGraphicsCorners;\r\n AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n pth: TTMSFNCGraphicsPath;\r\n r: TRectF;\r\n rc: Single;\r\nbegin\r\n r := ARect;\r\n rc := ARounding;\r\n\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n if gcBottomLeft in ACorners then\r\n begin\r\n pth.MoveTo(PointF(r.Left + rc, r.Bottom));\r\n pth.AddArc(PointF(r.Left + rc, r.Bottom - rc), PointF(rc, rc), -270, 90);\r\n pth.LineTo(PointF(r.Left, r.Bottom - rc));\r\n end\r\n else\r\n begin\r\n pth.MoveTo(PointF(r.Left, r.Bottom));\r\n end;\r\n\r\n if gcTopLeft in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Left, r.Top + rc));\r\n pth.AddArc(PointF(r.Left + rc, r.Top + rc), PointF(rc, rc), -180, 90);\r\n pth.LineTo(PointF(r.Left + rc, r.Top));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Left, r.Top));\r\n\r\n if gcTopRight in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Right - rc, r.Top));\r\n pth.AddArc(PointF(r.Right - rc, r.Top + rc), PointF(rc, rc), -90, 90);\r\n pth.LineTo(PointF(r.Right, r.Top + rc));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Right, r.Top));\r\n\r\n if gcBottomRight in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Right, r.Bottom - rc));\r\n pth.AddArc(PointF(r.Right - rc, r.Bottom - rc), PointF(rc, rc), 0, 90);\r\n pth.LineTo(PointF(r.Right - rc, r.Bottom));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Right, r.Bottom));\r\n\r\n if gcBottomLeft in ACorners then\r\n pth.LineTo(PointF(r.Left + rc, r.Bottom))\r\n else\r\n pth.LineTo(PointF(r.Left, r.Bottom));\r\n\r\n pth.ClosePath;\r\n\r\n DrawPath(FStroke, pth);\r\n finally\r\n pth.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.DrawText(AText: string; ARect: TRectF;\r\n AWordWrapping: Boolean; AHorizontalAlign,\r\n AVerticalAlign: TTMSFNCGraphicsTextAlign;\r\n ATrimming: TTMSFNCGraphicsTextTrimming; AAngle: Single);\r\nvar\r\n R: TRectF;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\n R := DrawTextInternal(AText, ARect, AWordWrapping, AHorizontalAlign, True);\r\n case AVerticalAlign of\r\n gtaCenter: DrawTextInternal(AText, RectF(ARect.Left, ARect.Top + ((ARect.Bottom - ARect.Top) - (r.Bottom - r.Top)) / 2, ARect.Right, ARect.Top + ((ARect.Bottom - ARect.Top) - (r.Bottom - r.Top)) / 2 + (r.Bottom - r.Top)), AWordWrapping, AHorizontalAlign, False);\r\n gtaLeading: DrawTextInternal(AText, RectF(ARect.Left, ARect.Top, ARect.Right, ARect.Top + (r.Bottom - r.Top)), AWordWrapping, AHorizontalAlign, False);\r\n gtaTrailing: DrawTextInternal(AText, RectF(ARect.Left, ARect.Bottom - (r.Bottom - r.Top), ARect.Right, ARect.Bottom), AWordWrapping, AHorizontalAlign, False);\r\n end;\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.EndScene;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n Render;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillArc(AFill: TTMSFNCGraphicsFill; ACenter,\r\n ARadius: TPointF; AStartAngle, ASweepAngle: Single);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_arc(FNCanvas, ACenter.X, ACenter.Y, ARadius.X, DegToRad(AStartAngle), DegToRad(AStartAngle + ASweepAngle));\r\n case AFill.Kind of\r\n gfkSolid:\r\n begin\r\n ApplyFill;\r\n// cairo_fill(FNCanvas);\r\n end;\r\n gfkGradient:\r\n begin\r\n// cairo_clip(FNCanvas);\r\n DrawLinearGradient(RectF(ACenter.X - ARadius.X, ACenter.Y - ARadius.Y, ACenter.X + ARadius.X, ACenter.Y + ARadius.Y));\r\n end;\r\n end;\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillChanged(Sender: TObject);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n ApplyFill;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillEllipse(AFill: TTMSFNCGraphicsFill;\r\n ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n r: TRectF;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n r := ARect;\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_arc(FNCanvas, r.Left + r.Width / 2, r.Top + r.Height / 2, r.Width / 2, 0, 2 * PI);\r\n case AFill.Kind of\r\n gfkSolid:\r\n begin\r\n ApplyFill;\r\n// cairo_fill(FNCanvas);\r\n end;\r\n gfkGradient:\r\n begin\r\n// cairo_clip(FNCanvas);\r\n DrawLinearGradient(r);\r\n end;\r\n end;\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillPath(AFill: TTMSFNCGraphicsFill;\r\n APath: TTMSFNCGraphicsPath; APathMode: TTMSFNCGraphicsPathDrawMode);\r\nvar\r\n p: TTMSFNCGraphicsPathPolygon;\r\nbegin\r\n if Assigned(APath) then\r\n begin\r\n FActivePath := APath;\r\n SetLength(p, 0);\r\n APath.FlattenToPolygon(p);\r\n case APathMode of\r\n pdmPolygon: FillPolygon(AFill, p);\r\n pdmPolyline: FillPolyline(AFill, p);\r\n end;\r\n FActivePath := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillPolygon(AFill: TTMSFNCGraphicsFill;\r\n APolygon: TTMSFNCGraphicsPathPolygon);\r\nvar\r\n I: Integer;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n if Length(Apolygon) = 0 then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_move_to(FNCanvas, APolygon[0].X, APolygon[0].Y);\r\n// for I := 1 to Length(APolygon) - 1 do\r\n// cairo_line_to(FNCanvas, APolygon[I].X, APolygon[I].Y);\r\n// cairo_close_path(FNCanvas);\r\n case AFill.Kind of\r\n gfkSolid:\r\n begin\r\n ApplyFill;\r\n// cairo_fill(FNCanvas);\r\n end;\r\n gfkGradient:\r\n begin\r\n// cairo_clip(FNCanvas);\r\n if Assigned(FActivePath) then\r\n DrawLinearGradient(FActivePath.GetBounds);\r\n end;\r\n end;\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillPolyline(AFill: TTMSFNCGraphicsFill;\r\n APolyline: TTMSFNCGraphicsPathPolygon);\r\nvar\r\n I: Integer;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n if Length(APolyline) = 0 then\r\n Exit;\r\n\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_move_to(FNCanvas, APolyline[0].X, APolyline[0].Y);\r\n// for I := 1 to Length(APolyline) - 1 do\r\n// cairo_line_to(FNCanvas, APolyline[I].X, APolyline[I].Y);\r\n case AFill.Kind of\r\n gfkSolid:\r\n begin\r\n ApplyFill;\r\n// cairo_fill(FNCanvas);\r\n end;\r\n gfkGradient:\r\n begin\r\n// cairo_clip(FNCanvas);\r\n if Assigned(FActivePath) then\r\n DrawLinearGradient(FActivePath.GetBounds);\r\n end;\r\n end;\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillRect(AFill: TTMSFNCGraphicsFill;\r\n ARect: TRectF; AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n r: TRectF;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n r := ARect;\r\n SaveContext;\r\n// cairo_new_path(FNCanvas);\r\n// cairo_rectangle(FNCanvas, r.Left, r.Top, r.Width, r.Height);\r\n case AFill.Kind of\r\n gfkSolid:\r\n begin\r\n ApplyFill;\r\n// cairo_fill(FNCanvas);\r\n end;\r\n gfkGradient:\r\n begin\r\n// cairo_clip(FNCanvas);\r\n DrawLinearGradient(r);\r\n end;\r\n end;\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FillRoundRect(AFill: TTMSFNCGraphicsFill;\r\n ARect: TRectF; ARounding: Single; ACorners: TTMSFNCGraphicsCorners;\r\n AModifyRectMode: TTMSFNCGraphicsModifyRectMode);\r\nvar\r\n pth: TTMSFNCGraphicsPath;\r\n r: TRectF;\r\n rc: Single;\r\nbegin\r\n r := ARect;\r\n rc := ARounding;\r\n\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n if gcBottomLeft in ACorners then\r\n begin\r\n pth.MoveTo(PointF(r.Left + rc, r.Bottom));\r\n pth.AddArc(PointF(r.Left + rc, r.Bottom - rc), PointF(rc, rc), -270, 90);\r\n pth.LineTo(PointF(r.Left, r.Bottom - rc));\r\n end\r\n else\r\n begin\r\n pth.MoveTo(PointF(r.Left, r.Bottom));\r\n end;\r\n\r\n if gcTopLeft in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Left, r.Top + rc));\r\n pth.AddArc(PointF(r.Left + rc, r.Top + rc), PointF(rc, rc), -180, 90);\r\n pth.LineTo(PointF(r.Left + rc, r.Top));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Left, r.Top));\r\n\r\n if gcTopRight in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Right - rc, r.Top));\r\n pth.AddArc(PointF(r.Right - rc, r.Top + rc), PointF(rc, rc), -90, 90);\r\n pth.LineTo(PointF(r.Right, r.Top + rc));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Right, r.Top));\r\n\r\n if gcBottomRight in ACorners then\r\n begin\r\n pth.LineTo(PointF(r.Right, r.Bottom - rc));\r\n pth.AddArc(PointF(r.Right - rc, r.Bottom - rc), PointF(rc, rc), 0, 90);\r\n pth.LineTo(PointF(r.Right - rc, r.Bottom));\r\n end\r\n else\r\n pth.LineTo(PointF(r.Right, r.Bottom));\r\n\r\n if gcBottomLeft in ACorners then\r\n pth.LineTo(PointF(r.Left + rc, r.Bottom))\r\n else\r\n pth.LineTo(PointF(r.Left, r.Bottom));\r\n\r\n pth.ClosePath;\r\n\r\n FillPath(FFill, pth);\r\n finally\r\n pth.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.FontChanged(Sender: TObject);\r\nbegin\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextWEB.GetFillColor: TTMSFNCGraphicsColor;\r\nbegin\r\n Result := Graphics.Fill.Color;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextWEB.GetNativeCanvas: Pointer;\r\nbegin\r\n Result := FNCanvas;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.PathClose(APath: Pointer);\r\nbegin\r\n// cairo_close_path(FNCanvas);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.PathLineTo(APath: Pointer; APoint: TPointF);\r\nbegin\r\n// cairo_line_to(FNCanvas, APoint.X, APoint.Y);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.PathMoveTo(APath: Pointer; APoint: TPointF);\r\nbegin\r\n// cairo_move_to(FNCanvas, APoint.X, APoint.Y);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.PathOpen(APath: Pointer);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.Render;\r\nbegin\r\n if not FNeedsRendering then\r\n Exit;\r\n\r\n// if Assigned(FNCanvas) and Assigned(FBitmap) then\r\n// Canvas.Draw(0, 0, FBitmap);\r\n\r\n FNeedsRendering := False;\r\n DestroyResources;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ResetClip;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ResetTextAngle(AAngle: Single);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n if AAngle <> 0 then\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ResetTransform;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n RestoreContext;\r\n SaveContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.RestoreState(\r\n AState: TTMSFNCGraphicsSaveState);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n RestoreContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.RotateTransform(AAngle: Single);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// cairo_rotate(FNCanvas, DegToRad(AAngle));\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextWEB.DrawTextInternal(AText: String; ARect: TRectF; AWordWrap: Boolean; AHorizontalAlignment: TTMSFNCGraphicsTextAlign; ACalculate: Boolean): TRectF;\r\nvar\r\n i: Integer;\r\n s, sn, st: string;\r\n l: Integer;\r\n w, mw: Single;\r\n f: Boolean;\r\n p: Integer;\r\n tw: Single;\r\n th: Single;\r\n lcnt: Integer;\r\n rs: TRectF;\r\n fws: Single;\r\n// te: cairo_text_extents_t;\r\n ths: Single;\r\n\r\n procedure ApplyFont;\r\n// var\r\n// slant: cairo_font_slant_t;\r\n// weight: cairo_font_weight_t;\r\n// fn: string;\r\n// sz: Single;\r\n begin\r\n// fn := FFont.Name;\r\n// if (fn = '') or (UpperCase(fn) = 'DEFAULT') then\r\n// fn := 'sans-serif';\r\n//\r\n// sz := FFont.Size;\r\n// if sz = 0 then\r\n// sz := 12;\r\n//\r\n// if fsBold in FFont.Style then\r\n// weight := CAIRO_FONT_WEIGHT_BOLD\r\n// else\r\n// weight := CAIRO_FONT_WEIGHT_NORMAL;\r\n//\r\n// if fsItalic in FFont.Style then\r\n// slant := CAIRO_FONT_SLANT_ITALIC\r\n// else\r\n// slant := CAIRO_FONT_SLANT_NORMAL;\r\n//\r\n// cairo_select_font_face(FNCanvas, PChar(fn), slant, weight);\r\n// cairo_set_font_size(FNCanvas, sz * 1.3);\r\n// cairo_set_source_rgb(FNCanvas, TTMSFNCGraphics.GetColorRed(FFont.Color) / 255, TTMSFNCGraphics.GetColorGreen(FFont.Color) / 255,\r\n// TTMSFNCGraphics.GetColorBlue(FFont.Color) / 255);\r\n end;\r\n\r\n function FindNextWord(AText: String; var APos: Integer): String;\r\n var\r\n l: integer;\r\n i: integer;\r\n begin\r\n Result := '';\r\n\r\n l := Length(AText);\r\n if APos > l then\r\n Exit;\r\n\r\n i := APos;\r\n while True do\r\n begin\r\n if ((AText[i] = #10) and (AText[i - 1] = #13)) or ((AText[i] = #13) and (AText[i - 1] = #10)) or (AText[i] = ' ') then\r\n begin\r\n if AText[i] = ' ' then\r\n Result := Copy(AText, APos, i - (APos - 1))\r\n else\r\n Result := Copy(AText, APos, i - APos);\r\n\r\n Break;\r\n end\r\n else if (AText[i] = #10) or (AText[i] = #13) or (AText[i] = ' ') then\r\n begin\r\n result := Copy(AText, APos, i - (APos - 1));\r\n Break;\r\n end\r\n else if i >= l then\r\n begin\r\n result := Copy(AText, APos, i - (APos - 1));\r\n Break;\r\n end\r\n else\r\n inc(i);\r\n end;\r\n\r\n APos := i + 1;\r\n end;\r\nbegin\r\n ApplyFont;\r\n if not AWordWrap then\r\n begin\r\n// cairo_text_extents(FNCanvas, PChar(AText), @te);\r\n if not ACalculate then\r\n begin\r\n// case AHorizontalAlignment of\r\n// gtaCenter: cairo_move_to(FNCanvas, ARect.Left + (ARect.Width - te.x_advance) / 2, ARect.Top + te.height);\r\n// gtaLeading: cairo_move_to(FNCanvas, ARect.Left, ARect.Top + te.height);\r\n// gtaTrailing: cairo_move_to(FNCanvas, ARect.Right - te.x_advance, ARect.Top + te.height);\r\n// end;\r\n// cairo_show_text(FNCanvas, PChar(AText));\r\n end;\r\n// Result := RectF(ARect.Left, ARect.Top, ARect.Left + te.x_advance, ARect.Top + te.Height);\r\n end\r\n else\r\n begin\r\n rs := ARect;\r\n\r\n mw := 0;\r\n i := 1;\r\n ths := FFont.Size * 0.5;\r\n lcnt := 0;\r\n fws := 0;\r\n tw := 0;\r\n s := FindNextWord(AText, i);\r\n// cairo_text_extents(FNCanvas, PChar(s), @te);\r\n// w := te.x_advance;\r\n// th := te.Height + ths;\r\n\r\n mw := mw + w;\r\n if (Length(s) > 0) and (s[Length(s)] = ' ') then\r\n mw := mw + fws;\r\n\r\n while i <= Length(AText) do\r\n begin\r\n l := Length(s);\r\n if (l >= 2) and (((s[l] = #10) and (s[l - 1] = #13)) or ((s[l] = #13) and (s[l - 1] = #10))) then\r\n begin\r\n s := Copy(s, 1, l - 2);\r\n f := True;\r\n end\r\n else if (l >= 1) and ((s[l] = #10) or (s[l] = #13)) then\r\n begin\r\n s := Copy(s, 1, l - 1);\r\n f := True;\r\n end\r\n else\r\n f := False;\r\n\r\n sn := FindNextWord(AText, i);\r\n// cairo_text_extents(FNCanvas, PChar(sn), @te);\r\n// w := te.x_advance;\r\n// th := Max(th, te.Height + ths);\r\n\r\n if (ARect.Left + mw + w > ARect.Right) or f then\r\n begin\r\n if s <> '' then\r\n begin\r\n p := Length(s);\r\n st := Copy(s, 1, p);\r\n\r\n Inc(lcnt);\r\n if mw > tw then\r\n tw := mw;\r\n\r\n if not ACalculate then\r\n begin\r\n// case AHorizontalAlignment of\r\n// gtaCenter: cairo_move_to(FNCanvas, ARect.Left + (ARect.Width - mw) / 2, ARect.Top + th);\r\n// gtaLeading: cairo_move_to(FNCanvas, ARect.Left, ARect.Top + th);\r\n// gtaTrailing: cairo_move_to(FNCanvas, ARect.Right - mw, ARect.Top + th);\r\n// end;\r\n// cairo_show_text(FNCanvas, PChar(st));\r\n end;\r\n\r\n mw := 0;\r\n end;\r\n\r\n s := '';\r\n\r\n ARect.Top := ARect.Top + th;\r\n if (Trunc(ARect.Top) > Trunc(ARect.Bottom - th)) and not ACalculate then\r\n Break;\r\n end;\r\n\r\n mw := mw + w;\r\n if (Length(sn) > 0) and (sn[Length(sn)] = ' ') then\r\n mw := mw + fws;\r\n s := s + sn;\r\n end;\r\n\r\n if s <> '' then\r\n begin\r\n p := Length(s);\r\n st := Copy(s, 1, p);\r\n Inc(lcnt);\r\n if mw > tw then\r\n tw := mw;\r\n\r\n if not ACalculate then\r\n begin\r\n// case AHorizontalAlignment of\r\n// gtaCenter: cairo_move_to(FNCanvas, ARect.Left + (ARect.Width - mw) / 2, ARect.Top + th);\r\n// gtaLeading: cairo_move_to(FNCanvas, ARect.Left, ARect.Top + th);\r\n// gtaTrailing: cairo_move_to(FNCanvas, ARect.Right - mw, ARect.Top + th);\r\n// end;\r\n// cairo_show_text(FNCanvas, PChar(st));\r\n end;\r\n end;\r\n\r\n Result := RectF(rs.Left, rs.Top, rs.Left + tw, rs.Top + lcnt * th);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SaveContext;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// cairo_save(FNCanvas);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.RestoreContext;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// cairo_restore(FNCanvas);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SaveState(AState: TTMSFNCGraphicsSaveState);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n SaveContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.ScaleTransform(AX, AY: Single);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// cairo_scale(FNCanvas, AX, AY);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetSize(AWidth, AHeight: Single);\r\nbegin\r\n FContextSize.cx := AWidth;\r\n FContextSize.cy := AHeight;\r\n\r\n DestroyResources;\r\n\r\n FBitmap := TBitmap.Create;\r\n// FBitmap.SetSize(Round(AWidth * FScale), Round(AHeight * FScale));\r\n// FBitmap.Canvas.Brush.Style := bsSolid;\r\n// FBitmap.Canvas.Brush.Color := gcWhite;\r\n// FBitmap.Canvas.FillRect(0, 0, FBitmap.Width, FBitmap.Height);\r\n\r\n// {$IFDEF LINUX}\r\n// {$IFDEF LCLGTK2}\r\n// FNCanvas := gdk_cairo_create(TGtkDeviceContext(FBitmap.Canvas.Handle).Drawable);\r\n// {$ENDIF}\r\n// {$ENDIF}\r\n// {$IFDEF DARWIN}\r\n// FNCanvas := nil;\r\n// {$ENDIF}\r\n ScaleTransform(FScale, FScale);\r\n SaveContext;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetTextQuality(ATextQuality: TTMSFNCGraphicsTextQuality);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetShowAcceleratorChar(AShowAcceleratorChar: Boolean);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetAntiAliasing(AAntiAliasing: Boolean);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// if AAntiAliasing then\r\n// begin\r\n// {$IFDEF LINUX}\r\n// cairo_set_antialias(FNCanvas, CAIRO_ANTIALIAS_BEST);\r\n// {$ENDIF}\r\n// {$IFDEF DARWIN}\r\n// cairo_set_antialias(FNCanvas, CAIRO_ANTIALIAS_DEFAULT);\r\n// {$ENDIF}\r\n// end\r\n// else\r\n// cairo_set_antialias(FNCanvas, CAIRO_ANTIALIAS_NONE);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFill(AFill: TTMSFNCGraphicsFill);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFill.Assign(AFill);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFillColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFill.Color := AColor;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFillKind(AKind: TTMSFNCGraphicsFillKind);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFill.Kind := AKind;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFont(AFont: TTMSFNCGraphicsFont);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFont.AssignSource(AFont);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFontColor(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFont.Color := AColor;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFontName(AName: string);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFont.Name := AName;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFontSize(ASize: Integer);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFont.Size := ASize;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetFontStyles(AStyle: TFontStyles);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FFont.Style := AStyle;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetStroke(AStroke: TTMSFNCGraphicsStroke);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FStroke.Assign(AStroke);\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetStrokeColor(\r\n AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FStroke.Color := AColor;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetStrokeKind(\r\n AKind: TTMSFNCGraphicsStrokeKind);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FStroke.Kind := AKind;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.SetStrokeWidth(AWidth: Single);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n FStroke.Width := AWidth;\r\nend;\r\n\r\nfunction TTMSFNCGraphicsContextWEB.SetTextAngle(ARect: TRectF;\r\n AAngle: Single): TRectF;\r\nvar\r\n ar: Single;\r\n cx: TPointF;\r\nbegin\r\n Result := ARect;\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n if AAngle <> 0 then\r\n begin\r\n ar := DegToRad(AAngle);\r\n cx.X := Result.Left + (Result.Right - Result.Left) / 2;\r\n cx.Y := Result.Top + (Result.Bottom - Result.Top) / 2;\r\n\r\n SaveContext;\r\n\r\n// cairo_translate(FNCanvas, cx.X, cx.Y);\r\n// cairo_rotate(FNCanvas, ar);\r\n\r\n if (Result.Right - Result.Left) < (Result.Bottom - Result.Top) then\r\n Result := RectF(-(Result.Bottom - Result.Top) / 2, -(Result.Right - Result.Left) / 2, (Result.Bottom - Result.Top) / 2, (Result.Right - Result.Left) / 2)\r\n else\r\n Result := RectF(-(Result.Right - Result.Left) / 2, -(Result.Bottom - Result.Top) / 2, (Result.Right - Result.Left) / 2, (Result.Bottom - Result.Top) / 2);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.StartSpecialPen;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.StopSpecialPen;\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.StrokeChanged(Sender: TObject);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n ApplyStroke;\r\nend;\r\n\r\nprocedure TTMSFNCGraphicsContextWEB.TranslateTransform(AX, AY: Single);\r\nbegin\r\n if not Assigned(FNCanvas) then\r\n Exit;\r\n\r\n// cairo_translate(FNCanvas, AX, AY);\r\nend;\r\n\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCCustomComponent;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Controls, WEBLib.TMSFNCTypes\r\n {$IFNDEF WEBLIB}\r\n ,WEBLib.TMSFNCPersistence\r\n {$ENDIF}\r\n ,TypInfo;\r\n\r\ntype\r\n {$IFDEF CMNWEBLIB}\r\n TTMSFNCCustomComponent = class(TCustomControl, ITMSFNCProductInfo{$IFNDEF WEBLIB}, ITMSFNCPersistence{$ENDIF})\r\n private\r\n FStored: Boolean;\r\n {$ELSE}\r\n TTMSFNCCustomComponent = class(TControl, ITMSFNCProductInfo, ITMSFNCPersistence)\r\n {$ENDIF}\r\n private\r\n FAdaptToStyle: Boolean;\r\n protected\r\n {$IFDEF WEBLIB}\r\n class function GetVersionNumber(AMaj, AMin, ARel, ABld: ShortInt): string;\r\n {$ENDIF}\r\n function CanSaveProperty({%H-}AObject: TObject; {%H-}APropertyName: string; {%H-}APropertyType: TTypeKind): Boolean; virtual;\r\n function CanLoadProperty({%H-}AObject: TObject; {%H-}APropertyName: string; {%H-}APropertyType: TTypeKind): Boolean; virtual;\r\n function GetVersion: string; virtual;\r\n function GetDocURL: string; virtual;\r\n function GetTipsURL: string; virtual;\r\n function GetInstance: NativeUInt; virtual;\r\n procedure SetAdaptToStyle(const Value: Boolean); virtual;\r\n procedure Paint; override;\r\n procedure Loaded; override;\r\n procedure RegisterRuntimeClasses; virtual;\r\n property AdaptToStyle: Boolean read FAdaptToStyle write SetAdaptToStyle default False;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n {$IFDEF FMXLIB}\r\n procedure SetBounds(X, Y, AWidth, AHeight: Single); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure SetBounds(X, Y, {%H-}AWidth, {%H-}AHeight: Integer); override;\r\n property Stored: Boolean read FStored write FStored;\r\n {$ENDIF}\r\n function IsDesignTime: Boolean; virtual;\r\n function IsLoading: Boolean; virtual;\r\n function IsReading: Boolean; virtual;\r\n function IsDesigning: Boolean; virtual;\r\n function IsDestroying: Boolean; virtual;\r\n {$IFNDEF WEBLIB}\r\n procedure SaveSettingsToFile(AFileName: string); virtual;\r\n procedure LoadSettingsFromFile(AFileName: string); virtual;\r\n procedure SaveSettingsToStream(AStream: TStream); virtual;\r\n procedure LoadSettingsFromStream(AStream: TStream); virtual;\r\n {$ENDIF}\r\n published\r\n {$IFDEF FMXLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 27}\r\n property Size;\r\n {$IFEND}\r\n {$HINTS ON}\r\n property Position;\r\n {$ENDIF}\r\n property Visible {$IFDEF CMNLIB}default False{$ENDIF};\r\n property Width;\r\n property Height;\r\n end;\r\n\r\n TTMSFNCCustomComponentClass = class of TTMSFNCCustomComponent;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.TMSFNCUtils, SysUtils, WEBLib.TMSFNCGraphics,\r\n WEBLib.Graphics, WEBLib.TMSFNCGraphicsTypes\r\n {$IFNDEF LCLLIB}\r\n ,Types\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,PngImage\r\n {$ENDIF}\r\n ;\r\n\r\n{ TTMSFNCCustomComponent }\r\n\r\n{$IFDEF WEBLIB}\r\nclass function TTMSFNCCustomComponent.GetVersionNumber(AMaj, AMin, ARel, ABld: ShortInt): string;\r\nbegin\r\n Result := '';\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomComponent.CanSaveProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind): Boolean;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if AObject = Self then\r\n Result := (TTMSFNCUtils.IndexOfTextInArray(APropertyName, ExcludePropertyList) = -1)\r\n else\r\n {$ENDIF}\r\n Result := True;\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.CanLoadProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind): Boolean;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if AObject = Self then\r\n Result := (TTMSFNCUtils.IndexOfTextInArray(APropertyName, ExcludePropertyList) = -1)\r\n else\r\n {$ENDIF}\r\n Result := True;\r\nend;\r\n\r\nconstructor TTMSFNCCustomComponent.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n Width := 26;\r\n Height := 26;\r\n\r\n if not IsDesigning then\r\n RegisterRuntimeClasses;\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.GetDocURL: string;\r\nbegin\r\n Result := TTMSFNCBaseDocURL;\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.GetInstance: NativeUInt;\r\nbegin\r\n Result := HInstance;\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.GetTipsURL: string;\r\nbegin\r\n Result := TTMSFNCBaseTipsURL;\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.GetVersion: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.IsDesignTime: Boolean;\r\nbegin\r\n Result := (csDesigning in ComponentState) and not ((csReading in Owner.ComponentState) or (csLoading in Owner.ComponentState));\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.IsReading: Boolean;\r\nbegin\r\n Result := (csReading in Owner.ComponentState);\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.IsDesigning: Boolean;\r\nbegin\r\n Result := (csDesigning in ComponentState);\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.IsDestroying: Boolean;\r\nbegin\r\n Result := (csDestroying in ComponentState);\r\nend;\r\n\r\nfunction TTMSFNCCustomComponent.IsLoading: Boolean;\r\nbegin\r\n Result := (csLoading in Owner.ComponentState);\r\nend;\r\n\r\nprocedure TTMSFNCCustomComponent.Loaded;\r\nbegin\r\n inherited;\r\n if not (csDesigning in ComponentState) then\r\n Visible := False;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomComponent.SaveSettingsToFile(AFileName: string);\r\nbegin\r\n TTMSFNCPersistence.SaveSettingsToFile(Self, AFileName);\r\nend;\r\n\r\nprocedure TTMSFNCCustomComponent.LoadSettingsFromFile(AFileName: string);\r\nbegin\r\n TTMSFNCPersistence.LoadSettingsFromFile(Self, AFileName);\r\nend;\r\n\r\nprocedure TTMSFNCCustomComponent.SaveSettingsToStream(AStream: TStream);\r\nbegin\r\n TTMSFNCPersistence.SaveSettingsToStream(Self, AStream);\r\nend;\r\n\r\nprocedure TTMSFNCCustomComponent.LoadSettingsFromStream(AStream: TStream);\r\nbegin\r\n TTMSFNCPersistence.LoadSettingsFromStream(Self, AStream);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomComponent.Paint;\r\nvar\r\n {$IFDEF VCLLIB}\r\n png: TPngImage;\r\n {$ENDIF}\r\n pic: TTMSFNCBitmap;\r\n g: TTMSFNCGraphics;\r\n r: TResourceStream;\r\nbegin\r\n inherited;\r\n r := nil;\r\n pic := TTMSFNCBitmap.Create;\r\n {$IFDEF VCLLIB}\r\n png := TPNGImage.Create;\r\n {$ENDIF}\r\n g := TTMSFNCGraphics.Create(Canvas);\r\n try\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcBlack;\r\n g.DrawRectangle(RectF(0, 0, Width, Height));\r\n\r\n r := TTMSFNCUtils.GetResourceStream(UpperCase(ClassName), GetInstance);\r\n if Assigned(r) then\r\n begin\r\n {$IFDEF VCLLIB}\r\n png.LoadFromStream(r);\r\n pic.Assign(png);\r\n {$ELSE}\r\n pic.LoadFromStream(r);\r\n {$ENDIF}\r\n end;\r\n\r\n g.DrawBitmap(RectF(0, 0, Width, Height), BitmapToDrawBitmap(pic));\r\n finally\r\n if Assigned(r) then\r\n r.Free;\r\n\r\n pic.Free;\r\n {$IFDEF VCLLIB}\r\n png.Free;\r\n {$ENDIF}\r\n g.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomComponent.RegisterRuntimeClasses;\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomComponent.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n FAdaptToStyle := Value;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomComponent.SetBounds(X, Y, AWidth, AHeight: Single);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomComponent.SetBounds(X, Y, AWidth, AHeight: Integer);\r\n{$ENDIF}\r\nbegin\r\n inherited SetBounds(X, Y, 26, 26);\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCStyles;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF VCLLIB}\r\n{$HINTS OFF}\r\n{$IF COMPILERVERSION > 22}\r\n{$DEFINE VCLSTYLESENABLED}\r\n{$IFEND}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.Graphics, WEBLib.TMSFNCGraphicsTypes\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types, WEBLib.Controls, UITypes\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n ,VCL.Themes\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ,js\r\n {$ENDIF}\r\n ;\r\n\r\ntype\r\n ITMSFNCAdaptToStyle = interface\r\n ['{3EFF288D-3927-4E86-8E9D-EF684B501C9E}']\r\n function GetAdaptToStyle: Boolean;\r\n procedure SetAdaptToStyle(const Value: Boolean);\r\n property AdaptToStyle: Boolean read GetAdaptToStyle write SetAdaptToStyle;\r\n end;\r\n\r\n TTMSFNCStyles = class\r\n private class var\r\n {$IFDEF FMXLIB}\r\n FScene: IScene;\r\n {$ENDIF}\r\n protected\r\n {$IFDEF FMXLIB}\r\n class function ExtractColor(ABitmap: TBitmap): TTMSFNCGraphicsColor; virtual;\r\n class function ExtractColorTo(ABitmap: TBitmap): TTMSFNCGraphicsColor; virtual;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n class function ExtractColor(AValue: string): TTMSFNCGraphicsColor; virtual;\r\n class function ExtractColorTo(AValue: string): TTMSFNCGraphicsColor; virtual;\r\n class function ExtractFontName(AValue: string): string; virtual;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n class function ExtractColor(AElement: TThemedElementDetails): TTMSFNCGraphicsColor; virtual;\r\n class function ExtractColorTo(AElement: TThemedElementDetails): TTMSFNCGraphicsColor; virtual;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n class function ParseBrush(ABrush: TBrush; ASecondColor: Boolean): TTMSFNCGraphicsColor; virtual;\r\n class function GetStyleSceneObject: TFmxObject; virtual;\r\n class function GetStyleBackgroundFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleBackgroundStroke(AStyle: TFmxObject): TStrokeBrush; virtual;\r\n class function GetStyleDefaultButtonFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleDefaultButtonStroke(AStyle: TFmxObject): TStrokeBrush; virtual;\r\n class function GetStyleEditTextColor(AStyle: TFmxObject): TAlphaColor; virtual;\r\n class function GetStyleEditFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleEditStroke(AStyle: TFmxObject): TStrokeBrush; virtual;\r\n class function GetStyleHeaderFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleHeaderStroke(AStyle: TFmxObject): TStrokeBrush; virtual;\r\n class function GetStyleSelectionFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleAlternativeSelectionFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleAlternativeBackgroundFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleAlternativeBackgroundStroke(AStyle: TFmxObject): TStrokeBrush; virtual;\r\n class function GetStyleFocusFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleLineFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function GetStyleTextFont(AStyle: TFmxObject): TFont; virtual;\r\n class function GetStyleTextColor(AStyle: TFmxObject): TAlphaColor; virtual;\r\n class function GetStyleAlternateBackgroundFill(AStyle: TFmxObject): TBrush; virtual;\r\n class function IsTransparentStyle(AStyle: TFmxObject): Boolean; virtual;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n class function GetStyleBackgroundFill: string; virtual;\r\n class function GetStyleBackgroundStroke: string; virtual;\r\n class function GetStyleDefaultButtonFill: string; virtual;\r\n class function GetStyleDefaultButtonStroke: string; virtual;\r\n class function GetStyleEditTextColor: string; virtual;\r\n class function GetStyleEditFill: string; virtual;\r\n class function GetStyleEditStroke: string; virtual;\r\n class function GetStyleHeaderFill: string; virtual;\r\n class function GetStyleHeaderStroke: string; virtual;\r\n class function GetStyleSelectionFill: string; virtual;\r\n class function GetStyleAlternativeSelectionFill: string; virtual;\r\n class function GetStyleAlternativeBackgroundFill: string; virtual;\r\n class function GetStyleAlternativeBackgroundStroke: string; virtual;\r\n class function GetStyleFocusFill: string; virtual;\r\n class function GetStyleLineFill: string; virtual;\r\n class function GetStyleTextFont: string; virtual;\r\n class function GetStyleTextColor: string; virtual;\r\n class function GetStyleAlternateBackgroundFill: string; virtual;\r\n {$ENDIF}\r\n public\r\n {$IFDEF FMXLIB}\r\n class procedure SetActiveScene(AScene: IScene); virtual;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n class function FindCSSStyleRule(ARuleName: string): TJSObject; virtual;\r\n class function FindCSSStyleProperty(ARuleName, APropertyName: string): string; virtual;\r\n {$ENDIF}\r\n class function StyleServicesEnabled: Boolean; virtual;\r\n class function GetStyleLineFillColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleBackgroundFillColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleBackgroundFillColorTo(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleAlternativeBackgroundFillColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleAlternativeBackgroundFillColorTo(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleBackgroundStrokeColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleHeaderFillColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleHeaderFillColorTo(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleHeaderStrokeColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleSelectionFillColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleSelectionFillColorTo(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleTextFontColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleAlternativeTextFontColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleDefaultButtonFillColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n class function GetStyleDefaultButtonStrokeColor(var {%H-}AColor: TTMSFNCGraphicsColor): Boolean; virtual;\r\n end;\r\n\r\nvar\r\n CSSStyleFileName: string = '';\r\n\r\nimplementation\r\n\r\n{$IFDEF FMXLIB}\r\nuses\r\n UIConsts, FMX.Objects, FMX.Styles, FMX.Styles.Objects, Types, SysUtils, WEBLib.Forms;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nuses\r\n SysUtils;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nfunction Pos(const Search, InString: String; Offset: Integer): Integer; assembler; overload;\r\nasm\r\n return InString.indexOf(Search, Offset)+1;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\n\r\nclass function TTMSFNCStyles.ParseBrush(ABrush: TBrush; ASecondColor: Boolean): TTMSFNCGraphicsColor;\r\nbegin\r\n case ABrush.Kind of\r\n TBrushKind.None, TBrushKind.Resource: Result := gcNull;\r\n TBrushKind.Solid: Result := ABrush.Color;\r\n TBrushKind.Gradient:\r\n begin\r\n if ABrush.Gradient.Points.Count > 0 then\r\n begin\r\n if ASecondColor then\r\n Result := ABrush.Gradient.Points[1].Color\r\n else\r\n Result := ABrush.Gradient.Points[0].Color;\r\n end\r\n else\r\n Result := ABrush.Color;\r\n end;\r\n TBrushKind.Bitmap:\r\n begin\r\n if ASecondColor then\r\n Result := ExtractColorTo(ABrush.Bitmap.Bitmap)\r\n else\r\n Result := ExtractColor(ABrush.Bitmap.Bitmap);\r\n end;\r\n else\r\n Result := gcNull;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleSceneObject: TFmxObject;\r\nvar\r\n frm: TCommonCustomForm;\r\nbegin\r\n if Assigned(TTMSFNCStyles.FScene) and Assigned(TTMSFNCStyles.FScene.GetObject) and (TTMSFNCStyles.FScene.GetObject.ClassName <> 'TTMSFNCCustomPopupForm') then\r\n begin\r\n if Assigned(TTMSFNCStyles.FScene.StyleBook) then\r\n Result := TTMSFNCStyles.FScene.StyleBook.Style\r\n else\r\n Result := TStyleManager.ActiveStyleForScene(TTMSFNCStyles.FScene);\r\n end\r\n else\r\n begin\r\n frm := Screen.ActiveForm;\r\n if not Assigned(frm) then\r\n frm := Application.MainForm;\r\n\r\n if Assigned(frm) and Assigned(frm.StyleBook) then\r\n Result := frm.StyleBook.Style\r\n else\r\n Result := TStyleManager.ActiveStyle(nil);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.IsTransparentStyle(\r\n AStyle: TFmxObject): Boolean;\r\nvar\r\n st: TStyleDescription;\r\nbegin\r\n Result := False;\r\n st := TStyleManager.FindStyleDescriptor(AStyle);\r\n if Assigned(st) then\r\n Result := LowerCase(st.Title) = 'transparent';\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternateBackgroundFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('gridstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('alternatingrowbackground');\r\n if (Assigned(stobj) and (stobj is TBrushObject)) then\r\n f.Assign((stobj as TBrushObject).Brush);\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeSelectionFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('memostyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('selection');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if (stobj is TBrushObject) then\r\n f.Assign((stobj as TBrushObject).Brush)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleDefaultButtonFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('buttonstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleBackgroundFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('gridstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleDefaultButtonStroke(\r\n AStyle: TFmxObject): TStrokeBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n s: TStrokeBrush;\r\nbegin\r\n s := TStrokeBrush.Create(TBrushKind.Solid, claDarkGray);\r\n Result := s;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('buttonstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n s.Assign((stobj as TRectangle).Stroke);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleBackgroundStroke(\r\n AStyle: TFmxObject): TStrokeBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n s: TStrokeBrush;\r\nbegin\r\n s := TStrokeBrush.Create(TBrushKind.Solid, claDarkGray);\r\n Result := s;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('gridstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n s.Assign((stobj as TRectangle).Stroke);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeBackgroundFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('memostyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeBackgroundStroke(\r\n AStyle: TFmxObject): TStrokeBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n s: TStrokeBrush;\r\nbegin\r\n s := TStrokeBrush.Create(TBrushKind.Solid, claDarkGray);\r\n Result := s;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('memostyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('foreground');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TBrushObject) then\r\n s.Assign((stobj as TBrushObject).Brush);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleEditTextColor(AStyle: TFmxObject): TAlphaColor;\r\nvar\r\n st, stobj: TFMXObject;\r\nbegin\r\n Result := claBlack;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('editstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('foreground');\r\n if (Assigned(stobj) and (stobj is TBrushObject)) then\r\n begin\r\n if (Assigned(stobj) and (stobj is TBrushObject)) then\r\n Result := (stobj as TBrushObject).Brush.Color;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleEditFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('editstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleEditStroke(\r\n AStyle: TFmxObject): TStrokeBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n s: TStrokeBrush;\r\nbegin\r\n s := TStrokeBrush.Create(TBrushKind.Solid, claDarkGray);\r\n Result := s;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('editstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n s.Assign((stobj as TRectangle).Stroke);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleFocusFill(AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('gridstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('focus');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleHeaderFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('headeritemstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if stobj is TButtonStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TButtonStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleHeaderStroke(\r\n AStyle: TFmxObject): TStrokeBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n s: TStrokeBrush;\r\nbegin\r\n s := TStrokeBrush.Create(TBrushKind.Solid, claDarkGray);\r\n Result := s;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('headeritemstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('background');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n s.Assign((stobj as TRectangle).Stroke);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleLineFill(AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('gridstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('linefill');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TBrushObject) then\r\n f.Assign((stobj as TBrushObject).Brush)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleSelectionFill(\r\n AStyle: TFmxObject): TBrush;\r\nvar\r\n st, stobj: TFmxObject;\r\n f: TBrush;\r\n bmp: TBitmap;\r\nbegin\r\n f := TBrush.Create(TBrushKind.Solid, claNull);\r\n Result := f;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('gridstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('selection');\r\n if Assigned(stobj) then\r\n begin\r\n if (stobj is TRectangle) then\r\n f.Assign((stobj as TRectangle).Fill)\r\n else if (stobj is TBrushObject) then\r\n f.Assign((stobj as TBrushObject).Brush)\r\n else if stobj is TCustomStyleObject then\r\n begin\r\n f.Kind := TBrushKind.Bitmap;\r\n f.Bitmap.WrapMode := TWrapMode.TileStretch;\r\n bmp := TBitmap.Create(Round(200), Round(200));\r\n if bmp.Canvas.BeginScene then\r\n begin\r\n (stobj as TCustomStyleObject).DrawToCanvas(bmp.Canvas, RectF(-10, -10, bmp.Width + 10, bmp.Height + 10));\r\n bmp.Canvas.EndScene;\r\n end;\r\n f.Bitmap.Bitmap.Assign(bmp);\r\n bmp.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleTextColor(\r\n AStyle: TFmxObject): TAlphaColor;\r\nvar\r\n st, stobj: TFmxObject;\r\nbegin\r\n Result := claBlack;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('headeritemstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('text');\r\n if (Assigned(stobj) and (stobj is TText)) then\r\n Result := (stobj as TText).TextSettings.FontColor;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleTextFont(AStyle: TFmxObject): TFont;\r\nvar\r\n st, stobj: TFmxObject;\r\nbegin\r\n Result := TFont.Create;\r\n if Assigned(AStyle) then\r\n begin\r\n st := AStyle.FindStyleResource('headeritemstyle');\r\n if Assigned(st) then\r\n begin\r\n stobj := st.FindStyleResource('text');\r\n if (Assigned(stobj) and (stobj is TText)) then\r\n Result.Assign((stobj as TText).TextSettings.Font);\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCStyles }\r\n\r\n{$IFDEF FMXLIB}\r\nclass function TTMSFNCStyles.ExtractColor(\r\n ABitmap: TBitmap): TTMSFNCGraphicsColor;\r\nvar\r\n dt: TBitmapData;\r\nbegin\r\n Result := gcNull;\r\n if not Assigned(ABitmap) then\r\n Exit;\r\n if ABitmap.Map(TMapAccess.Read, dt) then\r\n begin\r\n Result := dt.GetPixel(dt.Width div 2, 0);\r\n ABitmap.Unmap(dt);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.ExtractColorTo(\r\n ABitmap: TBitmap): TTMSFNCGraphicsColor;\r\nvar\r\n dt: TBitmapData;\r\nbegin\r\n Result := gcNull;\r\n if not Assigned(ABitmap) then\r\n Exit;\r\n if ABitmap.Map(TMapAccess.Read, dt) then\r\n begin\r\n Result := dt.GetPixel(dt.Width div 2, dt.Height);\r\n ABitmap.Unmap(dt);\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\n\r\nclass function TTMSFNCStyles.GetStyleBackgroundFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCGridStyle', 'background');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleBackgroundStroke: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCGridStyle', 'border-color');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleDefaultButtonFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCButtonStyle', 'background');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleDefaultButtonStroke: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCButtonStyle', 'border-color');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleEditTextColor: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCEditStyle', '--foreground');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleEditFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCEditStyle', 'background');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleEditStroke: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCStyle', 'border-color');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleHeaderFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCHeaderItemStyle', 'background');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleHeaderStroke: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCHeaderItemStyle', 'border-color');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleSelectionFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCGridStyle', '--selection');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeSelectionFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCMemoStyle', '--selection');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeBackgroundFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCMemoStyle', 'background');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeBackgroundStroke: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCMemoStyle', 'border-color');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleFocusFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCGridStyle', '--focus');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleLineFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCGridStyle', '--linefill');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleTextFont: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCHeaderItemStyle', 'font-family');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleTextColor: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCHeaderItemStyle', 'color');\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternateBackgroundFill: string;\r\nbegin\r\n Result := FindCSSStyleProperty('.TMSFNCGridStyle', '--alternatingrowbackground');\r\nend;\r\n\r\nclass function TTMSFNCStyles.ExtractColor(AValue: string): TTMSFNCGraphicsColor;\r\nvar\r\n s, s2, s3: string;\r\n sl, sl2: TStringList;\r\n p, p2: Integer;\r\n\r\n function ParseValue(AValue: string): Integer;\r\n begin\r\n Result := StrToInt(Trim(StringReplace(AValue, 'rgb(', '', [rfReplaceAll])))\r\n end;\r\nbegin\r\n Result := gcNull;\r\n if AValue <> '' then\r\n begin\r\n s := LowerCase(StringReplace(AValue, ' ', '', [rfReplaceAll]));\r\n if Pos('linear-gradient', s) = 1 then\r\n begin\r\n p := Pos('rgb', s);\r\n if p = 0 then\r\n p := Pos('#', s);\r\n p2 := Pos(')', s, p);\r\n s2 := Copy(s, p, p2 - p + 1);\r\n p := Pos('rgb', s, p2);\r\n if p = 0 then\r\n p := Pos('#', s);\r\n p2 := Pos(')', s, p);\r\n s3 := Copy(s, p, p2 - p + 1);\r\n Result := ExtractColor(s2);\r\n end\r\n else if Pos('rgb', s) = 1 then\r\n begin\r\n sl := TStringList.Create;\r\n try\r\n sl.Delimiter := ',';\r\n sl.DelimitedText := s;\r\n Result := MakeGraphicsColor(ParseValue(sl[0]), ParseValue(sl[1]), ParseValue(sl[2]));\r\n finally\r\n sl.Free;\r\n end;\r\n end\r\n else if Pos('#', s) = 1 then\r\n Result := HexToColor(s);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.ExtractColorTo(AValue: string): TTMSFNCGraphicsColor;\r\nvar\r\n s, s2, s3: string;\r\n sl, sl2: TStringList;\r\n p, p2: Integer;\r\n\r\n function ParseValue(AValue: string): Integer;\r\n begin\r\n Result := StrToInt(Trim(StringReplace(AValue, 'rgb(', '', [rfReplaceAll])))\r\n end;\r\nbegin\r\n Result := gcNull;\r\n if AValue <> '' then\r\n begin\r\n s := LowerCase(StringReplace(AValue, ' ', '', [rfReplaceAll]));\r\n if Pos('linear-gradient', s) = 1 then\r\n begin\r\n p := Pos('rgb', s);\r\n if p = 0 then\r\n p := Pos('#', s);\r\n p2 := Pos(')', s, p);\r\n s2 := Copy(s, p, p2 - p + 1);\r\n p := Pos('rgb', s, p2);\r\n if p = 0 then\r\n p := Pos('#', s);\r\n p2 := Pos(')', s, p);\r\n s3 := Copy(s, p, p2 - p + 1);\r\n Result := ExtractColor(s3);\r\n end\r\n else if Pos('rgb', s) = 1 then\r\n begin\r\n sl := TStringList.Create;\r\n try\r\n sl.Delimiter := ',';\r\n sl.DelimitedText := s;\r\n Result := MakeGraphicsColor(ParseValue(sl[0]), ParseValue(sl[1]), ParseValue(sl[2]));\r\n finally\r\n sl.Free;\r\n end;\r\n end\r\n else if Pos('#', s) = 1 then\r\n Result := HexToColor(s);\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.ExtractFontName(AValue: string): string;\r\nbegin\r\n Result := AValue;\r\nend;\r\n\r\nclass function TTMSFNCStyles.FindCSSStyleProperty(ARuleName, APropertyName: string): string;\r\nvar\r\n j: TJSObject;\r\n s: string;\r\n v: string;\r\nbegin\r\n Result := '';\r\n j := FindCSSStyleRule(ARuleName);\r\n if Assigned(j) then\r\n begin\r\n s := APropertyName;\r\n asm\r\n v = j.style.getPropertyValue(s);\r\n end;\r\n Result := v;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.FindCSSStyleRule(ARuleName: string): TJSObject;\r\nvar\r\n s, f: string;\r\nbegin\r\n Result := nil;\r\n s := ARuleName;\r\n f := CSSStyleFileName;\r\n asm\r\n for (var i = 0; i < document.styleSheets.length; i++){\r\n var fn = document.styleSheets[i].href;\r\n if (fn != null) {\r\n if (f == fn.substring(fn.lastIndexOf('/')+1) || f == \"\"){\r\n var classes = document.styleSheets[i].rules || document.styleSheets[i].cssRules;\r\n for (var x = 0; x < classes.length; x++) {\r\n if (classes[x].selectorText.startsWith(s)) {\r\n return classes[x];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF VCLSTYLESENABLED}\r\nclass function TTMSFNCStyles.ExtractColor(AElement: TThemedElementDetails): TTMSFNCGraphicsColor;\r\nvar\r\n bmp: TBitmap;\r\nbegin\r\n bmp := TBitmap.Create;\r\n try\r\n bmp.SetSize(200, 200);\r\n StyleServices.DrawElement(bmp.Canvas.Handle, AElement, Rect(0, 0, 200, 200));\r\n Result := bmp.Canvas.Pixels[bmp.Width div 2, 2];\r\n finally\r\n bmp.Free;\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.ExtractColorTo(AElement: TThemedElementDetails): TTMSFNCGraphicsColor;\r\nvar\r\n bmp: TBitmap;\r\nbegin\r\n bmp := TBitmap.Create;\r\n try\r\n bmp.SetSize(200, 200);\r\n StyleServices.DrawElement(bmp.Canvas.Handle, AElement, Rect(0, 0, 200, 200));\r\n Result := bmp.Canvas.Pixels[bmp.Width div 2, bmp.Height - 2];\r\n finally\r\n bmp.Free;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TTMSFNCStyles.GetStyleBackgroundFillColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleBackgroundFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, False);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgCellNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecFillColor, c);\r\n if c = clNone then\r\n c := ExtractColor(l);\r\n\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleBackgroundFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleBackgroundFillColorTo(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleBackgroundFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, True);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgGradientCellNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecFillColor, c);\r\n if c = clNone then\r\n c := ExtractColorTo(l);\r\n\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleBackgroundFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColorTo(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeBackgroundFillColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleAlternativeBackgroundFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, False);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(teBackgroundNormal);\r\n c := ExtractColor(l);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleAlternativeBackgroundFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeBackgroundFillColorTo(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleAlternativeBackgroundFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, True);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(teBackgroundNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecGradientColor1, c);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleAlternativeBackgroundFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColorTo(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleBackgroundStrokeColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n s: TStrokeBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n s := GetStyleBackgroundStroke(GetStyleSceneObject);\r\n if Assigned(s) then\r\n begin\r\n AColor := ParseBrush(s, False);\r\n Result := AColor <> claNull;\r\n s.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgCellNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecBorderColor, c);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleBackgroundStroke;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleDefaultButtonFillColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleDefaultButtonFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, False);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tcbButtonNormal);\r\n c := ExtractColor(l);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleDefaultButtonFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleDefaultButtonStrokeColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n s: TStrokeBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n s := GetStyleDefaultButtonStroke(GetStyleSceneObject);\r\n if Assigned(s) then\r\n begin\r\n AColor := ParseBrush(s, False);\r\n Result := AColor <> claNull;\r\n s.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tcbButtonNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecBorderColor, c);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleDefaultButtonStroke;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleHeaderFillColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleHeaderFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, False);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgFixedCellNormal);\r\n c := ExtractColor(l);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleHeaderFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleHeaderFillColorTo(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleHeaderFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, True);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgFixedCellNormal);\r\n c := ExtractColorTo(l);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleHeaderFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColorTo(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleHeaderStrokeColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n s: TStrokeBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n s := GetStyleHeaderStroke(GetStyleSceneObject);\r\n if Assigned(s) then\r\n begin\r\n AColor := ParseBrush(s, False);\r\n Result := AColor <> claNull;\r\n s.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLLIBVCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgFixedCellNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecBorderColor, c);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleHeaderStroke;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleLineFillColor(\r\n var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleLineFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, False);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgCellNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecBorderColor, c);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleLineFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleSelectionFillColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleSelectionFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, False);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgCellSelected);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecFillColor, c);\r\n c := ExtractColor(l);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleSelectionFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleSelectionFillColorTo(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n f: TBrush;\r\n{$ENDIF}\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n f := GetStyleSelectionFill(GetStyleSceneObject);\r\n if Assigned(f) then\r\n begin\r\n AColor := ParseBrush(f, True);\r\n Result := AColor <> claNull;\r\n f.Free;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n l := StyleServices.GetElementDetails(tgCellSelected);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecFillColor, c);\r\n c := ExtractColorTo(l);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleSelectionFill;\r\n if f <> '' then\r\n begin\r\n c := ExtractColorTo(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleTextFontColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n AColor := GetStyleTextColor(GetStyleSceneObject);\r\n Result := AColor <> claNull;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n AColor := gcBlack;\r\n l := StyleServices.GetElementDetails(tgCellNormal);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecTextColor, c);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleTextColor;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nclass function TTMSFNCStyles.GetStyleAlternativeTextFontColor(var AColor: TTMSFNCGraphicsColor): Boolean;\r\n{$IFDEF VCLSTYLESENABLED}\r\nvar\r\n l: TThemedElementDetails;\r\n c: TColor;\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nvar\r\n f: string;\r\n c: TTMSFNCGraphicsColor;\r\n{$ENDIF}\r\nbegin\r\n Result := False;\r\n if StyleServicesEnabled then\r\n begin\r\n {$IFDEF FMXLIB}\r\n AColor := GetStyleEditTextColor(GetStyleSceneObject);\r\n Result := AColor <> claNull;\r\n {$ENDIF}\r\n {$IFDEF VCLSTYLESENABLED}\r\n AColor := gcBlack;\r\n l := StyleServices.GetElementDetails(tgCellSelected);\r\n c := clNone;\r\n StyleServices.GetElementColor(l, ecTextColor, c);\r\n AColor := c;\r\n Result := c <> clNone;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n f := GetStyleEditTextColor;\r\n if f <> '' then\r\n begin\r\n c := ExtractColor(f);\r\n AColor := c;\r\n Result := c <> gcNull;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nclass procedure TTMSFNCStyles.SetActiveScene(AScene: IScene);\r\nbegin\r\n FScene := AScene;\r\nend;\r\n{$ENDIF}\r\n\r\nclass function TTMSFNCStyles.StyleServicesEnabled: Boolean;\r\n{$IFDEF FMXLIB}\r\nvar\r\n s: TFmxObject;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF WEBLIB}\r\n Result := True;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n Result := False;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n s := GetStyleSceneObject;\r\n Result := Assigned(s);\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n {$IFDEF VCLSTYLESENABLED}\r\n Result := (StyleServices.Enabled) and (StyleServices.Name <> 'Windows');\r\n {$ENDIF}\r\n {$IFNDEF VCLSTYLESENABLED}\r\n Result := False;\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCCustomControl;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXMOBILE}\r\n{$DEFINE DRAWTRIAL}\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\n{$DEFINE DRAWTRIAL}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n {%H-}Windows,\r\n {$ENDIF}\r\n Classes, WEBLib.Controls, WEBLib.TMSFNCGraphics, WEBLib.Graphics, WEBLib.TMSFNCStyles\r\n {$IFNDEF WEBLIB}\r\n ,WEBLib.TMSFNCPersistence, WEBLib.TMSFNCUndo\r\n {$IFDEF FNCLIB}\r\n ,WEBLib.TMSFNCHint\r\n {$ENDIF}\r\n {$ENDIF}\r\n ,Types, WEBLib.TMSFNCGraphicsTypes, WEBLib.TMSFNCTypes, TypInfo, WEBLib.Forms\r\n {$IFDEF VCLLIB}\r\n ,Messages\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,UITypes, Generics.Collections\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,LMessages, {%H-}LCLIntF, fgl\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types, Messaging\r\n {$ENDIF}\r\n ;\r\n\r\ntype\r\n {$IFDEF FNCLIB}\r\n {$IFNDEF WEBLIB}\r\n ITMSFNCShortCutHint = interface\r\n ['{A3E21A73-163A-4617-841B-8E0A62BF41B0}']\r\n function HasShortCut(AShortCut: string): Boolean;\r\n function HandleShortCut(AShortCut: string): Boolean;\r\n function GetShortCutHint: string;\r\n function IsShortCutHintActive: Boolean;\r\n procedure ShowShortCutHint;\r\n procedure CancelShortCutHint(AClearShortCutHintString: Boolean = True);\r\n procedure SetShortCutHint(const Value: string);\r\n property ShortCutHint: string read GetShortCutHint write SetShortCutHint;\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n TTMSFNCCustomDesignerForm = class(TForm);\r\n\r\n TTMSFNCCustomControl = class;\r\n\r\n TTMSFNCControlAlignment = (caNone, caTop, caBottom, caLeft, caRight, caClient);\r\n\r\n {$IFDEF FNCLIB}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCCustomControlShortCutWindowList = TObjectList;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n TTMSFNCCustomControlBaseCommon = class(TControl, ITMSFNCAdaptToStyle, ITMSFNCProductInfo {$IFDEF FNCLIB}, ITMSFNCShortCutHint{$ENDIF})\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n TTMSFNCCustomControlBaseCommon = class(TCustomControl, ITMSFNCAdaptToStyle, ITMSFNCProductInfo {$IFNDEF WEBLIB}{$IFDEF FNCLIB}, ITMSFNCShortCutHint{$ENDIF}{$ENDIF})\r\n {$ENDIF}\r\n private\r\n {$IFDEF CMNWEBLIB}\r\n FAllowFocus: Boolean;\r\n {$ENDIF}\r\n {$IFDEF FNCLIB}\r\n FShortCutHint: string;\r\n {$IFNDEF WEBLIB}\r\n FShortCutLimitation: string;\r\n FShortCutWindowList: TTMSFNCCustomControlShortCutWindowList;\r\n {$ENDIF}\r\n {$ENDIF}\r\n FAllowGetChildren: Boolean;\r\n FAdaptToStyle: Boolean;\r\n FAdaptedToStyle: Boolean;\r\n FTransparent: Boolean;\r\n FBufferedPainting: Boolean;\r\n FNativeCanvas: Boolean;\r\n FAntiAliasing: Boolean;\r\n FOptimizedHTMLDrawing: Boolean;\r\n FShowAcceleratorChar: Boolean;\r\n FTextQuality: TTMSFNCGraphicsTextQuality;\r\n FOnInternalDblClick: TNotifyEvent;\r\n FOnInternalMouseDown: TNotifyEvent;\r\n FOnInternalMouseMove: TNotifyEvent;\r\n FOnInternalMouseUp: TNotifyEvent;\r\n function GetAllowFocus: Boolean;\r\n {$IFDEF FNCLIB}\r\n function GetShortCutHint: string;\r\n {$ENDIF}\r\n function GetControlAlignment: TTMSFNCControlAlignment;\r\n procedure SetAllowFocus(const Value: Boolean);\r\n procedure SetControlAlignment(const Value: TTMSFNCControlAlignment);\r\n procedure SetAntiAliasing(const Value: Boolean);\r\n procedure SetOptimizedHTMLDrawing(const Value: Boolean);\r\n procedure SetShowAcceleratorChar(const Value: Boolean);\r\n procedure SetNativeCanvas(const Value: Boolean);\r\n procedure SetTextQuality(const Value: TTMSFNCGraphicsTextQuality);\r\n {$IFDEF FNCLIB}\r\n procedure SetShortCutHint(const Value: string);\r\n {$ENDIF}\r\n protected\r\n function GetVersion: string; virtual;\r\n function GetDocURL: string; virtual;\r\n function GetTipsURL: string; virtual;\r\n function GetClientMousePos: TPointF; virtual;\r\n function ConvertScreenToClient(APoint: TPointF): TPointF; virtual;\r\n function ConvertClientToScreen(APoint: TPointF): TPointF; virtual;\r\n function GetDragObjectScreenShot: TTMSFNCBitmap; virtual;\r\n function GetAdaptToStyle: Boolean; virtual;\r\n {$IFDEF FNCLIB}\r\n {$IFNDEF WEBLIB}\r\n function HasShortCut(AShortCut: string): Boolean; virtual;\r\n function HandleShortCut(AShortCut: string): Boolean; virtual;\r\n function ExecuteShortCutMethod(AShortCut: string): Boolean; virtual;\r\n function IsShortCutHintActive: Boolean; virtual;\r\n {$ENDIF}\r\n {$ENDIF}\r\n procedure ChangeDPIScale({%H-}M, {%H-}D: Integer); virtual;\r\n procedure DestroyGraphicElements; virtual; abstract;\r\n procedure SetDefaultGraphicColors; virtual;\r\n procedure SetAdaptToStyle(const Value: Boolean); virtual;\r\n procedure CancelHint; virtual;\r\n procedure BeginDrag; virtual;\r\n procedure InitializeStyle;\r\n procedure ApplyStyle; virtual;\r\n procedure ResetToDefaultStyle; virtual;\r\n procedure HandleMouseLeave; virtual;\r\n procedure HandleMouseEnter; virtual;\r\n procedure HandleMouseDown({%H-}Button: TTMSFNCMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Single); virtual;\r\n procedure HandleMouseMove({%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Single); virtual;\r\n procedure HandleDblClick({%H-}X, {%H-}Y: Single); virtual;\r\n procedure HandleMouseUp({%H-}Button: TTMSFNCMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Single); virtual;\r\n procedure HandleKeyPress(var {%H-}Key: Char); virtual;\r\n procedure HandleKeyDown(var {%H-}Key: Word; {%H-}Shift: TShiftState); virtual;\r\n procedure HandleDialogKey(var {%H-}Key: Word; {%H-}Shift: TShiftState); virtual;\r\n procedure HandleKeyUp(var {%H-}Key: Word; {%H-}Shift: TShiftState); virtual;\r\n procedure HandleMouseWheel({%H-}Shift: TShiftState; {%H-}WheelDelta: Integer; var {%H-}Handled: Boolean); virtual;\r\n procedure HandleDragOver(const {%H-}Source: TObject; const {%H-}Point: TPointF; var {%H-}Accept: Boolean); virtual;\r\n procedure HandleDragDrop(const {%H-}Source: TObject; const {%H-}Point: TPointF); virtual;\r\n {$IFDEF FNCLIB}\r\n {$IFNDEF WEBLIB}\r\n procedure GetShortCutHints(AShortCutHints: TStringList); virtual;\r\n procedure ShowShortCutHint; virtual;\r\n procedure CustomizeShortCut({%H-}AShortCutWindow: TTMSFNCHint; {%H-}AShortCut: string; {%H-}AShortCutRect: TRectF; var {%H-}AShortCutPosition: TPointF); virtual;\r\n procedure CancelShortCutHint(AClearShortCutHintString: Boolean = True); virtual;\r\n {$ENDIF}\r\n {$ENDIF}\r\n property AdaptToStyle: Boolean read GetAdaptToStyle write SetAdaptToStyle default False;\r\n property Transparent: Boolean read FTransparent write FTransparent default False;\r\n property BufferedPainting: Boolean read FBufferedPainting write FBufferedPainting default False;\r\n property NativeCanvas: Boolean read FNativeCanvas write SetNativeCanvas default False;\r\n property AntiAliasing: Boolean read FAntiAliasing write SetAntiAliasing default True;\r\n property OptimizedHTMLDrawing: Boolean read FOptimizedHTMLDrawing write SetOptimizedHTMLDrawing default True;\r\n property ShowAcceleratorChar: Boolean read FShowAcceleratorChar write SetShowAcceleratorChar default True;\r\n property TextQuality: TTMSFNCGraphicsTextQuality read FTextQuality write SetTextQuality default gtqAntiAliasing;\r\n property OnInternalMouseDown: TNotifyEvent read FOnInternalMouseDown write FOnInternalMouseDown;\r\n property OnInternalMouseUp: TNotifyEvent read FOnInternalMouseUp write FOnInternalMouseUp;\r\n property OnInternalMouseMove: TNotifyEvent read FOnInternalMouseMove write FOnInternalMouseMove;\r\n property OnInternalDblClick: TNotifyEvent read FOnInternalDblClick write FOnInternalDblClick;\r\n {$IFDEF FNCLIB}\r\n property ShortCutHint: string read GetShortCutHint write SetShortCutHint;\r\n {$ENDIF}\r\n property AllowGetChildren: Boolean read FAllowGetChildren write FAllowGetChildren default False;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n property AllowFocus: Boolean read GetAllowFocus write SetAllowFocus default True;\r\n property ControlAlignment: TTMSFNCControlAlignment read GetControlAlignment write SetControlAlignment default caNone;\r\n procedure SetControlMargins(ALeft, ATop, ARight, ABottom: Single);\r\n procedure GetControlMargins(var ALeft, ATop, ARight, ABottom: Single);\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n TTMSFNCCustomControlBase = class(TTMSFNCCustomControlBaseCommon)\r\n private\r\n FStyleChangedId: Integer;\r\n function GetL: Single;\r\n function GetT: Single;\r\n procedure SetTop(const Value: Single);\r\n procedure SetLeft(const Value: Single);\r\n protected\r\n procedure StyleChangedHandler(const Sender: TObject; const Msg: TMessage); virtual;\r\n procedure DoMouseEnter; override;\r\n procedure DoMouseLeave; override;\r\n procedure DragOver(const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation); override;\r\n procedure DragDrop(const Data: TDragObject; const Point: TPointF); override;\r\n procedure MouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure MouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure MouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;\r\n procedure KeyUp(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;\r\n procedure DialogKey(var Key: Word; Shift: TShiftState); override;\r\n procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override;\r\n procedure DblClick; override;\r\n {$WARNINGS OFF}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION < 30}\r\n function GetHintString: String; virtual;\r\n function HasHint: Boolean; virtual;\r\n {$IFEND}\r\n {$IF COMPILERVERSION = 28}\r\n procedure BeginUpdate; virtual;\r\n procedure EndUpdate; virtual;\r\n {$IFEND}\r\n {$WARNINGS ON}\r\n {$HINTS ON}\r\n public\r\n property Left: Single read GetL write SetLeft;\r\n property Top: Single read GetT write SetTop;\r\n procedure Invalidate; virtual;\r\n procedure SetNewScene(AScene: IScene); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n TTMSFNCCustomControlBase = class(TTMSFNCCustomControlBaseCommon)\r\n private\r\n FStored: Boolean;\r\n FHitTest: Boolean;\r\n {$IFDEF VCLLIB}\r\n procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;\r\n procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;\r\n procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;\r\n procedure WMPaint(var Message: TWMPaint); message WM_PAINT;\r\n procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;\r\n procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;\r\n procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;\r\n procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW;\r\n procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;\r\n procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n procedure WMGetDlgCode(var {%H-}Message: TLMNoParams); message LM_GETDLGCODE;\r\n procedure WMEraseBkGnd(var {%H-}Message: TLMEraseBkGnd); message LM_ERASEBKGND;\r\n procedure WMPaint(var {%H-}Message: TLMPaint); message LM_PAINT;\r\n procedure WMMouseWheel(var {%H-}Message: TLMMouseEvent); message LM_MOUSEWHEEL;\r\n procedure CMMouseLeave(var {%H-}Message: TLMNoParams); message CM_MOUSELEAVE;\r\n procedure CMMouseEnter(var {%H-}Message: TLMNoParams); message CM_MOUSEENTER;\r\n procedure CMFocusChanged(var {%H-}Message: TLMessage); message CM_FOCUSCHANGED;\r\n procedure CMHintShow(var {%H-}Message: TLMessage); message CM_HINTSHOW;\r\n procedure WMNCHitTest(var Message: TLMessage) ; message LM_NCHITTEST;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override;\r\n procedure DoMouseLeave; override;\r\n procedure DoMouseEnter; override;\r\n {$ENDIF}\r\n protected\r\n function GetHintString: String; virtual;\r\n function HasHint: Boolean; virtual;\r\n procedure MouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Integer); override;\r\n procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;\r\n procedure MouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Integer); override;\r\n procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override;\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure KeyPress(var Key: Char); override;\r\n procedure KeyUp(var Key: Word; Shift: TShiftState); override;\r\n procedure DblClick; override;\r\n {$IFDEF VCLLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 30}\r\n procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); override;\r\n {$ELSE}\r\n procedure ChangeScale(M, D: Integer); override;\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n {$IFDEF WEBLIB}\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n procedure BeginUpdate; virtual;\r\n procedure EndUpdate; virtual;\r\n {$ENDIF}\r\n procedure DragDrop(Source: TObject; X, Y: Integer); override;\r\n function CanFocus: Boolean; override;\r\n function LocalRect: TRectF; virtual;\r\n property Stored: Boolean read FStored write FStored default True;\r\n property HitTest: Boolean read FHitTest write FHitTest default True;\r\n end;\r\n {$ENDIF}\r\n\r\n TTMSFNCCustomControlBeforeDrawEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCCustomControlAfterDrawEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF) of object;\r\n TTMSFNCCustomControlCanSavePropertyEvent = procedure(Sender: TObject; AObject: TObject; APropertyName: string; APropertyType: TTypeKind; var ACanSave: Boolean) of object;\r\n TTMSFNCCustomControlCanLoadPropertyEvent = procedure(Sender: TObject; AObject: TObject; APropertyName: string; APropertyType: TTypeKind; var ACanLoad: Boolean) of object;\r\n\r\n TTMSFNCCustomControl = class(TTMSFNCCustomControlBase, ITMSFNCGraphicsExport{$IFNDEF WEBLIB}, ITMSFNCPersistence{$ENDIF})\r\n private\r\n {$IFDEF WEBLIB}\r\n FBlockInvalidate: Boolean;\r\n FPopupMenu: TPopupMenu;\r\n {$ENDIF}\r\n FOnBeforeDraw: TTMSFNCCustomControlBeforeDrawEvent;\r\n FOnAfterDraw: TTMSFNCCustomControlAfterDrawEvent;\r\n FOnCanSaveProperty: TTMSFNCCustomControlCanSavePropertyEvent;\r\n FOnCanLoadProperty: TTMSFNCCustomControlCanLoadPropertyEvent;\r\n {$IFDEF FMXLIB}\r\n FColor: TTMSFNCGraphicsColor;\r\n {$ENDIF}\r\n FCheckedChk, FUnCheckedChk, FCheckedFocusChk, FUnCheckedFocusChk, FCheckedDisabledChk, FUnCheckedDisabledChk: TTMSFNCBitmap;\r\n FCheckedRd, FUnCheckedRd, FCheckedFocusRd, FUnCheckedFocusRd, FCheckedDisabledRd, FUnCheckedDisabledRd: TTMSFNCBitmap;\r\n FDownBtn, FNormalBtn, FDownFocusBtn, FNormalFocusBtn, FNormalDisabledBtn: TTMSFNCBitmap;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FDataPointer: Pointer;\r\n FDataBoolean: Boolean;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n {$IFNDEF WEBLIB}\r\n FUndoManager: TTMSFNCUndoManager;\r\n function GetUndoManager: TTMSFNCUndoManager;\r\n {$ENDIF}\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n {$IFDEF FMXLIB}\r\n procedure SetColor(const Value: TTMSFNCGraphicsColor);\r\n {$ENDIF}\r\n protected\r\n {$IFDEF WEBLIB}\r\n class function GetVersionNumber(AMaj, AMin, ARel, ABld: ShortInt): string;\r\n {$ENDIF}\r\n function CanSaveProperty({%H-}AObject: TObject; {%H-}APropertyName: string; {%H-}APropertyType: TTypeKind): Boolean; virtual;\r\n function CanLoadProperty({%H-}AObject: TObject; {%H-}APropertyName: string; {%H-}APropertyType: TTypeKind): Boolean; virtual;\r\n function GetVersion: string; override;\r\n function LocalToScreenEx(APoint: TPointF): TPointF; virtual;\r\n function ScreenToLocalEx(APoint: TPointF): TPointF; virtual;\r\n function GetContentRect: TRectF; virtual;\r\n function GetControlRect: TRectF; virtual;\r\n {$IFDEF WEBLIB}\r\n procedure SetColor(AValue: TColor); override;\r\n {$ENDIF}\r\n procedure RegisterRuntimeClasses; virtual;\r\n procedure &Export({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n procedure ApplyStyle; override;\r\n procedure ResetToDefaultStyle; override;\r\n procedure DestroyGraphicElements; override;\r\n {$IFDEF FMXLIB}\r\n procedure TurnOffAnimation(chk: TFmxObject); virtual;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n procedure DoSetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;\r\n {$ENDIF}\r\n procedure UpdateControlAfterResize; virtual;\r\n procedure CreateCheckBoxBitmaps; virtual;\r\n procedure CreateRadioButtonBitmaps; virtual;\r\n procedure CreateButtonBitmaps(AWidth, AHeight: Single); virtual;\r\n procedure DoBeforeDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF); virtual;\r\n procedure DoCanSaveProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind; var ACanSave: Boolean); virtual;\r\n procedure DoCanLoadProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind; var ACanLoad: Boolean); virtual;\r\n procedure DrawBackground(AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n procedure Draw({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n procedure DrawControl; virtual;\r\n procedure DoBitmapChanged(Sender: TObject);\r\n {$IFDEF DRAWTRIAL}\r\n {$IFDEF FREEWARE}\r\n procedure DrawTrial(AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n {$ENDIF}\r\n {$ENDIF}\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n procedure CaptureEx; virtual;\r\n procedure ReleaseCaptureEx; virtual;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetCheckBoxBitmap(AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True): TTMSFNCBitmap; virtual;\r\n function GetRadioButtonBitmap(AChecked: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True): TTMSFNCBitmap; virtual;\r\n function GetButtonBitmap(AWidth, AHeight: Single; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True): TTMSFNCBitmap; virtual;\r\n function IsDesignTime: Boolean; virtual;\r\n function IsLoading: Boolean; virtual;\r\n function IsReading: Boolean; virtual;\r\n function IsDesigning: Boolean; virtual;\r\n function IsDesignerForm: Boolean; virtual;\r\n function IsDestroying: Boolean; virtual;\r\n {$IFNDEF WEBLIB}\r\n procedure SaveSettingsToFile(AFileName: string); virtual;\r\n procedure LoadSettingsFromFile(AFileName: string); virtual;\r\n procedure SaveSettingsToStream(AStream: TStream); virtual;\r\n procedure LoadSettingsFromStream(AStream: TStream); virtual;\r\n {$ENDIF}\r\n procedure DisableBackground;\r\n procedure EnableBackground;\r\n procedure DisableFill;\r\n procedure EnableFill;\r\n procedure DisableStroke;\r\n procedure EnableStroke;\r\n procedure Resize; override;\r\n procedure Paint; override;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n {$IFNDEF WEBLIB}\r\n property UndoManager: TTMSFNCUndoManager read GetUndoManager;\r\n {$ENDIF}\r\n published\r\n property AdaptToStyle;\r\n property AllowFocus default True;\r\n {$IFDEF FMXLIB}\r\n property Hint;\r\n property ShowHint;\r\n property Color: TTMSFNCGraphicsColor read FColor write SetColor default gcWhite;\r\n property Align;\r\n property CanParentFocus;\r\n property ClipChildren default True;\r\n property ClipParent default False;\r\n property DisableFocusEffect default True;\r\n property DragMode default TDragMode.dmManual;\r\n property EnableDragHighlight default True;\r\n property Enabled default True;\r\n property Height;\r\n property HitTest default True;\r\n property Locked default False;\r\n property Padding;\r\n property Opacity;\r\n property Margins;\r\n property PopupMenu;\r\n property Position;\r\n property RotationAngle;\r\n property RotationCenter;\r\n property Scale;\r\n {$WARNINGS OFF}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 27}\r\n property Size;\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$WARNINGS ON}\r\n property TabOrder;\r\n property TabStop default True;\r\n property TouchTargetExpansion;\r\n property Visible default True;\r\n property Width;\r\n property OnApplyStyleLookup;\r\n property OnDragEnter;\r\n property OnDragLeave;\r\n property OnDragOver;\r\n property OnDragDrop;\r\n property OnDragEnd;\r\n property OnKeyDown;\r\n property OnKeyUp;\r\n property OnCanFocus;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnEnter;\r\n property OnExit;\r\n property OnMouseDown;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnMouseWheel;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnResize;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNLIB}\r\n property Align;\r\n {$IFDEF LCLLIB}\r\n property BorderSpacing;\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n property BevelEdges;\r\n property BevelInner;\r\n property BevelKind;\r\n property BevelOuter;\r\n property BevelWidth;\r\n property Ctl3D;\r\n property ParentCtl3D;\r\n property ParentDoubleBuffered;\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 23}\r\n property StyleElements;\r\n {$IFEND}\r\n {$HINTS ON}\r\n property Touch;\r\n property OnGesture;\r\n property OnMouseActivate;\r\n {$ENDIF}\r\n property Anchors;\r\n property BiDiMode;\r\n property Color default gcWhite;\r\n property Constraints;\r\n property DoubleBuffered;\r\n property DragCursor;\r\n property DragKind;\r\n property DragMode;\r\n property Enabled;\r\n property Font;\r\n property TabStop default True;\r\n property ParentBiDiMode;\r\n property ParentColor default False;\r\n property ParentFont;\r\n property ParentShowHint;\r\n property PopupMenu;\r\n property ShowHint;\r\n property Hint;\r\n property TabOrder;\r\n property Visible;\r\n property OnClick;\r\n property OnContextPopup;\r\n property OnDblClick;\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDock;\r\n property OnEndDrag;\r\n property OnEnter;\r\n property OnExit;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnMouseWheelDown;\r\n property OnMouseWheelUp;\r\n property OnStartDock;\r\n property OnStartDrag;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n property Align;\r\n property DoubleBuffered;\r\n property Color;\r\n property Enabled;\r\n property Font;\r\n property ParentDoubleBuffered;\r\n property TabStop;\r\n property ShowHint;\r\n property Hint;\r\n property TabOrder;\r\n property Visible;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnEnter;\r\n property OnExit;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnMouseWheel;\r\n property PopupMenu: TPopupMenu read FPopupMenu write FPopupMenu;\r\n {$ENDIF}\r\n property ShowAcceleratorChar;\r\n property OnBeforeDraw: TTMSFNCCustomControlBeforeDrawEvent read FOnBeforeDraw write FOnBeforeDraw;\r\n property OnAfterDraw: TTMSFNCCustomControlAfterDrawEvent read FOnAfterDraw write FOnAfterDraw;\r\n property OnCanSaveProperty: TTMSFNCCustomControlCanSavePropertyEvent read FOnCanSaveProperty write FOnCanSaveProperty;\r\n property OnCanLoadProperty: TTMSFNCCustomControlCanLoadPropertyEvent read FOnCanLoadProperty write FOnCanLoadProperty;\r\n end;\r\n\r\n TTMSFNCCustomControlClass = class of TTMSFNCCustomControl;\r\n\r\n TTMSFNCControl = class(TTMSFNCCustomControl)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.TMSFNCUtils, SysUtils\r\n {$IFNDEF LCLLIB}\r\n ,WEBLib.StdCtrls\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Platform, FMX.Ani\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,LCLType\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,WEBLib.TMSFNCXPVS\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF FMXMOBILE}\r\n {$IFDEF FREEWARE}\r\n {$IFDEF MSWINDOWS}\r\n ,System.Win.Registry, WinApi.ShellApi\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n ,MacApi.AppKit, MacApi.Foundation, MacApi.Helpers\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Objects, UIConsts\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,VCL.ExtCtrls\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\n{$IFDEF CMNLIB}\r\ntype\r\n TWinControlProtected = class(TWinControl);\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNLIB}\r\nfunction CreateShiftStateEx: TShiftState;\r\nbegin\r\n Result := [];\r\n if GetKeyState(VK_SHIFT) < 0 then\r\n Include(Result, ssShift);\r\n if GetKeyState(VK_CONTROL) < 0 then\r\n Include(Result, ssCtrl);\r\n if GetKeyState(VK_MENU) < 0 then\r\n Include(Result, ssAlt);\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCCustomControlBaseCommon }\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n FAdaptToStyle := Value;\r\n InitializeStyle;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.ChangeDPIScale(M, D: Integer);\r\nbegin\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetAdaptToStyle: Boolean;\r\nbegin\r\n Result := FAdaptToStyle;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.ApplyStyle;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.ResetToDefaultStyle;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetDefaultGraphicColors;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n TTMSFNCGraphics.DefaultPopupFillColor := c\r\n else\r\n TTMSFNCGraphics.DefaultPopupFillColor := gcWhite;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundStrokeColor(c) then\r\n TTMSFNCGraphics.DefaultPopupStrokeColor := c\r\n else\r\n TTMSFNCGraphics.DefaultPopupStrokeColor := gcSilver;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleDefaultButtonFillColor(c) then\r\n TTMSFNCGraphics.DefaultButtonFillColor := c\r\n else\r\n TTMSFNCGraphics.DefaultButtonFillColor := MakeGraphicsColor(225, 225, 225);\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleLineFillColor(c) then\r\n TTMSFNCGraphics.DefaultButtonStrokeColor := c\r\n else\r\n TTMSFNCGraphics.DefaultButtonStrokeColor := gcDarkgray;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleTextFontColor(c) then\r\n TTMSFNCGraphics.DefaultTextFontColor := c\r\n else\r\n TTMSFNCGraphics.DefaultTextFontColor := gcBlack;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleSelectionFillColor(c) then\r\n begin\r\n TTMSFNCGraphics.DefaultSelectionFillColor := c;\r\n TTMSFNCGraphics.DefaultButtonFillColorFocused := Blend(c, TTMSFNCGraphics.DefaultButtonFillColor, 25);\r\n TTMSFNCGraphics.DefaultButtonStrokeColorFocused := Blend(c, TTMSFNCGraphics.DefaultButtonStrokeColor, 30);\r\n end\r\n else\r\n begin\r\n TTMSFNCGraphics.DefaultSelectionFillColor := gcBlack;\r\n TTMSFNCGraphics.DefaultButtonFillColorFocused := MakeGraphicsColor(229, 241, 251);\r\n TTMSFNCGraphics.DefaultButtonStrokeColorFocused := MakeGraphicsColor(60, 127, 177);\r\n end;\r\n\r\n TTMSFNCGraphics.DefaultButtonStrokeColorDisabled := gcDarkGray;\r\n TTMSFNCGraphics.DefaultButtonFillColorDisabled := gcLightgray;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.InitializeStyle;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n TTMSFNCStyles.SetActiveScene(Scene);\r\n {$ENDIF}\r\n SetDefaultGraphicColors;\r\n DestroyGraphicElements;\r\n if AdaptToStyle then\r\n begin\r\n FAdaptedToStyle := True;\r\n ApplyStyle;\r\n end\r\n else if FAdaptedToStyle then\r\n begin\r\n ResetToDefaultStyle;\r\n FAdaptedToStyle := False;\r\n end;\r\n\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetVersion: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetDocURL: string;\r\nbegin\r\n Result := TTMSFNCBaseDocURL;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetTipsURL: string;\r\nbegin\r\n Result := TTMSFNCBaseTipsURL;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetClientMousePos: TPointF;\r\nbegin\r\n Result := ConvertScreenToClient(TTMSFNCUtils.GetMousePos);\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nfunction TTMSFNCCustomControlBaseCommon.ConvertClientToScreen(APoint: TPointF): TPointF;\r\nvar\r\n p: TPoint;\r\nbegin\r\n p := ClientToScreen(Point(Round(APoint.X), Round(APoint.Y)));\r\n Result := PointF(p.X, p.Y);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nfunction TTMSFNCCustomControlBaseCommon.ConvertClientToScreen(APoint: TPointF): TPointF;\r\nbegin\r\n Result := LocalToScreen(APoint);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNWEBLIB}\r\nfunction TTMSFNCCustomControlBaseCommon.ConvertScreenToClient(APoint: TPointF): TPointF;\r\nvar\r\n p: TPoint;\r\nbegin\r\n p := ScreenToClient(Point(Round(APoint.X), Round(APoint.Y)));\r\n Result := PointF(p.X, p.Y);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nfunction TTMSFNCCustomControlBaseCommon.ConvertScreenToClient(APoint: TPointF): TPointF;\r\nbegin\r\n Result := ScreenToLocal(APoint);\r\nend;\r\n{$ENDIF}\r\n\r\nconstructor TTMSFNCCustomControlBaseCommon.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n {$IFDEF FNCLIB}\r\n {$IFNDEF WEBLIB}\r\n FShortCutWindowList := TTMSFNCCustomControlShortCutWindowList.Create;\r\n {$ENDIF}\r\n {$ENDIF}\r\n SetDefaultGraphicColors;\r\n FAdaptToStyle := False;\r\n FAdaptedToStyle := False;\r\n FTransparent := False;\r\n FNativeCanvas := False;\r\n FBufferedPainting := False;\r\n FAntiAliasing := True;\r\n FOptimizedHTMLDrawing := True;\r\n FShowAcceleratorChar := True;\r\n FTextQuality := gtqAntiAliasing;\r\n {$IFDEF CMNWEBLIB}\r\n FAllowFocus := True;\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TTMSFNCCustomControlBaseCommon.Destroy;\r\nbegin\r\n {$IFDEF FNCLIB}\r\n {$IFNDEF WEBLIB}\r\n CancelShortCutHint;\r\n FShortCutWindowList.Free;\r\n {$ENDIF}\r\n {$ENDIF}\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetAllowFocus: Boolean;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := CanFocus;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := FAllowFocus;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetAllowFocus(const Value: Boolean);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n CanFocus := Value;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FAllowFocus := Value;\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF FNCLIB}\r\nfunction TTMSFNCCustomControlBaseCommon.GetShortCutHint: string;\r\nbegin\r\n Result := FShortCutHint;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetShortCutHint(const Value: string);\r\nbegin\r\n FShortCutHint := Value;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nfunction TTMSFNCCustomControlBaseCommon.IsShortCutHintActive: Boolean;\r\nbegin\r\n Result := FShortCutWindowList.Count > 0;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.CancelShortCutHint(AClearShortCutHintString: Boolean = True);\r\nbegin\r\n FShortCutWindowList.Clear;\r\n if AClearShortCutHintString then\r\n FShortCutLimitation := '';\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.CustomizeShortCut(AShortCutWindow: TTMSFNCHint; AShortCut: string; AShortCutRect: TRectF; var AShortCutPosition: TPointF);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.GetShortCutHints(AShortCutHints: TStringList);\r\nbegin\r\n AShortCutHints.Add(ShortCutHint);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.ShowShortCutHint;\r\nvar\r\n pt: TPointF;\r\n r: TRect;\r\n I: Integer;\r\n h: TTMSFNCHint;\r\n s: string;\r\n l: TStringList;\r\nbegin\r\n CancelShortCutHint(False);\r\n l := TStringList.Create;\r\n try\r\n GetShortCutHints(l);\r\n\r\n for I := 0 to l.Count - 1 do\r\n begin\r\n s := l[I];\r\n if (s <> '') and ((Pos(FShortCutLimitation, s) > 0) or (FShortCutLimitation = '')) then\r\n begin\r\n h := TTMSFNCHint.Create(Self);\r\n r := h.Calculate(s);\r\n pt := PointF((Width - (r.Right - r.Left)) / 2, Height - (r.Bottom - r.Top) / 2);\r\n CustomizeShortCut(h, s, ConvertToRectF(r), pt);\r\n pt := ConvertClientToScreen(pt);\r\n h.ShowHintAt(s, Round(pt.X), Round(pt.Y));\r\n FShortCutWindowList.Add(h);\r\n end;\r\n end;\r\n finally\r\n l.Free;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.ExecuteShortCutMethod(AShortCut: String): Boolean;\r\nbegin\r\n Result := False;\r\n if AShortCut = ShortCutHint then\r\n begin\r\n Click;\r\n Result := True;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.HasShortCut(AShortCut: string): Boolean;\r\nvar\r\n sl: TStringList;\r\n i: Integer;\r\n s: string;\r\nbegin\r\n Result := False;\r\n sl := TStringList.Create;\r\n try\r\n GetShortCutHints(sl);\r\n for I := 0 to sl.Count - 1 do\r\n begin\r\n s := sl[I];\r\n if (s <> '') and ((Pos(AShortCut, s) = 1) or (AShortCut = '')) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n finally\r\n sl.Free;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.HandleShortCut(AShortcut: string): Boolean;\r\nvar\r\n sl: TStringList;\r\n s: string;\r\n I: Integer;\r\n b: Boolean;\r\nbegin\r\n Result := ExecuteShortCutMethod(AShortCut);\r\n if Result then\r\n begin\r\n CancelShortCutHint;\r\n FShortCutLimitation := '';\r\n end\r\n else\r\n begin\r\n FShortCutLimitation := AShortCut;\r\n sl := TStringList.Create;\r\n try\r\n GetShortCutHints(sl);\r\n b := False;\r\n for I := 0 to sl.Count - 1 do\r\n begin\r\n s := sl[I];\r\n if (s <> '') and ((Pos(FShortCutLimitation, s) = 1) or (FShortCutLimitation = '')) then\r\n begin\r\n b := True;\r\n Break;\r\n end;\r\n end;\r\n\r\n if b then\r\n ShowShortCutHint\r\n else\r\n CancelShortCutHint;\r\n finally\r\n sl.Free;\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetTextQuality(const Value: TTMSFNCGraphicsTextQuality);\r\nbegin\r\n if FTextQuality <> Value then\r\n begin\r\n FTextQuality := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetNativeCanvas(const Value: Boolean);\r\nbegin\r\n if FNativeCanvas <> Value then\r\n begin\r\n FNativeCanvas := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetAntiAliasing(const Value: Boolean);\r\nbegin\r\n if FAntiAliasing <> Value then\r\n begin\r\n FAntiAliasing := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetOptimizedHTMLDrawing(const Value: Boolean);\r\nbegin\r\n if FOptimizedHTMLDrawing <> Value then\r\n begin\r\n FOptimizedHTMLDrawing := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetShowAcceleratorChar(const Value: Boolean);\r\nbegin\r\n if FShowAcceleratorChar <> Value then\r\n begin\r\n FShowAcceleratorChar := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetControlAlignment: TTMSFNCControlAlignment;\r\nbegin\r\n Result := caNone;\r\n {$IFDEF FMXLIB}\r\n case Align of\r\n TAlignLayout.None: Result := caNone;\r\n TAlignLayout.Top: Result := caTop;\r\n TAlignLayout.Bottom: Result := caBottom;\r\n TAlignLayout.Left: Result := caLeft;\r\n TAlignLayout.Right: Result := caRight;\r\n TAlignLayout.Client: Result := caClient;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n case Align of\r\n alNone: Result := caNone;\r\n alTop: Result := caTop;\r\n alBottom: Result := caBottom;\r\n alLeft: Result := caLeft;\r\n alRight: Result := caRight;\r\n alClient: Result := caClient;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetControlAlignment(const Value: TTMSFNCControlAlignment);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n case Value of\r\n caNone: Align := TAlignLayout.None;\r\n caTop: Align := TAlignLayout.Top;\r\n caBottom: Align := TAlignLayout.Bottom;\r\n caLeft: Align := TAlignLayout.Left;\r\n caRight: Align := TAlignLayout.Right;\r\n caClient: Align := TAlignLayout.Client;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n case Value of\r\n caNone: Align := alNone;\r\n caTop: Align := alTop;\r\n caBottom: Align := alBottom;\r\n caLeft: Align := alLeft;\r\n caRight: Align := alRight;\r\n caClient: Align := alClient;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleMouseLeave;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleMouseEnter;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X: Single; Y: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleMouseMove(Shift: TShiftState; X: Single; Y: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleDblClick(X: Single; Y: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleDragOver(const Source: TObject; const Point: TPointF; var Accept: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleDragDrop(const Source: TObject; const Point: TPointF);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X: Single; Y: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleKeyPress(var Key: Char);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleKeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleDialogKey(var Key: Word; Shift: TShiftState);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleKeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.HandleMouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomControlBase.StyleChangedHandler(const Sender: TObject; const Msg: TMessage);\r\nbegin\r\n InitializeStyle;\r\nend;\r\n\r\nconstructor TTMSFNCCustomControlBase.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FStyleChangedId := TMessageManager.DefaultManager.SubscribeToMessage(TStyleChangedMessage, StyleChangedHandler);\r\nend;\r\n\r\ndestructor TTMSFNCCustomControlBase.Destroy;\r\nvar\r\n frm: TCustomForm;\r\nbegin\r\n frm := TTMSFNCUtils.GetOwnerForm(Self);\r\n if Assigned(frm) and (csDestroying in frm.ComponentState) then\r\n TTMSFNCStyles.SetActiveScene(nil);\r\n\r\n TMessageManager.DefaultManager.Unsubscribe(TStyleChangedMessage, FStyleChangedId);\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.Invalidate;\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\n{$WARNINGS OFF}\r\n{$HINTS OFF}\r\n{$IF COMPILERVERSION < 30}\r\nfunction TTMSFNCCustomControlBase.GetHintString: String;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBase.HasHint: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n{$IFEND}\r\n{$HINTS ON}\r\n{$WARNINGS ON}\r\n\r\nfunction TTMSFNCCustomControlBase.GetL: Single;\r\nbegin\r\n Result := Position.X;\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBase.GetT: Single;\r\nbegin\r\n Result := Position.Y;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.SetTop(const Value: Single);\r\nbegin\r\n Position.Y := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.SetLeft(const Value: Single);\r\nbegin\r\n Position.X := Value;\r\nend;\r\n\r\n{$WARNINGS OFF}\r\n{$HINTS OFF}\r\n{$IF COMPILERVERSION = 28}\r\nprocedure TTMSFNCCustomControlBase.BeginUpdate;\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.EndUpdate;\r\nbegin\r\nend;\r\n{$IFEND}\r\n{$HINTS ON}\r\n{$WARNINGS ON}\r\n\r\nprocedure TTMSFNCCustomControlBase.KeyDown(var Key: Word; var KeyChar: WideChar;\r\n Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if KeyChar = ' ' then\r\n Key := KEY_SPACE;\r\n\r\n HandleKeyPress(KeyChar);\r\n HandleKeyDown(Key, Shift);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.KeyUp(var Key: Word; var KeyChar: WideChar;\r\n Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if KeyChar = ' ' then\r\n Key := KEY_SPACE;\r\n\r\n HandleKeyUp(Key, Shift);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DialogKey(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n HandleDialogKey(Key, Shift);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DragOver(const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation);\r\nvar\r\n b: Boolean;\r\nbegin\r\n inherited;\r\n b := Operation = TDragOperation.Move;\r\n HandleDragOver(Data.Source, Point, b);\r\n if b then\r\n Operation := TDragOperation.Move;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DragDrop(const Data: TDragObject; const Point: TPointF);\r\nbegin\r\n inherited;\r\n HandleDragDrop(Data.Source, Point);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X,\r\n Y: Single);\r\nbegin\r\n inherited;\r\n HandleMouseDown(Button, Shift, X, Y);\r\n if Assigned(OnInternalMouseDown) then\r\n OnInternalMouseDown(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseMove(Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n HandleMouseMove(Shift, X, Y);\r\n if Assigned(OnInternalMouseMove) then\r\n OnInternalMouseMove(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X,\r\n Y: Single);\r\nbegin\r\n inherited;\r\n HandleMouseUp(Button, Shift, X, Y);\r\n if Assigned(OnInternalMouseUp) then\r\n OnInternalMouseUp(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseWheel(Shift: TShiftState; WheelDelta: Integer;\r\n var Handled: Boolean);\r\nbegin\r\n inherited;\r\n HandleMouseWheel(Shift, WheelDelta, Handled);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DoMouseEnter;\r\nbegin\r\n inherited;\r\n HandleMouseEnter;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.SetNewScene(AScene: IScene);\r\nbegin\r\n inherited;\r\n TTMSFNCStyles.SetActiveScene(AScene);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DoMouseLeave;\r\nbegin\r\n inherited;\r\n HandleMouseLeave;\r\nend;\r\n\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControlBase.DblClick;\r\nvar\r\n pf: TPointF;\r\nbegin\r\n inherited;\r\n pf := ConvertScreenToClient(TTMSFNCUtils.GetMousePos);\r\n HandleDblClick(pf.X, pf.Y);\r\n if Assigned(OnInternalDblClick) then\r\n OnInternalDblClick(Self);\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\n\r\n{$IFDEF VCLLIB}\r\n{$HINTS OFF}\r\n{$IF COMPILERVERSION > 30}\r\nprocedure TTMSFNCCustomControlBase.ChangeScale(M, D: Integer; isDpiChange: Boolean);\r\n{$ELSE}\r\nprocedure TTMSFNCCustomControlBase.ChangeScale(M, D: Integer);\r\n{$IFEND}\r\nbegin\r\n inherited;\r\n if not (csDesigning in ComponentState) and (M <> D) then\r\n ChangeDPIScale(M, D);\r\nend;\r\n{$HINTS ON}\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControlBase.KeyPress(var Key: Char);\r\nbegin\r\n inherited;\r\n HandleKeyPress(Key);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.KeyDown(var Key: Word; Shift: TShiftState);\r\nvar\r\n Ctrl: TWinControl;\r\nbegin\r\n inherited;\r\n HandleDialogKey(Key, Shift);\r\n HandleKeyDown(Key, Shift);\r\n if Key = KEY_TAB then\r\n begin\r\n {$IFNDEF WEBLIB}\r\n if ssShift in Shift then\r\n Ctrl := TWinControlProtected(Self.Parent).FindNextControl(Self, False, True, True)\r\n else\r\n Ctrl := TWinControlProtected(Self.Parent).FindNextControl(Self, True, True, True);\r\n\r\n if Assigned(Ctrl) and Ctrl.CanFocus then\r\n Ctrl.SetFocus;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.KeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n HandleKeyUp(Key, Shift);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);\r\nbegin\r\n inherited;\r\n HandleDragOver(Source, PointF(X, Y), Accept);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DragDrop(Source: TObject; X, Y: Integer);\r\nbegin\r\n inherited;\r\n HandleDragDrop(Source, PointF(X, Y));\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X,\r\n Y: Integer);\r\nbegin\r\n inherited;\r\n HandleMouseDown(Button, Shift, X, Y);\r\n if Assigned(OnInternalMouseDown) then\r\n OnInternalMouseDown(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseMove(Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n inherited;\r\n HandleMouseMove(Shift, X, Y);\r\n if Assigned(OnInternalMouseMove) then\r\n OnInternalMouseMove(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X,\r\n Y: Integer);\r\nbegin\r\n inherited;\r\n HandleMouseUp(Button, Shift, X, Y);\r\n if Assigned(OnInternalMouseUp) then\r\n OnInternalMouseUp(Self);\r\nend;\r\n\r\n{$IFDEF VCLLIB}\r\nprocedure TTMSFNCCustomControlBase.CMHintShow(var Message: TMessage);\r\nvar\r\n h: String;\r\nbegin\r\n with TCMHintShow(Message).HintInfo^ do\r\n begin\r\n if HasHint then\r\n begin\r\n h := GetHintString;\r\n HintStr := h;\r\n ReshowTimeout := 0;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.CMStyleChanged(var Message: TMessage);\r\nbegin\r\n InitializeStyle;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMNCHitTest(var Message: TWMNCHitTest);\r\nbegin\r\n if not HitTest then\r\n Message.Result := HTTRANSPARENT\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMPaint(var Message: TWMPaint);\r\nbegin\r\n if Transparent then\r\n PaintHandler(Message)\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMEraseBkGnd(var Message: TWMEraseBkGnd);\r\nbegin\r\n if Transparent then\r\n Message.Result := 1\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMGetDlgCode(var Message: TWMGetDlgCode);\r\nbegin\r\n if TabStop then\r\n Message.result := DLGC_WANTALLKEYS or DLGC_WANTARROWS or DLGC_WANTTAB\r\n else\r\n Message.result := DLGC_WANTALLKEYS or DLGC_WANTARROWS;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMMouseWheel(var Message: TWMMouseWheel);\r\nvar\r\n b: Boolean;\r\nbegin\r\n inherited;\r\n b := False;\r\n HandleMouseWheel(CreateShiftStateEx, Message.WheelDelta, b);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.CMFocusChanged(var Message: TCMFocusChanged);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.CMMouseLeave(var Message: TMessage);\r\nbegin\r\n HandleMouseLeave;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.CMMouseEnter(var Message: TMessage);\r\nbegin\r\n HandleMouseEnter;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nprocedure TTMSFNCCustomControlBase.DoMouseEnter;\r\nbegin\r\n inherited;\r\n HandleMouseEnter;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.DoMouseLeave;\r\nbegin\r\n inherited;\r\n HandleMouseLeave;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);\r\nbegin\r\n HandleMouseWheel(Shift, WheelDelta, Handled);\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF LCLLIB}\r\nprocedure TTMSFNCCustomControlBase.CMFocusChanged(var Message: TLMessage);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.CMMouseLeave(var Message: TLMNoParams);\r\nbegin\r\n HandleMouseLeave;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.CMMouseEnter(var Message: TLMNoParams);\r\nbegin\r\n HandleMouseEnter;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.CMHintShow(var Message: TLMessage);\r\nvar\r\n h: String;\r\nbegin\r\n with TCMHintShow(Message).HintInfo^ do\r\n begin\r\n if HasHint then\r\n begin\r\n h := GetHintString;\r\n HintStr := h;\r\n ReshowTimeout := 0;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMNCHitTest(var Message: TLMessage);\r\nbegin\r\n if not HitTest then\r\n Message.Result := HTTRANSPARENT\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMPaint(var Message: TLMPaint);\r\nbegin\r\n if Transparent then\r\n PaintHandler(Message)\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMEraseBkGnd(var Message: TLMEraseBkGnd);\r\nbegin\r\n if Transparent then\r\n Message.Result := 1\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMGetDlgCode(var Message: TLMNoParams);\r\nbegin\r\n if TabStop then\r\n Message.result := DLGC_WANTALLKEYS or DLGC_WANTARROWS or DLGC_WANTTAB\r\n else\r\n Message.result := DLGC_WANTALLKEYS or DLGC_WANTARROWS;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.WMMouseWheel(var Message: TLMMouseEvent);\r\nvar\r\n b: Boolean;\r\nbegin\r\n inherited;\r\n b := False;\r\n HandleMouseWheel(CreateShiftStateEx, Message.WheelDelta, b);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomControlBase.CanFocus: Boolean;\r\nbegin\r\n Result := inherited CanFocus;\r\n Result := Result and AllowFocus;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.BeginUpdate;\r\nbegin\r\n {$IFDEF WEBLIB}\r\n inherited;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBase.EndUpdate;\r\nbegin\r\n {$IFDEF WEBLIB}\r\n inherited;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBase.LocalRect: TRectF;\r\nbegin\r\n Result := RectF(0, 0, Width, Height);\r\nend;\r\n\r\nconstructor TTMSFNCCustomControlBase.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FHitTest := True;\r\n FStored := True;\r\n {$IFNDEF WEBLIB}\r\n DoubleBuffered := True;\r\n {$ENDIF}\r\n ControlStyle := ControlStyle + [csAcceptsControls];\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nclass function TTMSFNCCustomControl.GetVersionNumber(AMaj, AMin, ARel, ABld: ShortInt): string;\r\nbegin\r\n Result := '';\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControl.DisableBackground;\r\nbegin\r\n FFill.Kind := gfkNone;\r\n FStroke.Kind := gskNone;\r\n {$IFDEF CMNWEBLIB}\r\n Color := clBtnFace;\r\n {$IFNDEF WEBLIB}\r\n ParentColor := False;\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.EnableBackground;\r\nbegin\r\n FFill.Kind := gfkSolid;\r\n FStroke.Kind := gskSolid;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DisableStroke;\r\nbegin\r\n FStroke.Kind := gskNone;\r\nend;\r\n\r\n{$IFDEF LCLLIB}\r\nprocedure TTMSFNCCustomControl.DoSetBounds(ALeft, ATop, AWidth,\r\n AHeight: Integer);\r\nbegin\r\n inherited DoSetBounds(ALeft, ATop, AWidth, AHeight);\r\n UpdateControlAfterResize;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nprocedure TTMSFNCCustomControl.SetColor(AValue: TColor);\r\nbegin\r\n inherited;\r\n if Assigned(Fill) then\r\n Fill.Color := AValue;\r\n Invalidate;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomControl.SetColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColor <> Value then\r\n begin\r\n FColor := Value;\r\n Fill.Color := Color;\r\n Invalidate;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControl.Resize;\r\nbegin\r\n inherited;\r\n {$IFNDEF LCLLIB}\r\n UpdateControlAfterResize;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.EnableStroke;\r\nbegin\r\n FStroke.Kind := gskSolid;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DisableFill;\r\nbegin\r\n FFill.Kind := gfkNone;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.EnableFill;\r\nbegin\r\n FFill.Kind := gfkSolid;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomControl then\r\n begin\r\n FFill.Assign((Source as TTMSFNCCustomControl).Fill);\r\n FStroke.Assign((Source as TTMSFNCCustomControl).Stroke);\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCCustomControl.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n {$IFDEF FMXLIB}\r\n FColor := gcWhite;\r\n CanFocus := True;\r\n ClipChildren := True;\r\n DisableFocusEffect := True;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF WEBLIB}\r\n ParentColor := False;\r\n {$ENDIF}\r\n Color := gcWhite;\r\n {$ENDIF}\r\n TabStop := True;\r\n FFill := TTMSFNCGraphicsFill.Create;\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FFill.OnChanged := @FillChanged;\r\n FStroke.OnChanged := @StrokeChanged;\r\n\r\n if not IsDesignerForm then\r\n RegisterRuntimeClasses;\r\nend;\r\n\r\ndestructor TTMSFNCCustomControl.Destroy;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if Assigned(FUndoManager) then\r\n begin\r\n FUndoManager.Free;\r\n FUndoManager := nil;\r\n end;\r\n {$ENDIF}\r\n\r\n if Assigned(FDownBtn) then\r\n begin\r\n FDownBtn.Free;\r\n FDownBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalBtn) then\r\n begin\r\n FNormalBtn.Free;\r\n FNormalBtn := nil;\r\n end;\r\n\r\n if Assigned(FDownFocusBtn) then\r\n begin\r\n FDownFocusBtn.Free;\r\n FDownFocusBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalFocusBtn) then\r\n begin\r\n FNormalFocusBtn.Free;\r\n FNormalFocusBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalDisabledBtn) then\r\n begin\r\n FNormalDisabledBtn.Free;\r\n FNormalDisabledBtn := nil;\r\n end;\r\n\r\n if Assigned(FCheckedChk) then\r\n begin\r\n FCheckedChk.Free;\r\n FCheckedChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedFocusChk) then\r\n begin\r\n FCheckedFocusChk.Free;\r\n FCheckedFocusChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedDisabledChk) then\r\n begin\r\n FUnCheckedDisabledChk.Free;\r\n FUnCheckedDisabledChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedDisabledChk) then\r\n begin\r\n FCheckedDisabledChk.Free;\r\n FCheckedDisabledChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedChk) then\r\n begin\r\n FUnCheckedChk.Free;\r\n FUnCheckedChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedFocusChk) then\r\n begin\r\n FUnCheckedFocusChk.Free;\r\n FUnCheckedFocusChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedRd) then\r\n begin\r\n FCheckedRd.Free;\r\n FCheckedRd := nil;\r\n end;\r\n\r\n if Assigned(FCheckedFocusRd) then\r\n begin\r\n FCheckedFocusRd.Free;\r\n FCheckedFocusRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedRd) then\r\n begin\r\n FUnCheckedRd.Free;\r\n FUnCheckedRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedFocusRd) then\r\n begin\r\n FUnCheckedFocusRd.Free;\r\n FUnCheckedFocusRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedDisabledRd) then\r\n begin\r\n FUnCheckedDisabledRd.Free;\r\n FUnCheckedDisabledRd := nil;\r\n end;\r\n\r\n if Assigned(FCheckedDisabledRd) then\r\n begin\r\n FCheckedDisabledRd.Free;\r\n FCheckedDisabledRd := nil;\r\n end;\r\n\r\n FFill.Free;\r\n FStroke.Free;\r\n\r\n inherited;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nfunction TTMSFNCCustomControl.GetUndoManager: TTMSFNCUndoManager;\r\nbegin\r\n if not Assigned(FUndoManager) then\r\n FUndoManager := TTMSFNCUndoManager.Create(Self);\r\n\r\n Result := FUndoManager;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControl.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DoCanSaveProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind; var ACanSave: Boolean);\r\nbegin\r\n if Assigned(OnCanSaveProperty) then\r\n OnCanSaveProperty(Self, AObject, APropertyName, APropertyType, ACanSave);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DoCanLoadProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind; var ACanLoad: Boolean);\r\nbegin\r\n if Assigned(OnCanLoadProperty) then\r\n OnCanLoadProperty(Self, AObject, APropertyName, APropertyType, ACanLoad);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DoBeforeDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDraw) then\r\n OnBeforeDraw(Self, AGraphics, ARect, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DoAfterDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n if Assigned(OnAfterDraw) then\r\n OnAfterDraw(Self, AGraphics, ARect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DrawBackground(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n AGraphics.Fill.Assign(Fill);\r\n AGraphics.Fill.Color := Color;\r\n AGraphics.Stroke.Assign(Stroke);\r\n AGraphics.DrawRectangle(ARect);\r\nend;\r\n\r\n{$IFDEF DRAWTRIAL}\r\n{$IFDEF FREEWARE}\r\nprocedure TTMSFNCCustomControl.DrawTrial(AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF);\r\nvar\r\n s: String;\r\nbegin\r\n if not (Parent is TTMSFNCCustomControl) then\r\n begin\r\n InflateRectEx(ARect, -5, -5);\r\n AGraphics.Font.Color := gcRed;\r\n TTMSFNCUtils.SetFontSize(AGraphics.Font, 10);\r\n s := ClassName + ' Trial ' + GetVersion;\r\n AGraphics.DrawText(ARect, s, False, gtaTrailing, gtaTrailing);\r\n end;\r\nend;\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControl.DrawControl;\r\nvar\r\n g, gbmp: TTMSFNCGraphics;\r\n r: TRectF;\r\n df: Boolean;\r\n bmp: TTMSFNCDrawBitmap;\r\n {$IFDEF FMXLIB}\r\n sc: Single;\r\n {$ENDIF}\r\nbegin\r\n if BufferedPainting then\r\n begin\r\n {$IFDEF FMXLIB}\r\n sc := TTMSFNCUtils.GetDPIScale;\r\n g := TTMSFNCGraphics.CreateBitmapCanvas(Round(Width * sc), Round(Height * sc), NativeCanvas);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n g := TTMSFNCGraphics.CreateBitmapCanvas(Width, Height, NativeCanvas);\r\n {$ENDIF}\r\n g.BeginScene;\r\n end\r\n else\r\n g := TTMSFNCGraphics.Create(Canvas, NativeCanvas);\r\n\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n g.Context.SetSize(Width, Height);\r\n g.Context.SetAntiAliasing(AntiAliasing);\r\n g.Context.SetShowAcceleratorChar(ShowAcceleratorChar);\r\n g.Context.SetTextQuality(TextQuality);\r\n try\r\n r := RectF(0, 0, Width, Height);\r\n df := True;\r\n DoBeforeDraw(g, r, df);\r\n if df then\r\n begin\r\n DrawBackground(g, r);\r\n Draw(g, r);\r\n DoAfterDraw(g, r);\r\n end;\r\n {$IFDEF DRAWTRIAL}\r\n {$IFDEF FREEWARE}\r\n DrawTrial(g, r);\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n if BufferedPainting then\r\n g.EndScene;\r\n\r\n g.Context.Render;\r\n\r\n if BufferedPainting then\r\n begin\r\n bmp := TTMSFNCDrawBitmap(g.Bitmap);\r\n gbmp := TTMSFNCGraphics.Create(Canvas, False);\r\n try\r\n gbmp.Context.SetSize(Width, Height);\r\n gbmp.Context.SetAntiAliasing(AntiAliasing);\r\n gbmp.Context.SetShowAcceleratorChar(ShowAcceleratorChar);\r\n gbmp.Context.SetTextQuality(TextQuality);\r\n gbmp.DrawBitmap(r, bmp);\r\n finally\r\n gbmp.Free;\r\n end;\r\n end;\r\n finally\r\n g.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.Paint;\r\nbegin\r\n inherited;\r\n DrawControl;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.StrokeChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.FillChanged(Sender: TObject);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n FColor := Fill.Color;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if (Fill.Kind <> gfkNone) and (Fill.Color <> gcNull) then\r\n Color := Fill.Color\r\n else\r\n Color := clBtnFace;\r\n {$ENDIF}\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.UpdateControlAfterResize;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DoBitmapChanged(Sender: TObject);\r\nbegin\r\n {$IFDEF WEBLIB}\r\n if FBlockInvalidate then\r\n Exit;\r\n FBlockInvalidate := True;\r\n Invalidate;\r\n FBlockInvalidate := False;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.CreateCheckBoxBitmaps;\r\nvar\r\n{$IFDEF FMXLIB}\r\n chk: TCheckBox;\r\n f: TCommonCustomForm;\r\n fo: IControl;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLWEBLIB}\r\n rc: TRect;\r\n dChecked: Cardinal;\r\n hth: HTHEME;\r\n ThemeStyle: DWord;\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g: TTMSFNCGraphics;\r\n {$ENDIF}\r\n bmp: TBitmap;\r\n{$ENDIF}\r\nbegin\r\n if Assigned(FCheckedFocusChk) then\r\n begin\r\n FCheckedFocusChk.Free;\r\n FCheckedFocusChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedChk) then\r\n begin\r\n FUnCheckedChk.Free;\r\n FUnCheckedChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedChk) then\r\n begin\r\n FCheckedChk.Free;\r\n FCheckedChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedFocusChk) then\r\n begin\r\n FUnCheckedFocusChk.Free;\r\n FUnCheckedFocusChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedDisabledChk) then\r\n begin\r\n FUnCheckedDisabledChk.Free;\r\n FUnCheckedDisabledChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedDisabledChk) then\r\n begin\r\n FCheckedDisabledChk.Free;\r\n FCheckedDisabledChk := nil;\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n chk := TCheckBox.Create(Self);\r\n chk.Width := chk.Height;\r\n chk.Text := '';\r\n chk.Parent := Self;\r\n chk.IsChecked := false;\r\n chk.NeedStyleLookup;\r\n chk.ApplyStyleLookup;\r\n\r\n {$IFDEF FMXMOBILE}\r\n chk.Width := 25;\r\n chk.Height := 25;\r\n {$ENDIF}\r\n\r\n TurnOffAnimation(chk);\r\n FUnCheckedChk := TTMSFNCBitmap(chk.MakeScreenshot);\r\n chk.IsChecked := true;\r\n FCheckedChk := TTMSFNCBitmap(chk.MakeScreenshot);\r\n chk.Enabled := False;\r\n chk.IsChecked := False;\r\n FUnCheckedDisabledChk := TTMSFNCBitmap(chk.MakeScreenshot);\r\n chk.IsChecked := True;\r\n FCheckedDisabledChk := TTMSFNCBitmap(chk.MakeScreenshot);\r\n chk.Enabled := True;\r\n\r\n f := TTMSFNCUtils.GetParentForm(Self);\r\n fo := nil;\r\n if Assigned(f) then\r\n fo := f.Focused;\r\n\r\n chk.SetFocus;\r\n chk.IsChecked := false;\r\n FUnCheckedFocusChk := TTMSFNCBitmap(chk.MakeScreenshot);\r\n chk.IsChecked := true;\r\n FCheckedFocusChk := TTMSFNCBitmap(chk.MakeScreenshot);\r\n chk.Parent := nil;\r\n chk.Free;\r\n\r\n if Assigned(fo) then\r\n fo.SetFocus;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n bmp := TBitmap.Create;\r\n {$IFDEF VCLLIB}\r\n rc := Bounds(0, 0, 16, 16);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g := TTMSFNCGraphics.Create(bmp.Canvas);\r\n {$ENDIF}\r\n try\r\n {$IFNDEF WEBLIB}\r\n bmp.PixelFormat := pf24bit;\r\n bmp.TransparentMode := tmFixed;\r\n bmp.Transparent := True;\r\n bmp.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n bmp.SetSize(16, 16);\r\n\r\n FUnCheckedChk := TTMSFNCBitmap.Create;\r\n FUnCheckedChk.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONCHECK;\r\n ThemeStyle := CBS_UNCHECKEDNORMAL;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_CHECKBOX, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawCheckBox(RectF(0, 0, bmp.Width, bmp.Height), False, False, True);\r\n {$ENDIF}\r\n\r\n FUnCheckedChk.Assign(bmp);\r\n\r\n FCheckedChk := TTMSFNCBitmap.Create;\r\n FCheckedChk.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONCHECK or DFCS_CHECKED;\r\n ThemeStyle := CBS_CHECKEDNORMAL;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_CHECKBOX, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawCheckBox(RectF(0, 0, bmp.Width, bmp.Height), True, False, True);\r\n {$ENDIF}\r\n\r\n FCheckedChk.Assign(bmp);\r\n\r\n FUnCheckedFocusChk := TTMSFNCBitmap.Create;\r\n FUnCheckedFocusChk.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONCHECK or DFCS_HOT;\r\n ThemeStyle := CBS_UNCHECKEDHOT;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_CHECKBOX, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawCheckBox(RectF(0, 0, bmp.Width, bmp.Height), False, True, True);\r\n {$ENDIF}\r\n\r\n FUnCheckedFocusChk.Assign(bmp);\r\n\r\n FCheckedFocusChk := TTMSFNCBitmap.Create;\r\n FCheckedFocusChk.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONCHECK or DFCS_CHECKED or DFCS_HOT;\r\n ThemeStyle := CBS_CHECKEDHOT;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_CHECKBOX, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawCheckBox(RectF(0, 0, bmp.Width, bmp.Height), True, True, True);\r\n {$ENDIF}\r\n\r\n FCheckedFocusChk.Assign(bmp);\r\n\r\n FUnCheckedDisabledChk := TTMSFNCBitmap.Create;\r\n FUnCheckedDisabledChk.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONCHECK or DFCS_INACTIVE;\r\n ThemeStyle := CBS_UNCHECKEDDISABLED;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_CHECKBOX, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawCheckBox(RectF(0, 0, bmp.Width, bmp.Height), False, False, False);\r\n {$ENDIF}\r\n\r\n FUnCheckedDisabledChk.Assign(bmp);\r\n\r\n FCheckedDisabledChk := TTMSFNCBitmap.Create;\r\n FCheckedDisabledChk.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONCHECK or DFCS_CHECKED or DFCS_INACTIVE;\r\n ThemeStyle := CBS_CHECKEDDISABLED;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_CHECKBOX, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawCheckBox(RectF(0, 0, bmp.Width, bmp.Height), True, False, False);\r\n {$ENDIF}\r\n\r\n FCheckedDisabledChk.Assign(bmp);\r\n finally\r\n {$IFDEF LCLWEBLIB}\r\n g.Free;\r\n {$ENDIF}\r\n bmp.Free;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.CreateButtonBitmaps(AWidth, AHeight: Single);\r\nvar\r\n{$IFDEF FMXLIB}\r\n btn: TButton;\r\n f: TCommonCustomForm;\r\n fo: IControl;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLWEBLIB}\r\n rc: TRect;\r\n dChecked: Cardinal;\r\n hth: HTHEME;\r\n ThemeStyle: DWord;\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g: TTMSFNCGraphics;\r\n {$ENDIF}\r\n bmp: TBitmap;\r\n{$ENDIF}\r\nbegin\r\n if Assigned(FDownBtn) then\r\n begin\r\n FDownBtn.Free;\r\n FDownBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalBtn) then\r\n begin\r\n FNormalBtn.Free;\r\n FNormalBtn := nil;\r\n end;\r\n\r\n if Assigned(FDownFocusBtn) then\r\n begin\r\n FDownFocusBtn.Free;\r\n FDownFocusBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalFocusBtn) then\r\n begin\r\n FNormalFocusBtn.Free;\r\n FNormalFocusBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalDisabledBtn) then\r\n begin\r\n FNormalDisabledBtn.Free;\r\n FNormalDisabledBtn := nil;\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n btn := TButton.Create(Self);\r\n btn.Width := AWidth;\r\n btn.Height := AHeight;\r\n btn.Text := '';\r\n btn.Parent := Self;\r\n btn.StaysPressed := True;\r\n btn.IsPressed := False;\r\n btn.NeedStyleLookup;\r\n btn.ApplyStyleLookup;\r\n\r\n TurnOffAnimation(btn);\r\n FNormalBtn := TTMSFNCBitmap(btn.MakeScreenshot);\r\n btn.IsPressed := true;\r\n FDownBtn := TTMSFNCBitmap(btn.MakeScreenshot);\r\n btn.Enabled := False;\r\n btn.IsPressed := False;\r\n FNormalDisabledBtn := TTMSFNCBitmap(btn.MakeScreenshot);\r\n btn.Enabled := True;\r\n\r\n f := TTMSFNCUtils.GetParentForm(Self);\r\n fo := nil;\r\n if Assigned(f) then\r\n fo := f.Focused;\r\n\r\n btn.SetFocus;\r\n btn.IsPressed := false;\r\n FNormalFocusBtn := TTMSFNCBitmap(btn.MakeScreenshot);\r\n btn.IsPressed := true;\r\n FDownFocusBtn := TTMSFNCBitmap(btn.MakeScreenshot);\r\n btn.Parent := nil;\r\n btn.Free;\r\n\r\n if Assigned(fo) then\r\n fo.SetFocus;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n bmp := TBitmap.Create;\r\n {$IFDEF VCLLIB}\r\n rc := Bounds(0, 0, Round(AWidth), Round(AHeight));\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g := TTMSFNCGraphics.Create(bmp.Canvas);\r\n {$ENDIF}\r\n try\r\n {$IFNDEF WEBLIB}\r\n bmp.PixelFormat := pf24bit;\r\n bmp.TransparentMode := tmFixed;\r\n bmp.Transparent := True;\r\n bmp.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n bmp.SetSize(Round(AWidth), Round(AHeight));\r\n\r\n FNormalBtn := TTMSFNCBitmap.Create;\r\n FNormalBtn.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONPUSH;\r\n ThemeStyle := PBS_NORMAL;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_PUSHBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc, DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawButton(RectF(0, 0, bmp.Width, bmp.Height), False, False, True, AdaptToStyle);\r\n {$ENDIF}\r\n\r\n FNormalBtn.Assign(bmp);\r\n\r\n FDownBtn := TTMSFNCBitmap.Create;\r\n FDownBtn.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONPUSH or DFCS_PUSHED;\r\n ThemeStyle := PBS_PRESSED;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_PUSHBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc, DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawButton(RectF(0, 0, bmp.Width, bmp.Height), True, False, True, AdaptToStyle);\r\n {$ENDIF}\r\n\r\n FDownBtn.Assign(bmp);\r\n\r\n FNormalFocusBtn := TTMSFNCBitmap.Create;\r\n FNormalFocusBtn.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONPUSH or DFCS_HOT;\r\n ThemeStyle := PBS_HOT;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_PUSHBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc, DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawButton(RectF(0, 0, bmp.Width, bmp.Height), True, True, True, AdaptToStyle);\r\n {$ENDIF}\r\n\r\n FNormalFocusBtn.Assign(bmp);\r\n\r\n FDownFocusBtn := TTMSFNCBitmap.Create;\r\n FDownFocusBtn.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONPUSH or DFCS_PUSHED or DFCS_HOT;\r\n ThemeStyle := PBS_HOT or PBS_PRESSED;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_PUSHBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc, DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawButton(RectF(0, 0, bmp.Width, bmp.Height), False, True, True, AdaptToStyle);\r\n {$ENDIF}\r\n\r\n FDownFocusBtn.Assign(bmp);\r\n\r\n FNormalDisabledBtn := TTMSFNCBitmap.Create;\r\n FNormalDisabledBtn.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONPUSH or DFCS_INACTIVE;\r\n ThemeStyle := PBS_DISABLED;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_PUSHBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc, DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawButton(RectF(0, 0, bmp.Width, bmp.Height), False, False, False, AdaptToStyle);\r\n {$ENDIF}\r\n\r\n FNormalDisabledBtn.Assign(bmp);\r\n finally\r\n {$IFDEF LCLWEBLIB}\r\n g.Free;\r\n {$ENDIF}\r\n bmp.Free;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.CreateRadioButtonBitmaps;\r\nvar\r\n{$IFDEF FMXLIB}\r\n Rd: TRadioButton;\r\n f: TCommonCustomForm;\r\n fo: IControl;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLWEBLIB}\r\n rc: TRect;\r\n dChecked: Cardinal;\r\n hth: HTHEME;\r\n ThemeStyle: DWord;\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g: TTMSFNCGraphics;\r\n {$ENDIF}\r\n bmp: TBitmap;\r\n{$ENDIF}\r\nbegin\r\n if Assigned(FCheckedFocusRd) then\r\n begin\r\n FCheckedFocusRd.Free;\r\n FCheckedFocusRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedRd) then\r\n begin\r\n FUnCheckedRd.Free;\r\n FUnCheckedRd := nil;\r\n end;\r\n\r\n if Assigned(FCheckedRd) then\r\n begin\r\n FCheckedRd.Free;\r\n FCheckedRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedFocusRd) then\r\n begin\r\n FUnCheckedFocusRd.Free;\r\n FUnCheckedFocusRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedDisabledRd) then\r\n begin\r\n FUnCheckedDisabledRd.Free;\r\n FUnCheckedDisabledRd := nil;\r\n end;\r\n\r\n if Assigned(FCheckedDisabledRd) then\r\n begin\r\n FCheckedDisabledRd.Free;\r\n FCheckedDisabledRd := nil;\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n Rd := TRadioButton.Create(Self);\r\n Rd.Width := Rd.Height;\r\n Rd.Text := '';\r\n Rd.Parent := Self;\r\n Rd.IsChecked := false;\r\n Rd.NeedStyleLookup;\r\n Rd.ApplyStyleLookup;\r\n\r\n {$IFDEF FMXMOBILE}\r\n Rd.Width := 25;\r\n Rd.Height := 25;\r\n {$ENDIF}\r\n\r\n TurnOffAnimation(Rd);\r\n FUnCheckedRd := TTMSFNCBitmap(Rd.MakeScreenshot);\r\n Rd.IsChecked := true;\r\n FCheckedRd := TTMSFNCBitmap(Rd.MakeScreenshot);\r\n Rd.Enabled := False;\r\n Rd.IsChecked := False;\r\n FUnCheckedDisabledRd := TTMSFNCBitmap(Rd.MakeScreenshot);\r\n Rd.IsChecked := true;\r\n FCheckedDisabledRd := TTMSFNCBitmap(Rd.MakeScreenshot);\r\n Rd.Enabled := True;\r\n\r\n f := TTMSFNCUtils.GetParentForm(Self);\r\n fo := nil;\r\n if Assigned(f) then\r\n fo := f.Focused;\r\n\r\n Rd.SetFocus;\r\n Rd.IsChecked := false;\r\n FUnCheckedFocusRd := TTMSFNCBitmap(Rd.MakeScreenshot);\r\n Rd.IsChecked := true;\r\n FCheckedFocusRd := TTMSFNCBitmap(Rd.MakeScreenshot);\r\n Rd.Parent := nil;\r\n Rd.Free;\r\n\r\n if Assigned(fo) then\r\n fo.SetFocus;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n bmp := TBitmap.Create;\r\n {$IFDEF VCLLIB}\r\n rc := Bounds(0, 0, 16, 16);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g := TTMSFNCGraphics.Create(bmp.Canvas);\r\n {$ENDIF}\r\n try\r\n {$IFNDEF WEBLIB}\r\n bmp.PixelFormat := pf24bit;\r\n bmp.TransparentMode := tmFixed;\r\n bmp.Transparent := True;\r\n bmp.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n bmp.SetSize(16, 16);\r\n\r\n FUnCheckedRd := TTMSFNCBitmap.Create;\r\n FUnCheckedRd.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONRADIO;\r\n ThemeStyle := RBS_UNCHECKEDNORMAL;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_RADIOBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawRadioButton(RectF(0, 0, bmp.Width, bmp.Height), False, False, True);\r\n {$ENDIF}\r\n\r\n FUnCheckedRd.Assign(bmp);\r\n\r\n FCheckedRd := TTMSFNCBitmap.Create;\r\n FCheckedRd.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONRADIO or DFCS_CHECKED;\r\n ThemeStyle := RBS_CHECKEDNORMAL;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_RADIOBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawRadioButton(RectF(0, 0, bmp.Width, bmp.Height), True, False, True);\r\n {$ENDIF}\r\n\r\n FCheckedRd.Assign(bmp);\r\n\r\n FUnCheckedFocusRd := TTMSFNCBitmap.Create;\r\n FUnCheckedFocusRd.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONRADIO or DFCS_HOT;\r\n ThemeStyle := RBS_UNCHECKEDHOT;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_RADIOBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawRadioButton(RectF(0, 0, bmp.Width, bmp.Height), False, True, True);\r\n {$ENDIF}\r\n\r\n FUnCheckedFocusRd.Assign(bmp);\r\n\r\n FCheckedFocusRd := TTMSFNCBitmap.Create;\r\n FCheckedFocusRd.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONRADIO or DFCS_CHECKED or DFCS_HOT;\r\n ThemeStyle := RBS_CHECKEDHOT;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_RADIOBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawRadioButton(RectF(0, 0, bmp.Width, bmp.Height), True, True, True);\r\n {$ENDIF}\r\n\r\n FCheckedFocusRd.Assign(bmp);\r\n\r\n FUnCheckedDisabledRd := TTMSFNCBitmap.Create;\r\n FUnCheckedDisabledRd.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONRADIO or DFCS_INACTIVE;\r\n ThemeStyle := RBS_UNCHECKEDDISABLED;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_RADIOBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawRadioButton(RectF(0, 0, bmp.Width, bmp.Height), False, False, False);\r\n {$ENDIF}\r\n\r\n FUnCheckedDisabledRd.Assign(bmp);\r\n\r\n FCheckedDisabledRd := TTMSFNCBitmap.Create;\r\n FCheckedDisabledRd.OnChange := @DoBitmapChanged;\r\n\r\n {$IFDEF VCLLIB}\r\n bmp.Canvas.Brush.Color := gcWhite;\r\n bmp.Canvas.Brush.Style := bsSolid;\r\n bmp.Canvas.FillRect(rc);\r\n\r\n DChecked := DFCS_BUTTONRADIO or DFCS_CHECKED or DFCS_INACTIVE;\r\n ThemeStyle := RBS_CHECKEDDISABLED;\r\n if IsThemeActive and not (csDesigning in ComponentState) then\r\n begin\r\n hth := OpenThemeData(Self.Handle,'button');\r\n DrawThemeBackground(hth, bmp.Canvas.Handle, BP_RADIOBUTTON, ThemeStyle,@rc,nil);\r\n CloseThemeData(hth);\r\n end\r\n else\r\n DrawFrameControl(bmp.Canvas.Handle,rc,DFC_BUTTON, DChecked);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n g.Fill.Kind := gfkSolid;\r\n g.Fill.Color := gcWhite;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n g.DrawRadioButton(RectF(0, 0, bmp.Width, bmp.Height), True, False, False);\r\n {$ENDIF}\r\n\r\n FCheckedDisabledRd.Assign(bmp);\r\n finally\r\n {$IFDEF LCLWEBLIB}\r\n g.Free;\r\n {$ENDIF}\r\n bmp.Free;\r\n end;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.GetButtonBitmap(AWidth, AHeight: Single; ADown: Boolean = False; AFocused: Boolean = False; AEnabled: Boolean = True): TTMSFNCBitmap;\r\nbegin\r\n CreateButtonBitmaps(AWidth, AHeight);\r\n\r\n if ADown then\r\n begin\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n Result := FDownFocusBtn\r\n else\r\n Result := FDownBtn;\r\n end\r\n else\r\n Result := FNormalDisabledBtn;\r\n end\r\n else\r\n begin\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n Result := FNormalFocusBtn\r\n else\r\n Result := FNormalBtn;\r\n end\r\n else\r\n Result := FNormalDisabledBtn;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.GetCheckBoxBitmap(AChecked: Boolean; AFocused: Boolean; AEnabled: Boolean): TTMSFNCBitmap;\r\nbegin\r\n if (not Assigned(FCheckedChk) or not Assigned(FCheckedFocusChk) or not Assigned(FUnCheckedChk)\r\n or not Assigned(FUnCheckedFocusChk) or not Assigned(FCheckedDisabledChk) or not Assigned(FUnCheckedDisabledChk)) then\r\n CreateCheckBoxBitmaps;\r\n\r\n if AChecked then\r\n begin\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n Result := FCheckedFocusChk\r\n else\r\n Result := FCheckedChk;\r\n end\r\n else\r\n Result := FCheckedDisabledChk;\r\n end\r\n else\r\n begin\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n Result := FUnCheckedFocusChk\r\n else\r\n Result := FUnCheckedChk;\r\n end\r\n else\r\n Result := FUnCheckedDisabledChk;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.GetRadioButtonBitmap(AChecked: Boolean; AFocused: Boolean; AEnabled: Boolean): TTMSFNCBitmap;\r\nbegin\r\n if (not Assigned(FCheckedRd) or not Assigned(FCheckedFocusRd) or not Assigned(FUnCheckedRd)\r\n or not Assigned(FUnCheckedFocusRd) or not Assigned(FCheckedDisabledRd) or not Assigned(FUnCheckedDisabledRd)) then\r\n CreateRadioButtonBitmaps;\r\n\r\n if AChecked then\r\n begin\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n Result := FCheckedFocusRd\r\n else\r\n Result := FCheckedRd;\r\n end\r\n else\r\n Result := FCheckedDisabledRd;\r\n end\r\n else\r\n begin\r\n if AEnabled then\r\n begin\r\n if AFocused then\r\n Result := FUnCheckedFocusRd\r\n else\r\n Result := FUnCheckedRd;\r\n end\r\n else\r\n Result := FUnCheckedDisabledRd;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.IsDesignTime: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(Owner) then\r\n Result := (csDesigning in ComponentState) and not ((csReading in Owner.ComponentState) or (csLoading in Owner.ComponentState));\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.IsReading: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(Owner) then\r\n Result := (csReading in Owner.ComponentState);\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.IsDesigning: Boolean;\r\nbegin\r\n Result := (csDesigning in ComponentState);\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.IsDesignerForm: Boolean;\r\nvar\r\n frm: TCustomForm;\r\nbegin\r\n frm := TTMSFNCUtils.GetOwnerForm(Self);\r\n Result := IsDesigning;\r\n if Assigned(frm) then\r\n Result := Result or (frm is TTMSFNCCustomDesignerForm);\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.IsDestroying: Boolean;\r\nbegin\r\n Result := (csDestroying in ComponentState);\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.IsLoading: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(Owner) then\r\n Result := (csLoading in Owner.ComponentState)\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.ResetToDefaultStyle;\r\nbegin\r\n inherited;\r\n Fill.Color := gcWhite;\r\n Stroke.Color := gcSilver;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.RegisterRuntimeClasses;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.&Export({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n Fill.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleLineFillColor(c) then\r\n Stroke.Color := c;\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.DestroyGraphicElements;\r\nbegin\r\n if Assigned(FDownBtn) then\r\n begin\r\n FDownBtn.Free;\r\n FDownBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalBtn) then\r\n begin\r\n FNormalBtn.Free;\r\n FNormalBtn := nil;\r\n end;\r\n\r\n if Assigned(FDownFocusBtn) then\r\n begin\r\n FDownFocusBtn.Free;\r\n FDownFocusBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalFocusBtn) then\r\n begin\r\n FNormalFocusBtn.Free;\r\n FNormalFocusBtn := nil;\r\n end;\r\n\r\n if Assigned(FNormalDisabledBtn) then\r\n begin\r\n FNormalDisabledBtn.Free;\r\n FNormalDisabledBtn := nil;\r\n end;\r\n\r\n if Assigned(FCheckedChk) then\r\n begin\r\n FCheckedChk.Free;\r\n FCheckedChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedFocusChk) then\r\n begin\r\n FCheckedFocusChk.Free;\r\n FCheckedFocusChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedDisabledChk) then\r\n begin\r\n FUnCheckedDisabledChk.Free;\r\n FUnCheckedDisabledChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedDisabledChk) then\r\n begin\r\n FCheckedDisabledChk.Free;\r\n FCheckedDisabledChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedChk) then\r\n begin\r\n FUnCheckedChk.Free;\r\n FUnCheckedChk := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedFocusChk) then\r\n begin\r\n FUnCheckedFocusChk.Free;\r\n FUnCheckedFocusChk := nil;\r\n end;\r\n\r\n if Assigned(FCheckedRd) then\r\n begin\r\n FCheckedRd.Free;\r\n FCheckedRd := nil;\r\n end;\r\n\r\n if Assigned(FCheckedFocusRd) then\r\n begin\r\n FCheckedFocusRd.Free;\r\n FCheckedFocusRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedRd) then\r\n begin\r\n FUnCheckedRd.Free;\r\n FUnCheckedRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedFocusRd) then\r\n begin\r\n FUnCheckedFocusRd.Free;\r\n FUnCheckedFocusRd := nil;\r\n end;\r\n\r\n if Assigned(FUnCheckedDisabledRd) then\r\n begin\r\n FUnCheckedDisabledRd.Free;\r\n FUnCheckedDisabledRd := nil;\r\n end;\r\n\r\n if Assigned(FCheckedDisabledRd) then\r\n begin\r\n FCheckedDisabledRd.Free;\r\n FCheckedDisabledRd := nil;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.GetControlRect: TRectF;\r\nbegin\r\n Result := RectF(0, 0, Width, Height);\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.GetContentRect: TRectF;\r\nbegin\r\n Result := GetControlRect;\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.GetVersion: String;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.CanSaveProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind): Boolean;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if AObject = Self then\r\n Result := (TTMSFNCUtils.IndexOfTextInArray(APropertyName, ExcludePropertyList) = -1)\r\n else\r\n Result := True;\r\n {$ENDIF}\r\n\r\n DoCanSaveProperty(AObject, APropertyName, APropertyType, Result);\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.CanLoadProperty(AObject: TObject; APropertyName: string; APropertyType: TTypeKind): Boolean;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if AObject = Self then\r\n Result := (TTMSFNCUtils.IndexOfTextInArray(APropertyName, ExcludePropertyList) = -1)\r\n else\r\n Result := True;\r\n {$ENDIF}\r\n\r\n DoCanLoadProperty(AObject, APropertyName, APropertyType, Result);\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomControl.SaveSettingsToFile(AFileName: string);\r\nbegin\r\n TTMSFNCPersistence.SaveSettingsToFile(Self, AFileName);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.LoadSettingsFromFile(AFileName: string);\r\nbegin\r\n TTMSFNCPersistence.LoadSettingsFromFile(Self, AFileName);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.SaveSettingsToStream(AStream: TStream);\r\nbegin\r\n TTMSFNCPersistence.SaveSettingsToStream(Self, AStream);\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.LoadSettingsFromStream(AStream: TStream);\r\nbegin\r\n TTMSFNCPersistence.LoadSettingsFromStream(Self, AStream);\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomControl.LocalToScreenEx(APoint: TPointF): TPointF;\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n pt: TPoint;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := LocalToScreen(APoint);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n pt := ClientToScreen(Point(Round(APoint.X), Round(APoint.Y)));\r\n Result := PointF(pt.X, pt.Y);\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCCustomControl.ScreenToLocalEx(APoint: TPointF): TPointF;\r\n{$IFDEF CMNWEBLIB}\r\nvar\r\n pt: TPoint;\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := ScreenToLocal(APoint);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n pt := ScreenToClient(Point(Round(APoint.X), Round(APoint.Y)));\r\n Result := PointF(pt.X, pt.Y);\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomControl.TurnOffAnimation(chk: TFmxObject);\r\nvar\r\n I: Integer;\r\nbegin\r\n if Assigned(chk) then\r\n begin\r\n if chk is TAnimation then\r\n (chk as TAnimation).Duration := 0;\r\n\r\n for I := 0 to chk.ChildrenCount - 1 do\r\n begin\r\n TurnOffAnimation(chk.Children[I]);\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomControl.CaptureEx;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Capture;\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n SetCapture(Self.Handle);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n MouseCapture := True;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Capture;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControl.ReleaseCaptureEx;\r\nbegin\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ReleaseCapture;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n MouseCapture := False;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ReleaseCapture;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.GetControlMargins(var ALeft: Single; var ATop: Single; var ARight: Single; var ABottom: Single);\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n {$IFDEF VCLLIB}\r\n if not AlignWithMargins then\r\n Exit;\r\n {$ENDIF}\r\n ALeft := Margins.Left;\r\n ATop := Margins.Top;\r\n ARight := Margins.Right;\r\n ABottom := Margins.Bottom;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ALeft := BorderSpacing.Left;\r\n ATop := BorderSpacing.Top;\r\n ARight := BorderSpacing.Right;\r\n ABottom := BorderSpacing.Bottom;\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.SetControlMargins(ALeft: Single; ATop: Single; ARight: Single; ABottom: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Margins.Left := ALeft;\r\n Margins.Top := ATop;\r\n Margins.Right := ARight;\r\n Margins.Bottom := ABottom;\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n AlignWithMargins := True;\r\n Margins.Left := Round(ALeft);\r\n Margins.Top := Round(ATop);\r\n Margins.Right := Round(ARight);\r\n Margins.Bottom := Round(ABottom);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n BorderSpacing.Left := Round(ALeft);\r\n BorderSpacing.Top := Round(ATop);\r\n BorderSpacing.Right := Round(ARight);\r\n BorderSpacing.Bottom := Round(ABottom);\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomControlBaseCommon.BeginDrag;\r\n{$IFDEF FMXLIB}\r\n{$HINTS OFF}\r\n{$IF COMPILERVERSION > 27}\r\nvar\r\n Svc: IFMXDragDropService;\r\n DragData: TDragObject;\r\n DragImage: TTMSFNCBitmap;\r\nbegin\r\n if TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, Svc) then\r\n begin\r\n DragData.Source := Self;\r\n DragImage := TTMSFNCBitmap.Create;\r\n DragImage.Width := 1;\r\n DragImage.Height := 1;\r\n try\r\n DragData.Data := DragImage;\r\n Svc.BeginDragDrop(TTMSFNCUtils.GetParentForm(Self), DragData, DragImage);\r\n finally\r\n DragImage.Free;\r\n end;\r\n end;\r\n{$IFEND}\r\n{$IF COMPILERVERSION <= 27}\r\nbegin\r\n{$IFEND}\r\n{$HINTS ON}\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\nbegin\r\n inherited BeginDrag(True);\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\nbegin\r\n{$ENDIF}\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomControlBaseCommon.CancelHint;\r\nbegin\r\n {$WARNINGS OFF}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 29}\r\n Application.CancelHint;\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$WARNINGS ON}\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomControlBaseCommon.GetDragObjectScreenShot: TTMSFNCBitmap;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomControlBaseCommon.CancelHint;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n Application.CancelHint;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBase.GetHintString: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TTMSFNCCustomControlBase.HasHint: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCControl }\r\n\r\nprocedure TTMSFNCControl.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCControl);\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\n{$IFNDEF LCLLIB}\r\n{$IFNDEF FMXMOBILE}\r\n{$IFDEF FREEWARE}\r\n{$I TMSProductTrial.inc}\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\nend.\r\n\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCScrollBar;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomControl, WEBLib.ExtCtrls,\r\n WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphics, WEBLib.Controls,\r\n WEBLib.TMSFNCGraphicsTypes\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n ,UITypes, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\ntype\r\n TTMSFNCCustomScrollBar = class;\r\n\r\n TTMSFNCScrollBarAppearance = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCCustomScrollBar;\r\n FScrollButtonSize: Single;\r\n FThumbButtonSize: Single;\r\n FOnChange: TNotifyEvent;\r\n FFixedThumb: Boolean;\r\n FArrowColor: TTMSFNCGraphicsColor;\r\n FThumbStroke: TTMSFNCGraphicsStroke;\r\n FThumbButtonRightDownStroke: TTMSFNCGraphicsStroke;\r\n FThumbFill: TTMSFNCGraphicsFill;\r\n FThumbButtonLeftFill: TTMSFNCGraphicsFill;\r\n FScrollButtonLeftHoverFill: TTMSFNCGraphicsFill;\r\n FScrollButtonLeftStroke: TTMSFNCGraphicsStroke;\r\n FScrollButtonRightFill: TTMSFNCGraphicsFill;\r\n FThumbButtonLeftHoverFill: TTMSFNCGraphicsFill;\r\n FThumbButtonLeftStroke: TTMSFNCGraphicsStroke;\r\n FScrollButtonLeftHoverStroke: TTMSFNCGraphicsStroke;\r\n FThumbButtonRightFill: TTMSFNCGraphicsFill;\r\n FScrollButtonRightHoverFill: TTMSFNCGraphicsFill;\r\n FScrollButtonRightStroke: TTMSFNCGraphicsStroke;\r\n FThumbButtonLeftHoverStroke: TTMSFNCGraphicsStroke;\r\n FScrollButtonLeftDownFill: TTMSFNCGraphicsFill;\r\n FThumbButtonRightHoverFill: TTMSFNCGraphicsFill;\r\n FThumbButtonRightStroke: TTMSFNCGraphicsStroke;\r\n FScrollButtonRightHoverStroke: TTMSFNCGraphicsStroke;\r\n FThumbButtonLeftDownFill: TTMSFNCGraphicsFill;\r\n FScrollButtonLeftDownStroke: TTMSFNCGraphicsStroke;\r\n FThumbButtonRightHoverStroke: TTMSFNCGraphicsStroke;\r\n FScrollButtonRightDownFill: TTMSFNCGraphicsFill;\r\n FThumbButtonLeftDownStroke: TTMSFNCGraphicsStroke;\r\n FThumbButtonRightDownFill: TTMSFNCGraphicsFill;\r\n FScrollButtonRightDownStroke: TTMSFNCGraphicsStroke;\r\n FScrollButtonLeftFill: TTMSFNCGraphicsFill;\r\n procedure SetThumbButtonSize(const Value: Single);\r\n procedure SetFixedThumb(const Value: Boolean);\r\n procedure SetArrowColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetScrollButtonLeftDownFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetScrollButtonLeftDownStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetScrollButtonLeftFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetScrollButtonLeftHoverFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetScrollButtonLeftHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\n procedure SetScrollButtonLeftStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetScrollButtonRightDownFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetScrollButtonRightDownStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\n procedure SetScrollButtonRightFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetScrollButtonRightHoverFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetScrollButtonRightHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\n procedure SetScrollButtonRightStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetScrollButtonSize(const Value: Single);\r\n procedure SetThumbButtonLeftDownFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetThumbButtonLeftDownStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetThumbButtonLeftFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetThumbButtonLeftHoverFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetThumbButtonLeftHoverStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetThumbButtonLeftStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetThumbButtonRightDownFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetThumbButtonRightDownStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetThumbButtonRightFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetThumbButtonRightHoverFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetThumbButtonRightHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\n procedure SetThumbButtonRightStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetThumbFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetThumbStroke(const Value: TTMSFNCGraphicsStroke);\r\n function IsScrollButtonSizeStored: Boolean;\r\n function IsThumbButtonSizeStored: Boolean;\r\n protected\r\n procedure Changed;\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n public\r\n constructor Create(AOwner: TTMSFNCCustomScrollBar);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function GetThumbButtonSize: Single;\r\n published\r\n property ThumbFill: TTMSFNCGraphicsFill read FThumbFill write SetThumbFill;\r\n property ScrollButtonLeftFill: TTMSFNCGraphicsFill read FScrollButtonLeftFill write SetScrollButtonLeftFill;\r\n property ScrollButtonRightFill: TTMSFNCGraphicsFill read FScrollButtonRightFill write SetScrollButtonRightFill;\r\n property ScrollButtonLeftHoverFill: TTMSFNCGraphicsFill read FScrollButtonLeftHoverFill write SetScrollButtonLeftHoverFill;\r\n property ScrollButtonRightHoverFill: TTMSFNCGraphicsFill read FScrollButtonRightHoverFill write SetScrollButtonRightHoverFill;\r\n property ScrollButtonLeftDownFill: TTMSFNCGraphicsFill read FScrollButtonLeftDownFill write SetScrollButtonLeftDownFill;\r\n property ScrollButtonRightDownFill: TTMSFNCGraphicsFill read FScrollButtonRightDownFill write SetScrollButtonRightDownFill;\r\n property ThumbButtonLeftFill: TTMSFNCGraphicsFill read FThumbButtonLeftFill write SetThumbButtonLeftFill;\r\n property ThumbButtonRightFill: TTMSFNCGraphicsFill read FThumbButtonRightFill write SetThumbButtonRightFill;\r\n property ThumbButtonLeftHoverFill: TTMSFNCGraphicsFill read FThumbButtonLeftHoverFill write SetThumbButtonLeftHoverFill;\r\n property ThumbButtonRightHoverFill: TTMSFNCGraphicsFill read FThumbButtonRightHoverFill write SetThumbButtonRightHoverFill;\r\n property ThumbButtonLeftDownFill: TTMSFNCGraphicsFill read FThumbButtonLeftDownFill write SetThumbButtonLeftDownFill;\r\n property ThumbButtonRightDownFill: TTMSFNCGraphicsFill read FThumbButtonRightDownFill write SetThumbButtonRightDownFill;\r\n property ThumbStroke: TTMSFNCGraphicsStroke read FThumbStroke write SetThumbStroke;\r\n property ScrollButtonLeftStroke: TTMSFNCGraphicsStroke read FScrollButtonLeftStroke write SetScrollButtonLeftStroke;\r\n property ScrollButtonRightStroke: TTMSFNCGraphicsStroke read FScrollButtonRightStroke write SetScrollButtonRightStroke;\r\n property ScrollButtonLeftHoverStroke: TTMSFNCGraphicsStroke read FScrollButtonLeftHoverStroke write SetScrollButtonLeftHoverStroke;\r\n property ScrollButtonRightHoverStroke: TTMSFNCGraphicsStroke read FScrollButtonRightHoverStroke write SetScrollButtonRightHoverStroke;\r\n property ScrollButtonLeftDownStroke: TTMSFNCGraphicsStroke read FScrollButtonLeftDownStroke write SetScrollButtonLeftDownStroke;\r\n property ScrollButtonRightDownStroke: TTMSFNCGraphicsStroke read FScrollButtonRightDownStroke write SetScrollButtonRightDownStroke;\r\n property ThumbButtonLeftStroke: TTMSFNCGraphicsStroke read FThumbButtonLeftStroke write SetThumbButtonLeftStroke;\r\n property ThumbButtonRightStroke: TTMSFNCGraphicsStroke read FThumbButtonRightStroke write SetThumbButtonRightStroke;\r\n property ThumbButtonLeftHoverStroke: TTMSFNCGraphicsStroke read FThumbButtonLeftHoverStroke write SetThumbButtonLeftHoverStroke;\r\n property ThumbButtonRightHoverStroke: TTMSFNCGraphicsStroke read FThumbButtonRightHoverStroke write SetThumbButtonRightHoverStroke;\r\n property ThumbButtonLeftDownStroke: TTMSFNCGraphicsStroke read FThumbButtonLeftDownStroke write SetThumbButtonLeftDownStroke;\r\n property ThumbButtonRightDownStroke: TTMSFNCGraphicsStroke read FThumbButtonRightDownStroke write SetThumbButtonRightDownStroke;\r\n property ThumbButtonSize: Single read FThumbButtonSize write SetThumbButtonSize stored IsThumbButtonSizeStored nodefault;\r\n property ScrollButtonSize: Single read FScrollButtonSize write SetScrollButtonSize stored IsScrollButtonSizeStored nodefault;\r\n property FixedThumb: Boolean read FFixedThumb write SetFixedThumb default False;\r\n property ArrowColor: TTMSFNCGraphicsColor read FArrowColor write SetArrowColor default gcBlack;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TTMSFNCScrollBarMode = (sbmNone, sbmScroll, sbmChangePageSize);\r\n\r\n TTMSFNCScrollBarHoveredButton = (shbNone, shbScrollMin, shbScrollMax, shbThumbMin, shbThumbMax);\r\n\r\n TTMSFNCScrollBarDownButton = (sdbNone, sdbScrollMin, sdbScrollMax, sdbThumbMin, sdbThumbMax);\r\n\r\n TTMSFNCScrollButtonChange = (sbcNone, sbcSmallSubstract, sbcSmallAdd, sbcLargeSubstract, sbcLargeAdd);\r\n\r\n TTMSFNCScrollBarValueChanged = procedure(Sender: TObject; Value: Double) of object;\r\n\r\n TTMSFNCScrollBarPageSizeChanged = procedure(Sender: TObject; PageSize: Double) of object;\r\n\r\n TTMSFNCScrollBarKind = (sbkHorizontal, sbkVertical);\r\n\r\n TTMSFNCCustomScrollBar = class(TTMSFNCCustomControl)\r\n private\r\n FNeedsChange: Boolean;\r\n FSavedPageSize: Double;\r\n FDesignTime, FMinThumb, FMaxThumb: Boolean;\r\n FMx, FMy, FCx, FCy: Double;\r\n FTimer: TTimer;\r\n FTime: integer;\r\n FScrollBarMode: TTMSFNCScrollBarMode;\r\n FScrollButtonChange: TTMSFNCScrollButtonChange;\r\n FHoveredButton: TTMSFNCScrollBarHoveredButton;\r\n FDownButton: TTMSFNCScrollBarDownButton;\r\n FKind: TTMSFNCScrollBarKind;\r\n FValue, FTempValue: Double;\r\n FMin: Double;\r\n FMax: Double;\r\n FPageSize: Double;\r\n FSmallChange: Double;\r\n FLargeChange: Double;\r\n FAppearance: TTMSFNCScrollBarAppearance;\r\n FOnValueChange: TTMSFNCScrollBarValueChanged;\r\n FOnPageSizeChanged: TTMSFNCScrollBarPageSizeChanged;\r\n FTracking: Boolean;\r\n procedure SetAppearance(const Value: TTMSFNCScrollBarAppearance);\r\n procedure SetKind(Value: TTMSFNCScrollBarKind);\r\n procedure SetMax(const Value: Double);\r\n procedure SetMin(const Value: Double);\r\n procedure SetValue(const Value: Double);\r\n procedure SetPageSize(const Value: Double);\r\n function IsLargeChangeStored: Boolean;\r\n function IsMaxStored: Boolean;\r\n function IsMinStored: Boolean;\r\n function IsPageSizeStored: Boolean;\r\n function IsSmallChangeStored: Boolean;\r\n function IsValueStored: Boolean;\r\n procedure SetTracking(const Value: Boolean);\r\n protected\r\n procedure ApplyStyle; override;\r\n procedure Loaded; override;\r\n procedure ResetToDefaultStyle; override;\r\n procedure HandleKeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseLeave; override;\r\n procedure HandleMouseEnter; override;\r\n procedure HandleMouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override;\r\n procedure Changed;\r\n procedure AppearanceChanged(Sender: TObject);\r\n procedure TimerChanged(Sender: TObject);\r\n function GetMinScrollButton: TRectF;\r\n function GetMaxScrollButton: TRectF;\r\n function GetMinThumbButton: TRectF;\r\n function GetMaxThumbButton: TRectF;\r\n function GetScrollRectangle: TRectF;\r\n function GetScrollSize: Double;\r\n function GetScrollAreaMin: TRectF;\r\n function GetScrollAreaMax: TRectF;\r\n function GetThumbRectangle: TRectF;\r\n function GetValue: Double; overload;\r\n function GetValue(XYPos: Double): Double; overload;\r\n function GetRange: Double;\r\n function MouseOnThumbButtons(X, Y: Double): Boolean;\r\n function MouseOnThumb(X, Y: Double): Boolean;\r\n procedure DrawScrollButtons(g: TTMSFNCGraphics);\r\n procedure DrawThumb(g: TTMSFNCGraphics);\r\n procedure DrawThumbButtons(g: TTMSFNCGraphics);\r\n procedure DrawArrow(g: TTMSFNCGraphics; r: TRectF; ALeft: Boolean);\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n property Appearance: TTMSFNCScrollBarAppearance read FAppearance write SetAppearance;\r\n property Kind: TTMSFNCScrollBarKind read FKind write SetKind default sbkVertical;\r\n property LargeChange: Double read FLargeChange write FLargeChange stored IsLargeChangeStored nodefault;\r\n property Max: Double read FMax write SetMax stored IsMaxStored nodefault;\r\n property Min: Double read FMin write SetMin stored IsMinStored nodefault;\r\n property PageSize: Double read FPageSize write SetPageSize stored IsPageSizeStored nodefault;\r\n property Value: Double read FValue write SetValue stored IsValueStored nodefault;\r\n property SmallChange: Double read FSmallChange write FSmallChange stored IsSmallChangeStored nodefault;\r\n property Tracking: Boolean read FTracking write SetTracking default True;\r\n property OnValueChanged: TTMSFNCScrollBarValueChanged read FOnValueChange write FOnValueChange;\r\n property OnPageSizeChanged: TTMSFNCScrollBarPageSizeChanged read FOnPageSizeChanged write FOnPageSizeChanged;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCScrollBar = class(TTMSFNCCustomScrollBar)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n published\r\n property Fill;\r\n property Stroke;\r\n property Appearance;\r\n property Kind;\r\n property LargeChange;\r\n property Max;\r\n property Tracking;\r\n property Min;\r\n property PageSize;\r\n property Value;\r\n property SmallChange;\r\n property OnValueChanged;\r\n property OnPageSizeChanged;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math, WEBLib.TMSFNCStyles;\r\n\r\n{ TTMSFNCScrollBarAppearance }\r\n\r\nprocedure TTMSFNCScrollBarAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCScrollBarAppearance) then\r\n begin\r\n FThumbFill.Assign((Source as TTMSFNCScrollBarAppearance).ThumbFill);\r\n FScrollButtonSize := (Source as TTMSFNCScrollBarAppearance).ScrollButtonSize;\r\n FThumbButtonSize := (source as TTMSFNCScrollBarAppearance).ThumbButtonSize;\r\n FThumbButtonLeftFill.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonLeftFill);\r\n FThumbButtonLeftHoverFill.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonLeftHoverFill);\r\n FThumbButtonLeftDownFill.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonLeftDownFill);\r\n FThumbButtonRightFill.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonRightFill);\r\n FThumbButtonRightDownFill.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonRightDownFill);\r\n FThumbButtonRightHoverFill.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonRightHoverFill);\r\n FScrollButtonLeftFill.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonLeftFill);\r\n FScrollButtonLeftHoverFill.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonLeftHoverFill);\r\n FScrollButtonLeftDownFill.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonLeftDownFill);\r\n FScrollButtonRightFill.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonRightFill);\r\n FScrollButtonRightDownFill.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonRightDownFill);\r\n FScrollButtonRightHoverFill.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonRightHoverFill);\r\n FThumbButtonLeftStroke.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonLeftStroke);\r\n FThumbButtonLeftHoverStroke.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonLeftHoverStroke);\r\n FThumbButtonLeftDownStroke.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonLeftDownStroke);\r\n FThumbButtonRightStroke.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonRightStroke);\r\n FThumbButtonRightDownStroke.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonRightDownStroke);\r\n FThumbButtonRightHoverStroke.Assign((Source as TTMSFNCScrollBarAppearance).ThumbButtonRightHoverStroke);\r\n FScrollButtonLeftStroke.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonLeftStroke);\r\n FScrollButtonLeftHoverStroke.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonLeftHoverStroke);\r\n FScrollButtonLeftDownStroke.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonLeftDownStroke);\r\n FScrollButtonRightStroke.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonRightStroke);\r\n FScrollButtonRightDownStroke.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonRightDownStroke);\r\n FScrollButtonRightHoverStroke.Assign((Source as TTMSFNCScrollBarAppearance).ScrollButtonRightHoverStroke);\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.Changed;\r\nbegin\r\n FOwner.Changed;\r\nend;\r\n\r\nconstructor TTMSFNCScrollBarAppearance.Create(AOwner: TTMSFNCCustomScrollBar);\r\nbegin\r\n FOwner := AOwner;\r\n FThumbFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(225, 225, 225));\r\n FThumbFill.OnChanged := @FillChanged;\r\n FThumbButtonLeftFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(225, 225, 225));\r\n FThumbButtonLeftFill.OnChanged := @FillChanged;\r\n FThumbButtonRightFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(225, 225, 225));\r\n FThumbButtonRightFill.OnChanged := @FillChanged;\r\n FThumbButtonLeftHoverFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(229, 241, 251));\r\n FThumbButtonLeftHoverFill.OnChanged := @FillChanged;\r\n FThumbButtonRightHoverFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(229, 241, 251));\r\n FThumbButtonRightHoverFill.OnChanged := @FillChanged;\r\n FThumbButtonLeftDownFill := TTMSFNCGraphicsFill.Create(gfkSolid, Darker(MakeGraphicsColor(229, 241, 251), 40));\r\n FThumbButtonLeftDownFill.OnChanged := @FillChanged;\r\n FThumbButtonRightDownFill := TTMSFNCGraphicsFill.Create(gfkSolid, Darker(MakeGraphicsColor(229, 241, 251), 40));\r\n FThumbButtonRightDownFill.OnChanged := @FillChanged;\r\n\r\n FScrollButtonLeftFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(225, 225, 225));\r\n FScrollButtonLeftFill.OnChanged := @FillChanged;\r\n FScrollButtonRightFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(225, 225, 225));\r\n FScrollButtonRightFill.OnChanged := @FillChanged;\r\n FScrollButtonLeftHoverFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(229, 241, 251));\r\n FScrollButtonLeftHoverFill.OnChanged := @FillChanged;\r\n FScrollButtonRightHoverFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(229, 241, 251));\r\n FScrollButtonRightHoverFill.OnChanged := @FillChanged;\r\n FScrollButtonLeftDownFill := TTMSFNCGraphicsFill.Create(gfkSolid, Darker(MakeGraphicsColor(229, 241, 251), 40));\r\n FScrollButtonLeftDownFill.OnChanged := @FillChanged;\r\n FScrollButtonRightDownFill := TTMSFNCGraphicsFill.Create(gfkSolid, Darker(MakeGraphicsColor(229, 241, 251), 40));\r\n FScrollButtonRightDownFill.OnChanged := @FillChanged;\r\n\r\n FThumbStroke := TTMSFNCGraphicsStroke.Create(gskSolid, Darker(gcDarkGray, 40));\r\n FThumbStroke.OnChanged := @StrokeChanged;\r\n FThumbButtonLeftStroke := TTMSFNCGraphicsStroke.Create(gskSolid, Darker(gcDarkGray, 40));\r\n FThumbButtonLeftStroke.OnChanged := @StrokeChanged;\r\n FThumbButtonRightStroke := TTMSFNCGraphicsStroke.Create(gskSolid, Darker(gcDarkGray, 40));\r\n FThumbButtonRightStroke.OnChanged := @StrokeChanged;\r\n FThumbButtonLeftHoverStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FThumbButtonLeftHoverStroke.OnChanged := @StrokeChanged;\r\n FThumbButtonRightHoverStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FThumbButtonRightHoverStroke.OnChanged := @StrokeChanged;\r\n FThumbButtonLeftDownStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FThumbButtonLeftDownStroke.OnChanged := @StrokeChanged;\r\n FThumbButtonRightDownStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FThumbButtonRightDownStroke.OnChanged := @StrokeChanged;\r\n\r\n FScrollButtonLeftStroke := TTMSFNCGraphicsStroke.Create(gskSolid, Darker(gcDarkGray, 40));\r\n FScrollButtonLeftStroke.OnChanged := @StrokeChanged;\r\n FScrollButtonRightStroke := TTMSFNCGraphicsStroke.Create(gskSolid, Darker(gcDarkGray, 40));\r\n FScrollButtonRightStroke.OnChanged := @StrokeChanged;\r\n FScrollButtonLeftHoverStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FScrollButtonLeftHoverStroke.OnChanged := @StrokeChanged;\r\n FScrollButtonRightHoverStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FScrollButtonRightHoverStroke.OnChanged := @StrokeChanged;\r\n FScrollButtonLeftDownStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FScrollButtonLeftDownStroke.OnChanged := @StrokeChanged;\r\n FScrollButtonRightDownStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(60, 127, 177));\r\n FScrollButtonRightDownStroke.OnChanged := @StrokeChanged;\r\n\r\n FArrowColor := gcBlack;\r\n\r\n FFixedThumb := False;\r\n FThumbButtonSize := 18;\r\n FScrollButtonSize := 18;\r\nend;\r\n\r\ndestructor TTMSFNCScrollBarAppearance.Destroy;\r\nbegin\r\n FThumbFill.Free;\r\n FScrollButtonLeftFill.Free;\r\n FScrollButtonRightFill.Free;\r\n FScrollButtonLeftHoverFill.Free;\r\n FScrollButtonRightHoverFill.Free;\r\n FScrollButtonLeftDownFill.Free;\r\n FScrollButtonRightDownFill.Free;\r\n FThumbButtonLeftFill.Free;\r\n FThumbButtonRightFill.Free;\r\n FThumbButtonLeftHoverFill.Free;\r\n FThumbButtonRightHoverFill.Free;\r\n FThumbButtonLeftDownFill.Free;\r\n FThumbButtonRightDownFill.Free;\r\n FThumbStroke.Free;\r\n FScrollButtonLeftStroke.Free;\r\n FScrollButtonRightStroke.Free;\r\n FScrollButtonLeftHoverStroke.Free;\r\n FScrollButtonRightHoverStroke.Free;\r\n FScrollButtonLeftDownStroke.Free;\r\n FScrollButtonRightDownStroke.Free;\r\n FThumbButtonLeftStroke.Free;\r\n FThumbButtonRightStroke.Free;\r\n FThumbButtonLeftHoverStroke.Free;\r\n FThumbButtonRightHoverStroke.Free;\r\n FThumbButtonLeftDownStroke.Free;\r\n FThumbButtonRightDownStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nfunction TTMSFNCScrollBarAppearance.GetThumbButtonSize: Single;\r\nbegin\r\n if FixedThumb then\r\n Result := 0\r\n else\r\n Result := ThumbButtonSize;\r\nend;\r\n\r\nfunction TTMSFNCScrollBarAppearance.IsScrollButtonSizeStored: Boolean;\r\nbegin\r\n Result := ScrollButtonSize <> 18;\r\nend;\r\n\r\nfunction TTMSFNCScrollBarAppearance.IsThumbButtonSizeStored: Boolean;\r\nbegin\r\n Result := ThumbButtonSize <> 18;\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetArrowColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FArrowColor <> Value then\r\n begin\r\n FArrowColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetFixedThumb(const Value: Boolean);\r\nbegin\r\n if FFixedThumb <> value then\r\n begin\r\n FFixedThumb := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonLeftDownFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FScrollButtonLeftDownFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonLeftDownStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FScrollButtonLeftDownStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonLeftFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FScrollButtonLeftFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonLeftHoverFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FScrollButtonLeftHoverFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonLeftHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FScrollButtonLeftHoverStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonLeftStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FScrollButtonLeftStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonRightDownFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FScrollButtonRightDownFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonRightDownStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FScrollButtonRightDownStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonRightFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FScrollButtonRightFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonRightHoverFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FScrollButtonRightHoverFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonRightHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FScrollButtonRightHoverStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonRightStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FScrollButtonRightStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetScrollButtonSize(const Value: Single);\r\nbegin\r\n if FScrollButtonSize <> Value then\r\n begin\r\n FScrollButtonSize := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonLeftDownFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FThumbButtonLeftDownFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonLeftDownStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FThumbButtonLeftDownStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonLeftFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FThumbButtonLeftFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonLeftHoverFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FThumbButtonLeftHoverFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonLeftHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FThumbButtonLeftHoverStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonLeftStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FThumbButtonLeftStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonRightDownFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FThumbButtonRightDownFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonRightDownStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FThumbButtonRightDownStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonRightFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FThumbButtonRightFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonRightHoverFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FThumbButtonRightHoverFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonRightHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FThumbButtonRightHoverStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonRightStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FThumbButtonRightStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbButtonSize(\r\n const Value: Single);\r\nbegin\r\n if FThumbButtonSize <> value then\r\n begin\r\n FThumbButtonSize := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FThumbFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.SetThumbStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FThumbStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCScrollBarAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.AppearanceChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n begin\r\n Appearance.ThumbFill.Color := c;\r\n Appearance.ThumbButtonLeftFill.Color := c;\r\n Appearance.ThumbButtonRightFill.Color := c;\r\n Appearance.ScrollButtonLeftFill.Color := c;\r\n Appearance.ScrollButtonRightFill.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleLineFillColor(c) then\r\n begin\r\n Appearance.ThumbStroke.Color := c;\r\n Appearance.ThumbButtonLeftStroke.Color := c;\r\n Appearance.ThumbButtonRightStroke.Color := c;\r\n Appearance.ScrollButtonLeftStroke.Color := c;\r\n Appearance.ScrollButtonRightStroke.Color := c;\r\n Appearance.ThumbButtonLeftHoverStroke.Color := c;\r\n Appearance.ThumbButtonRightHoverStroke.Color := c;\r\n Appearance.ScrollButtonLeftHoverStroke.Color := c;\r\n Appearance.ScrollButtonRightHoverStroke.Color := c;\r\n Appearance.ThumbButtonLeftDownStroke.Color := c;\r\n Appearance.ThumbButtonRightDownStroke.Color := c;\r\n Appearance.ScrollButtonLeftDownStroke.Color := c;\r\n Appearance.ScrollButtonRightDownStroke.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleSelectionFillColor(c) then\r\n begin\r\n Appearance.ThumbButtonLeftHoverFill.Color := Blend(Fill.Color, c, 70);\r\n Appearance.ThumbButtonRightHoverFill.Color := Blend(Fill.Color, c, 70);\r\n Appearance.ScrollButtonLeftHoverFill.Color := Blend(Fill.Color, c, 70);\r\n Appearance.ScrollButtonRightHoverFill.Color := Blend(Fill.Color, c, 70);\r\n Appearance.ThumbButtonLeftDownFill.Color := Blend(Fill.Color, c, 50);\r\n Appearance.ThumbButtonRightDownFill.Color := Blend(Fill.Color, c, 50);\r\n Appearance.ScrollButtonLeftDownFill.Color := Blend(Fill.Color, c, 50);\r\n Appearance.ScrollButtonRightDownFill.Color := Blend(Fill.Color, c, 50);\r\n Appearance.ArrowColor := c;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCScrollBar) then\r\n begin\r\n FKind := (Source as TTMSFNCScrollBar).Kind;\r\n FValue := (Source as TTMSFNCScrollBar).Value;\r\n FMin := (Source as TTMSFNCScrollBar).Min;\r\n FMax := (Source as TTMSFNCScrollBar).Max;\r\n FPageSize := (Source as TTMSFNCScrollBar).PageSize;\r\n FSmallChange := (Source as TTMSFNCScrollBar).SmallChange;\r\n FLargeChange := (Source as TTMSFNCScrollBar).LargeChange;\r\n FAppearance.Assign((Source as TTMSFNCScrollBar).Appearance);\r\n FTracking := (Source as TTMSFNCScrollBar).Tracking;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.Changed;\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.HandleMouseLeave;\r\nbegin\r\n inherited;\r\n FTimer.Enabled := false;\r\n FTime := 0;\r\n FScrollBarMode := sbmNone;\r\n FScrollButtonChange := sbcNone;\r\n FMinThumb := false;\r\n FMaxThumb := false;\r\n FDownButton := sdbNone;\r\n FHoveredButton := shbNone;\r\n Changed;\r\nend;\r\n\r\nconstructor TTMSFNCCustomScrollBar.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FTracking := True;\r\n FDesignTime := IsDesignTime;\r\n if FDesignTime then\r\n begin\r\n Fill.Color := Lighter(MakeGraphicsColor(225, 225, 225), 40);\r\n Stroke.Color := Darker(gcDarkGray, 40);\r\n end;\r\n Height := 121;\r\n Width := 18;\r\n FKind := sbkVertical;\r\n FValue := 0;\r\n FMin := 0;\r\n FMax := 100;\r\n FSmallChange := 1;\r\n FLargeChange := 20;\r\n FAppearance := TTMSFNCScrollBarAppearance.Create(Self);\r\n FAppearance.OnChange := @AppearanceChanged;\r\n FPageSize := 20;\r\n {$IFDEF WEBLIB}\r\n FTimer := TTimer.Create(nil);\r\n {$ELSE}\r\n FTimer := TTimer.Create(Self);\r\n {$ENDIF}\r\n FTimer.OnTimer := TimerChanged;\r\n FTimer.Interval := 100;\r\nend;\r\n\r\ndestructor TTMSFNCCustomScrollBar.Destroy;\r\nbegin\r\n FAppearance.Free;\r\n FTimer.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.DrawArrow(g: TTMSFNCGraphics; r: TRectF; ALeft: Boolean);\r\nbegin\r\n g.Stroke.Color := Appearance.ArrowColor;\r\n if Kind = sbkVertical then\r\n begin\r\n InflateRectEx(r, 0, -4);\r\n if not ALeft then\r\n begin\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 2), r.Top + ((r.Bottom - R.Top) / 3 * 2)), PointF(r.Left + ((r.Right - R.Left) / 3), r.Top + ((r.Bottom - R.Top) / 3)));\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 2), r.Top + ((r.Bottom - R.Top) / 3 * 2)), PointF(r.Left + ((r.Right - R.Left) / 3 * 2), r.Top + ((r.Bottom - R.Top) / 3)));\r\n end\r\n else\r\n begin\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 2), r.Top + ((r.Bottom - R.Top) / 3)), PointF(r.Left + ((r.Right - R.Left) / 3), r.Top + ((r.Bottom - R.Top) / 3 * 2)));\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 2), r.Top + ((r.Bottom - R.Top) / 3)), PointF(r.Left + ((r.Right - R.Left) / 3 * 2), r.Top + ((r.Bottom - R.Top) / 3 * 2)));\r\n end;\r\n end\r\n else\r\n begin\r\n InflateRectEx(r, -4, 0);\r\n if not ALeft then\r\n begin\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 3), r.Top + ((r.Bottom - R.Top) / 3)), PointF(r.Left + ((r.Right - R.Left) / 3 * 2), r.Top + ((r.Bottom - R.Top) / 2)));\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 3), r.Top + ((r.Bottom - R.Top) / 3 * 2)), PointF(r.Left + ((r.Right - R.Left) / 3 * 2), r.Top + ((r.Bottom - R.Top) / 2)));\r\n end\r\n else\r\n begin\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 3 * 2), r.Top + ((r.Bottom - R.Top) / 3)), PointF(r.Left + ((r.Right - R.Left) / 3), r.Top + ((r.Bottom - R.Top) / 2)));\r\n g.DrawLine(PointF(r.Left + ((r.Right - R.Left) / 3 * 2), r.Top + ((r.Bottom - R.Top) / 3 * 2)), PointF(r.Left + ((r.Right - R.Left) / 3), r.Top + ((r.Bottom - R.Top) / 2)));\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TTMSFNCCustomScrollBar.DrawScrollButtons(g: TTMSFNCGraphics);\r\nvar\r\n flmin, flmax: TTMSFNCGraphicsFill;\r\n stmin, stmax: TTMSFNCGraphicsStroke;\r\nbegin\r\n if Appearance.ScrollButtonSize <= 0 then\r\n Exit;\r\n\r\n flmin := Appearance.ScrollButtonLeftFill;\r\n flmax := Appearance.ScrollButtonRightFill;\r\n stmin := Appearance.ScrollButtonLeftStroke;\r\n stmax := Appearance.ScrollButtonRightStroke;\r\n\r\n if FDownButton = sdbScrollMin then\r\n begin\r\n flmin := Appearance.ScrollButtonLeftDownFill;\r\n stmin := Appearance.ScrollButtonLeftDownStroke;\r\n end\r\n else if FHoveredButton = shbScrollMin then\r\n begin\r\n flmin := Appearance.ScrollButtonLeftHoverFill;\r\n stmin := Appearance.ScrollButtonLeftHoverStroke;\r\n end;\r\n\r\n g.Fill.Assign(flmin);\r\n g.Stroke.Assign(stmin);\r\n g.DrawRectangle(GetMinScrollButton);\r\n\r\n if FDownButton = sdbScrollMax then\r\n begin\r\n flmax := Appearance.ScrollButtonRightDownFill;\r\n stmax := Appearance.ScrollButtonRightDownStroke;\r\n end\r\n else if FHoveredButton = shbScrollMax then\r\n begin\r\n flmax := Appearance.ScrollButtonRightHoverFill;\r\n stmax := Appearance.ScrollButtonRightHoverStroke;\r\n end;\r\n\r\n g.Fill.Assign(flmax);\r\n g.Stroke.Assign(stmax);\r\n g.DrawRectangle(GetMaxScrollButton);\r\n\r\n DrawArrow(g, GetMinScrollButton, true);\r\n DrawArrow(g, GetMaxScrollButton, false);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.DrawThumb(g: TTMSFNCGraphics);\r\nbegin\r\n g.Fill.Assign(Appearance.ThumbFill);\r\n g.Stroke.Assign(Appearance.ThumbStroke);\r\n g.DrawRectangle(GetThumbRectangle);\r\n if not Appearance.FixedThumb then\r\n DrawThumbButtons(g);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.DrawThumbButtons(g: TTMSFNCGraphics);\r\nvar\r\n flmin, flmax: TTMSFNCGraphicsFill;\r\n stmin, stmax: TTMSFNCGraphicsStroke;\r\nbegin\r\n if Appearance.ThumbButtonSize <= 0 then\r\n Exit;\r\n\r\n flmin := Appearance.ThumbButtonLeftFill;\r\n flmax := Appearance.ThumbButtonRightFill;\r\n stmin := Appearance.ThumbButtonLeftStroke;\r\n stmax := Appearance.ThumbButtonRightStroke;\r\n\r\n if FDownButton = sdbThumbMin then\r\n begin\r\n flmin := Appearance.ThumbButtonLeftDownFill;\r\n stmin := Appearance.ThumbButtonLeftDownStroke;\r\n end\r\n else if FHoveredButton = shbThumbMin then\r\n begin\r\n flmin := Appearance.ThumbButtonLeftHoverFill;\r\n stmin := Appearance.ThumbButtonLeftHoverStroke;\r\n end;\r\n\r\n g.Fill.Assign(flmin);\r\n g.Stroke.Assign(stmin);\r\n g.DrawRectangle(GetMinThumbButton);\r\n\r\n if FDownButton = sdbThumbMax then\r\n begin\r\n flmax := Appearance.ThumbButtonRightDownFill;\r\n stmax := Appearance.ThumbButtonRightDownStroke;\r\n end\r\n else if FHoveredButton = shbThumbMax then\r\n begin\r\n flmax := Appearance.ThumbButtonRightHoverFill;\r\n stmax := Appearance.ThumbButtonRightHoverStroke;\r\n end;\r\n\r\n g.Fill.Assign(flmax);\r\n g.Stroke.Assign(stmax);\r\n g.DrawRectangle(GetMaxThumbButton);\r\n\r\n DrawArrow(g, GetMinThumbButton, true);\r\n DrawArrow(g, GetMaxThumbButton, false);\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetMaxScrollButton: TRectF;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := LocalRect;\r\n case Kind of\r\n sbkHorizontal: Result := MakeRectF(r.Right - Appearance.ScrollButtonSize, r.Top, Appearance.ScrollButtonSize, r.Bottom - r.Top);\r\n sbkVertical: Result := MakeRectF(r.Left, r.Bottom - Appearance.ScrollButtonSize, r.Right - r.Left, Appearance.ScrollButtonSize);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetMaxThumbButton: TRectF;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := GetThumbRectangle;\r\n case Kind of\r\n sbkHorizontal: Result := MakeRectF(r.Left + (r.Right - R.Left) - Appearance.GetThumbButtonSize, r.Top, Appearance.GetThumbButtonSize, (r.Bottom - R.Top));\r\n sbkVertical: Result := MakeRectF(r.Left, r.Top + (r.Bottom - R.Top) - Appearance.GetThumbButtonSize, (r.Right - R.Left), Appearance.GetThumbButtonSize);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetMinScrollButton: TRectF;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := LocalRect;\r\n case Kind of\r\n sbkHorizontal: Result := MakeRectF(r.Left, r.Top, Appearance.ScrollButtonSize, r.Bottom - r.Top);\r\n sbkVertical: Result := MakeRectF(r.Left, r.Top, r.Right - r.Left, Appearance.ScrollButtonSize);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetMinThumbButton: TRectF;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := GetThumbRectangle;\r\n case Kind of\r\n sbkHorizontal: Result := MakeRectF(r.Left, r.Top, Appearance.GetThumbButtonSize, (r.Bottom - R.Top));\r\n sbkVertical: Result := MakeRectF(r.Left, r.Top, (r.Right - R.Left), Appearance.GetThumbButtonSize);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetValue(XYPos: Double): Double;\r\nvar\r\n v, s: Double;\r\n scr: TRectF;\r\nbegin\r\n scr := GetScrollRectangle;\r\n case Kind of\r\n sbkHorizontal: s := (scr.Right - scr.Left) - Math.Max(Appearance.GetThumbButtonSize * 2 + 10, ((scr.Right - scr.Left) / GetRange * PageSize));\r\n sbkVertical: s := (scr.Bottom - scr.Top) - Math.Max(Appearance.GetThumbButtonSize * 2 + 10, ((scr.Bottom - scr.Top) / GetRange * PageSize));\r\n else\r\n s := 0;\r\n end;\r\n\r\n if (max - min > 0) and (s > 0) then\r\n begin\r\n v := (XYPos / s) * (max - min) + min;\r\n Result := Math.Max(Math.Min(v, max), min);\r\n end\r\n else\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetValue: Double;\r\nvar\r\n s: Double;\r\n scr: TRectF;\r\nbegin\r\n Result := 0;\r\n scr := GetScrollRectangle;\r\n case Kind of\r\n sbkHorizontal: s := (scr.Right - scr.Left) - Math.Max(Appearance.GetThumbButtonSize * 2 + 10, ((scr.Right - scr.Left) / GetRange * PageSize));\r\n sbkVertical: s := (scr.Bottom - scr.Top) - Math.Max(Appearance.GetThumbButtonSize * 2 + 10, ((scr.Bottom - scr.Top) / GetRange * PageSize));\r\n else\r\n s := 0;\r\n end;\r\n\r\n if s <= 0 then\r\n Exit;\r\n\r\n if (Max - Min) > 0 then\r\n begin\r\n if Tracking then\r\n Result := Math.Min(((Value - Min) / (Max - Min)) * s, s)\r\n else\r\n Result := Math.Min(((FTempValue - Min) / (Max - Min)) * s, s)\r\n end\r\n else\r\n Result := Min;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetRange: Double;\r\nbegin\r\n Result := Math.Max(2, Max - Min);\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetScrollAreaMin: TRectF;\r\nvar\r\n scr: TRectF;\r\n thr: TRectF;\r\nbegin\r\n scr := GetScrollRectangle;\r\n thr := GetThumbRectangle;\r\n case Kind of\r\n sbkHorizontal:\r\n begin\r\n Result.Left := scr.Left;\r\n Result.Top := scr.Top;\r\n Result.Right := Result.Left + (thr.Left - scr.Left);\r\n Result.Bottom := Result.Top + (scr.Bottom - scr.Top);\r\n end;\r\n sbkVertical:\r\n begin\r\n Result.Left := scr.Left;\r\n Result.Top := scr.Top;\r\n Result.Right := Result.Left + (scr.Right - scr.Left);\r\n Result.Bottom := Result.Top + (thr.Top - scr.Top);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetScrollAreaMax: TRectF;\r\nvar\r\n scr: TRectF;\r\n thr: TRectF;\r\nbegin\r\n scr := GetScrollRectangle;\r\n thr := GetThumbRectangle;\r\n case Kind of\r\n sbkHorizontal:\r\n begin\r\n Result.Left := thr.Left + (thr.Right - thr.Left);\r\n Result.Top := scr.Top;\r\n Result.Right := Result.Left + (scr.Right - scr.Left) - (thr.Right - thr.Left) - thr.Left + scr.Left;\r\n Result.Bottom := Result.Top + (scr.Bottom - scr.Top);\r\n end;\r\n sbkVertical:\r\n begin\r\n Result.Left := scr.Left;\r\n Result.Top := thr.Top + (thr.Bottom - thr.Top);\r\n Result.Right := Result.Left + (scr.Right - scr.Left);\r\n result.Bottom := Result.Top + (scr.Bottom - scr.Top) - (thr.Bottom - thr.Top) - thr.Top + scr.Top;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetScrollRectangle: TRectF;\r\nbegin\r\n case Kind of\r\n sbkHorizontal:\r\n begin\r\n Result.Left := GetMinScrollButton.Left + (GetMinScrollButton.Right - GetMinScrollButton.Left);\r\n Result.Top := GetMinScrollButton.Top;\r\n Result.Bottom := Result.Top + (GetMinScrollButton.Bottom - GetMinScrollButton.Top);\r\n Result.Right := Result.Left + GetMaxScrollButton.Left - (GetMinScrollbutton.Right - GetMinScrollButton.Left);\r\n end;\r\n sbkVertical:\r\n begin\r\n Result.Left := GetMinScrollButton.Left;\r\n Result.Top := GetMinScrollButton.Top + (GetMinScrollButton.Bottom - GetMinScrollButton.Top);\r\n Result.Bottom := Result.Top + GetMaxScrollButton.Top - (GetMinScrollButton.Bottom - GetMinScrollButton.Top);\r\n Result.Right := Result.Left + (GetMinScrollButton.Right - GetMinScrollButton.Left);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetScrollSize: Double;\r\nbegin\r\n case Kind of\r\n sbkHorizontal: Result := (GetScrollRectangle.Right - GetScrollRectangle.Left) - (GetThumbRectangle.Right - GetThumbRectangle.Left);\r\n sbkVertical: Result := (GetScrollRectangle.Bottom - GetScrollRectangle.Top) - (GetThumbRectangle.Bottom - GetThumbRectangle.Top);\r\n else\r\n Result := 0;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.GetThumbRectangle: TRectF;\r\nvar\r\n scr: TRectF;\r\n s: Double;\r\nbegin\r\n scr := GetScrollRectangle;\r\n case Kind of\r\n sbkHorizontal:\r\n begin\r\n s := (scr.Right - scr.Left) / GetRange * PageSize;\r\n Result.Left := scr.Left + GetValue;\r\n Result.Top := scr.Top;\r\n Result.Right := Result.Left + Math.Max(Appearance.GetThumbButtonSize * 2 + 10, s);\r\n Result.Bottom := Result.Top + (scr.Bottom - scr.Top);\r\n end;\r\n sbkVertical:\r\n begin\r\n s := (scr.Bottom - scr.Top) / GetRange * PageSize;\r\n Result.Left := scr.Left;\r\n Result.Top := scr.Top + GetValue;\r\n Result.Right := Result.Left + (scr.Right - scr.Left);\r\n Result.Bottom := Result.Top + Math.Max(Appearance.GetThumbButtonSize * 2 + 10, s);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.HandleKeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n case Key of\r\n KEY_UP, KEY_LEFT: Value := Value - SmallChange;\r\n KEY_DOWN, KEY_RIGHT: Value := Value + SmallChange;\r\n KEY_HOME: Value := Min;\r\n KEY_END: Value := Max;\r\n KEY_PRIOR: Value := Value - LargeChange;\r\n KEY_NEXT: Value := Value + LargeChange;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.HandleMouseDown(Button: TMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n CaptureEx;\r\n FCx := Abs(X - GetThumbRectangle.Left + GetScrollRectangle.Left);\r\n FCy := Abs(Y - GetThumbRectangle.Top + GetScrollRectangle.Top);\r\n FMx := X;\r\n FMy := Y;\r\n FSavedPageSize := PageSize;\r\n FTime := 0;\r\n FTimer.Enabled := true;\r\n if MouseOnThumbButtons(X, Y) then\r\n begin\r\n FScrollBarMode := sbmChangePageSize;\r\n FMinThumb := PtInRectEx(GetMinThumbButton, PointF(X, Y));\r\n FMaxThumb := PtInRectEx(GetMaxThumbButton, PointF(X, Y));\r\n end\r\n else if MouseOnThumb(X, Y) then\r\n FScrollBarMode := sbmScroll\r\n else if PtInRectEx(GetMinScrollButton, PointF(X, Y)) then\r\n FScrollButtonChange := sbcSmallSubstract\r\n else if PtInRectEx(GetMaxScrollButton, PointF(X, Y)) then\r\n FScrollButtonChange := sbcSmallAdd\r\n else if PtInRectEx(GetScrollAreaMin, PointF(X, Y)) then\r\n FScrollButtonChange := sbcLargeSubstract\r\n else if PtInRectEx(GetScrollAreaMax, PointF(X, Y)) then\r\n FScrollButtonChange := sbcLargeAdd;\r\n\r\n if PtInRectEx(GetMinThumbButton, PointF(X, Y)) and not (FDownButton = sdbThumbMin) then\r\n begin\r\n FDownButton := sdbThumbMin;\r\n Changed;\r\n end\r\n else if PtInRectEx(GetMaxThumbButton, PointF(X, Y)) and not (FDownButton = sdbThumbMax) then\r\n begin\r\n FDownButton := sdbThumbMax;\r\n Changed;\r\n end\r\n else if PtInRectEx(GetMinScrollButton, PointF(X, Y)) and not (FDownButton = sdbScrollMin) then\r\n begin\r\n FDownButton := sdbScrollMin;\r\n Changed;\r\n end\r\n else if PtInRectEx(GetMaxScrollButton, PointF(X, Y)) and not (FDownButton = sdbScrollMax) then\r\n begin\r\n FDownButton := sdbScrollMax;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.HandleMouseEnter;\r\nbegin\r\n inherited;\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.HandleMouseMove(Shift: TShiftState; X, Y: Single);\r\nvar\r\n pos: Double;\r\n v: Double;\r\nbegin\r\n inherited;\r\n begin\r\n if FScrollBarMode = sbmChangePageSize then\r\n begin\r\n case Kind of\r\n sbkHorizontal: Cursor := crSizeWE;\r\n sbkVertical: Cursor := crSizeNS;\r\n end;\r\n\r\n case Kind of\r\n sbkHorizontal: pos := GetRange / (GetScrollRectangle.Right - GetScrollRectangle.Left) * (X - FMx);\r\n sbkVertical: pos := GetRange / (GetScrollRectangle.Bottom - GetScrollRectangle.Top) * (Y - FMy);\r\n else\r\n pos := 0;\r\n end;\r\n\r\n if FMinThumb then\r\n begin\r\n if Value - Min > 0 then\r\n PageSize := FSavedPageSize - pos * (GetRange / (Value - Min))\r\n else\r\n PageSize := FSavedPageSize - pos\r\n end\r\n else if FMaxThumb then\r\n begin\r\n if Value - Min < GetRange then\r\n PageSize := FSavedPageSize + pos * (GetRange / (Max - Value))\r\n else\r\n PageSize := FSavedPageSize + pos\r\n end;\r\n end\r\n else if (FScrollBarMode = sbmScroll) then\r\n begin\r\n case Kind of\r\n sbkHorizontal: pos := X - FCx;\r\n sbkVertical: pos := Y - FCy;\r\n else\r\n pos := 0;\r\n end;\r\n\r\n v := GetValue(pos);\r\n if Tracking then\r\n Value := v\r\n else\r\n begin\r\n FTempValue := v;\r\n Changed;\r\n end;\r\n end\r\n else if MouseOnThumbButtons(X, Y) then\r\n begin\r\n case Kind of\r\n sbkHorizontal: Cursor := crSizeWE;\r\n sbkVertical: Cursor := crSizeNS;\r\n end;\r\n end\r\n else\r\n begin\r\n Cursor := crDefault;\r\n end;\r\n end;\r\n\r\n if PtInRectEx(GetMinThumbButton, PointF(X, Y)) and not (FHoveredButton = shbThumbMin) then\r\n begin\r\n FHoveredButton := shbThumbMin;\r\n Changed;\r\n end\r\n else if PtInRectEx(GetMaxThumbButton, PointF(X, Y)) and not (FHoveredButton = shbThumbMax) then\r\n begin\r\n FHoveredButton := shbThumbMax;\r\n Changed;\r\n end\r\n else if PtInRectEx(GetMinScrollButton, PointF(X, Y)) and not (FHoveredButton = shbScrollMin) then\r\n begin\r\n FHoveredButton := shbScrollMin;\r\n Changed;\r\n end\r\n else if PtInRectEx(GetMaxScrollButton, PointF(X, Y)) and not (FHoveredButton = shbScrollMax) then\r\n begin\r\n FHoveredButton := shbScrollMax;\r\n Changed;\r\n end\r\n else if not PtInRectEx(GetMaxThumbButton, PointF(X, Y)) and not PtInRectEx(GetMinThumbButton, PointF(X, Y)) and not PtInRectEx(GetMaxScrollButton, PointF(X, Y))\r\n and not PtInRectEx(GetMinScrollButton, PointF(X, Y)) and (FHoveredButton <> shbNone) then\r\n begin\r\n FHoveredButton := shbNone;\r\n Changed;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.MouseOnThumb(X, Y: Double): Boolean;\r\nbegin\r\n Result := PtInRectEx(GetThumbRectangle, PointF(X, Y));\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.MouseOnThumbButtons(X, Y: Double): Boolean;\r\nbegin\r\n Result := PtInRectEx(GetMinThumbButton, PointF(X, Y)) or PtInRectEx(GetMaxThumbButton, PointF(X, Y));\r\n Result := Result and not Appearance.FixedThumb;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.ResetToDefaultStyle;\r\nvar\r\n ia: TTMSFNCScrollBarAppearance;\r\nbegin\r\n inherited;\r\n ia := TTMSFNCScrollBarAppearance.Create(nil);\r\n try\r\n Appearance.Assign(ia);\r\n finally\r\n ia.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.HandleMouseUp(Button: TMouseButton; Shift: TShiftState;\r\n X, Y: Single);\r\nbegin\r\n inherited;\r\n ReleaseCaptureEx;\r\n if (FScrollBarMode = sbmScroll) and not Tracking then\r\n Value := FTempValue;\r\n\r\n if (FScrollBarMode = sbmNone) then\r\n begin\r\n if PtInRectEx(GetMinScrollButton, PointF(X, Y)) then\r\n Value := Value - SmallChange\r\n else if PtInRectEx(GetMaxScrollButton, PointF(X, Y)) then\r\n Value := Value + SmallChange\r\n else if PtInRectEx(GetScrollAreaMin, PointF(X, Y)) then\r\n Value := Value - LargeChange\r\n else if PtInRectEx(GetScrollAreaMax, PointF(X, Y)) then\r\n Value := Value + LargeChange;\r\n end;\r\n\r\n FDownButton := sdbNone;\r\n FMinThumb := false;\r\n FMaxThumb := false;\r\n FTimer.Enabled := false;\r\n FTime := 0;\r\n FScrollBarMode := sbmNone;\r\n Cursor := crDefault;\r\n FScrollButtonChange := sbcNone;\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.HandleMouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);\r\nbegin\r\n inherited;\r\n if WheelDelta < 0 then\r\n Value := Value + LargeChange\r\n else\r\n Value := Value - LargeChange;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.IsLargeChangeStored: Boolean;\r\nbegin\r\n Result := LargeChange <> 20;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.IsMaxStored: Boolean;\r\nbegin\r\n Result := Max <> 100;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.IsMinStored: Boolean;\r\nbegin\r\n Result := Min <> 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.IsPageSizeStored: Boolean;\r\nbegin\r\n Result := PageSize <> 20;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.IsSmallChangeStored: Boolean;\r\nbegin\r\n Result := SmallChange <> 1;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollBar.IsValueStored: Boolean;\r\nbegin\r\n Result := Value <> 0;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.Loaded;\r\nbegin\r\n inherited;\r\n if FNeedsChange then\r\n SetBounds(Left, Top, Height, Width);\r\n\r\n FNeedsChange := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n inherited;\r\n DrawThumb(AGraphics);\r\n DrawScrollButtons(AGraphics);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.SetAppearance(\r\n const Value: TTMSFNCScrollBarAppearance);\r\nbegin\r\n if FAppearance <> value then\r\n begin\r\n FAppearance.Assign(Value);\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.SetKind(Value: TTMSFNCScrollBarKind);\r\nbegin\r\n if FKind <> Value then\r\n begin\r\n FKind := Value;\r\n if not (csLoading in ComponentState) then\r\n SetBounds(Left, Top, Height, Width)\r\n else\r\n FNeedsChange := True;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.SetMax(const Value: Double);\r\nbegin\r\n if FMax <> value then\r\n begin\r\n FMax := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.SetMin(const Value: Double);\r\nbegin\r\n if FMin <> value then\r\n begin\r\n FMin := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.SetPageSize(const Value: Double);\r\nbegin\r\n if FPageSize <> value then\r\n begin\r\n FPageSize := Math.Min(GetRange, Math.Max(0, Value));\r\n if Assigned(FOnPageSizeChanged) then\r\n FOnPageSizeChanged(Self, PageSize);\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.SetTracking(const Value: Boolean);\r\nbegin\r\n if FTracking <> Value then\r\n begin\r\n FTracking := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.SetValue(const Value: Double);\r\nbegin\r\n if FValue <> Value then\r\n begin\r\n FValue := Math.Max(Self.Min, Math.Min(Self.Max, Value));\r\n FTempValue := FValue;\r\n if Assigned(FOnValueChange) then\r\n FOnValueChange(Self, Value);\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollBar.TimerChanged(Sender: TObject);\r\nbegin\r\n Inc(FTime);\r\n if FTime >= 4 then\r\n begin\r\n if FScrollButtonChange = sbcSmallSubstract then\r\n begin\r\n Value := Value - SmallChange;\r\n Changed;\r\n end\r\n else if FScrollButtonChange = sbcSmallAdd then\r\n begin\r\n Value := Value + SmallChange;\r\n Changed;\r\n end\r\n else if FScrollButtonChange = sbcLargeSubstract then\r\n begin\r\n Value := Value - LargeChange;\r\n Changed;\r\n end\r\n else if FScrollButtonChange = sbcLargeAdd then\r\n begin\r\n Value := Value + LargeChange;\r\n Changed;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCScrollBar }\r\n\r\nprocedure TTMSFNCScrollBar.RegisterRuntimeClasses;\r\nbegin\r\n RegisterClass(TTMSFNCScrollBar);\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCCustomScrollControl;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n Windows,\r\n {$ENDIF}\r\n Classes, WEBLib.TMSFNCCustomControl, WEBLib.StdCtrls, WEBLib.TMSFNCScrollBar, WEBLib.TMSFNCGraphics,\r\n WEBLib.TMSFNCTypes, WEBLib.ExtCtrls\r\n {$IFNDEF LCLLIB}\r\n ,Types\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ,WEBLib.Controls\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n {$IFDEF ANDROID}\r\n SCROLLINGDELAY = 40;\r\n {$ELSE}\r\n SCROLLINGDELAY = 0;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 15;\r\n {$ELSE}\r\n {$IFDEF MSWINDOWS}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 15;\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 200;\r\n {$ELSE}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 200;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF ANDROID}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 100;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n {$IFDEF LINUX}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 200;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 100;\r\n {$ENDIF}\r\n\r\ntype\r\n TTMSFNCCustomScrollControlMode = (scmPixelScrolling, scmItemScrolling);\r\n TTMSFNCCustomScrollControlUpdate = (scuContinuous, scuOnce);\r\n\r\n TTMSFNCCustomScrollControl = class(TTMSFNCCustomControl)\r\n private\r\n FDownTime: Integer;\r\n FMouseUp, FAnimateVerticalPos, FAnimateHorizontalPos: Boolean;\r\n FAnimating: Boolean;\r\n FSpX, FSpY: Double;\r\n FDoubleSelection, FRangeSelection, FScrolling: Boolean;\r\n FScrollX, FScrollY, FDownX, FDownY, FMouseX, FMouseY: Double;\r\n FScrollVTo, FScrollHTo: Double;\r\n FTimeStart, FTimeStop: Double;\r\n FAnimateTimer, FDownTimer: TTimer;\r\n FSaveHScrollPos, FSaveVScrollPos: Single;\r\n FBlockScrollingUpdate, FIsMouseDown, FStretchScrollBars: Boolean;\r\n FUpdateCount: Integer;\r\n FVerticalScrollBar, FHorizontalScrollBar: TScrollBar;\r\n FCustomVerticalScrollBar, FCustomHorizontalScrollBar: TTMSFNCScrollBar;\r\n FVerticalScrollBarVisible: Boolean;\r\n FHorizontalScrollBarVisible: Boolean;\r\n FScrollMode: TTMSFNCCustomScrollControlMode;\r\n FApplyClipRect: Boolean;\r\n FScrollUpdate: TTMSFNCCustomScrollControlUpdate;\r\n FCustomScrollBars: Boolean;\r\n FTouchScrolling: Boolean;\r\n FProcessTouchScrolling: Boolean;\r\n procedure SetHorizontalScrollBarVisible(const Value: Boolean);\r\n procedure SetVerticalScrollBarVisible(const Value: Boolean);\r\n procedure SetStretchScrollBars(const Value: Boolean);\r\n procedure SetScrollMode(const Value: TTMSFNCCustomScrollControlMode);\r\n procedure SetApplyClipRect(const Value: Boolean);\r\n procedure SetScrollUpdate(const Value: TTMSFNCCustomScrollControlUpdate);\r\n procedure SetCustomScrollBars(const Value: Boolean);\r\n protected\r\n function GetVersion: string; override;\r\n {$IFDEF WEBLIB}\r\n function GetCanvasHeightOffset: Integer; override;\r\n function GetCanvasWidthOffset: Integer; override;\r\n {$ENDIF}\r\n function ColumnStretchingActive: Boolean; virtual; abstract;\r\n procedure Animate(Sender: TObject);\r\n procedure DownTime(Sender: TObject);\r\n procedure UpdateControlAfterResize; override;\r\n procedure FillChanged(Sender: TObject); reintroduce; virtual;\r\n procedure StrokeChanged(Sender: TObject); reintroduce; virtual;\r\n procedure Scroll(AHorizontalPos, AVerticalPos: Double);\r\n procedure UpdateControlScroll({%H-}AHorizontalPos, {%H-}AVerticalPos, {%H-}ANewHorizontalPos, {%H-}ANewVerticalPos: Double); virtual;\r\n procedure VerticalScrollPositionChanged; virtual;\r\n procedure HorizontalScrollPositionChanged; virtual;\r\n procedure VScrollChanged(Sender: TObject);\r\n procedure HScrollChanged(Sender: TObject);\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HCustomScrollChanged(Sender: TObject; {%H-}AValue: Double);\r\n procedure VCustomScrollChanged(Sender: TObject; {%H-}AValue: Double);\r\n procedure UpdateControlScrollBarCalculations; virtual;\r\n procedure UpdateControlScrollBars(AUpdate: Boolean = True; ACalculate: Boolean = True);\r\n procedure UpdateControl({%H-}AUpdate: Boolean = True; {%H-}ARealign: Boolean = True); virtual;\r\n procedure UpdateControlCache; virtual;\r\n procedure UpdateControlDisplay; virtual;\r\n procedure StopAnimationTimer; virtual;\r\n procedure SetHScrollValue(AValue: Single); virtual;\r\n procedure SetVScrollValue(AValue: Single); virtual;\r\n procedure Loaded; override;\r\n procedure Draw({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); override;\r\n procedure DrawContent({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n procedure UpdateScrollingMode(AMode: TTMSFNCCustomScrollControlMode); virtual;\r\n function GetTotalContentWidth: Double; virtual;\r\n function GetTotalContentHeight: Double; virtual;\r\n function GetHorizontalContentViewPortSize: Double; virtual;\r\n function GetVerticalContentViewPortSize: Double; virtual;\r\n function GetHorizontalContentCount: Integer; virtual;\r\n function GetVerticalContentCount: Integer; virtual;\r\n function GetCalculationRect: TRectF; virtual;\r\n function GetContentClipRect: TRectF; virtual;\r\n function GetContentRect: TRectF; override;\r\n function GetHScrollValue: Single; virtual;\r\n function GetVScrollValue: Single; virtual;\r\n function GetVViewPortSize: Single; virtual;\r\n function GetHViewPortSize: Single; virtual;\r\n function GetVMax: Single; virtual;\r\n function GetHMax: Single; virtual;\r\n function GetHVisible: Boolean; virtual;\r\n function GetVVisible: Boolean; virtual;\r\n property HorizontalScrollBarVisible: Boolean read FHorizontalScrollBarVisible write SetHorizontalScrollBarVisible default True;\r\n property VerticalScrollBarVisible: Boolean read FVerticalScrollBarVisible write SetVerticalScrollBarVisible default True;\r\n property UpdateCount: Integer read FUpdateCount write FUpdateCount;\r\n property IsMouseDown: Boolean read FIsMouseDown write FIsMouseDown;\r\n property StretchScrollBars: Boolean read FStretchScrollBars write SetStretchScrollBars default True;\r\n property ScrollMode: TTMSFNCCustomScrollControlMode read FScrollMode write SetScrollMode default scmPixelScrolling;\r\n property ScrollUpdate: TTMSFNCCustomScrollControlUpdate read FScrollUpdate write SetScrollUpdate default scuContinuous;\r\n property CustomScrollBars: Boolean read FCustomScrollBars write SetCustomScrollBars default False;\r\n property Version: string read GetVersion;\r\n property ApplyClipRect: Boolean read FApplyClipRect write SetApplyClipRect default True;\r\n property TouchScrolling: Boolean read FTouchScrolling write FTouchScrolling default False;\r\n property ProcessTouchScrolling: Boolean read FProcessTouchScrolling write FProcessTouchScrolling default False;\r\n property Animating: Boolean read FAnimating;\r\n property IsScrolling: Boolean read FScrolling;\r\n property IsRangeSelection: Boolean read FRangeSelection;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n procedure SaveScrollPosition; virtual;\r\n procedure RestoreScrollPosition; virtual;\r\n function GetVerticalScrollPosition: Double; virtual;\r\n function GetHorizontalScrollPosition: Double; virtual;\r\n function GetHorizontalScrollMax: Double; virtual;\r\n function GetVerticalScrollMax: Double; virtual;\r\n function HorizontalScrollBar: TScrollBar;\r\n function VerticalScrollBar: TScrollBar;\r\n function CustomHorizontalScrollBar: TTMSFNCScrollBar;\r\n function CustomVerticalScrollBar: TTMSFNCScrollBar;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n {$IFNDEF WEBLIB}\r\n WEBLib.Controls,\r\n {$ENDIF}\r\n WEBLib.Forms, Math,\r\n WEBLib.TMSFNCGraphicsTypes, SysUtils;\r\n\r\nfunction GetTickCountX: DWORD;\r\nvar\r\n h, m, s, ms: Word;\r\nbegin\r\n DecodeTime(Now, h, m, s, ms);\r\n Result := ms + s * 1000 + m * 60 * 1000 + h * 60 * 60 * 1000;\r\nend;\r\n\r\nfunction AnimateDouble(var Start, Stop: Double; Delta, Margin: Double): Boolean;\r\nbegin\r\n Result := true;\r\n if (Start > Stop - Margin) and (Start < Stop + Margin) then\r\n begin\r\n Start := Stop;\r\n Result := false;\r\n end\r\n else\r\n begin\r\n Delta := Max(Margin, Delta);\r\n if Start < Stop then\r\n Start := Start + Delta\r\n else\r\n Start := Start - Delta;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCCustomScrollControl }\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCCustomScrollControl.GetCanvasHeightOffset: Integer;\r\nvar\r\n hs: TScrollBar;\r\n hsc: TTMSFNCScrollBar;\r\nbegin\r\n Result := 0;\r\n hs := HorizontalScrollBar;\r\n hsc := CustomHorizontalScrollBar;\r\n if Assigned(hs) and Assigned(hsc) then\r\n begin\r\n if CustomScrollBars and hsc.Visible and Assigned(hsc.Parent) then\r\n Result := hsc.Height\r\n else if not CustomScrollBars and hs.Visible and Assigned(hs.Parent) then\r\n Result := hs.Height;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetCanvasWidthOffset: Integer;\r\nvar\r\n vs: TScrollBar;\r\n vsc: TTMSFNCScrollBar;\r\nbegin\r\n Result := 0;\r\n vs := VerticalScrollBar;\r\n vsc := CustomVerticalScrollBar;\r\n if Assigned(vs) and Assigned(vsc) then\r\n begin\r\n if CustomScrollBars and vsc.Visible and Assigned(vsc.Parent) then\r\n Result := vsc.Width\r\n else if not CustomScrollBars and vs.Visible and Assigned(vs.Parent) then\r\n Result := vs.Width;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVersion: string;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.Animate(Sender: TObject);\r\nvar\r\n dx, dy, posx, posy: Double;\r\n animh, animv: Boolean;\r\nbegin\r\n posy := GetVScrollValue;\r\n posx := GetHScrollValue;\r\n dx := Abs(FScrollHTo - posx) / Max(1, Abs(FSpX) * 6);\r\n dy := Abs(FScrollVTo - posy) / Max(1, Abs(FSpY) * 6);\r\n animv := False;\r\n if FAnimateVerticalPos then\r\n animv := AnimateDouble(posy, FScrollVTo, dy, 0.01);\r\n\r\n animh := False;\r\n if FAnimateHorizontalPos then\r\n animh := AnimateDouble(posx, FScrollHTo, dx, 0.01);\r\n\r\n FAnimating := animv or animh;\r\n if FAnimating then\r\n Scroll(posx, posy)\r\n else\r\n begin\r\n FAnimateVerticalPos := False;\r\n FAnimateTimer.Enabled := False;\r\n FAnimateHorizontalPos := False;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCCustomScrollControl then\r\n begin\r\n FStretchScrollBars := (Source as TTMSFNCCustomScrollControl).StretchScrollBars;\r\n FScrollMode := (Source as TTMSFNCCustomScrollControl).ScrollMode;\r\n FScrollUpdate := (Source as TTMSFNCCustomScrollControl).ScrollUpdate;\r\n FApplyClipRect := (Source as TTMSFNCCustomScrollControl).ApplyClipRect;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.RestoreScrollPosition;\r\nbegin\r\n Scroll(FSaveHScrollPos, FSaveVScrollPos);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SaveScrollPosition;\r\nbegin\r\n FSaveHScrollPos := GetHScrollValue;\r\n FSaveVScrollPos := GetVScrollValue;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.BeginUpdate;\r\nbegin\r\n inherited BeginUpdate;\r\n Inc(FUpdateCount);\r\nend;\r\n\r\nconstructor TTMSFNCCustomScrollControl.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FTouchScrolling := False;\r\n FProcessTouchScrolling := False;\r\n\r\n FAnimateTimer := TTimer.Create(Self);\r\n FAnimateTimer.Interval := 1;\r\n FAnimateTimer.Enabled := False;\r\n FAnimateTimer.OnTimer := Animate;\r\n\r\n FDownTimer := TTimer.Create(Self);\r\n FDownTimer.Interval := 1;\r\n FDownTimer.Enabled := False;\r\n FDownTimer.OnTimer := DownTime;\r\n\r\n FApplyClipRect := True;\r\n FStretchScrollBars := True;\r\n FScrollMode := scmPixelScrolling;\r\n FScrollUpdate := scuContinuous;\r\n\r\n FCustomVerticalScrollBar := TTMSFNCScrollBar.Create(Self);\r\n FCustomVerticalScrollBar.Parent := Self;\r\n FCustomHorizontalScrollBar := TTMSFNCScrollBar.Create(Self);\r\n FCustomHorizontalScrollBar.Parent := Self;\r\n\r\n FVerticalScrollBar := TScrollBar.Create(Self);\r\n FVerticalScrollBar.Parent := Self;\r\n FHorizontalScrollBar := TScrollBar.Create(Self);\r\n FHorizontalScrollBar.Parent := Self;\r\n\r\n FCustomVerticalScrollBar.Appearance.ThumbButtonSize := 0;\r\n FCustomHorizontalScrollBar.Appearance.ThumbButtonSize := 0;\r\n\r\n {$IFDEF FMXLIB}\r\n FVerticalScrollBar.Stored := False;\r\n FHorizontalScrollBar.Stored := False;\r\n FCustomVerticalScrollBar.Stored := False;\r\n FCustomHorizontalScrollBar.Stored := False;\r\n FVerticalScrollBar.Orientation := TOrientation.Vertical;\r\n {$ENDIF}\r\n\r\n FCustomHorizontalScrollBar.Kind := sbkHorizontal;\r\n\r\n {$IFDEF CMNWEBLIB}\r\n FVerticalScrollBar.DoubleBuffered := False;\r\n FHorizontalScrollBar.DoubleBuffered := False;\r\n FVerticalScrollBar.Kind := sbVertical;\r\n {$ENDIF}\r\n\r\n FVerticalScrollBar.Visible := True;\r\n FHorizontalScrollBar.Visible := True;\r\n FCustomVerticalScrollBar.Visible := False;\r\n FCustomHorizontalScrollBar.Visible := False;\r\n FVerticalScrollBar.OnChange := @VScrollChanged;\r\n FHorizontalScrollBar.OnChange := @HScrollChanged;\r\n FCustomHorizontalScrollBar.OnValueChanged := HCustomScrollChanged;\r\n FCustomVerticalScrollBar.OnValueChanged := VCustomScrollChanged;\r\n\r\n FVerticalScrollBarVisible := True;\r\n FHorizontalScrollBarVisible := True;\r\nend;\r\n\r\ndestructor TTMSFNCCustomScrollControl.Destroy;\r\nbegin\r\n FCustomVerticalScrollBar.Free;\r\n FCustomHorizontalScrollBar.Free;\r\n FVerticalScrollBar.Free;\r\n FHorizontalScrollBar.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.DownTime(Sender: TObject);\r\nbegin\r\n Inc(FDownTime);\r\n if (FDownTime = DOWNCOUNT) or not TouchScrolling then\r\n begin\r\n FRangeSelection := True;\r\n FDownTimer.Enabled := False;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetContentRect: TRectF;\r\nbegin\r\n Result := inherited GetContentRect;\r\n if CustomScrollBars then\r\n begin\r\n if CustomHorizontalScrollBar.Visible then\r\n Result.Bottom := Result.Bottom - CustomHorizontalScrollBar.Height - 1;\r\n\r\n if CustomVerticalScrollBar.Visible then\r\n Result.Right := Result.Right - CustomVerticalScrollBar.Width - 1;\r\n end\r\n else\r\n begin\r\n if HorizontalScrollBar.Visible then\r\n Result.Bottom := Result.Bottom - HorizontalScrollBar.Height - 1;\r\n\r\n if VerticalScrollBar.Visible then\r\n Result.Right := Result.Right - VerticalScrollBar.Width - 1;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetContentClipRect: TRectF;\r\nbegin\r\n Result := GetContentRect;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHorizontalScrollMax: Double;\r\nbegin\r\n Result := GetHMax;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVerticalScrollMax: Double;\r\nbegin\r\n Result := GetVMax;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHorizontalScrollPosition: Double;\r\nvar\r\n hVal: Double;\r\nbegin\r\n hVal := GetHScrollValue;\r\n Result := hVal;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHScrollValue: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomHorizontalScrollBar.Value\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := Min(HorizontalScrollBar.Max - HorizontalScrollBar.ViewportSize, Max(0, HorizontalScrollBar.Value));\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLLIB}\r\n Result := Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(HorizontalScrollBar.Position)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n Result := {%H-}Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(HorizontalScrollBar.Position)));\r\n {$ELSE}\r\n case ScrollMode of\r\n scmPixelScrolling: Result := {%H-}Min(HorizontalScrollBar.Max, Max(0, Round(HorizontalScrollBar.Position - HorizontalScrollBar.Position * (HorizontalScrollBar.PageSize / HorizontalScrollBar.Max))));\r\n scmItemScrolling: Result := {%H-}Min(HorizontalScrollBar.Max, Max(0, Round(HorizontalScrollBar.Position)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHMax: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomHorizontalScrollBar.Max\r\n else\r\n Result := HorizontalScrollBar.Max;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVMax: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomVerticalScrollBar.Max\r\n else\r\n Result := VerticalScrollBar.Max\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHViewPortSize: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomHorizontalScrollBar.PageSize\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := HorizontalScrollBar.ViewportSize;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := HorizontalScrollBar.PageSize;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHVisible: Boolean;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomHorizontalScrollBar.Visible\r\n else\r\n Result := HorizontalScrollBar.Visible;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVerticalScrollPosition: Double;\r\nvar\r\n vVal: Double;\r\nbegin\r\n vVal := GetVScrollValue;\r\n Result := vVal;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVViewPortSize: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomVerticalScrollBar.PageSize\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := VerticalScrollBar.ViewportSize;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := VerticalScrollBar.PageSize;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVVisible: Boolean;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomVerticalScrollBar.Visible\r\n else\r\n Result := VerticalScrollBar.Visible;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVScrollValue: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomVerticalScrollBar.Value\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := Min(VerticalScrollBar.Max - VerticalScrollBar.ViewportSize, Max(0, VerticalScrollBar.Value));\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLLIB}\r\n Result := Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(VerticalScrollBar.Position)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n Result := {%H-}Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(VerticalScrollBar.Position)));\r\n {$ELSE}\r\n case ScrollMode of\r\n scmPixelScrolling: Result := {%H-}Min(VerticalScrollBar.Max, Max(0, Round(VerticalScrollBar.Position - VerticalScrollBar.Position * (VerticalScrollBar.PageSize / VerticalScrollBar.Max))));\r\n scmItemScrolling: Result := {%H-}Min(VerticalScrollBar.Max, Max(0, Round(VerticalScrollBar.Position)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n\r\n CaptureEx;\r\n\r\n if not ProcessTouchScrolling then\r\n Exit;\r\n\r\n IsMouseDown := True;\r\n FTimeStart := GetTickCountX;\r\n FTimeStop := FTimeStart;\r\n FScrollVTo := GetVScrollValue;\r\n FScrollHTo := GetHScrollValue;\r\n FScrollX := X;\r\n FScrollY := Y;\r\n FDownX := X;\r\n FDownY := Y;\r\n FMouseX := X;\r\n FMouseY := Y;\r\n FMouseUp := False;\r\n FDownTimer.Enabled := True;\r\n FDoubleSelection := not FAnimateTimer.Enabled;\r\n FRangeSelection := False;\r\n FScrolling := False;\r\n FDownTime := 0;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.HandleMouseMove(Shift: TShiftState; X,\r\n Y: Single);\r\nvar\r\n f: Double;\r\n doscroll: Boolean;\r\nbegin\r\n inherited;\r\n if not ProcessTouchScrolling then\r\n Exit;\r\n\r\n if IsMouseDown then\r\n begin\r\n doscroll := True;\r\n if doscroll then\r\n begin\r\n f := 1;\r\n if (FScrolling or (Abs(FMouseX - X) > 3) or (Abs(FMouseY - Y) > 3)) and not FRangeSelection and TouchScrolling then\r\n begin\r\n if (Abs(X - FDownX) > SCROLLINGDELAY) or (Abs(Y - FDownY) > SCROLLINGDELAY) then\r\n begin\r\n FScrolling := True;\r\n FDownTimer.Enabled := False;\r\n FDoubleSelection := False;\r\n if IsMouseDown and not FMouseUp then\r\n begin\r\n Scroll(GetHScrollValue - (X - FDownX) * f, GetVScrollValue - (Y - FDownY) * f);\r\n FDownY := Y;\r\n FDownX := X;\r\n end;\r\n end;\r\n end;\r\n end\r\n else if FRangeSelection then\r\n begin\r\n\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.HandleMouseUp(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nvar\r\n f: Double;\r\nbegin\r\n inherited;\r\n\r\n ReleaseCaptureEx;\r\n\r\n\r\n if not ProcessTouchScrolling then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n Exit;\r\n\r\n f := 1;\r\n\r\n IsMouseDown := False;\r\n FMouseUp := True;\r\n FScrolling := False;\r\n FDownTimer.Enabled := False;\r\n\r\n if not FDoubleSelection and TouchScrolling then\r\n begin\r\n FTimeStop := GetTickCountX;\r\n if ((FTimeStop - FTimeStart) < SWIPECOUNT) and ((FTimeStop - FTimeStart) > 0) then\r\n begin\r\n FSpY := Abs(Y - FScrollY) / (FTimeStop - FTimeStart);\r\n if (FSpY > 0) then\r\n begin\r\n if (Y - FScrollY) > 0 then\r\n FScrollVTo := Max(0, Min(VerticalScrollBar.Max - GetVViewPortSize, FScrollVTo - Round(Abs(Y - FScrollY) * FSpY * f * 3)))\r\n else\r\n FScrollVTo := Max(0, Min(VerticalScrollBar.Max - GetVViewPortSize, FScrollVTo + Round(Abs(Y - FScrollY) * FSpY * f * 3)));\r\n\r\n FAnimateVerticalPos := True;\r\n FAnimateTimer.Enabled := True;\r\n end;\r\n\r\n FSpX := Abs(X - FScrollX) / (FTimeStop - FTimeStart);\r\n if (FSpX > 0) then\r\n begin\r\n if (X - FScrollX) > 0 then\r\n FScrollHTo := Max(0, Min(HorizontalScrollBar.Max - GetHViewPortSize, FScrollHTo - Round(Abs(X - FScrollX) * FSpX * f * 3)))\r\n else\r\n FScrollHTo := Max(0, Min(HorizontalScrollBar.Max - GetHViewPortSize, FScrollHTo + Round(Abs(X - FScrollX) * FSpX * f * 3)));\r\n\r\n FAnimateHorizontalPos := True;\r\n FAnimateTimer.Enabled := True;\r\n end;\r\n end;\r\n end;\r\n\r\n FRangeSelection := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.HCustomScrollChanged(Sender: TObject;\r\n AValue: Double);\r\nbegin\r\n if FBlockScrollingUpdate or not CustomScrollBars then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n HorizontalScrollPositionChanged;\r\n SetHScrollValue(GetHScrollValue);\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.HorizontalScrollBar: TScrollBar;\r\nbegin\r\n Result := FHorizontalScrollBar;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.CustomHorizontalScrollBar: TTMSFNCScrollBar;\r\nbegin\r\n Result := FCustomHorizontalScrollBar;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateControl(AUpdate: Boolean = True; ARealign: Boolean = True);\r\nbegin\r\n UpdateControlCache;\r\n UpdateControlScrollBars;\r\n UpdateControlDisplay;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateControlAfterResize;\r\nbegin\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) or (csLoading in ComponentState) then\r\n Exit;\r\n\r\n SaveScrollPosition;\r\n UpdateControl(False);\r\n RestoreScrollPosition;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateControlScroll(AHorizontalPos: Double; AVerticalPos: Double; ANewHorizontalPos: Double; ANewVerticalPos: Double);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.VCustomScrollChanged(Sender: TObject;\r\n AValue: Double);\r\nbegin\r\n if FBlockScrollingUpdate or not CustomScrollBars then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n VerticalScrollPositionChanged;\r\n SetVScrollValue(GetVScrollValue);\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.VerticalScrollBar: TScrollBar;\r\nbegin\r\n Result := FVerticalScrollBar;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.CustomVerticalScrollBar: TTMSFNCScrollBar;\r\nbegin\r\n Result := FCustomVerticalScrollBar;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.VerticalScrollPositionChanged;\r\nbegin\r\n\r\nend;\r\n\r\n\r\nprocedure TTMSFNCCustomScrollControl.HorizontalScrollPositionChanged;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.HScrollChanged(Sender: TObject);\r\nbegin\r\n if FBlockScrollingUpdate or CustomScrollBars then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n HorizontalScrollPositionChanged;\r\n SetHScrollValue(GetHScrollValue);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.VScrollChanged(Sender: TObject);\r\nbegin\r\n if FBlockScrollingUpdate or CustomScrollBars then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n VerticalScrollPositionChanged;\r\n SetVScrollValue(GetVScrollValue);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateControlCache;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetApplyClipRect(const Value: Boolean);\r\nbegin\r\n if FApplyClipRect <> Value then\r\n begin\r\n FApplyClipRect := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetCustomScrollBars(const Value: Boolean);\r\nbegin\r\n if FCustomScrollBars <> Value then\r\n begin\r\n FCustomScrollBars := Value;\r\n UpdateControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.FillChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.StrokeChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateControlDisplay;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateControlScrollBarCalculations;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.StopAnimationTimer;\r\nbegin\r\n FAnimateTimer.Enabled := False;\r\n FAnimating := False;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetTotalContentWidth: Double;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetTotalContentHeight: Double;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHorizontalContentViewPortSize: Double;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVerticalContentViewPortSize: Double;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetHorizontalContentCount: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetVerticalContentCount: Integer;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomScrollControl.GetCalculationRect: TRectF;\r\nbegin\r\n Result := LocalRect;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.EndUpdate;\r\nbegin\r\n inherited;\r\n Dec(FUpdateCount);\r\n if FUpdateCount = 0 then\r\n UpdateControl;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.Loaded;\r\nbegin\r\n inherited;\r\n UpdateControl;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.Scroll(AHorizontalPos, AVerticalPos: Double);\r\nvar\r\n AOldHorizontalPos, AOldVerticalPos: Double;\r\nbegin\r\n FBlockScrollingUpdate := True;\r\n AOldHorizontalPos := GetHScrollValue;\r\n AOldVerticalPos := GetVScrollValue;\r\n SetHScrollValue(AHorizontalPos);\r\n SetVScrollValue(AVerticalPos);\r\n FBlockScrollingUpdate := False;\r\n UpdateControlScroll(AOldHorizontalPos, AOldVerticalPos, AHorizontalPos, AVerticalPos);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetHorizontalScrollBarVisible(\r\n const Value: Boolean);\r\nbegin\r\n if FHorizontalScrollBarVisible <> Value then\r\n begin\r\n FHorizontalScrollBarVisible := Value;\r\n UpdateControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetHScrollValue(AValue: Single);\r\nbegin\r\n if CustomScrollBars then\r\n CustomHorizontalScrollBar.Value := AValue\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n HorizontalScrollBar.Value := Min(HorizontalScrollBar.Max - HorizontalScrollBar.ViewportSize, Max(0, AValue));\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n HorizontalScrollBar.Position := Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n HorizontalScrollBar.Position := Round(Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, AValue)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n HorizontalScrollBar.Position := {%H-}Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ELSE}\r\n case ScrollMode of\r\n scmPixelScrolling: HorizontalScrollBar.Position := {%H-}Min(HorizontalScrollBar.Max, Max(0, Round(AValue + AValue * (HorizontalScrollBar.PageSize / (HorizontalScrollBar.Max - HorizontalScrollBar.PageSize)))));\r\n scmItemScrolling: HorizontalScrollBar.Position := {%H-}Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(AValue)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetScrollMode(\r\n const Value: TTMSFNCCustomScrollControlMode);\r\nbegin\r\n if FScrollMode <> Value then\r\n begin\r\n FScrollMode := Value;\r\n UpdateControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetScrollUpdate(\r\n const Value: TTMSFNCCustomScrollControlUpdate);\r\nbegin\r\n if FScrollUpdate <> Value then\r\n begin\r\n FScrollUpdate := Value;\r\n if Assigned(FCustomVerticalScrollBar) then\r\n FCustomVerticalScrollBar.Tracking := ScrollUpdate = scuContinuous;\r\n\r\n if Assigned(FCustomHorizontalScrollBar) then\r\n FCustomHorizontalScrollBar.Tracking := ScrollUpdate = scuContinuous;\r\n\r\n UpdateControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetStretchScrollBars(const Value: Boolean);\r\nbegin\r\n if FStretchScrollBars <> Value then\r\n begin\r\n FStretchScrollBars := Value;\r\n UpdateControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetVerticalScrollBarVisible(\r\n const Value: Boolean);\r\nbegin\r\n if FVerticalScrollBarVisible <> Value then\r\n begin\r\n FVerticalScrollBarVisible := Value;\r\n UpdateControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.SetVScrollValue(AValue: Single);\r\nbegin\r\n if CustomScrollBars then\r\n CustomVerticalScrollBar.Value := AValue\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n VerticalScrollBar.Value := Min(VerticalScrollBar.Max - VerticalScrollBar.ViewportSize, Max(0, AValue));\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n VerticalScrollBar.Position := Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n VerticalScrollBar.Position := Round(Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, AValue)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n VerticalScrollBar.Position := {%H-}Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ELSE}\r\n case ScrollMode of\r\n scmPixelScrolling: VerticalScrollBar.Position := {%H-}Min(VerticalScrollBar.Max, Max(0, Round(AValue + AValue * (VerticalScrollBar.PageSize / (VerticalScrollBar.Max - VerticalScrollBar.PageSize)))));\r\n scmItemScrolling: VerticalScrollBar.Position := {%H-}Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(AValue)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateControlScrollBars(AUpdate: Boolean = True; ACalculate: Boolean = True);\r\nvar\r\n vs, hs: TScrollBar;\r\n vsc, hsc: TTMSFNCScrollBar;\r\n w, h: Double;\r\n cw, ch: Double;\r\n cr: TRectF;\r\n vmgr: TTMSFNCMargins;\r\n hmgr: TTMSFNCMargins;\r\nbegin\r\n if {$IFDEF FMXLIB} FBlockScrollingUpdate or {$ENDIF} (UpdateCount > 0) or (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n FBlockScrollingUpdate := True;\r\n\r\n if ACalculate then\r\n begin\r\n UpdateControlScrollBarCalculations;\r\n end;\r\n\r\n vs := VerticalScrollBar;\r\n hs := HorizontalScrollBar;\r\n vsc := CustomVerticalScrollBar;\r\n hsc := CustomHorizontalScrollBar;\r\n if Assigned(vs) and Assigned(hs) and Assigned(vsc) and Assigned(hsc) then\r\n begin\r\n if ACalculate then\r\n cr := GetCalculationRect\r\n else\r\n cr := GetContentRect;\r\n\r\n cw := cr.Right - cr.Left;\r\n ch := cr.Bottom - cr.Top;\r\n w := GetTotalContentWidth;\r\n h := GetTotalContentHeight;\r\n\r\n hs.Visible := (w > 0) and (CompareValueEx(w, cw) = 1) and HorizontalScrollBarVisible and not ColumnStretchingActive and not CustomScrollBars;\r\n vs.Visible := (h > 0) and (CompareValueEx(h, ch) = 1) and VerticalScrollBarVisible and not CustomScrollBars;\r\n hsc.Visible := (w > 0) and (CompareValueEx(w, cw) = 1) and HorizontalScrollBarVisible and not ColumnStretchingActive and CustomScrollBars;\r\n vsc.Visible := (h > 0) and (CompareValueEx(h, ch) = 1) and VerticalScrollBarVisible and CustomScrollBars;\r\n\r\n {$IFDEF CMNWEBLIB}\r\n if vsc.Visible and CustomScrollBars then\r\n vsc.Parent := Self\r\n else\r\n vsc.Parent := nil;\r\n\r\n if hsc.Visible and CustomScrollBars then\r\n hsc.Parent := Self\r\n else\r\n hsc.Parent := nil;\r\n\r\n if vs.Visible and not CustomScrollBars then\r\n vs.Parent := Self\r\n else\r\n vs.Parent := nil;\r\n\r\n if hs.Visible and not CustomScrollBars then\r\n hs.Parent := Self\r\n else\r\n hs.Parent := nil;\r\n {$ENDIF}\r\n\r\n vmgr := TTMSFNCMargins.Create;\r\n hmgr := TTMSFNCMargins.Create;\r\n\r\n if CustomScrollBars then\r\n begin\r\n if vsc.Visible and StretchScrollBars then\r\n hmgr.Right := vsc.Width + 1\r\n else\r\n hmgr.Right := 1;\r\n end\r\n else\r\n begin\r\n if vs.Visible and StretchScrollBars then\r\n hmgr.Right := vs.Width + 1\r\n else\r\n hmgr.Right := 1;\r\n end;\r\n\r\n vmgr.Top := 1;\r\n vmgr.Right := 1;\r\n hmgr.Bottom := 1;\r\n hmgr.Left := 1;\r\n\r\n if CustomScrollBars then\r\n begin\r\n if hsc.Visible then\r\n vmgr.Bottom := hsc.Height + 1\r\n else\r\n vmgr.Bottom := 1;\r\n end\r\n else\r\n begin\r\n if hs.Visible then\r\n vmgr.Bottom := hs.Height + 1\r\n else\r\n vmgr.Bottom := 1;\r\n end;\r\n\r\n if not StretchScrollBars then\r\n begin\r\n cr := GetCalculationRect;\r\n hmgr.Left := hmgr.Left + cr.Left;\r\n hmgr.Right := hmgr.Right + (Width - cr.Right);\r\n vmgr.Top := vmgr.Top + cr.Top;\r\n vmgr.Bottom := vmgr.Bottom + (Height - cr.Bottom);\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n hs.Position.X := hmgr.Left;\r\n hs.Position.Y := Height - hmgr.Bottom - hs.Height;\r\n vs.Position.X := Width - vmgr.Right - vs.Width;\r\n vs.Position.Y := vmgr.Top;\r\n hs.Width := Width - hmgr.Right - hmgr.Left;\r\n vs.Height := Height - vmgr.Bottom - vmgr.Top;\r\n hsc.Position.X := hmgr.Left;\r\n hsc.Position.Y := Height - hmgr.Bottom - hsc.Height;\r\n vsc.Position.X := Width - vmgr.Right - vsc.Width;\r\n vsc.Position.Y := vmgr.Top;\r\n hsc.Width := Width - hmgr.Right - hmgr.Left;\r\n vsc.Height := Height - vmgr.Bottom - vmgr.Top;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n hs.Left := Round(hmgr.Left);\r\n hs.Top := Round(Height - hmgr.Bottom - hs.Height);\r\n vs.Left := Round(Width - vmgr.Right - vs.Width);\r\n vs.Top := Round(vmgr.Top);\r\n hs.Width := Round(Max(0, Width - hmgr.Right - hmgr.Left));\r\n {$IFDEF MSWINDOWS}\r\n vs.Width := GetSystemMetrics(SM_CYVSCROLL);\r\n hs.Height := GetSystemMetrics(SM_CYHSCROLL);\r\n {$ENDIF}\r\n vs.Height := Round(Max(0, Height - vmgr.Bottom - vmgr.Top));\r\n hsc.Left := Round(hmgr.Left);\r\n hsc.Top := Round(Height - hmgr.Bottom - hsc.Height);\r\n vsc.Left := Round(Width - vmgr.Right - vsc.Width);\r\n vsc.Top := Round(vmgr.Top);\r\n hsc.Width := Round(Max(0, Width - hmgr.Right - hmgr.Left));\r\n vsc.Height := Round(Max(0, Height - vmgr.Bottom - vmgr.Top));\r\n {$ENDIF}\r\n\r\n hmgr.Free;\r\n vmgr.Free;\r\n\r\n cr := GetContentRect;\r\n cw := cr.Right - cr.Left;\r\n ch := cr.Bottom - cr.Top;\r\n\r\n {$IFDEF FMXLIB}\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n vs.ViewportSize := GetVerticalContentViewPortSize;\r\n vs.Max := GetVerticalContentCount;\r\n end\r\n else\r\n begin\r\n vs.ViewPortSize := Min(h, ch);\r\n vs.Max := h;\r\n vs.Value := Min(vs.Value, vs.Max - vs.ViewportSize);\r\n end;\r\n\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n hs.ViewportSize := GetHorizontalContentViewPortSize;\r\n hs.Max := GetHorizontalContentCount;\r\n end\r\n else\r\n begin\r\n hs.ViewPortSize := Min(w, cw);\r\n hs.Max := w;\r\n hs.Value := Min(hs.Value, hs.Max - hs.ViewportSize);\r\n end;\r\n\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n vsc.PageSize := GetVerticalContentViewPortSize;\r\n vsc.Max := GetVerticalContentCount - vsc.PageSize;\r\n end\r\n else\r\n begin\r\n vsc.PageSize := Min(h, ch);\r\n vsc.Max := h - ch;\r\n end;\r\n\r\n vsc.SmallChange := vsc.PageSize / 5;\r\n vsc.LargeChange := vsc.PageSize;\r\n\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n hsc.PageSize := GetHorizontalContentViewPortSize;\r\n hsc.Max := GetHorizontalContentCount - hsc.PageSize;\r\n end\r\n else\r\n begin\r\n hsc.PageSize := Min(w, cw);\r\n hsc.Max := w - cw;\r\n end;\r\n\r\n hsc.SmallChange := hsc.PageSize / 5;\r\n hsc.LargeChange := hsc.PageSize;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n vs.PageSize := Round(Max(0, GetVerticalContentViewPortSize));\r\n vs.Max := Max(vs.PageSize, GetVerticalContentCount);\r\n end\r\n else\r\n begin\r\n vs.PageSize := Round(Max(0, Min(h, ch)));\r\n vs.Max := Round(Max(vs.PageSize, h));\r\n vs.Position := Min(vs.Position, vs.Max);\r\n end;\r\n\r\n vs.SmallChange := vs.PageSize div 5;\r\n vs.LargeChange := vs.PageSize;\r\n\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n hs.PageSize := Round(Max(0, GetHorizontalContentViewPortSize));\r\n hs.Max := Max(hs.PageSize, GetHorizontalContentCount);\r\n end\r\n else\r\n begin\r\n hs.PageSize := Round(Max(0, Min(w, cw)));\r\n hs.Max := Round(Max(hs.PageSize, w));\r\n hs.Position := Min(hs.Position, hs.Max);\r\n end;\r\n\r\n hs.SmallChange := hs.PageSize div 5;\r\n hs.LargeChange := hs.PageSize;\r\n\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n vsc.PageSize := Max(0, Round(GetVerticalContentViewPortSize));\r\n vsc.Max := GetVerticalContentCount - vsc.PageSize;\r\n end\r\n else\r\n begin\r\n vsc.PageSize := Round(Max(0, Min(h, ch)));\r\n vsc.Max := Round(h - ch);\r\n end;\r\n\r\n vsc.SmallChange := vsc.PageSize / 5;\r\n vsc.LargeChange := vsc.PageSize;\r\n\r\n if ScrollMode = scmItemScrolling then\r\n begin\r\n hsc.PageSize := Max(0, Round(GetHorizontalContentViewPortSize));\r\n hsc.Max := GetHorizontalContentCount - hsc.PageSize;\r\n end\r\n else\r\n begin\r\n hsc.PageSize := Round(Max(0, Min(w, cw)));\r\n hsc.Max := Round(w - cw);\r\n end;\r\n\r\n hsc.SmallChange := hsc.PageSize / 5;\r\n hsc.LargeChange := hsc.PageSize;\r\n {$ENDIF}\r\n end;\r\n\r\n FBlockScrollingUpdate := False;\r\n\r\n if AUpdate then\r\n UpdateControlScrollBars(False, False);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.UpdateScrollingMode(\r\n AMode: TTMSFNCCustomScrollControlMode);\r\nbegin\r\n FScrollMode := AMode;\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n st: TTMSFNCGraphicsSaveState;\r\n cr: TRectF;\r\nbegin\r\n inherited;\r\n cr := GetContentClipRect;\r\n st := nil;\r\n if ApplyClipRect then\r\n begin\r\n st := AGraphics.SaveState;\r\n AGraphics.ClipRect(cr);\r\n end;\r\n\r\n DrawContent(AGraphics, cr);\r\n\r\n if ApplyClipRect then\r\n AGraphics.RestoreState(st);\r\nend;\r\n\r\nprocedure TTMSFNCCustomScrollControl.DrawContent(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCTreeViewBase;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n Windows,\r\n {$ENDIF}\r\n Classes, WEBLib.TMSFNCCustomControl, WEBLib.TMSFNCScrollBar, WEBLib.StdCtrls,\r\n WEBLib.Controls, WEBLib.TMSFNCTypes\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,UITypes, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n {$IFDEF LCLLIB}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 15;\r\n {$ELSE}\r\n {$IFDEF MSWINDOWS}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 15;\r\n {$ENDIF}\r\n {$IFDEF MACOS}\r\n {$IFDEF IOS}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 200;\r\n {$ELSE}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 200;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF ANDROID}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 100;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n {$IFDEF LINUX}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 100;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n SWIPECOUNT = 300;\r\n DOWNCOUNT = 100;\r\n {$ENDIF}\r\n\r\ntype\r\n TTMSFNCTreeViewBase = class;\r\n\r\n TTMSFNCTreeViewDoubleListItem = class(TCollectionItem)\r\n private\r\n FOwner: TTMSFNCTreeViewBase;\r\n FValue: Double;\r\n FCellVal: Integer;\r\n procedure SetCellData(const Value: Double);\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n published\r\n property Value: Double read FValue write SeTCellData;\r\n property CellVal: Integer read FCellVal write FCellVal;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewDoubleList = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewDoubleList = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FOwner: TTMSFNCTreeViewBase;\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: Integer): TTMSFNCTreeViewDoubleListItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewDoubleListItem);\r\n protected\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n public\r\n function IndexOf(ACellVal: Integer): Integer;\r\n constructor Create(AOwner: TTMSFNCTreeViewBase);\r\n property Items[Index: Integer]: TTMSFNCTreeViewDoubleListItem read GetItem write SetItem; default;\r\n function Add: TTMSFNCTreeViewDoubleListItem;\r\n function Insert(Index: Integer): TTMSFNCTreeViewDoubleListItem;\r\n end;\r\n\r\n TTMSFNCTreeViewScrollMode = (smPixelScrolling, smNodeScrolling);\r\n TTMSFNCTreeViewScrollUpdate = (suContinuous, suOnce);\r\n\r\n TTMSFNCTreeViewBase = class(TTMSFNCCustomControl)\r\n private\r\n FSaveHScrollPos, FSaveVScrollPos: Single;\r\n FTotalRowHeight: Double;\r\n FNodeListBuild: Boolean;\r\n FTotalColumnWidth: Double;\r\n FStartOffset: Double;\r\n FStartCol, FStopCol, FStartRow, FStopRow: Integer;\r\n FStartX, FStopX, FStartY, FStopY: Double;\r\n FBlockScrollingUpdate: Boolean;\r\n FUpdateCount: Integer;\r\n FVerticalScrollBar, FHorizontalScrollBar: TScrollBar;\r\n FCustomVerticalScrollBar, FCustomHorizontalScrollBar: TTMSFNCScrollBar;\r\n FRowCount: Integer;\r\n FColumnCount: Integer;\r\n FColumnW, FColumnP: TTMSFNCTreeViewDoubleList;\r\n FDefaultRowHeight: Double;\r\n FDefaultColumnWidth: Double;\r\n FVerticalScrollBarVisible: Boolean;\r\n FHorizontalScrollBarVisible: Boolean;\r\n FScrollMode: TTMSFNCTreeViewScrollMode;\r\n FIsMouseDown: Boolean;\r\n FDelayedLoading: Boolean;\r\n FStretchScrollBars: Boolean;\r\n FBlockUpdateNodeList: Boolean;\r\n FBlockUpdateNode: Boolean;\r\n FBlockRemoveNode: Integer;\r\n FBlockUserInput: Boolean;\r\n FBlockMouseClick: Boolean;\r\n FCustomScrollBars: Boolean;\r\n FScrollUpdate: TTMSFNCTreeViewScrollUpdate;\r\n procedure SetColumnCount(const Value: Integer);\r\n procedure SetRowCount(const Value: Integer);\r\n procedure SetDefaultColumnWidth(const Value: Double);\r\n procedure SetDefaultRowHeight(const Value: Double);\r\n procedure SetHorizontalScrollBarVisible(const Value: Boolean);\r\n procedure SetVerticalScrollBarVisible(const Value: Boolean);\r\n procedure SetScrollMode(const Value: TTMSFNCTreeViewScrollMode);\r\n procedure SetColWidths(Col: Integer; const Value: Double);\r\n procedure SetColumnP(const Value: TTMSFNCTreeViewDoubleList);\r\n procedure SetColumnW(const Value: TTMSFNCTreeViewDoubleList);\r\n function GetColWidths(Col: integer): Double;\r\n function GetColPos(Col: integer): Double;\r\n procedure SetColPos(Col: Integer; const Value: Double);\r\n procedure SetStretchScrollBars(const Value: Boolean);\r\n procedure SetCustomScrollBars(const Value: Boolean);\r\n procedure SetScrollUpdate(const Value: TTMSFNCTreeViewScrollUpdate);\r\n protected\r\n function ColumnStretchingActive: Boolean; virtual; abstract;\r\n procedure UpdateTreeView; virtual;\r\n procedure UpdateColumns; virtual; abstract;\r\n procedure AutoSizeColumnInternal(ACol: Integer; AUpdate: Boolean = False; ACallEventHandlers: Boolean = False); virtual; abstract;\r\n procedure UpdateVisualRange; virtual;\r\n procedure StretchColumn(AStretchAll: Boolean = True; ACol: Integer = -1; ANewWidth: Double = -1); virtual;\r\n procedure StopAnimationTimer; virtual; abstract;\r\n procedure Scroll(AHorizontalPos, AVerticalPos: Double); virtual;\r\n procedure UpdateDisplay; virtual;\r\n procedure VerticalScrollPositionChanged; virtual; abstract;\r\n procedure HorizontalScrollPositionChanged; virtual; abstract;\r\n procedure VScrollChanged(Sender: TObject);\r\n procedure HScrollChanged(Sender: TObject);\r\n procedure HCustomScrollChanged(Sender: TObject; {%H-}AValue: Double);\r\n procedure VCustomScrollChanged(Sender: TObject; {%H-}AValue: Double);\r\n procedure UpdateAutoSizing; virtual; abstract;\r\n procedure UpdateColumnRowCalculations(AUpdateTotalRowHeight: Boolean = True); virtual; abstract;\r\n procedure UpdateScrollBars(AUpdate: Boolean = True; ACalculate: Boolean = True);\r\n procedure UpdateCalculations; virtual; abstract;\r\n procedure ResetNodes(AUpdateAll: Boolean = True); virtual; abstract;\r\n procedure UpdateColumnsCache; virtual; abstract;\r\n procedure UpdateGroupsCache; virtual; abstract;\r\n procedure UpdateNodesCache(AUpdateNodes: Boolean = True; AResetNodes: Boolean = False); virtual; abstract;\r\n procedure UpdateTreeViewCache; virtual;\r\n procedure UpdateTreeViewDisplay; virtual;\r\n procedure Loaded; override;\r\n procedure SetHScrollValue(AValue: Single); virtual;\r\n procedure SetVScrollValue(AValue: Single); virtual;\r\n procedure UpdateControlAfterResize; override;\r\n function CanScrollDown: Boolean; virtual;\r\n function CanScrollUp: Boolean; virtual;\r\n function ScrollLimitation: Boolean; virtual;\r\n function IsColumnVisible({%H-}ACol: Integer): Boolean; virtual;\r\n function GetRowHeight({%H-}ARow: Integer): Double; virtual;\r\n function GetCalculationRect: TRectF; virtual;\r\n function GetContentRect: TRectF; override;\r\n function GetContentClipRect: TRectF; virtual;\r\n function GetHScrollValue: Single; virtual;\r\n function GetVScrollValue: Single; virtual;\r\n function GetVViewPortSize: Single; virtual;\r\n function GetHViewPortSize: Single; virtual;\r\n function GetColumnViewPortSize: Double; virtual;\r\n function GetRowViewPortSize: Double; virtual;\r\n property TotalColumnWidth: Double read FTotalColumnWidth write FTotalColumnWidth;\r\n property TotalRowHeight: Double read FTotalRowHeight write FTotalRowHeight;\r\n property IsMouseDown: Boolean read FIsMouseDown write FIsMouseDown;\r\n property BlockUserInput: Boolean read FBlockUserInput write FBlockUserInput;\r\n property BlockMouseClick: Boolean read FBlockMouseClick write FBlockMouseClick;\r\n property DefaultRowHeight: Double read FDefaultRowHeight write SetDefaultRowHeight;\r\n property DefaultColumnWidth: Double read FDefaultColumnWidth write SetDefaultColumnWidth;\r\n property HorizontalScrollBarVisible: Boolean read FHorizontalScrollBarVisible write SetHorizontalScrollBarVisible default True;\r\n property VerticalScrollBarVisible: Boolean read FVerticalScrollBarVisible write SetVerticalScrollBarVisible default True;\r\n property RowCount: Integer read FRowCount write SetRowCount;\r\n property ColumnCount: Integer read FColumnCount write SetColumnCount;\r\n property ScrollMode: TTMSFNCTreeViewScrollMode read FScrollMode write SetScrollMode default smPixelScrolling;\r\n property ScrollUpdate: TTMSFNCTreeViewScrollUpdate read FScrollUpdate write SetScrollUpdate default suContinuous;\r\n property CustomScrollBars: Boolean read FCustomScrollBars write SetCustomScrollBars default False;\r\n property ColumnPositions[Col: Integer]: Double read GetColPos write SetColPos;\r\n property ColumnWidths[Col: Integer]: Double read GetColWidths write SetColWidths;\r\n property ColumnW: TTMSFNCTreeViewDoubleList read FColumnW write SetColumnW;\r\n property ColumnP: TTMSFNCTreeViewDoubleList read FColumnP write SetColumnP;\r\n property UpdateCount: Integer read FUpdateCount write FUpdateCount;\r\n property BlockScrollingUpdate: Boolean read FBlockScrollingUpdate write FBlockScrollingUpdate;\r\n property StretchScrollBars: Boolean read FStretchScrollBars write SetStretchScrollBars default True;\r\n property BlockUpdateNodeList: Boolean read FBlockUpdateNodeList write FBlockUpdateNodeList;\r\n property BlockUpdateNode: Boolean read FBlockUpdateNode write FBlockUpdateNode;\r\n property NodeListBuild: Boolean read FNodeListBuild write FNodeListBuild;\r\n property BlockRemoveNode: Integer read FBlockRemoveNode write FBlockRemoveNode;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure Resize; override;\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n procedure SaveScrollPosition; virtual;\r\n procedure RestoreScrollPosition; virtual;\r\n procedure AutoSizeColumn(ACol: Integer); virtual;\r\n function GetVerticalScrollPosition: Double; virtual;\r\n function GetHorizontalScrollPosition: Double; virtual;\r\n function HorizontalScrollBar: TScrollBar;\r\n function VerticalScrollBar: TScrollBar;\r\n function CustomHorizontalScrollBar: TTMSFNCScrollBar;\r\n function CustomVerticalScrollBar: TTMSFNCScrollBar;\r\n function StartCol: Integer;\r\n function StopCol: Integer;\r\n function StartX: Double;\r\n function StopX: Double;\r\n function StartRow: Integer;\r\n function StartOffset: Double;\r\n function StopRow: Integer;\r\n function StartY: Double;\r\n function StopY: Double;\r\n function GetColumnWidth(AColumn: Integer): Double; virtual;\r\n function GetColumnPosition(AColumn: Integer): Double; virtual;\r\n function GetTotalColumnNodeWidth: Double; virtual;\r\n function GetTotalColumnWidth: Double; virtual;\r\n function GetTotalRowHeight: Double; virtual;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math, WEBLib.TMSFNCUtils, SysUtils, WEBLib.Forms;\r\n\r\n{ TTMSFNCTreeViewBase }\r\n\r\nprocedure TTMSFNCTreeViewBase.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCTreeViewBase then\r\n begin\r\n FScrollMode := (Source as TTMSFNCTreeViewBase).ScrollMode;\r\n FStretchScrollBars := (Source as TTMSFNCTreeViewBase).StretchScrollBars;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.RestoreScrollPosition;\r\nbegin\r\n Scroll(FSaveHScrollPos, FSaveVScrollPos);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SaveScrollPosition;\r\nbegin\r\n FSaveHScrollPos := GetHScrollValue;\r\n FSaveVScrollPos := GetVScrollValue;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.BeginUpdate;\r\nbegin\r\n inherited;\r\n Inc(FUpdateCount);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.CanScrollDown: Boolean;\r\nbegin\r\n Result := GetVerticalScrollPosition < GetTotalRowHeight - GetVViewPortSize;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.CanScrollUp: Boolean;\r\nbegin\r\n Result := GetVerticalScrollPosition > 0;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewBase.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FDelayedLoading := False;\r\n\r\n FStretchScrollBars := True;\r\n\r\n FScrollUpdate := suContinuous;\r\n\r\n FCustomVerticalScrollBar := TTMSFNCScrollBar.Create(Self);\r\n FCustomVerticalScrollBar.Parent := Self;\r\n FCustomHorizontalScrollBar := TTMSFNCScrollBar.Create(Self);\r\n FCustomHorizontalScrollBar.Parent := Self;\r\n\r\n FVerticalScrollBar := TScrollBar.Create(Self);\r\n FVerticalScrollBar.Parent := Self;\r\n FHorizontalScrollBar := TScrollBar.Create(Self);\r\n FHorizontalScrollBar.Parent := Self;\r\n\r\n FCustomVerticalScrollBar.Appearance.ThumbButtonSize := 0;\r\n FCustomHorizontalScrollBar.Appearance.ThumbButtonSize := 0;\r\n\r\n {$IFDEF FMXLIB}\r\n FVerticalScrollBar.Stored := False;\r\n FHorizontalScrollBar.Stored := False;\r\n FCustomVerticalScrollBar.Stored := False;\r\n FCustomHorizontalScrollBar.Stored := False;\r\n FVerticalScrollBar.Orientation := TOrientation.Vertical;\r\n {$ENDIF}\r\n\r\n FCustomHorizontalScrollBar.Kind := sbkHorizontal;\r\n\r\n {$IFDEF CMNWEBLIB}\r\n FVerticalScrollBar.DoubleBuffered := False;\r\n FHorizontalScrollBar.DoubleBuffered := False;\r\n FVerticalScrollBar.Kind := sbVertical;\r\n {$ENDIF}\r\n\r\n FVerticalScrollBar.Visible := True;\r\n FHorizontalScrollBar.Visible := True;\r\n FCustomVerticalScrollBar.Visible := False;\r\n FCustomHorizontalScrollBar.Visible := False;\r\n FVerticalScrollBar.OnChange := @VScrollChanged;\r\n FHorizontalScrollBar.OnChange := @HScrollChanged;\r\n FCustomHorizontalScrollBar.OnValueChanged := HCustomScrollChanged;\r\n FCustomVerticalScrollBar.OnValueChanged := VCustomScrollChanged;\r\n\r\n FVerticalScrollBarVisible := True;\r\n FHorizontalScrollBarVisible := True;\r\n\r\n FScrollMode := smPixelScrolling;\r\n\r\n FColumnW := TTMSFNCTreeViewDoubleList.Create(Self);\r\n FColumnP := TTMSFNCTreeViewDoubleList.Create(Self);\r\n\r\n FDefaultRowHeight := 25;\r\n FDefaultColumnWidth := 75;\r\n FColumnCount := 0;\r\n FRowCount := 0;\r\n FVerticalScrollBarVisible := True;\r\n FHorizontalScrollBarVisible := True;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.CustomHorizontalScrollBar: TTMSFNCScrollBar;\r\nbegin\r\n Result := FCustomHorizontalScrollBar;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.CustomVerticalScrollBar: TTMSFNCScrollBar;\r\nbegin\r\n Result := FCustomVerticalScrollBar;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewBase.Destroy;\r\nbegin\r\n FColumnP.Free;\r\n FColumnW.Free;\r\n FCustomVerticalScrollBar.Free;\r\n FCustomHorizontalScrollBar.Free;\r\n FVerticalScrollBar.Free;\r\n FHorizontalScrollBar.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetContentRect: TRectF;\r\nbegin\r\n Result := inherited GetContentRect;\r\n if CustomScrollBars then\r\n begin\r\n if CustomHorizontalScrollBar.Visible then\r\n Result.Bottom := Result.Bottom - CustomHorizontalScrollBar.Height - 1;\r\n\r\n if CustomVerticalScrollBar.Visible then\r\n Result.Right := Result.Right - CustomVerticalScrollBar.Width - 1;\r\n end\r\n else\r\n begin\r\n if HorizontalScrollBar.Visible then\r\n Result.Bottom := Result.Bottom - HorizontalScrollBar.Height - 1;\r\n\r\n if VerticalScrollBar.Visible then\r\n Result.Right := Result.Right - VerticalScrollBar.Width - 1;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetContentClipRect: TRectF;\r\nbegin\r\n Result := GetContentRect;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetCalculationRect: TRectF;\r\nbegin\r\n Result := LocalRect;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetHorizontalScrollPosition: Double;\r\nvar\r\n hVal, scrollh: Double;\r\nbegin\r\n hVal := GetHScrollValue;\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n scrollh := ColumnPositions[Round(hval)];\r\n hVal := scrollh;\r\n end;\r\n\r\n Result := hVal;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetHScrollValue: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomHorizontalScrollBar.Value\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := Min(HorizontalScrollBar.Max - HorizontalScrollBar.ViewportSize, Max(0, HorizontalScrollBar.Value));\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLLIB}\r\n Result := Round(Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, HorizontalScrollBar.Position)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n Result := {%H-}Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(HorizontalScrollBar.Position)));\r\n {$ELSE}\r\n case ScrollMode of\r\n smPixelScrolling: Result := {%H-}Min(HorizontalScrollBar.Max, Max(0, Round(HorizontalScrollBar.Position - HorizontalScrollBar.Position * (HorizontalScrollBar.PageSize / HorizontalScrollBar.Max))));\r\n smNodeScrolling: Result := {%H-}Min(HorizontalScrollBar.Max, Max(0, Round(HorizontalScrollBar.Position)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetHViewPortSize: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomHorizontalScrollBar.PageSize\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := HorizontalScrollBar.ViewportSize;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := HorizontalScrollBar.PageSize;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetRowHeight(ARow: Integer): Double;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetRowViewPortSize: Double;\r\nvar\r\n I,cnt: Integer;\r\n h: Double;\r\n ch: Double;\r\n r: TRectF;\r\nbegin\r\n r := GetContentRect;\r\n ch := r.Bottom - r.Top;\r\n Result := 0;\r\n h := 0;\r\n cnt := 0;\r\n for I := RowCount - 1 downto 0 do\r\n begin\r\n h := h + GetRowHeight(I);\r\n if h > ch then\r\n begin\r\n Result := Max(1, cnt);\r\n Break;\r\n end;\r\n Inc(cnt);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetTotalColumnNodeWidth: Double;\r\nbegin\r\n Result := TotalColumnWidth;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetTotalColumnWidth: Double;\r\nbegin\r\n Result := TotalColumnWidth;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetTotalRowHeight: Double;\r\nbegin\r\n Result := TotalRowHeight;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetVerticalScrollPosition: Double;\r\nvar\r\n vVal{, scrollv}: Double;\r\nbegin\r\n vVal := GetVScrollValue;\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n// scrollv := RowPositions[Round(vval)];\r\n// vVal := scrollv;\r\n end;\r\n\r\n Result := vVal;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetVViewPortSize: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomVerticalScrollBar.PageSize\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := VerticalScrollBar.ViewportSize;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := VerticalScrollBar.PageSize;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetVScrollValue: Single;\r\nbegin\r\n if CustomScrollBars then\r\n Result := CustomVerticalScrollBar.Value\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := Min(VerticalScrollBar.Max - VerticalScrollBar.ViewportSize, Max(0, VerticalScrollBar.Value));\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF LCLLIB}\r\n Result := Round(Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, VerticalScrollBar.Position)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n Result := {%H-}Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(VerticalScrollBar.Position)));\r\n {$ELSE}\r\n case ScrollMode of\r\n smPixelScrolling: Result := {%H-}Min(VerticalScrollBar.Max, Max(0, Round(VerticalScrollBar.Position - VerticalScrollBar.Position * (VerticalScrollBar.PageSize / VerticalScrollBar.Max))));\r\n smNodeScrolling: Result := {%H-}Min(VerticalScrollBar.Max, Max(0, Round(VerticalScrollBar.Position)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.HCustomScrollChanged(Sender: TObject;\r\n AValue: Double);\r\nbegin\r\n if FBlockScrollingUpdate or not CustomScrollBars then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n HorizontalScrollPositionChanged;\r\n SetHScrollValue(GetHScrollValue);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.HorizontalScrollBar: TScrollBar;\r\nbegin\r\n Result := FHorizontalScrollBar;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.HScrollChanged(Sender: TObject);\r\nbegin\r\n if FBlockScrollingUpdate then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n HorizontalScrollPositionChanged;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.IsColumnVisible(ACol: Integer): Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.Loaded;\r\nbegin\r\n inherited;\r\n UpdateTreeViewCache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.VCustomScrollChanged(Sender: TObject;\r\n AValue: Double);\r\nbegin\r\n if FBlockScrollingUpdate or not CustomScrollBars then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n VerticalScrollPositionChanged;\r\n SetVScrollValue(GetVScrollValue);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.VerticalScrollBar: TScrollBar;\r\nbegin\r\n Result := FVerticalScrollBar;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.VScrollChanged(Sender: TObject);\r\nbegin\r\n if FBlockScrollingUpdate then\r\n Exit;\r\n\r\n if not IsMouseDown then\r\n StopAnimationTimer;\r\n\r\n VerticalScrollPositionChanged;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.EndUpdate;\r\nbegin\r\n inherited;\r\n Dec(FUpdateCount);\r\n if FUpdateCount = 0 then\r\n UpdateTreeViewCache;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetColumnPosition(AColumn: Integer): Double;\r\nbegin\r\n Result := ColumnPositions[AColumn];\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetColumnViewPortSize: Double;\r\nvar\r\n I,cnt: Integer;\r\n w: Double;\r\n cw: Double;\r\n r: TRectF;\r\nbegin\r\n r := GetContentRect;\r\n cw := r.Right - r.Left;\r\n Result := 0;\r\n w := 0;\r\n cnt := 0;\r\n for I := ColumnCount - 1 downto 0 do\r\n begin\r\n w := w + ColumnWidths[I];\r\n if w > cw then\r\n begin\r\n Result := Max(1, cnt);\r\n Break;\r\n end;\r\n Inc(cnt);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetColumnWidth(AColumn: Integer): Double;\r\nbegin\r\n Result := ColumnWidths[AColumn];\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetColWidths(Col: Integer): Double;\r\nvar\r\n idx: Integer;\r\nbegin\r\n idx := ColumnW.IndexOf(Col);\r\n if idx <> -1 then\r\n Result := ColumnW[idx].Value\r\n else\r\n Result := DefaultColumnWidth;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.GetColPos(Col: Integer): Double;\r\nvar\r\n idx: Integer;\r\nbegin\r\n idx := ColumnP.IndexOf(Col);\r\n if idx <> -1 then\r\n Result := ColumnP[idx].Value\r\n else\r\n Result := -1;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.Resize;\r\nbegin\r\n inherited;\r\n {$IFNDEF LCLLIB}\r\n UpdateControlAfterResize;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.Scroll(AHorizontalPos, AVerticalPos: Double);\r\nbegin\r\n FBlockScrollingUpdate := True;\r\n SetHScrollValue(AHorizontalPos);\r\n SetVScrollValue(AVerticalPos);\r\n FBlockScrollingUpdate := False;\r\n UpdateDisplay;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.ScrollLimitation: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetColumnCount(const Value: Integer);\r\nbegin\r\n if FColumnCount <> Value then\r\n FColumnCount := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetColumnW(const Value: TTMSFNCTreeViewDoubleList);\r\nbegin\r\n FColumnW.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetColumnP(const Value: TTMSFNCTreeViewDoubleList);\r\nbegin\r\n FColumnP.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetColWidths(Col: Integer; const Value: Double);\r\nvar\r\n idx: Integer;\r\n c: TTMSFNCTreeViewDoubleListItem;\r\nbegin\r\n idx := ColumnW.IndexOf(Col);\r\n if (idx >= 0) and (idx <= ColumnW.Count - 1) then\r\n begin\r\n if Value = DefaultColumnWidth then\r\n ColumnW.Delete(idx)\r\n else\r\n begin\r\n ColumnW[idx].Value := Max(0, Value);\r\n ColumnW[idx].CellVal := Col;\r\n end;\r\n end\r\n else if Value <> DefaultColumnWidth then\r\n begin\r\n c := ColumnW.Add;\r\n c.Value := Max(0, Value);\r\n c.CellVal := Col;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetCustomScrollBars(const Value: Boolean);\r\nbegin\r\n if FCustomScrollBars <> Value then\r\n begin\r\n FCustomScrollBars := Value;\r\n UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetColPos(Col: Integer; const Value: Double);\r\nvar\r\n idx: Integer;\r\n c: TTMSFNCTreeViewDoubleListItem;\r\nbegin\r\n idx := ColumnP.IndexOf(Col);\r\n if (idx >= 0) and (idx <= ColumnP.Count - 1) then\r\n begin\r\n if Value = -1 then\r\n ColumnP.Delete(idx)\r\n else\r\n begin\r\n ColumnP[idx].Value := Max(0, Value);\r\n ColumnP[idx].CellVal := Col;\r\n end;\r\n end\r\n else if Value <> -1 then\r\n begin\r\n c := ColumnP.Add;\r\n c.Value := Max(0, Value);\r\n c.CellVal := Col;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetDefaultColumnWidth(const Value: Double);\r\nbegin\r\n if FDefaultColumnWidth <> Value then\r\n FDefaultColumnWidth := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetDefaultRowHeight(const Value: Double);\r\nbegin\r\n if FDefaultRowHeight <> Value then\r\n FDefaultRowHeight := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetHorizontalScrollBarVisible(\r\n const Value: Boolean);\r\nbegin\r\n if FHorizontalScrollBarVisible <> Value then\r\n begin\r\n FHorizontalScrollBarVisible := Value;\r\n UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetHScrollValue(AValue: Single);\r\nbegin\r\n if CustomScrollBars then\r\n CustomHorizontalScrollBar.Value := AValue\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n HorizontalScrollBar.Value := Min(HorizontalScrollBar.Max - HorizontalScrollBar.ViewportSize, Max(0, AValue));\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n HorizontalScrollBar.Position := Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n HorizontalScrollBar.Position := Round(Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, AValue)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n HorizontalScrollBar.Position := {%H-}Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ELSE}\r\n case ScrollMode of\r\n smPixelScrolling: HorizontalScrollBar.Position := {%H-}Min(HorizontalScrollBar.Max, Max(0, Round(AValue + AValue * (HorizontalScrollBar.PageSize / (HorizontalScrollBar.Max - HorizontalScrollBar.PageSize)))));\r\n smNodeScrolling: HorizontalScrollBar.Position := {%H-}Min(HorizontalScrollBar.Max - HorizontalScrollBar.PageSize, Max(0, Round(AValue)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetRowCount(const Value: Integer);\r\nbegin\r\n if FRowCount <> Value then\r\n FRowCount := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetScrollMode(\r\n const Value: TTMSFNCTreeViewScrollMode);\r\nbegin\r\n if FScrollMode <> Value then\r\n begin\r\n FScrollMode := Value;\r\n UpdateTreeViewDisplay;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetScrollUpdate(\r\n const Value: TTMSFNCTreeViewScrollUpdate);\r\nbegin\r\n if FScrollUpdate <> Value then\r\n begin\r\n FScrollUpdate := Value;\r\n if Assigned(FCustomVerticalScrollBar) then\r\n FCustomVerticalScrollBar.Tracking := ScrollUpdate = suContinuous;\r\n\r\n if Assigned(FCustomHorizontalScrollBar) then\r\n FCustomHorizontalScrollBar.Tracking := ScrollUpdate = suContinuous;\r\n\r\n UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetStretchScrollBars(const Value: Boolean);\r\nbegin\r\n if FStretchScrollBars <> Value then\r\n begin\r\n FStretchScrollBars := Value;\r\n UpdateTreeViewDisplay;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetVerticalScrollBarVisible(\r\n const Value: Boolean);\r\nbegin\r\n if FVerticalScrollBarVisible <> Value then\r\n begin\r\n FVerticalScrollBarVisible := Value;\r\n UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.SetVScrollValue(AValue: Single);\r\nbegin\r\n if CustomScrollBars then\r\n CustomVerticalScrollBar.Value := AValue\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n VerticalScrollBar.Value := Min(VerticalScrollBar.Max - VerticalScrollBar.ViewportSize, Max(0, AValue));\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n VerticalScrollBar.Position := Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n VerticalScrollBar.Position := Round(Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, AValue)));\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFDEF MSWINDOWS}\r\n VerticalScrollBar.Position := {%H-}Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(AValue)));\r\n {$ELSE}\r\n case ScrollMode of\r\n smPixelScrolling: VerticalScrollBar.Position := {%H-}Min(VerticalScrollBar.Max, Max(0, Round(AValue + AValue * (VerticalScrollBar.PageSize / (VerticalScrollBar.Max - VerticalScrollBar.PageSize)))));\r\n smNodeScrolling: VerticalScrollBar.Position := {%H-}Min(VerticalScrollBar.Max - VerticalScrollBar.PageSize, Max(0, Round(AValue)));\r\n end;\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StartCol: Integer;\r\nbegin\r\n Result := FStartCol;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StartOffset: Double;\r\nbegin\r\n Result := FStartOffset;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StartRow: Integer;\r\nbegin\r\n Result := FStartRow;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StartX: Double;\r\nbegin\r\n Result := FStartX;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StartY: Double;\r\nbegin\r\n Result := FStartY;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StopCol: Integer;\r\nbegin\r\n Result := FStopCol;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StopRow: Integer;\r\nbegin\r\n Result := FStopRow;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StopX: Double;\r\nbegin\r\n Result := FStopX;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewBase.StopY: Double;\r\nbegin\r\n Result := FStopY;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.StretchColumn(AStretchAll: Boolean = True; ACol: Integer = -1; ANewWidth: Double = -1);\r\nvar\r\n i: Integer;\r\n w, nw, d: Double;\r\n cnt: Integer;\r\n horz, vert: TScrollBar;\r\n r: TRectF;\r\nbegin\r\n horz := HorizontalScrollBar;\r\n vert := VerticalScrollBar;\r\n if not Assigned(vert) or not Assigned(horz) then\r\n Exit;\r\n\r\n if ANewWidth = -1 then\r\n begin\r\n r := GetContentRect;\r\n nw := r.Right - r.Left;\r\n end\r\n else\r\n nw := ANewWidth;\r\n\r\n cnt := 0;\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if IsColumnVisible(I) then\r\n cnt := cnt + 1;\r\n end;\r\n\r\n if ACol = - 1 then\r\n ACol := ColumnCount - 1;\r\n\r\n if (ACol >= ColumnCount) and not AStretchAll then\r\n begin\r\n {$IFNDEF WEBLIB}\r\n raise Exception.Create('Stretch column index out of range');\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n Exit;\r\n {$ENDIF}\r\n end;\r\n\r\n if (cnt = 0) then\r\n Exit;\r\n\r\n if ColumnCount = 1 then\r\n begin\r\n ColumnWidths[0] := nw;\r\n Exit;\r\n end;\r\n\r\n w := 0;\r\n\r\n if AStretchAll then\r\n begin\r\n if (cnt > 0) then\r\n begin\r\n d := nw;\r\n\r\n w := d / cnt;\r\n\r\n for i := 0 to ColumnCount - 1 do\r\n begin\r\n if IsColumnVisible(i) then\r\n ColumnWidths[i] := w;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n for i := 0 to ColumnCount - 1 do\r\n begin\r\n if (i <> ACol) and IsColumnVisible(i) then\r\n w := w + ColumnWidths[i];\r\n end;\r\n\r\n ColumnWidths[ACol] := nw - w {- 1};\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.AutoSizeColumn(ACol: Integer);\r\nbegin\r\n AutoSizeColumnInternal(ACol, True, True);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.UpdateVisualRange;\r\nvar\r\n c, r: Integer;\r\n xval, yval: Double;\r\n cw, ch: Double;\r\n vpos, hpos: Double;\r\n cr: TRectF;\r\n reverse: Boolean;\r\n rh: Double;\r\nbegin\r\n hpos := GetHorizontalScrollPosition;\r\n vpos := GetVerticalScrollPosition;\r\n cr := GetContentRect;\r\n xval := -hpos;\r\n yval := -vpos;\r\n cw := cr.Right - cr.Left;\r\n ch := cr.Bottom - cr.Top;\r\n\r\n reverse := GetVScrollValue > VerticalScrollBar.Max / 2;\r\n\r\n if reverse then\r\n yval := yval + GetTotalRowHeight;\r\n\r\n FStartCol := -1;\r\n FStartRow := -1;\r\n FStopCol := -1;\r\n FStopRow := -1;\r\n FStartX := cr.Left;\r\n FStopX := cr.Left;\r\n FStartY := cr.Top;\r\n FStopY := cr.Top;\r\n FStartOffset := 0;\r\n\r\n for c := 0 to ColumnCount - 1 do\r\n begin\r\n xval := xval + ColumnWidths[c];\r\n if (xval > 0) and (FStartCol = -1) then\r\n begin\r\n FStartCol := c;\r\n FStartX := FStartX + int(xval - ColumnWidths[c]);\r\n end;\r\n\r\n if (xval >= cw) and (FStopCol = -1) then\r\n begin\r\n FStopCol := c;\r\n FStopX := FStopX + int(xval);\r\n end;\r\n\r\n if (FStartCol > -1) and (FStopCol > -1) then\r\n Break;\r\n end;\r\n\r\n if reverse then\r\n begin\r\n for r := RowCount - 1 downto 0 do\r\n begin\r\n rh := GetRowHeight(r);\r\n yval := yval - rh;\r\n if (yval <= 0) and (FStartRow = -1) then\r\n begin\r\n FStartRow := r;\r\n FStartOffset := yval;\r\n FStartY := FStartY + int(FStartOffset - rh);\r\n end;\r\n\r\n if (yval < ch) and (FStopRow = -1) then\r\n begin\r\n FStopRow := r;\r\n FStopY := FStopY + int(yval);\r\n end;\r\n\r\n if (FStartRow > -1) and (FStopRow > -1) then\r\n Break;\r\n end;\r\n end\r\n else\r\n begin\r\n for r := 0 to RowCount - 1 do\r\n begin\r\n rh := GetRowHeight(r);\r\n yval := yval + rh;\r\n if (yval > 0) and (FStartRow = -1) then\r\n begin\r\n FStartRow := r;\r\n FStartOffset := yval - rh;\r\n FStartY := FStartY + int(FStartOffset);\r\n end;\r\n\r\n if (yval >= ch) and (FStopRow = -1) then\r\n begin\r\n FStopRow := r;\r\n FStopY := FStopY + int(yval);\r\n end;\r\n\r\n if (FStartRow > -1) and (FStopRow > -1) then\r\n Break;\r\n end;\r\n end;\r\n\r\n if (FStartRow > -1) and (FStopRow = -1) then\r\n FStopRow := RowCount - 1;\r\n\r\n if (FStartCol > -1) and (FStopCol = -1) then\r\n FStopCol := ColumnCount - 1;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.UpdateControlAfterResize;\r\nbegin\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) or (csLoading in ComponentState) then\r\n Exit;\r\n\r\n ResetNodes;\r\n SaveScrollPosition;\r\n UpdateNodesCache(True, True);\r\n UpdateGroupsCache;\r\n UpdateColumnsCache;\r\n RestoreScrollPosition;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.UpdateDisplay;\r\nbegin\r\n //ResetVisibleNodes;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.UpdateTreeView;\r\nbegin\r\n SaveScrollPosition;\r\n UpdateNodesCache(True, True);\r\n RestoreScrollPosition;\r\n UpdateGroupsCache;\r\n UpdateColumnsCache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.UpdateTreeViewCache;\r\nbegin\r\n if (UpdateCount > 0) or BlockUpdateNode or (csDestroying in ComponentState) or (csLoading in ComponentState) then\r\n Exit;\r\n\r\n ResetNodes;\r\n UpdateCalculations;\r\n UpdateColumns;\r\n UpdateScrollBars;\r\n UpdateNodesCache(True, True);\r\n UpdateGroupsCache;\r\n UpdateColumnsCache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.UpdateTreeViewDisplay;\r\nbegin\r\n UpdateScrollBars;\r\n UpdateDisplay;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewBase.UpdateScrollBars(AUpdate: Boolean = True; ACalculate: Boolean = True);\r\nvar\r\n vs, hs: TScrollBar;\r\n vsc, hsc: TTMSFNCScrollBar;\r\n w, h: Double;\r\n cw, ch: Double;\r\n cr: TRectF;\r\n vmgr: TTMSFNCMargins;\r\n hmgr: TTMSFNCMargins;\r\nbegin\r\n if {$IFDEF FMXLIB} FBlockScrollingUpdate or {$ENDIF} (UpdateCount > 0) or (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n FBlockScrollingUpdate := True;\r\n\r\n if ACalculate then\r\n begin\r\n UpdateAutoSizing;\r\n UpdateColumnRowCalculations;\r\n end;\r\n\r\n vs := VerticalScrollBar;\r\n hs := HorizontalScrollBar;\r\n vsc := CustomVerticalScrollBar;\r\n hsc := CustomHorizontalScrollBar;\r\n if Assigned(vs) and Assigned(hs) and Assigned(vsc) and Assigned(hsc) then\r\n begin\r\n if AUpdate then\r\n cr := GetCalculationRect\r\n else\r\n cr := GetContentRect;\r\n\r\n cw := cr.Right - cr.Left;\r\n ch := cr.Bottom - cr.Top;\r\n w := GetTotalColumnWidth;\r\n h := GetTotalRowHeight;\r\n\r\n hs.Visible := (w > 0) and (CompareValueEx(w, cw) = 1) and HorizontalScrollBarVisible and not ColumnStretchingActive and not CustomScrollBars;\r\n vs.Visible := (h > 0) and (CompareValueEx(h, ch) = 1) and VerticalScrollBarVisible and not CustomScrollBars;\r\n hsc.Visible := (w > 0) and (CompareValueEx(w, cw) = 1) and HorizontalScrollBarVisible and not ColumnStretchingActive and CustomScrollBars;\r\n vsc.Visible := (h > 0) and (CompareValueEx(h, ch) = 1) and VerticalScrollBarVisible and CustomScrollBars;\r\n\r\n {$IFDEF CMNWEBLIB}\r\n if vsc.Visible and CustomScrollBars then\r\n vsc.Parent := Self\r\n else\r\n vsc.Parent := nil;\r\n\r\n if hsc.Visible and CustomScrollBars then\r\n hsc.Parent := Self\r\n else\r\n hsc.Parent := nil;\r\n\r\n if vs.Visible and not CustomScrollBars then\r\n vs.Parent := Self\r\n else\r\n vs.Parent := nil;\r\n\r\n if hs.Visible and not CustomScrollBars then\r\n hs.Parent := Self\r\n else\r\n hs.Parent := nil;\r\n {$ENDIF}\r\n\r\n vmgr := TTMSFNCMargins.Create;\r\n hmgr := TTMSFNCMargins.Create;\r\n\r\n if CustomScrollBars then\r\n begin\r\n if vsc.Visible and StretchScrollBars then\r\n hmgr.Right := vsc.Width + 1\r\n else\r\n hmgr.Right := 1;\r\n end\r\n else\r\n begin\r\n if vs.Visible and StretchScrollBars then\r\n hmgr.Right := vs.Width + 1\r\n else\r\n hmgr.Right := 1;\r\n end;\r\n\r\n vmgr.Top := 1;\r\n vmgr.Right := 1;\r\n hmgr.Bottom := 1;\r\n hmgr.Left := 1;\r\n\r\n if CustomScrollBars then\r\n begin\r\n if hsc.Visible then\r\n vmgr.Bottom := hsc.Height + 1\r\n else\r\n vmgr.Bottom := 1;\r\n end\r\n else\r\n begin\r\n if hs.Visible then\r\n vmgr.Bottom := hs.Height + 1\r\n else\r\n vmgr.Bottom := 1;\r\n end;\r\n\r\n if not StretchScrollBars then\r\n begin\r\n cr := GetCalculationRect;\r\n hmgr.Left := hmgr.Left + cr.Left;\r\n hmgr.Right := hmgr.Right + (Width - cr.Right);\r\n vmgr.Top := vmgr.Top + cr.Top;\r\n vmgr.Bottom := vmgr.Bottom + (Height - cr.Bottom);\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n hs.Position.X := hmgr.Left;\r\n hs.Position.Y := Height - hmgr.Bottom - hs.Height;\r\n vs.Position.X := Width - vmgr.Right - vs.Width;\r\n vs.Position.Y := vmgr.Top;\r\n hs.Width := Width - hmgr.Right - hmgr.Left;\r\n vs.Height := Height - vmgr.Bottom - vmgr.Top;\r\n hsc.Position.X := hmgr.Left;\r\n hsc.Position.Y := Height - hmgr.Bottom - hsc.Height;\r\n vsc.Position.X := Width - vmgr.Right - vsc.Width;\r\n vsc.Position.Y := vmgr.Top;\r\n hsc.Width := Width - hmgr.Right - hmgr.Left;\r\n vsc.Height := Height - vmgr.Bottom - vmgr.Top;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n hs.Left := Round(hmgr.Left);\r\n hs.Top := Round(Height - hmgr.Bottom - hs.Height);\r\n vs.Left := Round(Width - vmgr.Right - vs.Width);\r\n vs.Top := Round(vmgr.Top);\r\n hs.Width := Round(Max(0, Width - hmgr.Right - hmgr.Left));\r\n vs.Height := Round(Max(0, Height - vmgr.Bottom - vmgr.Top));\r\n {$IFDEF MSWINDOWS}\r\n vs.Width := GetSystemMetrics(SM_CYVSCROLL);\r\n hs.Height := GetSystemMetrics(SM_CYHSCROLL);\r\n {$ENDIF}\r\n vs.Height := Round(Max(0, Height - vmgr.Bottom - vmgr.Top));\r\n hsc.Left := Round(hmgr.Left);\r\n hsc.Top := Round(Height - hmgr.Bottom - hsc.Height);\r\n vsc.Left := Round(Width - vmgr.Right - vsc.Width);\r\n vsc.Top := Round(vmgr.Top);\r\n hsc.Width := Round(Max(0, Width - hmgr.Right - hmgr.Left));\r\n vsc.Height := Round(Max(0, Height - vmgr.Bottom - vmgr.Top));\r\n {$ENDIF}\r\n\r\n hmgr.Free;\r\n vmgr.Free;\r\n\r\n cr := GetContentRect;\r\n cw := cr.Right - cr.Left;\r\n ch := cr.Bottom - cr.Top;\r\n\r\n {$IFDEF FMXLIB}\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n vs.ViewportSize := GetRowViewPortSize;\r\n vs.Max := RowCount;\r\n end\r\n else\r\n begin\r\n vs.ViewPortSize := Min(h, ch);\r\n vs.Max := h;\r\n vs.SmallChange := Round(DefaultRowHeight);\r\n vs.Value := Min(vs.Value, vs.Max - vs.ViewportSize);\r\n end;\r\n\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n hs.ViewportSize := GetColumnViewPortSize;\r\n hs.Max := ColumnCount;\r\n end\r\n else\r\n begin\r\n hs.ViewPortSize := Min(w, cw);\r\n hs.Max := w;\r\n hs.Value := Min(hs.Value, hs.Max - hs.ViewportSize);\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n vs.PageSize := Round(Max(0, GetRowViewPortSize));\r\n vs.Max := Max(vs.PageSize, RowCount);\r\n end\r\n else\r\n begin\r\n vs.PageSize := Round(Max(0, Min(h, ch)));\r\n vs.Max := Round(Max(vs.PageSize, h));\r\n vs.SmallChange := Round(DefaultRowHeight);\r\n vs.LargeChange := vs.PageSize;\r\n vs.Position := Min(vs.Position, vs.Max);\r\n end;\r\n\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n hs.PageSize := Round(Max(0, GetColumnViewPortSize));\r\n hs.Max := Max(hs.PageSize, ColumnCount);\r\n end\r\n else\r\n begin\r\n hs.PageSize := Round(Max(0, Min(w, cw)));\r\n hs.Max := Round(Max(hs.PageSize, w));\r\n hs.Position := Min(hs.Position, hs.Max);\r\n end;\r\n {$ENDIF}\r\n\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n vsc.PageSize := GetRowViewPortSize;\r\n vsc.Max := RowCount - vsc.PageSize;\r\n end\r\n else\r\n begin\r\n vsc.PageSize := Min(h, ch);\r\n vsc.Max := h - vsc.PageSize;\r\n vsc.SmallChange := Round(DefaultRowHeight);\r\n vsc.Value := Min(vsc.Value, vsc.Max);\r\n end;\r\n\r\n if ScrollMode = smNodeScrolling then\r\n begin\r\n hsc.PageSize := GetColumnViewPortSize;\r\n hsc.Max := ColumnCount - hsc.PageSize;\r\n end\r\n else\r\n begin\r\n hsc.PageSize := Min(w, cw);\r\n hsc.Max := w - hsc.PageSize;\r\n hsc.Value := Min(hsc.Value, hsc.Max);\r\n end;\r\n end;\r\n\r\n FBlockScrollingUpdate := False;\r\n\r\n if AUpdate then\r\n UpdateScrollBars(False, False);\r\nend;\r\n\r\n{ TTMSFNCTreeViewDoubleListItem }\r\n\r\nconstructor TTMSFNCTreeViewDoubleListItem.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FOwner := (Collection as TTMSFNCTreeViewDoubleList).FOwner;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewDoubleListItem.SetCellData(const Value: Double);\r\nbegin\r\n FValue := Value;\r\nend;\r\n\r\n{ TTMSFNCTreeViewDoubleList }\r\n\r\nfunction TTMSFNCTreeViewDoubleList.Add: TTMSFNCTreeViewDoubleListItem;\r\nbegin\r\n Result := TTMSFNCTreeViewDoubleListItem(inherited Add);\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewDoubleList.Create(AOwner: TTMSFNCTreeViewBase);\r\nbegin\r\n inherited Create(AOwner, TTMSFNCTreeViewDoubleListItem);\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewDoubleList.GetItem(\r\n Index: Integer): TTMSFNCTreeViewDoubleListItem;\r\nbegin\r\n Result := TTMSFNCTreeViewDoubleListItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewDoubleList.IndexOf(ACellVal: Integer): Integer;\r\nvar\r\n r: Integer;\r\nbegin\r\n Result := -1;\r\n for r := 0 to Count - 1 do\r\n begin\r\n if Items[r].CellVal = ACellVal then\r\n begin\r\n Result := r;\r\n Exit;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewDoubleList.Insert(\r\n Index: Integer): TTMSFNCTreeViewDoubleListItem;\r\nbegin\r\n Result := TTMSFNCTreeViewDoubleListItem(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewDoubleList.SetItem(Index: Integer;\r\n const Value: TTMSFNCTreeViewDoubleListItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCTreeViewData;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphicsTypes,\r\n WEBLib.TMSFNCBitmapContainer, WEBLib.TMSFNCTreeViewBase\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,Generics.Collections, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ,Contnrs\r\n {$ENDIF}\r\n ;\r\n\r\nresourcestring\r\n sTMSFNCTreeViewGroup = 'Group';\r\n sTMSFNCTreeViewColumn = 'Column';\r\n\r\nconst\r\n {$IFDEF FMXMOBILE}\r\n MAXLEVELDEPTH = 100;\r\n MAXNODECOUNT = 1000000;\r\n {$ELSE}\r\n MAXLEVELDEPTH = 100;\r\n MAXNODECOUNT = 2000000;\r\n {$ENDIF}\r\n\r\ntype\r\n TTMSFNCTreeViewCacheItem = class;\r\n TTMSFNCTreeViewData = class;\r\n TTMSFNCTreeViewGroup = class;\r\n TTMSFNCTreeViewColumn = class;\r\n\r\n TTMSFNCTreeViewNode = class;\r\n\r\n TTMSFNCTreeViewNodeScrollPosition = (tvnspTop, tvnspBottom, tvnspMiddle);\r\n\r\n TTMSFNCTreeViewVirtualNodeRemoveData = record\r\n RowIndex: Integer;\r\n Count: Integer;\r\n ParentNode: Integer;\r\n end;\r\n\r\n TTMSFNCArrayTRectF = array of TRectF;\r\n TTMSFNCArrayBoolean = array of Boolean;\r\n\r\n TTMSFNCTreeViewVirtualNode = class\r\n private\r\n FTreeView: TTMSFNCTreeViewData;\r\n FLevel: Integer;\r\n FAddedToVisibleList: Boolean;\r\n FChildren: Integer;\r\n FParentNode: Integer;\r\n FExpanded: Boolean;\r\n FTotalChildren: Integer;\r\n FIndex: Integer;\r\n FRow: Integer;\r\n FHeight: Double;\r\n FCalculated: Boolean;\r\n FCache: TTMSFNCTreeViewCacheItem;\r\n FTextRects: TTMSFNCArrayTRectF;\r\n FBitmapRects: TTMSFNCArrayTRectF;\r\n FExpandRects: TTMSFNCArrayTRectF;\r\n FCheckRects: TTMSFNCArrayTRectF;\r\n FCheckStates: TTMSFNCArrayBoolean;\r\n FNode: TTMSFNCTreeViewNode;\r\n FExtended: Boolean;\r\n FExtraRects: TTMSFNCArrayTRectF;\r\n FTitleRects: TTMSFNCArrayTRectF;\r\n FTitleHeight: Double;\r\n FTitleExtraRects: TTMSFNCArrayTRectF;\r\n function GetText(AColumn: Integer): String;\r\n function GetTitle(AColumn: Integer): String;\r\n function GetTitleExpanded(AColumn: Integer): Boolean;\r\n protected\r\n property Cache: TTMSFNCTreeViewCacheItem read FCache;\r\n public\r\n function GetParent: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetChildCount: Integer; virtual;\r\n function GetPrevious: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetNext: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetPreviousChild(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetNextChild(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetNextSibling: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetPreviousSibling: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetFirstChild: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetLastChild: TTMSFNCTreeViewVirtualNode; virtual;\r\n procedure RemoveChildren; virtual;\r\n procedure Expand(ARecurse: Boolean = False); virtual;\r\n procedure Collapse(ARecurse: Boolean = False); virtual;\r\n\r\n property Children: Integer read FChildren;\r\n property TotalChildren: Integer read FTotalChildren;\r\n property Expanded: Boolean read FExpanded;\r\n property Extended: Boolean read FExtended;\r\n property Level: Integer read FLevel;\r\n property Row: Integer read FRow;\r\n property Calculated: Boolean read FCalculated;\r\n property Height: Double read FHeight;\r\n property TitleHeight: Double read FTitleHeight;\r\n property ParentNode: Integer read FParentNode;\r\n property Index: Integer read FIndex;\r\n property ExtraRects: TTMSFNCArrayTRectF read FExtraRects;\r\n property TextRects: TTMSFNCArrayTRectF read FTextRects;\r\n property TitleRects: TTMSFNCArrayTRectF read FTitleRects;\r\n property TitleExtraRects: TTMSFNCArrayTRectF read FTitleExtraRects;\r\n property BitmapRects: TTMSFNCArrayTRectF read FBitmapRects;\r\n property CheckRects: TTMSFNCArrayTRectF read FCheckRects;\r\n property ExpandRects: TTMSFNCArrayTRectF read FExpandRects;\r\n property CheckStates: TTMSFNCArrayBoolean read FCheckStates;\r\n property Node: TTMSFNCTreeViewNode read FNode;\r\n property Text[AColumn: Integer]: String read GetText;\r\n property Title[AColumn: Integer]: String read GetTitle;\r\n property TitleExpanded[AColumn: Integer]: Boolean read GetTitleExpanded;\r\n property Visible: Boolean read FAddedToVisibleList;\r\n\r\n procedure CopyFrom(Source: TTMSFNCTreeViewVirtualNode); virtual;\r\n constructor Create(ATreeView: TTMSFNCTreeViewData);\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTMSFNCTreeViewCacheItemKind = (ikNode, ikColumnTop, ikColumnBottom, ikGroupTop, ikGroupBottom);\r\n\r\n TTMSFNCTreeViewCacheItem = class\r\n private\r\n FRect: TRectF;\r\n FDrawRect: TRectF;\r\n FKind: TTMSFNCTreeViewCacheItemKind;\r\n FGroup: Integer;\r\n FColumn: Integer;\r\n FNode: TTMSFNCTreeViewVirtualNode;\r\n FRow: Integer;\r\n FCol: Integer;\r\n FStartColumn: Integer;\r\n FEndColumn: Integer;\r\n public\r\n class function CreateNode(ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewCacheItem;\r\n class function CreateColumnTop(ARect: TRectF; AColumn: Integer): TTMSFNCTreeViewCacheItem;\r\n class function CreateGroupTop(ARect: TRectF; AGroup: Integer; AStartColumn, AEndColumn: Integer): TTMSFNCTreeViewCacheItem;\r\n class function CreateColumnBottom(ARect: TRectF; AColumn: Integer): TTMSFNCTreeViewCacheItem;\r\n class function CreateGroupBottom(ARect: TRectF; AGroup: Integer; AStartColumn, AEndColumn: Integer): TTMSFNCTreeViewCacheItem;\r\n\r\n property Rect: TRectF read FRect write FRect;\r\n property DrawRect: TRectF read FDrawRect write FDrawRect;\r\n property Kind: TTMSFNCTreeViewCacheItemKind read FKind write FKind;\r\n property Node: TTMSFNCTreeViewVirtualNode read FNode write FNode;\r\n property Group: Integer read FGroup write FGroup;\r\n property StartColumn: Integer read FStartColumn write FStartColumn;\r\n property EndColumn: Integer read FEndColumn write FEndColumn;\r\n property Column: Integer read FColumn write FColumn;\r\n property Col: Integer read FCol write FCol;\r\n property Row: Integer read FRow write FRow;\r\n destructor Destroy; override;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewCacheItemList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewCacheItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewCacheItem);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewCacheItem read GetItem write SetItem; default;\r\n end;\r\n TTMSFNCTreeViewIntegerList = class(TList)\r\n private\r\n function GetItem(Index: Integer): Integer;\r\n procedure SetItem(Index: Integer; const Value: Integer);\r\n public\r\n property Items[Index: Integer]: Integer read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewCacheItemList = class(TList);\r\n TTMSFNCTreeViewIntegerList = class(TList);\r\n {$ENDIF}\r\n TTMSFNCTreeViewVirtualNodeArray = array of TTMSFNCTreeViewVirtualNode;\r\n\r\n TTMSFNCTreeViewColumnEditorType = (tcetEdit, tcetComboBox, tcetMemo, tcetNone);\r\n\r\n TTMSFNCTreeViewNodesSortMode = (nsmAscending, nsmDescending);\r\n TTMSFNCTreeViewNodesSortKind = (nskNone, nskAscending, nskDescending);\r\n TTMSFNCTreeViewColumnSorting = (tcsNone, tcsNormal, tcsRecursive, tcsNormalCaseSensitive, tcsRecursiveCaseSensitive);\r\n\r\n TTMSFNCTreeViewColumnFiltering = class(TPersistent)\r\n private\r\n FColumn: TTMSFNCTreeViewColumn;\r\n FEnabled: Boolean;\r\n FMultiColumn: boolean;\r\n FDropDownHeight: integer;\r\n FDropDownWidth: integer;\r\n FButtonSize: Single;\r\n procedure SetEnabled(const Value: Boolean);\r\n function IsButtonSizeStored: Boolean;\r\n procedure SetButtonSize(const Value: Single);\r\n public\r\n constructor Create(AColumn: TTMSFNCTreeViewColumn);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Enabled: Boolean read FEnabled write SetEnabled default False;\r\n property DropDownWidth: integer read FDropDownWidth write FDropDownWidth default 100;\r\n property DropDownHeight: integer read FDropDownHeight write FDropDownHeight default 120;\r\n property MultiColumn: boolean read FMultiColumn write FMultiColumn default false;\r\n property ButtonSize: Single read FButtonSize write SetButtonSize stored IsButtonSizeStored nodefault;\r\n end;\r\n\r\n TTMSFNCTreeViewFilterOperation = (tfoSHORT, tfoNONE, tfoAND, tfoXOR, tfoOR);\r\n\r\n TTMSFNCTreeViewFilterData = class(TCollectionItem)\r\n private\r\n FColumn: SmallInt;\r\n FCondition: string;\r\n FCaseSensitive: Boolean;\r\n FSuffix: string;\r\n FPrefix: string;\r\n FOperation: TTMSFNCTreeViewFilterOperation;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Column: smallint read FColumn write FColumn;\r\n property Condition:string read FCondition write FCondition;\r\n property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive default True;\r\n property Prefix: string read FPrefix write FPrefix;\r\n property Suffix: string read FSuffix write FSuffix;\r\n property Operation: TTMSFNCTreeViewFilterOperation read FOperation write FOperation;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewFilter = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewFilter = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FOwner: TTMSFNCTreeViewData;\r\n function GetItem(Index: Integer): TTMSFNCTreeViewFilterData;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewFilterData);\r\n function GetColFilter(Col: Integer): TTMSFNCTreeViewFilterData;\r\n public\r\n constructor Create(AOwner: TTMSFNCTreeViewData);\r\n function Add: TTMSFNCTreeViewFilterData;\r\n function Insert(index: Integer): TTMSFNCTreeViewFilterData;\r\n property Items[Index: Integer]: TTMSFNCTreeViewFilterData read GetItem write SetItem; default;\r\n property ColumnFilter[Col: Integer]: TTMSFNCTreeViewFilterData read GetColFilter;\r\n function HasFilter(Col: integer): Boolean;\r\n procedure RemoveColumnFilter(Col: integer);\r\n end;\r\n\r\n TTMSFNCTreeViewColumn = class(TCollectionItem)\r\n private\r\n FSortKind: TTMSFNCTreeViewNodesSortKind;\r\n FTag: NativeInt;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FTreeView: TTMSFNCTreeViewData;\r\n FText: String;\r\n FName: String;\r\n FDBKey: String;\r\n FDataBoolean: Boolean;\r\n FWordWrapping: Boolean;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FWidth: Double;\r\n FVisible: Boolean;\r\n FUseDefaultAppearance: Boolean;\r\n FBottomFill: TTMSFNCGraphicsFill;\r\n FBottomStroke: TTMSFNCGraphicsStroke;\r\n FTopFill: TTMSFNCGraphicsFill;\r\n FTopStroke: TTMSFNCGraphicsStroke;\r\n FTopFont: TTMSFNCGraphicsFont;\r\n FBottomFont: TTMSFNCGraphicsFont;\r\n FFont: TTMSFNCGraphicsFont;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FEditorType: TTMSFNCTreeViewColumnEditorType;\r\n FDisabledFontColor: TTMSFNCGraphicsColor;\r\n FSelectedFontColor: TTMSFNCGraphicsColor;\r\n FEditorItems: TStringList;\r\n FCustomEditor: Boolean;\r\n FSorting: TTMSFNCTreeViewColumnSorting;\r\n FSortIndex: Integer;\r\n FFiltering: TTMSFNCTreeViewColumnFiltering;\r\n FDataPointer: Pointer;\r\n FTitleTrimming: TTMSFNCGraphicsTextTrimming;\r\n FTitleHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTitleWordWrapping: Boolean;\r\n FTitleVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FDisabledTitleFontColor: TTMSFNCGraphicsColor;\r\n FSelectedTitleFontColor: TTMSFNCGraphicsColor;\r\n FTitleFont: TTMSFNCGraphicsFont;\r\n FExpanded: Boolean;\r\n FExpandable: Boolean;\r\n FExpandingButtonSize: Single;\r\n procedure SetText(const Value: String);\r\n procedure SetName(const Value: String);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n procedure SetWidth(const Value: Double);\r\n procedure SetVisible(const Value: Boolean);\r\n procedure SetUseDefaultAppearance(const Value: Boolean);\r\n procedure SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetBottomStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetTopFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetTopStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetTopFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetEditorType(const Value: TTMSFNCTreeViewColumnEditorType);\r\n procedure SetDisabledFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetSelectedFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetEditorItems(const Value: TStringList);\r\n procedure SetSorting(const Value: TTMSFNCTreeViewColumnSorting);\r\n procedure SetSortKind(const Value: TTMSFNCTreeViewNodesSortKind);\r\n procedure SetSortIndex(const Value: Integer);\r\n procedure SetFiltering(const Value: TTMSFNCTreeViewColumnFiltering);\r\n procedure SetTitleHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTitleTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetTitleVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTitleWordWrapping(const Value: Boolean);\r\n procedure SetDisabledTitleFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetSelectedTitleFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTitleFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetExpanded(const Value: Boolean);\r\n procedure SetExpandable(const Value: Boolean);\r\n function IsExpandingButtonSizeStored: Boolean;\r\n procedure SetExpandingButtonSize(const Value: Single);\r\n protected\r\n procedure UpdateColumn;\r\n procedure Changed(Sender: TObject);\r\n function GetText: String; virtual;\r\n function GetColumnText: String; virtual;\r\n property SortIndex: Integer read FSortIndex write SetSortIndex default -1;\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure UpdateWidth(AWidth: Double); virtual;\r\n procedure Sort(ARecurse: Boolean = False; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending); virtual;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n property SortKind: TTMSFNCTreeViewNodesSortKind read FSortKind write SetSortKind default nskNone;\r\n property TitleHorizontalTextAlign: TTMSFNCGraphicsTextAlign read FTitleHorizontalTextAlign write SetTitleHorizontalTextAlign default gtaLeading;\r\n property TitleVerticalTextAlign: TTMSFNCGraphicsTextAlign read FTitleVerticalTextAlign write SetTitleVerticalTextAlign default gtaCenter;\r\n property TitleWordWrapping: Boolean read FTitleWordWrapping write SetTitleWordWrapping default False;\r\n property TitleTrimming: TTMSFNCGraphicsTextTrimming read FTitleTrimming write SetTitleTrimming default gttNone;\r\n property TitleFont: TTMSFNCGraphicsFont read FTitleFont write SetTitleFont;\r\n property SelectedTitleFontColor: TTMSFNCGraphicsColor read FSelectedTitleFontColor write SetSelectedTitleFontColor default gcWhite;\r\n property DisabledTitleFontColor: TTMSFNCGraphicsColor read FDisabledTitleFontColor write SetDisabledTitleFontColor default gcSilver;\r\n property Expandable: Boolean read FExpandable write SetExpandable default False;\r\n property Expanded: Boolean read FExpanded write SetExpanded default True;\r\n property ExpandingButtonSize: Single read FExpandingButtonSize write SetExpandingButtonSize stored IsExpandingButtonSizeStored nodefault;\r\n published\r\n property EditorType: TTMSFNCTreeViewColumnEditorType read FEditorType write SetEditorType default tcetNone;\r\n property EditorItems: TStringList read FEditorItems write SetEditorItems;\r\n property CustomEditor: Boolean read FCustomEditor write FCustomEditor default False;\r\n\r\n property Name: String read FName write SetName;\r\n property Text: String read FText write SetText;\r\n property Tag: NativeInt read FTag write FTag default 0;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaLeading;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaCenter;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping default False;\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming default gttNone;\r\n property Width: Double read FWidth write SetWidth;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property UseDefaultAppearance: Boolean read FUseDefaultAppearance write SetUseDefaultAppearance default True;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property SelectedFontColor: TTMSFNCGraphicsColor read FSelectedFontColor write SetSelectedFontColor default gcWhite;\r\n property DisabledFontColor: TTMSFNCGraphicsColor read FDisabledFontColor write SetDisabledFontColor default gcSilver;\r\n\r\n property TopFill: TTMSFNCGraphicsFill read FTopFill write SetTopFill;\r\n property TopStroke: TTMSFNCGraphicsStroke read FTopStroke write SetTopStroke;\r\n property TopFont: TTMSFNCGraphicsFont read FTopFont write SetTopFont;\r\n\r\n property BottomFill: TTMSFNCGraphicsFill read FBottomFill write SetBottomFill;\r\n property BottomStroke: TTMSFNCGraphicsStroke read FBottomStroke write SetBottomStroke;\r\n property BottomFont: TTMSFNCGraphicsFont read FBottomFont write SetBottomFont;\r\n property Sorting: TTMSFNCTreeViewColumnSorting read FSorting write SetSorting default tcsNone;\r\n property Filtering: TTMSFNCTreeViewColumnFiltering read FFiltering write SetFiltering;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewColumns = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewColumns = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FTreeView: TTMSFNCTreeViewData;\r\n function GetItem(Index: Integer): TTMSFNCTreeViewColumn;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewColumn);\r\n protected\r\n function GetItemClass: TCollectionItemClass; virtual;\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n constructor Create(ATreeView: TTMSFNCTreeViewData);\r\n function Add: TTMSFNCTreeViewColumn; virtual;\r\n function Insert(Index: Integer): TTMSFNCTreeViewColumn;\r\n property Items[Index: Integer]: TTMSFNCTreeViewColumn read GetItem write SetItem; default;\r\n end;\r\n\r\n TTMSFNCTreeViewNodes = class;\r\n TTMSFNCTreeViewNodeCheckType = (tvntNone, tvntCheckBox, tvntRadioButton);\r\n\r\n TTMSFNCTreeViewNodeValue = class(TCollectionItem)\r\n private\r\n FTag: NativeInt;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FTreeView: TTMSFNCTreeViewData;\r\n FNode: TTMSFNCTreeViewNode;\r\n FText: String;\r\n FDBKey: String;\r\n FDataBoolean: Boolean;\r\n FCheckType: TTMSFNCTreeViewNodeCheckType;\r\n FChecked: Boolean;\r\n FCollapsedIcon: TTMSFNCBitmap;\r\n FCollapsedIconLarge: TTMSFNCBitmap;\r\n FExpandedIcon: TTMSFNCBitmap;\r\n FExpandedIconLarge: TTMSFNCBitmap;\r\n FCollapsedIconName: String;\r\n FCollapsedIconLargeName: String;\r\n FExpandedIconName: String;\r\n FExpandedIconLargeName: String;\r\n FDataPointer: Pointer;\r\n FTitle: String;\r\n FTitleExpanded: Boolean;\r\n procedure SetText(const Value: String);\r\n procedure UpdateNodeValue;\r\n procedure SetChecked(const Value: Boolean);\r\n procedure SetCheckType(const Value: TTMSFNCTreeViewNodeCheckType);\r\n procedure SetCollapsedIconLarge(const Value: TTMSFNCBitmap);\r\n procedure SetCollapsedIcon(const Value: TTMSFNCBitmap);\r\n procedure SetExpandedIconLarge(const Value: TTMSFNCBitmap);\r\n procedure SetExpandedIcon(const Value: TTMSFNCBitmap);\r\n procedure SetCollapsedIconLargeName(const Value: String);\r\n procedure SetCollapsedIconName(const Value: String);\r\n procedure SetExpandedIconLargeName(const Value: String);\r\n procedure SetExpandedIconName(const Value: String);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetTitle(const Value: String);\r\n procedure SetTitleExpanded(const Value: Boolean);\r\n protected\r\n procedure BitmapChanged(Sender: TObject);\r\n property Title: String read FTitle write SetTitle;\r\n property TitleExpanded: Boolean read FTitleExpanded write SetTitleExpanded default True;\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n function Node: TTMSFNCTreeViewNode;\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure AssignData(Source: TPersistent); virtual;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n published\r\n property Tag: NativeInt read FTag write FTag default 0;\r\n property Text: String read FText write SetText;\r\n property CollapsedIconName: String read FCollapsedIconName write SetCollapsedIconName;\r\n property CollapsedIconLargeName: String read FCollapsedIconLargeName write SetCollapsedIconLargeName;\r\n property ExpandedIconName: String read FExpandedIconName write SetExpandedIconName;\r\n property ExpandedIconLargeName: String read FExpandedIconLargeName write SetExpandedIconLargeName;\r\n\r\n property CollapsedIcon: TTMSFNCBitmap read FCollapsedIcon write SetCollapsedIcon;\r\n property CollapsedIconLarge: TTMSFNCBitmap read FCollapsedIconLarge write SetCollapsedIconLarge;\r\n property ExpandedIcon: TTMSFNCBitmap read FExpandedIcon write SetExpandedIcon;\r\n property ExpandedIconLarge: TTMSFNCBitmap read FExpandedIconLarge write SetExpandedIconLarge;\r\n property Checked: Boolean read FChecked write SetChecked default False;\r\n property CheckType: TTMSFNCTreeViewNodeCheckType read FCheckType write SetCheckType default tvntNone;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewNodeValues = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewNodeValues = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FTreeView: TTMSFNCTreeViewData;\r\n FNode: TTMSFNCTreeViewNode;\r\n function GetItem(Index: Integer): TTMSFNCTreeViewNodeValue;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewNodeValue);\r\n protected\r\n function GetItemClass: TCollectionItemClass; virtual;\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n function Node: TTMSFNCTreeViewNode;\r\n procedure UpdateChecked(AIndex: Integer; AValue: Boolean); virtual;\r\n constructor Create(ATreeView: TTMSFNCTreeViewData; ANode: TTMSFNCTreeViewNode);\r\n function Add: TTMSFNCTreeViewNodeValue;\r\n function Insert(Index: Integer): TTMSFNCTreeViewNodeValue;\r\n property Items[Index: Integer]: TTMSFNCTreeViewNodeValue read GetItem write SetItem; default;\r\n end;\r\n\r\n TTMSFNCTreeViewNodeTextValues = array of string;\r\n TTMSFNCTreeViewNodeCheckStates = array of Boolean;\r\n TTMSFNCTreeViewNodeCheckTypes = array of TTMSFNCTreeViewNodeCheckType;\r\n TTMSFNCTreeViewNodeIcons = array of TTMSFNCBitmap;\r\n TTMSFNCTreeViewNodeIconNames = array of string;\r\n\r\n TTMSFNCTreeViewNode = class(TCollectionItem)\r\n private\r\n FTag: NativeInt;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FTreeView: TTMSFNCTreeViewData;\r\n FValues: TTMSFNCTreeViewNodeValues;\r\n FDBKey: String;\r\n FDataBoolean: Boolean;\r\n FNodes: TTMSFNCTreeViewNodes;\r\n FVirtualNode: TTMSFNCTreeViewVirtualNode;\r\n FExpanded: Boolean;\r\n FEnabled: Boolean;\r\n FExtended: Boolean;\r\n FDataPointer: Pointer;\r\n procedure SetValues(const Value: TTMSFNCTreeViewNodeValues);\r\n procedure SetNodes(const Value: TTMSFNCTreeViewNodes);\r\n procedure SetExpanded(const Value: Boolean);\r\n procedure SetEnabled(const Value: Boolean);\r\n procedure SetExtended(const Value: Boolean);\r\n function GetChecked(AColumn: integer): Boolean;\r\n procedure SetChecked(AColumn: integer; const Value: Boolean);\r\n function GetCheckType(AColumn: Integer): TTMSFNCTreeViewNodeCheckType;\r\n function GetCollapsedIcon(AColumn: Integer;\r\n ALarge: Boolean): TTMSFNCBitmap;\r\n function GetCollapsedIconName(AColumn: Integer;\r\n ALarge: Boolean): String;\r\n function GetExpandedIcon(AColumn: Integer;\r\n ALarge: Boolean): TTMSFNCBitmap;\r\n function GetExpandedIconName(AColumn: Integer;\r\n ALarge: Boolean): String;\r\n function GetText(AColumn: Integer): String;\r\n procedure SetCheckType(AColumn: Integer;\r\n const Value: TTMSFNCTreeViewNodeCheckType);\r\n procedure SetCollapsedIcon(AColumn: Integer; ALarge: Boolean;\r\n const Value: TTMSFNCBitmap);\r\n procedure SetCollapsedIconName(AColumn: Integer; ALarge: Boolean;\r\n const Value: String);\r\n procedure SetExpandedIcon(AColumn: Integer; ALarge: Boolean;\r\n const Value: TTMSFNCBitmap);\r\n procedure SetExpandedIconName(AColumn: Integer; ALarge: Boolean;\r\n const Value: String);\r\n procedure SetText(AColumn: Integer; const Value: String);\r\n function GetStrippedHTMLText(AColumn: Integer): String;\r\n protected\r\n procedure UpdateNode;\r\n function GetValueForColumn(AColumn: Integer): TTMSFNCTreeViewNodeValue; virtual;\r\n function CreateNodes: TTMSFNCTreeViewNodes; virtual;\r\n function CreateNodeValues: TTMSFNCTreeViewNodeValues; virtual;\r\n procedure SetIndex(Value: Integer); override;\r\n procedure ValuesChanged(Sender: TObject);\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n function GetParent: TTMSFNCTreeViewNode; virtual;\r\n function GetChildCount: Integer; virtual;\r\n function GetPrevious: TTMSFNCTreeViewNode; virtual;\r\n function GetNext: TTMSFNCTreeViewNode; virtual;\r\n function GetPreviousChild(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetNextChild(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetNextSibling: TTMSFNCTreeViewNode; virtual;\r\n function GetPreviousSibling: TTMSFNCTreeViewNode; virtual;\r\n function GetFirstChild: TTMSFNCTreeViewNode; virtual;\r\n function GetLastChild: TTMSFNCTreeViewNode; virtual;\r\n function SaveToString(ATextOnly: Boolean = True): String; virtual;\r\n procedure LoadFromString(AString: String); virtual;\r\n procedure RemoveChildren; virtual;\r\n procedure Expand(ARecurse: Boolean = False); virtual;\r\n procedure Collapse(ARecurse: Boolean = False); virtual;\r\n procedure MoveTo(ADestination: TTMSFNCTreeViewNode; AIndex: Integer = -1); virtual;\r\n procedure CopyTo(ADestination: TTMSFNCTreeViewNode; AIndex: Integer = -1); virtual;\r\n procedure SetTextValues(ATextValues: TTMSFNCTreeViewNodeTextValues); virtual;\r\n procedure SetCheckStates(ACheckStates: TTMSFNCTreeViewNodeCheckStates); virtual;\r\n procedure SetCheckTypes(ACheckTypes: TTMSFNCTreeViewNodeCheckTypes); virtual;\r\n procedure SetCollapsedIcons(AIcons: TTMSFNCTreeViewNodeIcons; ALarge: Boolean = False); virtual;\r\n procedure SetExpandedIcons(AIcons: TTMSFNCTreeViewNodeIcons; ALarge: Boolean = False); virtual;\r\n procedure SetCollapsedIconNames(AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean = False); virtual;\r\n procedure SetExpandedIconNames(AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean = False); virtual;\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure AssignData(Source: TPersistent); virtual;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n property Checked[AColumn: Integer]: Boolean read GetChecked write SetChecked;\r\n property Text[AColumn: Integer]: String read GetText write SetText;\r\n property StrippedHTMLText[AColumn: Integer]: String read GetStrippedHTMLText;\r\n property CheckTypes[AColumn: Integer]: TTMSFNCTreeViewNodeCheckType read GetCheckType write SetCheckType;\r\n property ExpandedIcons[AColumn: Integer; ALarge: Boolean]: TTMSFNCBitmap read GetExpandedIcon write SetExpandedIcon;\r\n property CollapsedIcons[AColumn: Integer; ALarge: Boolean]: TTMSFNCBitmap read GetCollapsedIcon write SetCollapsedIcon;\r\n property ExpandedIconNames[AColumn: Integer; ALarge: Boolean]: String read GetExpandedIconName write SetExpandedIconName;\r\n property CollapsedIconNames[AColumn: Integer; ALarge: Boolean]: String read GetCollapsedIconName write SetCollapsedIconName;\r\n property VirtualNode: TTMSFNCTreeViewVirtualNode read FVirtualNode;\r\n published\r\n property Values: TTMSFNCTreeViewNodeValues read FValues write SetValues;\r\n property Expanded: Boolean read FExpanded write SetExpanded default False;\r\n property Enabled: Boolean read FEnabled write SetEnabled default True;\r\n property Extended: Boolean read FExtended write SetExtended default False;\r\n property Tag: NativeInt read FTag write FTag;\r\n property Nodes: TTMSFNCTreeViewNodes read FNodes write SetNodes;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewNodes = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewNodes = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FTreeView: TTMSFNCTreeViewData;\r\n FNode: TTMSFNCTreeViewNode;\r\n function GetItem(Index: Integer): TTMSFNCTreeViewNode;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewNode);\r\n protected\r\n function GetItemClass: TCollectionItemClass; virtual;\r\n function Compare(ANode1, ANode2: TTMSFNCTreeViewNode; AColumn: Integer = 0; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending): Integer; virtual;\r\n procedure QuickSort(L, R: Integer; AColumn: Integer = 0; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending); virtual;\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n function Node: TTMSFNCTreeViewNode;\r\n constructor Create(ATreeView: TTMSFNCTreeViewData; ANode: TTMSFNCTreeViewNode);\r\n destructor Destroy; override;\r\n function Add: TTMSFNCTreeViewNode;\r\n function Insert(Index: Integer): TTMSFNCTreeViewNode;\r\n property Items[Index: Integer]: TTMSFNCTreeViewNode read GetItem write SetItem; default;\r\n procedure Sort(AColumn: Integer = 0; ARecurse: Boolean = False; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending; AClearNodeList: Boolean = True);\r\n end;\r\n\r\n TTMSFNCTreeViewGroup = class(TCollectionItem)\r\n private\r\n FTag: NativeInt;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FTreeView: TTMSFNCTreeViewData;\r\n FText: String;\r\n FStartColumn: Integer;\r\n FEndColumn: Integer;\r\n FName: String;\r\n FDBKey: String;\r\n FDataBoolean: Boolean;\r\n FBottomFill: TTMSFNCGraphicsFill;\r\n FBottomStroke: TTMSFNCGraphicsStroke;\r\n FTopFill: TTMSFNCGraphicsFill;\r\n FTopStroke: TTMSFNCGraphicsStroke;\r\n FTopFont: TTMSFNCGraphicsFont;\r\n FBottomFont: TTMSFNCGraphicsFont;\r\n FUseDefaultAppearance: Boolean;\r\n FDataPointer: Pointer;\r\n procedure SetText(const Value: String);\r\n procedure SetStartColumn(const Value: Integer);\r\n procedure SetEndColumn(const Value: Integer);\r\n procedure SetName(const Value: String);\r\n procedure SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetBottomStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetTopFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetTopStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetTopFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetUseDefaultAppearance(const Value: Boolean);\r\n protected\r\n procedure UpdateGroup;\r\n procedure Changed(Sender: TObject);\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n function GetText: String; virtual;\r\n published\r\n property Name: String read FName write SetName;\r\n property Text: String read FText write SetText;\r\n property StartColumn: Integer read FStartColumn write SetStartColumn default 0;\r\n property EndColumn: Integer read FEndColumn write SetEndColumn default 0;\r\n property Tag: NativeInt read FTag write FTag default 0;\r\n property UseDefaultAppearance: Boolean read FUseDefaultAppearance write SetUseDefaultAppearance default True;\r\n\r\n property TopFill: TTMSFNCGraphicsFill read FTopFill write SetTopFill;\r\n property TopStroke: TTMSFNCGraphicsStroke read FTopStroke write SetTopStroke;\r\n property TopFont: TTMSFNCGraphicsFont read FTopFont write SetTopFont;\r\n\r\n property BottomFill: TTMSFNCGraphicsFill read FBottomFill write SetBottomFill;\r\n property BottomStroke: TTMSFNCGraphicsStroke read FBottomStroke write SetBottomStroke;\r\n property BottomFont: TTMSFNCGraphicsFont read FBottomFont write SetBottomFont;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewGroups = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewGroups = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FTreeView: TTMSFNCTreeViewData;\r\n function GetItem(Index: Integer): TTMSFNCTreeViewGroup;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewGroup);\r\n protected\r\n function GetItemClass: TCollectionItemClass; virtual;\r\n public\r\n function TreeView: TTMSFNCTreeViewData;\r\n constructor Create(ATreeView: TTMSFNCTreeViewData);\r\n function Add: TTMSFNCTreeViewGroup;\r\n function Insert(Index: Integer): TTMSFNCTreeViewGroup;\r\n property Items[Index: Integer]: TTMSFNCTreeViewGroup read GetItem write SetItem; default;\r\n end;\r\n\r\n TTMSFNCTreeViewNodeTextMode = (tntmDrawing, tntmEditing);\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewNodeStructure = class(TObjectList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewVirtualNode read GetItem write SetItem; default;\r\n end;\r\n TTMSFNCTreeViewVisibleNodes = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewVirtualNode read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewNodeStructure = class(TObjectList);\r\n TTMSFNCTreeViewVisibleNodes = class(TList);\r\n {$ENDIF}\r\n\r\n TTMSFNCTreeViewDisplayGroup = record\r\n StartColumn: Integer;\r\n EndColumn: Integer;\r\n {$IFDEF LCLLIB}\r\n class operator = (z1, z2 : TTMSFNCTreeViewDisplayGroup) b : boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewDisplayGroups = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewDisplayGroup;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewDisplayGroup);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewDisplayGroup read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewDisplayGroups = class(TList);\r\n {$ENDIF}\r\n\r\n {$IFDEF FNCLIB}\r\n TTMSFNCTreeViewData = class(TTMSFNCTreeViewBase, ITMSFNCBitmapContainer)\r\n {$ENDIF}\r\n {$IFNDEF FNCLIB}\r\n TTMSFNCTreeViewData = class(TTMSFNCTreeViewBase)\r\n {$ENDIF}\r\n private\r\n FFilterApplied: Boolean;\r\n FBlockUpdate: Boolean;\r\n FNodeStructure: TTMSFNCTreeViewNodeStructure;\r\n FVisibleNodes: TTMSFNCTreeViewVisibleNodes;\r\n FColumns: TTMSFNCTreeViewColumns;\r\n FGroups: TTMSFNCTreeViewGroups;\r\n FNodes: TTMSFNCTreeViewNodes;\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n FDisplayGroups: TTMSFNCTreeViewDisplayGroups;\r\n FFilter: TTMSFNCTreeViewFilter;\r\n procedure SetColumns(const Value: TTMSFNCTreeViewColumns);\r\n procedure SetGroups(const Value: TTMSFNCTreeViewGroups);\r\n procedure SetNodes(const Value: TTMSFNCTreeViewNodes);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n protected\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n function CreateColumns: TTMSFNCTreeViewColumns; virtual;\r\n function CreateGroups: TTMSFNCTreeViewGroups; virtual;\r\n function CreateNodes: TTMSFNCTreeViewNodes; virtual;\r\n function GetInsertPosition(ANode: TTMSFNCTreeViewVirtualNode; ARoot: Boolean; AInsert: Boolean): Integer; virtual;\r\n function GetNodeFromNodeStructure(AIndex: Integer): TTMSFNCTreeViewVirtualNode; virtual;\r\n function MatchFilter(ANode: TTMSFNCTreeViewVirtualNode): Boolean; virtual;\r\n procedure BuildNodeList; virtual;\r\n procedure UpdateColumns; override;\r\n procedure BuildInternalNodeList(ANode: TTMSFNCTreeViewVirtualNode; AID: String; AParentNode: Integer; ANodeIndex: Integer; ALevel: Integer; AParentExpanded: Boolean; var ATotalChildren: Integer);\r\n procedure GetNodeForNodeData(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoGetNumberOfNodes(ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer); virtual;\r\n procedure DoGetColumnTrimming({%H-}AColumn: Integer; {%H-}AKind: TTMSFNCTreeViewCacheItemKind; var {%H-}ATrimming: TTMSFNCGraphicsTextTrimming); virtual;\r\n procedure DoGetColumnHorizontalTextAlign({%H-}AColumn: Integer; {%H-}AKind: TTMSFNCTreeViewCacheItemKind; var {%H-}AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetColumnVerticalTextAlign({%H-}AColumn: Integer; {%H-}AKind: TTMSFNCTreeViewCacheItemKind; var {%H-}AVerticalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetColumnWordWrapping({%H-}AColumn: Integer; {%H-}AKind: TTMSFNCTreeViewCacheItemKind; var {%H-}AWordWrapping: Boolean); virtual;\r\n procedure DoGetNodeSides({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}ASides: TTMSFNCGraphicsSides); virtual;\r\n procedure DoGetNodeText({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}AMode: TTMSFNCTreeViewNodeTextMode; var {%H-}AText: String); virtual;\r\n procedure DoGetNodeTitle({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}AMode: TTMSFNCTreeViewNodeTextMode; var {%H-}ATitle: String); virtual;\r\n procedure DoGetNodeTitleExpanded({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AExpanded: Boolean); virtual;\r\n procedure DoGetNodeTrimming({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATrimming: TTMSFNCGraphicsTextTrimming); virtual;\r\n procedure DoGetNodeHorizontalTextAlign({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeVerticalTextAlign({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AVerticalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeWordWrapping({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AWordWrapping: Boolean); virtual;\r\n procedure DoGetNodeTitleTrimming({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATrimming: TTMSFNCGraphicsTextTrimming); virtual;\r\n procedure DoGetNodeTitleHorizontalTextAlign({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeTitleVerticalTextAlign({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AVerticalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeTitleWordWrapping({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AWordWrapping: Boolean); virtual;\r\n procedure DoGetNodeExtraSize({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AExtraSize: Single); virtual;\r\n procedure DoGetNodeTitleExtraSize({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATitleExtraSize: Single); virtual;\r\n procedure DoGetNodeCheckType({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ACheckType: TTMSFNCTreeViewNodeCheckType); virtual;\r\n procedure DoGetNodeIcon({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}ALarge: Boolean; var {%H-}AIcon: TTMSFNCBitmap); virtual;\r\n procedure DoGetNodeSelectedColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeDisabledColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeSelectedTextColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATextColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeDisabledTextColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATextColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeSelectedTitleColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATitleColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeDisabledTitleColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATitleColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeTextColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATextColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeTitleColor({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}ATitleColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoIsNodeExpanded({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AExpanded: Boolean); virtual;\r\n procedure DoIsNodeExtended({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AExtended: Boolean); virtual;\r\n procedure DoIsNodeChecked({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AChecked: Boolean); virtual;\r\n procedure DoIsNodeVisible({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AVisible: Boolean); virtual;\r\n procedure DoIsNodeEnabled({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AEnabled: Boolean); virtual;\r\n procedure DoNodeCompare({%H-}ANode1, {%H-}ANode2: TTMSFNCTreeViewNode; {%H-}AColumn: Integer; var {%H-}ACompareResult: Integer); virtual;\r\n procedure ToggleCheckNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n procedure CheckNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n procedure UpdateCheckState({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}AChecked: Boolean); virtual;\r\n procedure UnCheckNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n procedure ExpandNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False); virtual;\r\n procedure CollapseNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False); virtual;\r\n function RemoveNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AUpdateNodes: Boolean = True): TTMSFNCTreeViewVirtualNodeRemoveData; virtual;\r\n procedure UpdateNodesInternal(ANodeRemoveData: TTMSFNCTreeViewVirtualNodeRemoveData); virtual;\r\n procedure InsertNodeInternal(AParentNode: TTMSFNCTreeViewVirtualNode; AIndex, AInsertIndex: Integer; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure UpdateVisibleNodes(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure ToggleNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False); virtual;\r\n procedure InsertItemInternal(AItem: TTMSFNCTreeViewNode); virtual;\r\n function IsVariableNodeHeight: Boolean; virtual; abstract;\r\n function RemoveItemInternal(AItem: TTMSFNCTreeViewNode; AUpdate: Boolean = True): TTMSFNCTreeViewVirtualNodeRemoveData; virtual;\r\n function GetNodesSpacing: Single; virtual;\r\n procedure ToggleNode(ANode: TTMSFNCTreeViewNode); virtual;\r\n procedure UpdateNodeCalculated(ANode: TTMSFNCTreeViewVirtualNode; ACalculated: Boolean); virtual;\r\n procedure UpdateNodeHeight(ANode: TTMSFNCTreeViewVirtualNode; AHeight: Double); virtual;\r\n procedure UpdateNodeTitleHeight(ANode: TTMSFNCTreeViewVirtualNode; AHeight: Double); virtual;\r\n procedure UpdateNodeCheckStates(ANode: TTMSFNCTreeViewVirtualNode; ACheckStates: TTMSFNCArrayBoolean); virtual;\r\n procedure UpdateNodeBitmapRects(ANode: TTMSFNCTreeViewVirtualNode; ABitmapRects: TTMSFNCArrayTRectF); virtual;\r\n procedure UpdateNodeCheckRects(ANode: TTMSFNCTreeViewVirtualNode; ACheckRects: TTMSFNCArrayTRectF); virtual;\r\n procedure UpdateNodeExpandRects(ANode: TTMSFNCTreeViewVirtualNode; AExpandRects: TTMSFNCArrayTRectF); virtual;\r\n procedure UpdateNodeTextRects(ANode: TTMSFNCTreeViewVirtualNode; ATextRects: TTMSFNCArrayTRectF); virtual;\r\n procedure UpdateNodeTitleRects(ANode: TTMSFNCTreeViewVirtualNode; ATitleRects: TTMSFNCArrayTRectF); virtual;\r\n procedure UpdateNodeExtraRects(ANode: TTMSFNCTreeViewVirtualNode; AExtraRects: TTMSFNCArrayTRectF); virtual;\r\n procedure UpdateNodeTitleExtraRects(ANode: TTMSFNCTreeViewVirtualNode; ATitleExtraRects: TTMSFNCArrayTRectF); virtual;\r\n procedure UpdateNodeCacheReference(ANode: TTMSFNCTreeViewVirtualNode; ACache: TTMSFNCTreeViewCacheItem); virtual;\r\n procedure UpdateNodeExpanded(ANode: TTMSFNCTreeViewVirtualNode; AExpanded: Boolean); virtual;\r\n procedure UpdateNodeExtended(ANode: TTMSFNCTreeViewVirtualNode; AExtended: Boolean); virtual;\r\n procedure UpdateNodeTotalChildren(ANode: TTMSFNCTreeViewVirtualNode; ATotalChildren: Integer); virtual;\r\n procedure UpdateNodeChildren(ANode: TTMSFNCTreeViewVirtualNode; AChildren: Integer); virtual;\r\n procedure UpdateNodeIndex(ANode: TTMSFNCTreeViewVirtualNode; AIndex: Integer); virtual;\r\n procedure UpdateNodeRow(ANode: TTMSFNCTreeViewVirtualNode; ARow: Integer); virtual;\r\n procedure UpdateNodeLevel(ANode: TTMSFNCTreeViewVirtualNode; ALevel: Integer); virtual;\r\n procedure UpdateNodeParentNode(ANode: TTMSFNCTreeViewVirtualNode; AParentNode: Integer); virtual;\r\n procedure UpdateNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure CustomizeScrollPosition({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}APosition, {%H-}ATopPosition: Double); virtual;\r\n property Columns: TTMSFNCTreeViewColumns read FColumns write SetColumns;\r\n property Groups: TTMSFNCTreeViewGroups read FGroups write SetGroups;\r\n property Nodes: TTMSFNCTreeViewNodes read FNodes write SetNodes;\r\n property DisplayGroups: TTMSFNCTreeViewDisplayGroups read FDisplayGroups;\r\n property BlockUpdate: Boolean read FBlockUpdate write FBlockUpdate;\r\n property NodeStructure: TTMSFNCTreeViewNodeStructure read FNodeStructure;\r\n property VisibleNodes: TTMSFNCTreeViewVisibleNodes read FVisibleNodes;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function IsColumnVisible(ACol: Integer): Boolean; override;\r\n function FindColumnByName(AName: String): TTMSFNCTreeViewColumn; virtual;\r\n function FindGroupByName(AName: String): TTMSFNCTreeViewGroup; virtual;\r\n function FindColumnIndexByName(AName: String): Integer; virtual;\r\n function FindGroupIndexByName(AName: String): Integer; virtual;\r\n\r\n procedure ClearColumns; virtual;\r\n procedure ClearNodes; virtual;\r\n procedure ClearNodeList; virtual;\r\n procedure RemoveNodeFromSelection(ANode: TTMSFNCTreeViewVirtualNode); virtual; abstract;\r\n procedure RemoveVirtualNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure RemoveNode(ANode: TTMSFNCTreeViewNode); virtual;\r\n procedure ExpandNode(ANode: TTMSFNCTreeViewNode; ARecurse: Boolean = False); virtual;\r\n procedure MoveNode(ANode: TTMSFNCTreeViewNode; ADestinationNode: TTMSFNCTreeViewNode; AIndex: Integer = -1); virtual;\r\n procedure CopyNode(ANode: TTMSFNCTreeViewNode; ADestinationNode: TTMSFNCTreeViewNode; AIndex: Integer = -1); virtual;\r\n procedure ExpandAll; virtual;\r\n procedure CollapseAll; virtual;\r\n procedure ExpandAllVirtual; virtual;\r\n procedure CollapseAllVirtual; virtual;\r\n procedure ApplyFilter; virtual;\r\n procedure RemoveFilter; virtual;\r\n procedure RemoveFilters; virtual;\r\n procedure CollapseNode(ANode: TTMSFNCTreeViewNode; ARecurse: Boolean = False); virtual;\r\n procedure ToggleVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False); virtual;\r\n procedure ExpandVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False); virtual;\r\n procedure CollapseVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False); virtual;\r\n procedure CheckNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n procedure UnCheckNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n procedure ToggleCheckNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n\r\n procedure CheckVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n procedure UnCheckVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n procedure ToggleCheckVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False); virtual;\r\n\r\n procedure SetNodeTextValues(ANode: TTMSFNCTreeViewNode; ATextValues: TTMSFNCTreeViewNodeTextValues); virtual;\r\n procedure SetNodeCheckStates(ANode: TTMSFNCTreeViewNode; ACheckStates: TTMSFNCTreeViewNodeCheckStates); virtual;\r\n procedure SetNodeCheckTypes(ANode: TTMSFNCTreeViewNode; ACheckTypes: TTMSFNCTreeViewNodeCheckTypes); virtual;\r\n procedure SetNodeCollapsedIcons(ANode: TTMSFNCTreeViewNode; AIcons: TTMSFNCTreeViewNodeIcons; ALarge: Boolean = False); virtual;\r\n procedure SetNodeExpandedIcons(ANode: TTMSFNCTreeViewNode; AIcons: TTMSFNCTreeViewNodeIcons; ALarge: Boolean = False); virtual;\r\n procedure SetNodeCollapsedIconNames(ANode: TTMSFNCTreeViewNode; AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean = False); virtual;\r\n procedure SetNodeExpandedIconNames(ANode: TTMSFNCTreeViewNode; AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean = False); virtual;\r\n\r\n procedure RemoveVirtualNodeChildren(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure RemoveNodeChildren(ANode: TTMSFNCTreeViewNode); virtual;\r\n procedure ScrollToNode(ANode: TTMSFNCTreeViewNode; AScrollIfNotVisible: Boolean = False; AScrollPosition: TTMSFNCTreeViewNodeScrollPosition = tvnspTop; AForceScroll: Boolean = False); virtual;\r\n procedure ScrollToVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AScrollIfNotVisible: Boolean = False; AScrollPosition: TTMSFNCTreeViewNodeScrollPosition = tvnspTop; AForceScroll: Boolean = False); virtual;\r\n procedure ScrollToVirtualNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AScrollIfNotVisible: Boolean = False; AScrollPosition: TTMSFNCTreeViewNodeScrollPosition = tvnspTop; AForceScroll: Boolean = False); virtual;\r\n procedure ScrollToVirtualNodeRow(ARow: Integer; AScrollIfNotVisible: Boolean = False; AScrollPosition: TTMSFNCTreeViewNodeScrollPosition = tvnspTop; AForceScroll: Boolean = False); virtual;\r\n\r\n function GetNodeForRow(ARow: Integer): TTMSFNCTreeViewVirtualNode; virtual;\r\n function AddNode(AParentNode: TTMSFNCTreeViewNode = nil): TTMSFNCTreeViewNode; virtual;\r\n function AddVirtualNode(AParentNode: TTMSFNCTreeViewVirtualNode = nil): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetParentVirtualNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetParentNode(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetVirtualNodeChildCount(ANode: TTMSFNCTreeViewVirtualNode): Integer; virtual;\r\n function GetTotalVirtualNodeCount: Integer; virtual;\r\n function GetTotalNodeCount: Integer; virtual;\r\n function GetNodeText(ANode: TTMSFNCTreeViewNode; AColumn: Integer): string; virtual;\r\n function GetVirtualNodeText(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): string; virtual;\r\n function GetNodeTitle(ANode: TTMSFNCTreeViewNode; AColumn: Integer): string; virtual;\r\n function GetVirtualNodeTitle(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): string; virtual;\r\n function GetVirtualNodeTitleExpanded(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): Boolean; virtual;\r\n function FindVirtualNodeByRow(ARow: Integer): TTMSFNCTreeViewVirtualNode; virtual;\r\n function FindNodeByRow(ARow: Integer): TTMSFNCTreeViewNode; virtual;\r\n function FindVirtualNodeByDBKey(ADBKey: String): TTMSFNCTreeViewVirtualNode; virtual;\r\n function FindNodeByDBKey(ADBKey: String): TTMSFNCTreeViewNode; virtual;\r\n function FindVirtualNodeByTextAndColumn(AText: string; AColumn: Integer; ARecurse: Boolean = False; ACaseSensitive: Boolean = True): TTMSFNCTreeViewVirtualNode; virtual;\r\n function FindNodeByTextAndColumn(AText: string; AColumn: Integer; ARecurse: Boolean = False; ACaseSensitive: Boolean = True): TTMSFNCTreeViewNode; virtual;\r\n function GetNodeChildCount(ANode: TTMSFNCTreeViewNode): Integer; virtual;\r\n function GetPreviousNode(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetNextNode(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetPreviousChildNode(ANode: TTMSFNCTreeViewNode; AStartNode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetNextChildNode(ANode: TTMSFNCTreeViewNode; AStartNode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetNextSiblingNode(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetPreviousSiblingNode(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetFirstChildNode(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n function GetLastChildNode(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode; virtual;\r\n\r\n function GetPreviousVirtualNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetNextVirtualNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetPreviousChildVirtualNode({%H-}ANode: TTMSFNCTreeViewVirtualNode; AStartNode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetNextChildVirtualNode({%H-}ANode: TTMSFNCTreeViewVirtualNode; AStartNode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetNextSiblingVirtualNode({%H-}ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetPreviousSiblingVirtualNode({%H-}ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetFirstChildVirtualNode({%H-}ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetLastChildVirtualNode({%H-}ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n\r\n function GetFirstRootNode: TTMSFNCTreeViewNode; virtual;\r\n function GetLastRootNode: TTMSFNCTreeViewNode; virtual;\r\n function GetLastNode: TTMSFNCTreeViewNode; virtual;\r\n function GetFirstRootVirtualNode: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetLastRootVirtualNode: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetLastVirtualNode: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetRootNodeByIndex(AIndex: Integer): TTMSFNCTreeViewNode; virtual;\r\n function GetRootVirtualNodeByIndex(AIndex: Integer): TTMSFNCTreeViewVirtualNode; virtual;\r\n\r\n function InsertNode(AIndex: Integer; AParentNode: TTMSFNCTreeViewNode = nil): TTMSFNCTreeViewNode; virtual;\r\n function InsertVirtualNode(AIndex: Integer; AParentNode: TTMSFNCTreeViewVirtualNode = nil): TTMSFNCTreeViewVirtualNode; virtual;\r\n\r\n property Filter: TTMSFNCTreeViewFilter read FFilter;\r\n end;\r\n\r\nfunction TranslateTextEx(AText: String): String;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, Math, WEBLib.TMSFNCUtils, WEBLib.Graphics\r\n {$IFDEF FMXLIB}\r\n , FMX.Types\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,AnsiStrings\r\n {$ENDIF}\r\n ;\r\n\r\nfunction TranslateTextEx(AText: String): String;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := TranslateText(AText);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := AText;\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF LCLLIB}\r\nclass operator TTMSFNCTreeViewDisplayGroup.=(z1, z2: TTMSFNCTreeViewDisplayGroup)b: boolean;\r\nbegin\r\n Result := z1 = z2;\r\nend;\r\n{$ENDIF}\r\n\r\ntype\r\n {$HINTS OFF}\r\n TShadowedCollection = class(TPersistent)\r\n private\r\n {%H-}FItemClass: TCollectionItemClass;\r\n {$IFDEF LCLWEBLIB}\r\n FItems: TFPList;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n FItems: TList;\r\n {$ENDIF}\r\n end;\r\n {$HINTS ON}\r\n\r\n{ TTMSFNCTreeViewData }\r\n\r\nprocedure TTMSFNCTreeViewData.RemoveVirtualNode(ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n RemoveNodeInternal(ANode);\r\nend; \r\n\r\nprocedure TTMSFNCTreeViewData.ToggleCheckNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer; ARecurse: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n ToggleCheckNodeInternal(ANode.VirtualNode, AColumn, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CheckNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer; ARecurse: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n CheckNodeInternal(ANode.VirtualNode, AColumn, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UnCheckNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer; ARecurse: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n UnCheckNodeInternal(ANode.VirtualNode, AColumn, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ToggleCheckVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False);\r\nbegin\r\n ToggleCheckNodeInternal(ANode, AColumn, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CheckVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False);\r\nbegin\r\n CheckNodeInternal(ANode, AColumn, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UnCheckVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False);\r\nbegin\r\n UnCheckNodeInternal(ANode, AColumn, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CollapseAll;\r\n procedure CollapseNodes(n: TTMSFNCTreeViewNodes);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to n.Count - 1 do\r\n begin\r\n n[I].FExpanded := False;\r\n CollapseNodes(n[I].Nodes);\r\n end;\r\n end;\r\nbegin\r\n CollapseNodes(Nodes);\r\n CollapseAllVirtual;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CollapseAllVirtual;\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n VisibleNodes.Clear;\r\n TotalRowHeight := 1;\r\n RowCount := 0;\r\n for I := 0 to NodeStructure.Count - 1 do\r\n begin\r\n v := GetNodeFromNodeStructure(I);\r\n if Assigned(v) then\r\n begin\r\n UpdateNodeExpanded(v, False);\r\n if v.ParentNode = -1 then\r\n begin\r\n VisibleNodes.Add(v);\r\n TotalRowHeight := TotalRowHeight + v.Height;\r\n RowCount := RowCount + 1;\r\n end;\r\n end;\r\n end;\r\n\r\n ResetNodes;\r\n UpdateTreeView;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CollapseNode(ANode: TTMSFNCTreeViewNode; ARecurse: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n CollapseVirtualNode(ANode.VirtualNode, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ToggleNode(ANode: TTMSFNCTreeViewNode);\r\nbegin\r\n if Assigned(ANode) then\r\n ToggleVirtualNode(ANode.VirtualNode);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ExpandAll;\r\n procedure ExpandNodes(n: TTMSFNCTreeViewNodes);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to n.Count - 1 do\r\n begin\r\n n[I].FExpanded := True;\r\n ExpandNodes(n[I].Nodes);\r\n end;\r\n end;\r\nbegin\r\n ExpandNodes(Nodes);\r\n ExpandAllVirtual;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ExpandAllVirtual;\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n VisibleNodes.Clear;\r\n TotalRowHeight := 1;\r\n RowCount := 0;\r\n for I := 0 to NodeStructure.Count - 1 do\r\n begin\r\n v := GetNodeFromNodeStructure(I);\r\n if Assigned(v) then\r\n begin\r\n UpdateNodeExpanded(v, True);\r\n VisibleNodes.Add(v);\r\n TotalRowHeight := TotalRowHeight + v.Height;\r\n RowCount := RowCount + 1;\r\n end;\r\n end;\r\n\r\n ResetNodes;\r\n UpdateTreeView;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ExpandNode(ANode: TTMSFNCTreeViewNode; ARecurse: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n ExpandVirtualNode(ANode.VirtualNode, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CollapseVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False);\r\nbegin\r\n CollapseNodeInternal(ANode, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CopyNode(ANode,\r\n ADestinationNode: TTMSFNCTreeViewNode; AIndex: Integer);\r\nvar\r\n n, nw: TTMSFNCTreeViewNode;\r\nbegin\r\n if ADestinationNode <> ANode then\r\n begin\r\n BeginUpdate;\r\n n := TTMSFNCTreeViewNode.Create(nil);\r\n n.Assign(ANode);\r\n\r\n if Assigned(ADestinationNode) then\r\n nw := ADestinationNode.Nodes.Add\r\n else\r\n nw := Nodes.Add;\r\n\r\n nw.Assign(n);\r\n n.Free;\r\n\r\n if Assigned(ADestinationNode) then\r\n begin\r\n if (AIndex >= 0) and (AIndex <= ADestinationNode.Nodes.Count - 1) then\r\n nw.Index := AIndex;\r\n end\r\n else\r\n begin\r\n if (AIndex >= 0) and (AIndex <= Nodes.Count - 1) then\r\n nw.Index := AIndex;\r\n end;\r\n\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ToggleVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False);\r\nbegin\r\n ToggleNodeInternal(ANode, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ExpandVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False);\r\nbegin\r\n ExpandNodeInternal(ANode, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCTreeViewData then\r\n begin\r\n FColumns.Assign((Source as TTMSFNCTreeViewData).Columns);\r\n FGroups.Assign((Source as TTMSFNCTreeViewData).Groups);\r\n FNodes.Assign((Source as TTMSFNCTreeViewData).Nodes);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ClearColumns;\r\nbegin\r\n BeginUpdate;\r\n Columns.Clear;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ClearNodeList;\r\nbegin\r\n BeginUpdate;\r\n NodeListBuild := False;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ClearNodes;\r\nbegin\r\n BeginUpdate;\r\n NodeListBuild := False;\r\n Nodes.Clear;\r\n EndUpdate;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewData.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FFilter := TTMSFNCTreeViewFilter.Create(Self);\r\n FNodeStructure := TTMSFNCTreeViewNodeStructure.Create;\r\n FVisibleNodes := TTMSFNCTreeViewVisibleNodes.Create;\r\n FDisplayGroups := TTMSFNCTreeViewDisplayGroups.Create;\r\n\r\n FNodes := CreateNodes;\r\n FColumns := CreateColumns;\r\n FGroups := CreateGroups;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.CreateGroups: TTMSFNCTreeViewGroups;\r\nbegin\r\n Result := TTMSFNCTreeViewGroups.Create(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNodeFromNodeStructure(AIndex: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if (AIndex >= 0) and (AIndex <= NodeStructure.Count - 1) then\r\n Result := NodeStructure[AIndex];\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNodesSpacing: Single;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNodeText(ANode: TTMSFNCTreeViewNode;\r\n AColumn: Integer): string;\r\nbegin\r\n Result := GetVirtualNodeText(ANode.VirtualNode, AColumn);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNodeTitle(ANode: TTMSFNCTreeViewNode;\r\n AColumn: Integer): string;\r\nbegin\r\n Result := GetVirtualNodeTitle(ANode.VirtualNode, AColumn);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetParentNode(\r\n ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n begin\r\n v := GetParentVirtualNode(ANode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetPreviousChildNode(\r\n ANode: TTMSFNCTreeViewNode; AStartNode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) and Assigned(AStartNode) then\r\n begin\r\n v := GetPreviousChildVirtualNode(ANode.VirtualNode, AStartNode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetPreviousChildVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AStartNode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := GetPreviousSiblingVirtualNode(AStartNode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetPreviousNode(\r\n ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n begin\r\n v := GetPreviousVirtualNode(ANode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetPreviousSiblingNode(\r\n ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n begin\r\n v := GetPreviousSiblingVirtualNode(ANode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetPreviousSiblingVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n res: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n res := ANode;\r\n repeat\r\n res := GetPreviousVirtualNode(res);\r\n Result := res;\r\n until (Result = nil) or (Assigned(Result) and (Result.ParentNode = ANode.ParentNode));\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetPreviousVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n Result := GetNodeFromNodeStructure(ANode.Row - 1);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetRootNodeByIndex(\r\n AIndex: Integer): TTMSFNCTreeViewNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n n := GetRootVirtualNodeByIndex(AIndex);\r\n if Assigned(n) then\r\n Result := n.Node;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetRootVirtualNodeByIndex(\r\n AIndex: Integer): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to NodeStructure.Count - 1 do\r\n begin\r\n if NodeStructure[I].Index = AIndex then\r\n begin\r\n Result := NodeStructure[I];\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetTotalNodeCount: Integer;\r\nbegin\r\n Result := GetTotalVirtualNodeCount;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetTotalVirtualNodeCount: Integer;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := 0;\r\n n := GetFirstRootVirtualNode;\r\n while Assigned(n) do\r\n begin\r\n Result := Result + n.TotalChildren + 1;\r\n n := n.GetNextSibling;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.InsertItemInternal(AItem: TTMSFNCTreeViewNode);\r\nvar\r\n pn: TTMSFNCTreeViewNode;\r\nbegin\r\n if (csDestroying in ComponentState) or not Assigned(AItem) or not NodeListBuild then\r\n Exit;\r\n\r\n pn := TTMSFNCTreeViewNodes(AItem.Collection).Node;\r\n if Assigned(pn) then\r\n InsertVirtualNode(AItem.Index, pn.VirtualNode)\r\n else\r\n InsertVirtualNode(AItem.Index);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.RemoveFilter;\r\nbegin\r\n FFilterApplied := False;\r\n ClearNodeList;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.RemoveFilters;\r\nbegin\r\n Filter.Clear;\r\n FFilterApplied := False;\r\n ClearNodeList;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.RemoveItemInternal(AItem: TTMSFNCTreeViewNode; AUpdate: Boolean = True): TTMSFNCTreeViewVirtualNodeRemoveData;\r\nbegin\r\n Result.RowIndex := -1;\r\n Result.Count := 0;\r\n Result.ParentNode := -1;\r\n\r\n if (csDestroying in ComponentState) or not Assigned(AItem) or not NodeListBuild then\r\n Exit;\r\n\r\n Result := RemoveNodeInternal(AItem.VirtualNode, AUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.InsertNodeInternal(AParentNode: TTMSFNCTreeViewVirtualNode; AIndex, AInsertIndex: Integer; ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n I: Integer;\r\n pi: Integer;\r\n pv, rs: TTMSFNCTreeViewVirtualNode;\r\n cnt: Integer;\r\n vi: Boolean;\r\n chk: Boolean;\r\n chkst: TTMSFNCArrayBoolean;\r\n ins: Integer;\r\n exp, ext: Boolean;\r\n K: Integer;\r\nbegin\r\n if not NodeListBuild or (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n if not Assigned(ANode) then\r\n begin\r\n ANode.Free;\r\n Exit;\r\n end;\r\n\r\n cnt := NodeStructure.Count;\r\n if Assigned(AParentNode) then\r\n begin\r\n pi := AParentNode.Row;\r\n if (pi >= 0) and (pi <= NodeStructure.Count - 1) then\r\n begin\r\n pv := GetNodeFromNodeStructure(pi);\r\n while Assigned(pv) do\r\n begin\r\n UpdateNodeTotalChildren(pv, pv.TotalChildren + 1);\r\n if pv.Row = AParentNode.Row then\r\n UpdateNodeChildren(pv, pv.Children + 1);\r\n\r\n pi := pv.ParentNode;\r\n pv := GetNodeFromNodeStructure(pi);\r\n end;\r\n end;\r\n end;\r\n\r\n UpdateNodeIndex(ANode, AIndex);\r\n UpdateNodeRow(ANode, AInsertIndex);\r\n\r\n if Assigned(AParentNode) then\r\n begin\r\n UpdateNodeParentNode(ANode, AParentNode.Row);\r\n UpdateNodeLevel(ANode, AParentNode.Level + 1);\r\n end\r\n else\r\n begin\r\n UpdateNodeParentNode(ANode, -1);\r\n UpdateNodeLevel(ANode, 0);\r\n end;\r\n\r\n UpdateNodeHeight(ANode, DefaultRowHeight);\r\n\r\n GetNodeForNodeData(ANode);\r\n\r\n exp := False;\r\n DoIsNodeExpanded(ANode, exp);\r\n UpdateNodeExpanded(ANode, exp);\r\n\r\n ext := False;\r\n DoIsNodeExtended(ANode, ext);\r\n UpdateNodeExtended(ANode, ext);\r\n\r\n SetLength(chkst, 0);\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n chk := False;\r\n DoIsNodeChecked(ANode, I, chk);\r\n SetLength(chkst, Length(chkst) + 1);\r\n chkst[Length(chkst) - 1] := chk;\r\n end;\r\n\r\n UpdateNodeCheckStates(ANode, chkst);\r\n\r\n if (ANode.Row >= 0) and (ANode.Row < NodeStructure.Count) then\r\n NodeStructure.Insert(ANode.Row, ANode)\r\n else\r\n NodeStructure.Add(ANode);\r\n\r\n vi := True;\r\n if Assigned(AParentNode) then\r\n DoIsNodeVisible(AParentNode, vi);\r\n\r\n cnt := cnt - NodeStructure.Count;\r\n\r\n for I := ANode.Row + 1 to NodeStructure.Count - 1 do\r\n begin\r\n rs := GetNodeFromNodeStructure(I);\r\n if Assigned(rs) then\r\n begin\r\n UpdateNodeRow(rs, rs.Row - cnt);\r\n\r\n if rs.ParentNode > ANode.ParentNode then\r\n UpdateNodeParentNode(rs, rs.ParentNode - cnt);\r\n\r\n if rs.ParentNode = ANode.ParentNode then\r\n UpdateNodeIndex(rs, rs.Index + 1);\r\n\r\n GetNodeForNodeData(rs);\r\n\r\n exp := False;\r\n DoIsNodeExpanded(rs, exp);\r\n UpdateNodeExpanded(rs, exp);\r\n\r\n ext := False;\r\n DoIsNodeExtended(rs, ext);\r\n UpdateNodeExtended(rs, ext);\r\n\r\n SetLength(chkst, 0);\r\n for K := 0 to ColumnCount - 1 do\r\n begin\r\n chk := False;\r\n DoIsNodeChecked(RS, K, chk);\r\n SetLength(chkst, Length(chkst) + 1);\r\n chkst[Length(chkst) - 1] := chk;\r\n end;\r\n\r\n UpdateNodeCheckStates(rs, chkst);\r\n end;\r\n end;\r\n\r\n if not Assigned(AParentNode) or (Assigned(AParentNode) and AParentNode.Expanded and vi) then\r\n begin\r\n if not Assigned(AParentNode) then\r\n begin\r\n RowCount := RowCount + 1;\r\n TotalRowHeight := TotalRowHeight + DefaultRowHeight;\r\n ins := GetInsertPosition(ANode, True, True);\r\n if (ins >= 0) and (ins < VisibleNodes.Count) then\r\n VisibleNodes.Insert(ins, ANode)\r\n else\r\n VisibleNodes.Add(ANode);\r\n end\r\n else\r\n begin\r\n UpdateNodeExpanded(AParentNode, False);\r\n UpdateVisibleNodes(AParentNode);\r\n UpdateNodeExpanded(AParentNode, True);\r\n UpdateVisibleNodes(AParentNode);\r\n end;\r\n end;\r\n\r\n ResetNodes(False);\r\n UpdateTreeView;\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.CreateNodes: TTMSFNCTreeViewNodes;\r\nbegin\r\n Result := TTMSFNCTreeViewNodes.Create(Self, nil);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CustomizeScrollPosition(\r\n ANode: TTMSFNCTreeViewVirtualNode; var APosition, ATopPosition: Double);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.CreateColumns: TTMSFNCTreeViewColumns;\r\nbegin\r\n Result := TTMSFNCTreeViewColumns.Create(Self);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.RemoveNodeChildren(ANode: TTMSFNCTreeViewNode);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.Nodes.Clear;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.RemoveVirtualNodeChildren(ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n I: Integer;\r\n s: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if Assigned(ANode) then\r\n begin\r\n for I := ANode.TotalChildren - 1 downto 0 do\r\n begin\r\n s := GetNodeFromNodeStructure(ANode.Row + I);\r\n if Assigned(s) then\r\n RemoveVirtualNode(s); \r\n end;\r\n end;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewData.Destroy;\r\nbegin\r\n FFilter.Free;\r\n FDisplayGroups.Free;\r\n FNodeStructure.Free;\r\n FVisibleNodes.Free;\r\n FNodes.Free;\r\n FGroups.Free;\r\n FColumns.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetColumnHorizontalTextAlign(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetColumnTrimming(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetColumnVerticalTextAlign(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetColumnWordWrapping(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AWordWrapping: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeCheckType(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; var ACheckType: TTMSFNCTreeViewNodeCheckType);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= it.Values.Count - 1) then\r\n ACheckType := it.Values[AColumn].CheckType;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeColor(ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeDisabledColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeDisabledTextColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeDisabledTitleColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATitleColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeExtraSize(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExtraSize: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitleExtraSize(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleExtraSize: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.BuildInternalNodeList(\r\n ANode: TTMSFNCTreeViewVirtualNode; AID: String; AParentNode: Integer; ANodeIndex: Integer; ALevel: Integer; AParentExpanded: Boolean; var ATotalChildren: Integer);\r\nvar\r\n I: Integer;\r\n nd: Integer;\r\n vi: Boolean;\r\n v: TTMSFNCTreeViewVirtualNode;\r\n exp: Boolean;\r\n tot: Integer;\r\n chk, ext: Boolean;\r\n chkst: TTMSFNCArrayBoolean;\r\n p: TTMSFNCTreeViewVirtualNode;\r\n l: TTMSFNCTreeViewVirtualNodeArray;\r\nbegin\r\n ANode.FRow := FNodeStructure.Count;\r\n ANode.FParentNode := AParentNode;\r\n ANode.FIndex := ANodeIndex;\r\n ANode.FLevel := ALevel;\r\n if AID <> 'ROOT' then\r\n GetNodeForNodeData(ANode);\r\n\r\n nd := 0;\r\n if (ALevel < MAXLEVELDEPTH) then\r\n DoGetNumberOfNodes(ANode, nd);\r\n\r\n ANode.FChildren := nd;\r\n\r\n ANode.FCalculated := False;\r\n ANode.FHeight := DefaultRowHeight;\r\n\r\n exp := False;\r\n if AID <> 'ROOT' then\r\n DoIsNodeExpanded(ANode, exp);\r\n ANode.FExpanded := exp;\r\n\r\n ext := False;\r\n DoIsNodeExtended(ANode, ext);\r\n UpdateNodeExtended(ANode, ext);\r\n\r\n SetLength(chkst, 0);\r\n if AID <> 'ROOT' then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n chk := False;\r\n DoIsNodeChecked(ANode, I, chk);\r\n SetLength(chkst, Length(chkst) + 1);\r\n chkst[Length(chkst) - 1] := chk;\r\n end;\r\n ANode.FCheckStates := chkst;\r\n end;\r\n\r\n if FFilterApplied then\r\n vi := MatchFilter(ANode)\r\n else\r\n vi := True;\r\n\r\n if AID <> 'ROOT' then\r\n DoIsNodeVisible(ANode, vi);\r\n\r\n tot := nd;\r\n\r\n if AID <> 'ROOT' then\r\n begin\r\n FNodeStructure.Add(ANode);\r\n if (AParentExpanded or (ANode.Level = 0)) and vi then\r\n begin\r\n if FFilterApplied then\r\n begin\r\n p := ANode.GetParent;\r\n while Assigned(p) do\r\n begin\r\n if not p.FAddedToVisibleList then\r\n begin\r\n l := nil;\r\n SetLength(l, Length(l) + 1);\r\n l[Length(l) - 1] := p;\r\n end;\r\n p := p.GetParent;\r\n end;\r\n\r\n for I := Length(l) - 1 downto 0 do\r\n begin\r\n FVisibleNodes.Add(l[I]);\r\n l[I].FAddedToVisibleList := True;\r\n end;\r\n end;\r\n\r\n FVisibleNodes.Add(ANode);\r\n ANode.FAddedToVisibleList := True;\r\n end;\r\n end;\r\n\r\n for I := 0 to nd - 1 do\r\n begin\r\n if FNodeStructure.Count = MAXNODECOUNT then\r\n Break;\r\n\r\n v := TTMSFNCTreeViewVirtualNode.Create(Self);\r\n if AID = 'ROOT' then\r\n BuildInternalNodeList(v, '', AParentNode, I, 0, exp, tot)\r\n else\r\n BuildInternalNodeList(v, '', ANode.Row, I, ANode.Level + 1, exp, tot);\r\n end;\r\n\r\n ATotalChildren := ATotalChildren + tot;\r\n\r\n if AID <> 'ROOT' then\r\n ANode.FTotalChildren := tot\r\n else\r\n ANode.Free;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (AComponent = FBitmapContainer) and (Operation = opRemove) then\r\n FBitmapContainer := nil;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.BuildNodeList;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\n c: Integer;\r\nbegin\r\n if NodeListBuild then\r\n Exit;\r\n\r\n FNodeStructure.Clear;\r\n FVisibleNodes.Clear;\r\n v := TTMSFNCTreeViewVirtualNode.Create(Self);\r\n TotalRowHeight := 1;\r\n RowCount := 0;\r\n c := 0;\r\n BuildInternalNodeList(v, 'ROOT', -1, -1, -1, True, c);\r\n RowCount := FVisibleNodes.Count;\r\n NodeListBuild := FNodeStructure.Count > 0;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNextChildNode(\r\n ANode: TTMSFNCTreeViewNode; AStartNode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) and Assigned(AStartNode) then\r\n begin\r\n v := GetNextChildVirtualNode(ANode.VirtualNode, AStartNode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNextChildVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AStartNode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := GetNextSiblingVirtualNode(AStartNode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNextNode(\r\n ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n begin\r\n v := GetNextVirtualNode(ANode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNextSiblingNode(\r\n ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n begin\r\n v := GetNextSiblingVirtualNode(ANode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNextSiblingVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n res: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n res := ANode;\r\n repeat\r\n res := GetNextVirtualNode(res);\r\n Result := res;\r\n until (Result = nil) or (Assigned(Result) and (Result.ParentNode = ANode.ParentNode));\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNextVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n Result := GetNodeFromNodeStructure(ANode.Row + 1);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNodeChildCount(ANode: TTMSFNCTreeViewNode): Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(ANode) then\r\n Result := GetVirtualNodeChildCount(ANode.VirtualNode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := FBitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetFirstChildNode(\r\n ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n begin\r\n v := GetFirstChildVirtualNode(ANode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetFirstChildVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) and (ANode.Children > 0) then\r\n Result := GetNodeFromNodeStructure(ANode.Row + 1);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetFirstRootNode: TTMSFNCTreeViewNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n n := GetFirstRootVirtualNode;\r\n if Assigned(n) then\r\n Result := n.Node;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetFirstRootVirtualNode: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if NodeStructure.Count > 0 then\r\n Result := NodeStructure[0];\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetInsertPosition(\r\n ANode: TTMSFNCTreeViewVirtualNode; ARoot: Boolean; AInsert: Boolean): Integer;\r\nvar\r\n prev: TTMSFNCTreeViewVirtualNode;\r\n I: Integer;\r\n r: Integer;\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := -1;\r\n if not Assigned(ANode) then\r\n Exit;\r\n\r\n if (ANode.Row = 0) then\r\n begin\r\n Result := 0;\r\n Exit;\r\n end;\r\n\r\n if AInsert then\r\n prev := GetNodeFromNodeStructure(ANode.Row - 1)\r\n else\r\n prev := GetNodeFromNodeStructure(ANode.Row);\r\n\r\n if ARoot then\r\n begin\r\n while Assigned(prev) and (prev.ParentNode >= 0) and (prev.ParentNode <= NodeStructure.Count - 1) do\r\n begin\r\n n := GetNodeFromNodeStructure(prev.ParentNode);\r\n if n <> prev then\r\n prev := n\r\n else\r\n Break;\r\n end;\r\n end;\r\n\r\n if Assigned(prev) then\r\n begin\r\n for I := prev.Index to VisibleNodes.Count - 1 do\r\n begin\r\n if AInsert then\r\n r := ANode.Row + 1\r\n else\r\n r := ANode.Row;\r\n\r\n if VisibleNodes[I].Row = r then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetLastChildNode(\r\n ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n begin\r\n v := GetLastChildVirtualNode(ANode.VirtualNode);\r\n if Assigned(v) then\r\n Result := v.Node;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetLastChildVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := GetFirstChildVirtualNode(ANode);\r\n if Assigned(Result) then\r\n begin\r\n v := Result;\r\n repeat\r\n Result := v;\r\n v := GetNextSiblingVirtualNode(v);\r\n until v = nil;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetLastNode: TTMSFNCTreeViewNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n n := GetLastVirtualNode;\r\n if Assigned(n) then\r\n Result := n.Node;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetLastRootNode: TTMSFNCTreeViewNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n n := GetLastRootVirtualNode;\r\n if Assigned(n) then\r\n Result := n.Node;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetLastRootVirtualNode: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if NodeStructure.Count > 0 then\r\n begin\r\n Result := NodeStructure[NodeStructure.Count - 1];\r\n while Assigned(Result) and (Result.ParentNode > -1) do\r\n Result := NodeStructure[Result.Row - 1];\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetLastVirtualNode: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if NodeStructure.Count > 0 then\r\n Result := NodeStructure[NodeStructure.Count - 1];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.GetNodeForNodeData(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n col: TTMSFNCTreeViewNodes;\r\n p: TTMSFNCTreeViewVirtualNode;\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n if Assigned(ANode) then\r\n begin\r\n p := GetNodeFromNodeStructure(ANode.ParentNode);\r\n if Assigned(p) and Assigned(p.Node) then\r\n col := TTMSFNCTreeViewNodes(p.Node.Nodes)\r\n else\r\n col := Nodes;\r\n end\r\n else\r\n Exit;\r\n\r\n if Assigned(col) then\r\n begin\r\n if (ANode.Index >= 0) and (ANode.Index <= col.Count - 1) then\r\n begin\r\n it := col[ANode.Index];\r\n ANode.FNode := it;\r\n it.FVirtualNode := ANode;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeHorizontalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeIcon(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; ALarge: Boolean; var AIcon: TTMSFNCBitmap);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= it.Values.Count - 1) then\r\n begin\r\n v := it.Values[AColumn];\r\n if ANode.Expanded then\r\n begin\r\n if ALarge then\r\n begin\r\n if Assigned(BitmapContainer) and (v.ExpandedIconLargeName <> '') then\r\n AIcon := BitmapContainer.FindBitmap(v.ExpandedIconLargeName);\r\n\r\n if not Assigned(AIcon) then\r\n AIcon := v.ExpandedIconLarge;\r\n end\r\n else\r\n begin\r\n if Assigned(BitmapContainer) and (v.ExpandedIconName <> '') then\r\n AIcon := BitmapContainer.FindBitmap(v.ExpandedIconName);\r\n\r\n if not Assigned(AIcon) then\r\n AIcon := v.ExpandedIcon;\r\n end;\r\n end\r\n else\r\n begin\r\n if ALarge then\r\n begin\r\n if Assigned(BitmapContainer) and (v.CollapsedIconLargeName <> '') then\r\n AIcon := BitmapContainer.FindBitmap(v.CollapsedIconLargeName);\r\n\r\n if not Assigned(AIcon) then\r\n AIcon := v.CollapsedIconLarge;\r\n end\r\n else\r\n begin\r\n if Assigned(BitmapContainer) and (v.CollapsedIconName <> '') then\r\n AIcon := BitmapContainer.FindBitmap(v.CollapsedIconName);\r\n\r\n if not Assigned(AIcon) then\r\n AIcon := v.CollapsedIcon;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeSelectedColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeSelectedTextColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeSelectedTitleColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATitleColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeSides(ANode: TTMSFNCTreeViewVirtualNode;\r\n var ASides: TTMSFNCGraphicsSides);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeText(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var AText: String);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= it.Values.Count - 1) then\r\n AText := it.Values[AColumn].Text;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitleExpanded(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; var AExpanded: Boolean);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= it.Values.Count - 1) then\r\n AExpanded := it.Values[AColumn].TitleExpanded;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitle(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var ATitle: String);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= it.Values.Count - 1) then\r\n ATitle := it.Values[AColumn].Title;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitleColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATitleColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitleHorizontalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitleTrimming(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitleVerticalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTitleWordWrapping(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AWordWrapping: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTextColor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATextColor: TTMSFNCGraphicsColor);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeTrimming(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeVerticalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNodeWordWrapping(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AWordWrapping: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoGetNumberOfNodes(\r\n ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer);\r\nbegin\r\n if Assigned(ANode.Node) then\r\n ANumberOfNodes := ANode.Node.Nodes.Count\r\n else\r\n ANumberOfNodes := Nodes.Count;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoIsNodeChecked(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AChecked: Boolean);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= it.Values.Count - 1) then\r\n AChecked := it.Values[AColumn].Checked;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CheckNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False);\r\nvar\r\n chkt: TTMSFNCTreeViewNodeCheckType;\r\n pn, n: TTMSFNCTreeViewVirtualNode;\r\n st, stp: Integer;\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if not Assigned(ANode) then\r\n Exit;\r\n\r\n if (AColumn >= 0) and (AColumn <= Length(ANode.CheckStates) - 1) then\r\n begin\r\n ANode.CheckStates[AColumn] := True;\r\n UpdateCheckState(ANode, AColumn, ANode.CheckStates[AColumn]);\r\n end;\r\n\r\n if Assigned(ANode.Node) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= ANode.Node.Values.Count - 1) then\r\n ANode.Node.Values.UpdateChecked(AColumn, True);\r\n end;\r\n\r\n chkt := tvntNone;\r\n DoGetNodeCheckType(ANode, AColumn, chkt);\r\n if chkt = tvntRadioButton then\r\n begin\r\n pn := GetNodeFromNodeStructure(ANode.ParentNode);\r\n if Assigned(pn) then\r\n begin\r\n st := pn.Row + 1;\r\n stp := st + pn.TotalChildren;\r\n end\r\n else\r\n begin\r\n st := 0;\r\n stp := NodeStructure.Count;\r\n end;\r\n\r\n while st < stp do\r\n begin\r\n n := GetNodeFromNodeStructure(st);\r\n if Assigned(n) then\r\n begin\r\n if n <> ANode then\r\n begin\r\n chkt := tvntNone;\r\n DoGetNodeCheckType(n, AColumn, chkt);\r\n if chkt = tvntRadioButton then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= Length(n.CheckStates) - 1) then\r\n begin\r\n n.CheckStates[AColumn] := False;\r\n UpdateCheckState(n, AColumn, n.CheckStates[AColumn]);\r\n end;\r\n\r\n if Assigned(n.Node) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= n.Node.Values.Count - 1) then\r\n n.Node.Values.UpdateChecked(AColumn, False);\r\n end;\r\n end;\r\n end;\r\n st := st + n.TotalChildren + 1;\r\n end\r\n else\r\n Break;\r\n end;\r\n end;\r\n\r\n if ARecurse then\r\n begin\r\n for I := ANode.Row + 1 to ANode.Row + ANode.TotalChildren do\r\n begin\r\n v := GetNodeFromNodeStructure(I);\r\n if Assigned(v) then\r\n CheckNodeInternal(v, AColumn, ARecurse);\r\n end;\r\n end;\r\n\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.InsertVirtualNode(AIndex: Integer; AParentNode: TTMSFNCTreeViewVirtualNode = nil): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\n p, n, c: TTMSFNCTreeViewVirtualNode;\r\n I, idx: Integer;\r\nbegin\r\n Result := nil;\r\n if (csDestroying in ComponentState) or not NodeListBuild then\r\n Exit;\r\n\r\n v := TTMSFNCTreeViewVirtualNode.Create(Self);\r\n if Assigned(AParentNode) then\r\n begin\r\n idx := -1;\r\n I := AParentNode.Row + 1;\r\n while i <= AParentNode.Row + AParentNode.TotalChildren do\r\n begin\r\n n := GetNodeFromNodeStructure(I);\r\n if Assigned(n) then\r\n begin\r\n if (n.Index = AIndex) and (n.ParentNode = AParentNode.Row) then\r\n begin\r\n idx := n.Row;\r\n Break;\r\n end;\r\n I := I + n.Children + 1;\r\n end\r\n else\r\n Break;\r\n end;\r\n\r\n if idx = -1 then\r\n InsertNodeInternal(AParentNode, AIndex, AParentNode.Row + AParentNode.TotalChildren + 1, v)\r\n else\r\n InsertNodeInternal(AParentNode, AIndex, idx, v);\r\n end\r\n else\r\n begin\r\n p := nil;\r\n if NodeStructure.Count > 0 then\r\n begin\r\n p := GetNodeFromNodeStructure(NodeStructure.Count - 1);\r\n while Assigned(p) and (p.ParentNode >= 0) and (p.ParentNode <= NodeStructure.Count - 1) do\r\n p := GetNodeFromNodeStructure(p.ParentNode);\r\n end;\r\n\r\n if Assigned(p) then\r\n begin\r\n if AIndex > p.Index then\r\n InsertNodeInternal(nil, AIndex, p.Row + p.TotalChildren + 1, v)\r\n else\r\n begin\r\n n := nil;\r\n I := 0;\r\n while not Assigned(n) do\r\n begin\r\n c := GetNodeFromNodeStructure(I);\r\n if Assigned(c) then\r\n begin\r\n if c.Index = AIndex then\r\n begin\r\n n := c;\r\n Break;\r\n end\r\n else\r\n I := I + c.TotalChildren + 1;\r\n end\r\n else\r\n Break;\r\n end;\r\n\r\n if Assigned(n) then\r\n InsertNodeInternal(nil, AIndex, n.Row, v);\r\n end;\r\n end\r\n else\r\n InsertNodeInternal(nil, 0, 0, v);\r\n end;\r\n\r\n Result := v;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetVirtualNodeChildCount(\r\n ANode: TTMSFNCTreeViewVirtualNode): Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(ANode) then\r\n Result := ANode.Children;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetVirtualNodeTitleExpanded(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(ANode) then\r\n begin\r\n Result := True;\r\n DoGetNodeTitleExpanded(ANode, AColumn, Result);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetVirtualNodeText(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): string;\r\nbegin\r\n Result := '';\r\n if Assigned(ANode) then\r\n begin\r\n Result := '';\r\n DoGetNodeText(ANode, AColumn, tntmDrawing, Result);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetVirtualNodeTitle(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): string;\r\nbegin\r\n Result := '';\r\n if Assigned(ANode) then\r\n begin\r\n Result := '';\r\n DoGetNodeTitle(ANode, AColumn, tntmDrawing, Result);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetParentVirtualNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(ANode) then\r\n Result := GetNodeFromNodeStructure(ANode.ParentNode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.AddVirtualNode(AParentNode: TTMSFNCTreeViewVirtualNode = nil): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n p: TTMSFNCTreeViewVirtualNode;\r\n idx: Integer;\r\nbegin\r\n Result := nil;\r\n if (csDestroying in ComponentState) or not NodeListBuild then\r\n Exit;\r\n\r\n if Assigned(AParentNode) then\r\n begin\r\n idx := AParentNode.Children;\r\n end\r\n else\r\n begin\r\n p := nil;\r\n if NodeStructure.Count > 0 then\r\n begin\r\n p := GetNodeFromNodeStructure(NodeStructure.Count - 1);\r\n while Assigned(p) and (p.ParentNode >= 0) and (p.ParentNode <= NodeStructure.Count - 1) do\r\n p := GetNodeFromNodeStructure(p.ParentNode);\r\n end;\r\n\r\n idx := p.Index + 1;\r\n end;\r\n\r\n Result := InsertVirtualNode(idx, AParentNode);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ApplyFilter;\r\nbegin\r\n FFilterApplied := True;\r\n ClearNodeList;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodeTextValues(ANode: TTMSFNCTreeViewNode; ATextValues: TTMSFNCTreeViewNodeTextValues);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.SetTextValues(ATextValues);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodeExpandedIcons(ANode: TTMSFNCTreeViewNode; AIcons: TTMSFNCTreeViewNodeIcons; ALarge: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.SetExpandedIcons(AIcons, ALarge);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodeExpandedIconNames(ANode: TTMSFNCTreeViewNode; AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.SetExpandedIconNames(AIconNames, ALarge);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodeCollapsedIcons(ANode: TTMSFNCTreeViewNode; AIcons: TTMSFNCTreeViewNodeIcons; ALarge: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.SetCollapsedIcons(AIcons, ALarge);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodeCollapsedIconNames(ANode: TTMSFNCTreeViewNode; AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.SetCollapsedIconNames(AIconNames, ALarge);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodeCheckTypes(ANode: TTMSFNCTreeViewNode; ACheckTypes: TTMSFNCTreeViewNodeCheckTypes);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.SetCheckTypes(ACheckTypes);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodeCheckStates(ANode: TTMSFNCTreeViewNode; ACheckStates: TTMSFNCTreeViewNodeCheckStates);\r\nbegin\r\n if Assigned(ANode) then\r\n ANode.SetCheckStates(ACheckStates);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.AddNode(AParentNode: TTMSFNCTreeViewNode = nil): TTMSFNCTreeViewNode;\r\nbegin\r\n if Assigned(AParentNode) then\r\n Result := AParentNode.Nodes.Add\r\n else\r\n Result := Nodes.Add;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.InsertNode(AIndex: Integer; AParentNode: TTMSFNCTreeViewNode = nil): TTMSFNCTreeViewNode;\r\nbegin\r\n if Assigned(AParentNode) then\r\n Result := AParentNode.Nodes.Insert(AIndex)\r\n else\r\n Result := Nodes.Insert(AIndex);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.RemoveNode(ANode: TTMSFNCTreeViewNode);\r\nbegin\r\n if Assigned(ANode) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n ANode.DisposeOf;\r\n {$ENDIF}\r\n {$IFNDEF FMXLIB}\r\n ANode.Free;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.RemoveNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AUpdateNodes: Boolean = True): TTMSFNCTreeViewVirtualNodeRemoveData;\r\nvar\r\n I: Integer;\r\n R, pi: Integer;\r\n subv, pv, rs: TTMSFNCTreeViewVirtualNode;\r\n cnt: Integer;\r\n exp, ext: Boolean;\r\n chkst: TTMSFNCArrayBoolean;\r\n K: Integer;\r\n chk: Boolean;\r\nbegin\r\n if (csDestroying in ComponentState) or not NodeListBuild or not Assigned(ANode) then\r\n Exit;\r\n\r\n cnt := NodeStructure.Count;\r\n pv := GetNodeFromNodeStructure(ANode.ParentNode);\r\n while Assigned(pv) do\r\n begin\r\n UpdateNodeTotalChildren(pv, pv.TotalChildren - 1 - ANode.TotalChildren);\r\n if pv.Row = ANode.ParentNode then\r\n UpdateNodeChildren(pv, pv.Children - 1);\r\n\r\n pi := pv.ParentNode;\r\n pv := GetNodeFromNodeStructure(pi);\r\n end;\r\n\r\n for I := ANode.TotalChildren - 1 downto 0 do\r\n begin\r\n R := I + ANode.Row + 1;\r\n subv := GetNodeFromNodeStructure(R);\r\n if Assigned(subv) then\r\n begin\r\n if VisibleNodes.IndexOf(subv) > -1 then\r\n begin\r\n VisibleNodes.Remove(subv);\r\n TotalRowHeight := TotalRowHeight - subv.Height;\r\n RowCount := RowCount - 1;\r\n end;\r\n NodeStructure.Remove(subv);\r\n RemoveNodeFromSelection(subv);\r\n end;\r\n end;\r\n\r\n R := ANode.Row;\r\n pi := ANode.ParentNode;\r\n if VisibleNodes.IndexOf(ANode) > -1 then\r\n begin\r\n VisibleNodes.Remove(ANode);\r\n TotalRowHeight := TotalRowHeight - ANode.Height;\r\n RowCount := RowCount - 1;\r\n end;\r\n\r\n UpdateNodeChildren(ANode, ANode.Children - 1);\r\n UpdateNodeTotalChildren(ANode, ANode.TotalChildren - 1);\r\n NodeStructure.Remove(ANode);\r\n RemoveNodeFromSelection(ANode);\r\n\r\n cnt := cnt - NodeStructure.Count;\r\n Result.Count := cnt;\r\n Result.RowIndex := R;\r\n Result.ParentNode := pi;\r\n\r\n if AUpdateNodes then\r\n begin\r\n for I := R to NodeStructure.Count - 1 do\r\n begin\r\n rs := GetNodeFromNodeStructure(I);\r\n if Assigned(rs) then\r\n begin\r\n UpdateNodeRow(rs, rs.Row - cnt);\r\n\r\n if rs.ParentNode > pi then\r\n UpdateNodeParentNode(rs, rs.ParentNode - cnt);\r\n\r\n if rs.ParentNode = pi then\r\n UpdateNodeIndex(rs, rs.Index - 1);\r\n\r\n GetNodeForNodeData(rs);\r\n\r\n exp := False;\r\n DoIsNodeExpanded(rs, exp);\r\n UpdateNodeExpanded(rs, exp);\r\n\r\n ext := False;\r\n DoIsNodeExtended(rs, ext);\r\n UpdateNodeExtended(rs, ext);\r\n\r\n SetLength(chkst, 0);\r\n for K := 0 to ColumnCount - 1 do\r\n begin\r\n chk := False;\r\n DoIsNodeChecked(RS, K, chk);\r\n SetLength(chkst, Length(chkst) + 1);\r\n chkst[Length(chkst) - 1] := chk;\r\n end;\r\n\r\n UpdateNodeCheckStates(rs, chkst);\r\n end;\r\n end;\r\n\r\n if not FBlockUpdate then\r\n begin\r\n ResetNodes(False);\r\n UpdateTreeView;\r\n Invalidate;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateVisibleNodes(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n add: Boolean;\r\n R, I, C, idx: Integer;\r\n subv: TTMSFNCTreeViewVirtualNode;\r\n en, vi, visub: Boolean;\r\nbegin\r\n add := ANode.Expanded;\r\n if add then\r\n begin\r\n idx := GetInsertPosition(ANode, ANode.ParentNode = -1, False);\r\n en := True;\r\n DoIsNodeEnabled(ANode, en);\r\n\r\n vi := True;\r\n DoIsNodeVisible(ANode, vi);\r\n\r\n if (idx <> -1) and vi and en then\r\n begin\r\n I := 0;\r\n C := idx + 1;\r\n while I < ANode.TotalChildren do\r\n begin\r\n R := I + ANode.Row + 1;\r\n subv := GetNodeFromNodeStructure(R);\r\n if Assigned(subv) then\r\n begin\r\n visub := True;\r\n DoIsNodeVisible(subv, visub);\r\n if visub then\r\n begin\r\n if (C >= 0) and (C < VisibleNodes.Count) then\r\n VisibleNodes.Insert(C, subv)\r\n else\r\n VisibleNodes.Add(subv);\r\n\r\n TotalRowHeight := TotalRowHeight + subv.Height;\r\n RowCount := RowCount + 1;\r\n Inc(C);\r\n end;\r\n\r\n if not subv.Expanded or not visub then\r\n I := I + subv.TotalChildren;\r\n end;\r\n Inc(I);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n for I := 0 to ANode.TotalChildren - 1 do\r\n begin\r\n R := I + ANode.Row + 1;\r\n subv := GetNodeFromNodeStructure(R);\r\n if Assigned(subv) then\r\n begin\r\n UpdateNodeCalculated(subv, False);\r\n if VisibleNodes.IndexOf(subv) > -1 then\r\n begin\r\n VisibleNodes.Remove(subv);\r\n TotalRowHeight := TotalRowHeight - subv.Height;\r\n RowCount := RowCount - 1;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.CollapseNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False);\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if not Assigned(ANode) or not ANode.Expanded or not NodeListBuild or (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n UpdateNodeExpanded(ANode, False);\r\n if ARecurse then\r\n begin\r\n for I := ANode.Row + 1 to ANode.Row + ANode.TotalChildren do\r\n begin\r\n v := GetNodeFromNodeStructure(I);\r\n if Assigned(v) then\r\n UpdateNodeExpanded(v, False);\r\n end;\r\n end;\r\n ResetNodes(False);\r\n UpdateVisibleNodes(ANode);\r\n UpdateTreeView;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoIsNodeEnabled(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AEnabled: Boolean);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n AEnabled := it.Enabled;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoIsNodeExpanded(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AExpanded: Boolean);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n AExpanded := it.Expanded;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoIsNodeExtended(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AExtended: Boolean);\r\nvar\r\n it: TTMSFNCTreeViewNode;\r\nbegin\r\n it := ANode.Node;\r\n if Assigned(it) then\r\n AExtended := it.Extended;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoIsNodeVisible(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AVisible: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.DoNodeCompare(ANode1, ANode2: TTMSFNCTreeViewNode; AColumn: Integer; var ACompareResult: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindGroupByName(AName: String): TTMSFNCTreeViewGroup;\r\nvar\r\n I: Integer;\r\n grp: TTMSFNCTreeViewGroup;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Groups.Count - 1 do\r\n begin\r\n grp := Groups[I];\r\n if grp.Name = AName then\r\n begin\r\n Result := grp;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindGroupIndexByName(AName: String): Integer;\r\nvar\r\n grp: TTMSFNCTreeViewGroup;\r\nbegin\r\n Result := -1;\r\n grp := FindGroupByName(AName);\r\n if Assigned(grp) then\r\n Result := grp.Index;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindNodeByDBKey(\r\n ADBKey: string): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n v := FindVirtualNodeByDBKey(ADBKey);\r\n if Assigned(v) then\r\n Result := v.Node;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindNodeByRow(ARow: Integer): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n v := FindVirtualNodeByRow(ARow);\r\n if Assigned(v) then\r\n Result := v.Node;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindNodeByTextAndColumn(AText: string;\r\n AColumn: Integer; ARecurse, ACaseSensitive: Boolean): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n v := FindVirtualNodeByTextAndColumn(AText, AColumn, ARecurse, ACaseSensitive);\r\n if Assigned(v) then\r\n Result := v.Node;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindVirtualNodeByDBKey(\r\n ADBKey: string): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n n := GetFirstRootVirtualNode;\r\n while Assigned(n) do\r\n begin\r\n if Assigned(n.Node) and (n.Node.DBKey = ADBKey) then\r\n begin\r\n Result := n;\r\n Break;\r\n end;\r\n n := n.GetNext;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindVirtualNodeByRow(\r\n ARow: Integer): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n n := GetFirstRootVirtualNode;\r\n while Assigned(n) do\r\n begin\r\n if n.Row = ARow then\r\n begin\r\n Result := n;\r\n Break;\r\n end;\r\n n := n.GetNext;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindVirtualNodeByTextAndColumn(AText: string;\r\n AColumn: Integer; ARecurse,\r\n ACaseSensitive: Boolean): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\n t: String;\r\nbegin\r\n Result := nil;\r\n n := GetFirstRootVirtualNode;\r\n while Assigned(n) do\r\n begin\r\n t := '';\r\n DoGetNodeText(n, AColumn, tntmDrawing, t);\r\n if TTMSFNCUtils.MatchStrEx(AText, t, ACaseSensitive) then\r\n begin\r\n Result := n;\r\n Break;\r\n end;\r\n\r\n if ARecurse then\r\n n := n.GetNext\r\n else\r\n n := n.GetNextSibling;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.IsColumnVisible(ACol: Integer): Boolean;\r\nbegin\r\n Result := inherited IsColumnVisible(ACol);\r\n if (ACol >= 0) and (ACol <= Columns.Count - 1) then\r\n Result := Columns[ACol].Visible;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.MatchFilter(ANode: TTMSFNCTreeViewVirtualNode): Boolean;\r\nvar\r\n i: Integer;\r\n s:string;\r\n temp: Boolean;\r\nbegin\r\n Result := True;\r\n for i := 1 to FFilter.Count do\r\n begin\r\n with FFilter.Items[i - 1] do\r\n begin\r\n s := '';\r\n DoGetNodeText(ANode, Column, tntmDrawing, s);\r\n s := TTMSFNCUtils.HTMLStrip(s);\r\n s := Trim(s);\r\n\r\n if Prefix <> '' then\r\n if Pos(Prefix,s) = 1 then\r\n Delete(s,1,Length(FFilter.Items[i - 1].Prefix));\r\n\r\n if Suffix <> '' then\r\n if Pos(Suffix,s) = 1 + Length(s) - Length(Suffix) then\r\n Delete(s,1 + Length(s) - Length(Suffix),Length(s));\r\n\r\n temp := true;\r\n try\r\n if FFilter.Items[i - 1].Condition <> '' then\r\n temp := TTMSFNCUtils.MatchStrEx(Condition,s,CaseSensitive);\r\n except\r\n temp := false;\r\n end;\r\n\r\n case FFilter.Items[i - 1].Operation of\r\n tfoSHORT:\r\n begin\r\n Result := temp;\r\n if not Result then\r\n Break;\r\n end;\r\n tfoNONE: Result := temp;\r\n tfoAND: Result := Result AND temp;\r\n tfoOR: Result := Result OR temp;\r\n tfoXOR: Result := Result XOR temp;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.MoveNode(ANode,\r\n ADestinationNode: TTMSFNCTreeViewNode; AIndex: Integer);\r\nvar\r\n n, nw: TTMSFNCTreeViewNode;\r\nbegin\r\n if ADestinationNode <> ANode then\r\n begin\r\n BeginUpdate;\r\n n := TTMSFNCTreeViewNode.Create(nil);\r\n n.Assign(ANode);\r\n\r\n if Assigned(ADestinationNode) then\r\n nw := ADestinationNode.Nodes.Add\r\n else\r\n nw := Nodes.Add;\r\n\r\n nw.Assign(n);\r\n n.Free;\r\n RemoveNode(ANode);\r\n\r\n if Assigned(ADestinationNode) then\r\n begin\r\n if (AIndex >= 0) and (AIndex <= ADestinationNode.Nodes.Count - 1) then\r\n nw.Index := AIndex;\r\n end\r\n else\r\n begin\r\n if (AIndex >= 0) and (AIndex <= Nodes.Count - 1) then\r\n nw.Index := AIndex;\r\n end;\r\n\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ToggleCheckNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False);\r\nvar\r\n chk: Boolean;\r\nbegin\r\n if (csDestroying in ComponentState) or not Assigned(ANode) or not NodeListBuild then\r\n Exit;\r\n\r\n if (AColumn >= 0) and (AColumn <= Length(ANode.CheckStates) - 1) then\r\n begin\r\n chk := ANode.CheckStates[AColumn];\r\n if chk then\r\n UnCheckNodeInternal(ANode, AColumn, ARecurse)\r\n else\r\n CheckNodeInternal(ANode, AColumn, ARecurse);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ToggleNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False);\r\nbegin\r\n if (csDestroying in ComponentState) or not Assigned(ANode) or not NodeListBuild then\r\n Exit;\r\n\r\n if ANode.Expanded then\r\n CollapseNodeInternal(ANode, ARecurse)\r\n else\r\n ExpandNodeInternal(ANode, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UnCheckNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ARecurse: Boolean = False);\r\nvar\r\n chkt: TTMSFNCTreeViewNodeCheckType;\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if (csDestroying in ComponentState) or not Assigned(ANode) or not NodeListBuild then\r\n Exit;\r\n\r\n chkt := tvntNone;\r\n DoGetNodeCheckType(ANode, AColumn, chkt);\r\n if chkt = tvntCheckBox then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= Length(ANode.CheckStates) - 1) then\r\n begin\r\n ANode.CheckStates[AColumn] := False;\r\n UpdateCheckState(ANode, AColumn, ANode.CheckStates[AColumn]);\r\n end;\r\n\r\n if Assigned(ANode.Node) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= ANode.Node.Values.Count - 1) then\r\n ANode.Node.Values.UpdateChecked(AColumn, False);\r\n end;\r\n end;\r\n\r\n if ARecurse then\r\n begin\r\n for I := ANode.Row + 1 to ANode.Row + ANode.TotalChildren do\r\n begin\r\n v := GetNodeFromNodeStructure(I);\r\n if Assigned(v) then\r\n UnCheckNodeInternal(v, AColumn, ARecurse);\r\n end;\r\n end;\r\n\r\n Invalidate;\r\nend;\r\n\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeCalculated(ANode: TTMSFNCTreeViewVirtualNode; ACalculated: Boolean);\r\nbegin\r\n ANode.FCalculated := ACalculated;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindColumnByName(\r\n AName: String): TTMSFNCTreeViewColumn;\r\nvar\r\n I: Integer;\r\n res: TTMSFNCTreeViewColumn;\r\nbegin\r\n Result := nil;\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Columns.Count - 1) then\r\n begin\r\n res := Columns[I];\r\n if res.Name = AName then\r\n begin\r\n Result := res;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.FindColumnIndexByName(AName: String): Integer;\r\nvar\r\n res: TTMSFNCTreeViewColumn;\r\nbegin\r\n Result := -1;\r\n res := FindColumnByName(AName);\r\n if Assigned(res) then\r\n Result := res.Index;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetGroups(const Value: TTMSFNCTreeViewGroups);\r\nbegin\r\n FGroups.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetNodes(const Value: TTMSFNCTreeViewNodes);\r\nbegin\r\n FNodes.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateCheckState(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AChecked: Boolean);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateColumns;\r\nvar\r\n I: Integer;\r\n c: TTMSFNCTreeViewColumn;\r\n g: TTMSFNCTreeViewGroup;\r\n grp: TTMSFNCTreeViewDisplayGroup;\r\nbegin\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n DisplayGroups.Clear;\r\n for I := 0 to Groups.Count - 1 do\r\n begin\r\n g := Groups[I];\r\n grp.StartColumn := Max(0, Min(g.StartColumn, Columns.Count - 1));\r\n grp.EndColumn := Max(0, Min(g.EndColumn, Columns.Count - 1));\r\n DisplayGroups.Add(grp);\r\n end;\r\n\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n c := Columns[I];\r\n if c.Visible then\r\n ColumnWidths[I] := c.Width\r\n else\r\n ColumnWidths[I] := 0;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNode(ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if not Assigned(ANode) or (csDestroying in ComponentState) or not NodeListBuild then\r\n Exit;\r\n\r\n if BlockUpdateNode then\r\n Exit;\r\n\r\n ANode.FCalculated := False;\r\n\r\n if UpdateCount > 0 then\r\n Exit;\r\n\r\n UpdateNodesCache;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeBitmapRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; ABitmapRects: TTMSFNCArrayTRectF);\r\nbegin\r\n ANode.FBitmapRects := ABitmapRects;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeCacheReference(\r\n ANode: TTMSFNCTreeViewVirtualNode; ACache: TTMSFNCTreeViewCacheItem);\r\nbegin\r\n ANode.FCache := ACache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeCheckRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; ACheckRects: TTMSFNCArrayTRectF);\r\nbegin\r\n ANode.FCheckRects := ACheckRects;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeCheckStates(\r\n ANode: TTMSFNCTreeViewVirtualNode; ACheckStates: TTMSFNCArrayBoolean);\r\nbegin\r\n ANode.FCheckStates := ACheckStates;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeChildren(ANode: TTMSFNCTreeViewVirtualNode;\r\n AChildren: Integer);\r\nbegin\r\n ANode.FChildren := AChildren;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeExpanded(ANode: TTMSFNCTreeViewVirtualNode;\r\n AExpanded: Boolean);\r\nbegin\r\n ANode.FExpanded := AExpanded;\r\n if Assigned(ANode.Node) then\r\n ANode.Node.FExpanded := AExpanded;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeExpandRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; AExpandRects: TTMSFNCArrayTRectF);\r\nbegin\r\n ANode.FExpandRects := AExpandRects;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeExtended(\r\n ANode: TTMSFNCTreeViewVirtualNode; AExtended: Boolean);\r\nbegin\r\n ANode.FExtended := AExtended;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeExtraRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; AExtraRects: TTMSFNCArrayTRectF);\r\nbegin\r\n ANode.FExtraRects := AExtraRects;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeHeight(ANode: TTMSFNCTreeViewVirtualNode;\r\n AHeight: Double);\r\nbegin\r\n ANode.FHeight := AHeight;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ExpandNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; ARecurse: Boolean = False);\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if (csDestroying in ComponentState) or not Assigned(ANode) or ANode.Expanded then\r\n Exit;\r\n\r\n if Assigned(ANode) then\r\n ANode.FExpanded := True;\r\n\r\n UpdateNodeExpanded(ANode, True);\r\n if ARecurse then\r\n begin\r\n for I := ANode.Row + 1 to ANode.Row + ANode.TotalChildren do\r\n begin\r\n v := GetNodeFromNodeStructure(I);\r\n if Assigned(v) then\r\n UpdateNodeExpanded(v, True);\r\n end;\r\n end;\r\n UpdateVisibleNodes(ANode);\r\n if not FBlockUpdate then\r\n begin\r\n ResetNodes(False);\r\n UpdateTreeView;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeIndex(ANode: TTMSFNCTreeViewVirtualNode;\r\n AIndex: Integer);\r\nbegin\r\n ANode.FIndex := AIndex;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeLevel(ANode: TTMSFNCTreeViewVirtualNode;\r\n ALevel: Integer);\r\nbegin\r\n ANode.FLevel := ALevel;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeParentNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AParentNode: Integer);\r\nbegin\r\n ANode.FParentNode := AParentNode;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeRow(ANode: TTMSFNCTreeViewVirtualNode;\r\n ARow: Integer);\r\nbegin\r\n ANode.FRow := ARow;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodesInternal(ANodeRemoveData: TTMSFNCTreeViewVirtualNodeRemoveData);\r\nvar\r\n cnt: Integer;\r\n I, pi, R: Integer;\r\n rs: TTMSFNCTreeViewVirtualNode;\r\n ext, exp: Boolean;\r\n chkst: TTMSFNCArrayBoolean;\r\n K: Integer;\r\n chk: Boolean;\r\nbegin\r\n cnt := ANodeRemoveData.Count;\r\n pi := ANodeRemoveData.ParentNode;\r\n R := ANodeRemoveData.RowIndex;\r\n\r\n for I := R to NodeStructure.Count - 1 do\r\n begin\r\n rs := GetNodeFromNodeStructure(I);\r\n if Assigned(rs) then\r\n begin\r\n UpdateNodeRow(rs, rs.Row - cnt);\r\n\r\n if rs.ParentNode > pi then\r\n UpdateNodeParentNode(rs, rs.ParentNode - cnt);\r\n\r\n if rs.ParentNode = pi then\r\n UpdateNodeIndex(rs, rs.Index - 1);\r\n\r\n GetNodeForNodeData(rs);\r\n\r\n exp := False;\r\n DoIsNodeExpanded(rs, exp);\r\n UpdateNodeExpanded(rs, exp);\r\n\r\n ext := False;\r\n DoIsNodeExtended(rs, ext);\r\n UpdateNodeExtended(rs, ext);\r\n\r\n SetLength(chkst, 0);\r\n for K := 0 to ColumnCount - 1 do\r\n begin\r\n chk := False;\r\n DoIsNodeChecked(RS, K, chk);\r\n SetLength(chkst, Length(chkst) + 1);\r\n chkst[Length(chkst) - 1] := chk;\r\n end;\r\n\r\n UpdateNodeCheckStates(rs, chkst);\r\n end;\r\n end;\r\n\r\n if not FBlockUpdate then\r\n begin\r\n ResetNodes(False);\r\n UpdateTreeView;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeTextRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; ATextRects: TTMSFNCArrayTRectF);\r\nbegin\r\n ANode.FTextRects := ATextRects;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeTitleHeight(\r\n ANode: TTMSFNCTreeViewVirtualNode; AHeight: Double);\r\nbegin\r\n ANode.FTitleHeight := AHeight;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeTitleRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; ATitleRects: TTMSFNCArrayTRectF);\r\nbegin\r\n ANode.FTitleRects := ATitleRects;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeTitleExtraRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; ATitleExtraRects: TTMSFNCArrayTRectF);\r\nbegin\r\n ANode.FTitleExtraRects := ATitleExtraRects;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.UpdateNodeTotalChildren(\r\n ANode: TTMSFNCTreeViewVirtualNode; ATotalChildren: Integer);\r\nbegin\r\n ANode.FTotalChildren := ATotalChildren;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ScrollToNode(ANode: TTMSFNCTreeViewNode; AScrollIfNotVisible: Boolean = False; AScrollPosition: TTMSFNCTreeViewNodeScrollPosition = tvnspTop; AForceScroll: Boolean = False);\r\nbegin\r\n if Assigned(ANode) then\r\n ScrollToVirtualNode(ANode.VirtualNode, AScrollIfNotVisible, AScrollPosition, AForceScroll);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ScrollToVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AScrollIfNotVisible: Boolean = False; AScrollPosition: TTMSFNCTreeViewNodeScrollPosition = tvnspTop; AForceScroll: Boolean = False);\r\nbegin\r\n if not Assigned(ANode) then\r\n Exit;\r\n\r\n if IsVariableNodeHeight then\r\n begin\r\n while not ANode.Calculated and (ANode.Expanded or (ANode.Children = 0)) do\r\n ScrollToVirtualNodeInternal(ANode, AScrollIfNotVisible, AScrollPosition, AForceScroll);\r\n end;\r\n\r\n ScrollToVirtualNodeInternal(ANode, AScrollIfNotVisible, AScrollPosition, AForceScroll);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ScrollToVirtualNodeInternal(ANode: TTMSFNCTreeViewVirtualNode; AScrollIfNotVisible: Boolean = False;\r\n AScrollPosition: TTMSFNCTreeViewNodeScrollPosition = tvnspTop; AForceScroll: Boolean = False);\r\nvar\r\n I, C: Integer;\r\n yp, ps: Double;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n yp := 0;\r\n c := 0;\r\n if Assigned(ANode) then\r\n begin\r\n for I := 0 to VisibleNodes.Count - 1 do\r\n begin\r\n v := VisibleNodes[I];\r\n if Assigned(v) then\r\n begin\r\n if v.Row = ANode.Row then\r\n Break;\r\n\r\n if v.Calculated then\r\n yp := yp + v.Height\r\n else\r\n Inc(c);\r\n end;\r\n end;\r\n\r\n yp := yp + DefaultRowHeight * c;\r\n ps := yp;\r\n case AScrollPosition of\r\n tvnspBottom: yp := yp - GetVViewPortSize + ANode.Height;\r\n tvnspMiddle: yp := yp - GetVViewPortSize / 2 + ANode.Height / 2;\r\n end;\r\n\r\n CustomizeScrollPosition(ANode, yp, ps);\r\n\r\n if AScrollIfNotVisible then\r\n begin\r\n if ((ps < Abs(GetVScrollValue)) or (ps + ANode.Height > Abs(GetVScrollValue) + GetVViewPortSize)) or AForceScroll then\r\n Scroll(GetHScrollValue, yp);\r\n end\r\n else\r\n begin\r\n Scroll(GetHScrollValue, yp);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewData.GetNodeForRow(\r\n ARow: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if (ARow >= 0) and (ARow <= VisibleNodes.Count - 1) then\r\n Result := VisibleNodes[ARow];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.ScrollToVirtualNodeRow(ARow: Integer;\r\n AScrollIfNotVisible: Boolean;\r\n AScrollPosition: TTMSFNCTreeViewNodeScrollPosition; AForceScroll: Boolean);\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n n := GetNodeForRow(ARow);\r\n if Assigned(n) then\r\n ScrollToVirtualNode(n, AScrollIfNotVisible, AScrollPosition, AForceScroll);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nbegin\r\n FBitmapContainer := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewData.SetColumns(const Value: TTMSFNCTreeViewColumns);\r\nbegin\r\n FColumns.Assign(Value);\r\nend;\r\n\r\n{ TTMSFNCTreeViewGroup }\r\n\r\nprocedure TTMSFNCTreeViewGroup.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewGroup then\r\n begin\r\n FTag := (Source as TTMSFNCTreeViewGroup).Tag;\r\n FText := (Source as TTMSFNCTreeViewGroup).Text;\r\n FStartColumn := (Source as TTMSFNCTreeViewGroup).StartColumn;\r\n FEndColumn := (Source as TTMSFNCTreeViewGroup).EndColumn;\r\n FUseDefaultAppearance := (Source as TTMSFNCTreeViewGroup).UseDefaultAppearance;\r\n FBottomFill.Assign((Source as TTMSFNCTreeViewGroup).BottomFill);\r\n FBottomFont.Assign((Source as TTMSFNCTreeViewGroup).BottomFont);\r\n FBottomStroke.Assign((Source as TTMSFNCTreeViewGroup).BottomStroke);\r\n FTopFill.Assign((Source as TTMSFNCTreeViewGroup).TopFill);\r\n FTopStroke.Assign((Source as TTMSFNCTreeViewGroup).TopStroke);\r\n FTopFont.Assign((Source as TTMSFNCTreeViewGroup).TopFont);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.Changed(Sender: TObject);\r\nbegin\r\n UpdateGroup;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewGroup.Create(ACollection: TCollection);\r\nvar\r\n grp: TTMSFNCTreeViewGroup;\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n begin\r\n FTreeView := (Collection as TTMSFNCTreeViewGroups).TreeView;\r\n FText := TranslateTextEx(sTMSFNCTreeViewGroup) + ' ' + inttostr(FTreeView.Groups.Count - 1);\r\n if FTreeView.Groups.Count < 2 then\r\n begin\r\n FStartColumn := 0;\r\n FEndColumn := 0\r\n end\r\n else\r\n begin\r\n grp := FTreeView.Groups[FTreeView.Groups.Count - 2];\r\n FStartColumn := grp.StartColumn + 1;\r\n FEndColumn := FStartColumn;\r\n end;\r\n end;\r\n\r\n FUseDefaultAppearance := True;\r\n\r\n FBottomFill := TTMSFNCGraphicsFill.Create(gfkNone, gcWhite);\r\n FBottomStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FTopFill := TTMSFNCGraphicsFill.Create(gfkNone, gcWhite);\r\n FTopStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n\r\n FTopFont := TTMSFNCGraphicsFont.Create;\r\n FBottomFont := TTMSFNCGraphicsFont.Create;\r\n\r\n FBottomFill.OnChanged := @Changed;\r\n FTopFill.OnChanged := @Changed;\r\n FBottomStroke.OnChanged := @Changed;\r\n FTopStroke.OnChanged := @Changed;\r\n\r\n {$IFDEF FMXLIB}\r\n FTopFont.OnChanged := @Changed;\r\n FBottomFont.OnChanged := @Changed;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FTopFont.OnChange := @Changed;\r\n FBottomFont.OnChange := @Changed;\r\n {$ENDIF}\r\n\r\n UpdateGroup;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewGroup.Destroy;\r\nbegin\r\n FTopFill.Free;\r\n FTopStroke.Free;\r\n FTopFont.Free;\r\n FBottomFill.Free;\r\n FBottomStroke.Free;\r\n FBottomFont.Free;\r\n inherited;\r\n UpdateGroup;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewGroup.GetText: String;\r\nbegin\r\n Result := Text;\r\n if Result = '' then\r\n begin\r\n Result := Name;\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCTreeViewGroup) + ' ' + inttostr(Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewGroup.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetStartColumn(const Value: Integer);\r\nbegin\r\n if FStartColumn <> Value then\r\n begin\r\n FStartColumn := Value;\r\n UpdateGroup;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetEndColumn(const Value: Integer);\r\nbegin\r\n if FEndColumn <> Value then\r\n begin\r\n FEndColumn := Value;\r\n UpdateGroup;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FBottomFont <> Value then\r\n FBottomFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetBottomStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FBottomStroke <> Value then\r\n FBottomStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FBottomFill <> Value then\r\n FBottomFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetTopFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FTopFont <> Value then\r\n FTopFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetTopStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FTopStroke <> Value then\r\n FTopStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetUseDefaultAppearance(const Value: Boolean);\r\nbegin\r\n if FUseDefaultAppearance <> Value then\r\n begin\r\n FUseDefaultAppearance := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetTopFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FTopFill <> Value then\r\n FTopFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetName(const Value: String);\r\nbegin\r\n if FName <> Value then\r\n begin\r\n FName := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n UpdateGroup;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroup.UpdateGroup;\r\nvar\r\n c: TTMSFNCTreeViewData;\r\nbegin\r\n c := TreeView;\r\n if Assigned(c) then\r\n begin\r\n c.UpdateColumns;\r\n c.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTreeViewGroups }\r\n\r\nfunction TTMSFNCTreeViewGroups.Add: TTMSFNCTreeViewGroup;\r\nbegin\r\n Result := TTMSFNCTreeViewGroup(inherited Add);\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewGroups.Create(ATreeView: TTMSFNCTreeViewData);\r\nbegin\r\n inherited Create(ATreeView, GetItemClass);\r\n FTreeView := ATreeView;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewGroups.GetItem(Index: Integer): TTMSFNCTreeViewGroup;\r\nbegin\r\n Result := TTMSFNCTreeViewGroup(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewGroups.GetItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCTreeViewGroup;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewGroups.Insert(Index: Integer): TTMSFNCTreeViewGroup;\r\nbegin\r\n Result := TTMSFNCTreeViewGroup(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCTreeViewGroups.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroups.SetItem(Index: Integer;\r\n const Value: TTMSFNCTreeViewGroup);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TTMSFNCTreeViewNode }\r\n\r\nfunction TTMSFNCTreeViewNode.SaveToString(ATextOnly: Boolean = True): String;\r\nconst\r\n TabChar = #9;\r\nvar\r\n vn: TTMSFNCTreeViewVirtualNode;\r\n I: Integer;\r\nbegin\r\n if not Assigned(FTreeView) then\r\n Exit;\r\n\r\n vn := VirtualNode;\r\n Result := '';\r\n for I := 0 to vn.Level - 1 do\r\n Result := Result + TabChar;\r\n\r\n for I := 0 to FTreeView.ColumnCount - 1 do\r\n begin\r\n if ATextOnly then\r\n begin\r\n if I = FTreeView.ColumnCount - 1 then\r\n Result := Result + GetStrippedHTMLText(I)\r\n else\r\n Result := Result + GetStrippedHTMLText(I)+'{1}'\r\n end\r\n else\r\n begin\r\n if I = FTreeView.ColumnCount - 1 then\r\n Result := Result + Text[I]\r\n else\r\n Result := Result + Text[I]+'{1}'\r\n end;\r\n end;\r\n\r\n if not ATextOnly then\r\n Result := Result + '{0}';\r\n\r\n for I := 0 to FTreeView.ColumnCount - 1 do\r\n begin\r\n if not ATextOnly then\r\n begin\r\n Result := Result + IntToStr(Integer(CheckTypes[I])) + ';';\r\n Result := Result + BoolToStr(Checked[I]) + ';';\r\n Result := Result + ExpandedIconNames[I, False] + ';';\r\n Result := Result + ExpandedIconNames[I, True] + ';';\r\n Result := Result + CollapsedIconNames[I, False] + ';';\r\n Result := Result + CollapsedIconNames[I, True] + ';';\r\n Result := Result + TTMSFNCUtils.SaveBitmapToHexStr(ExpandedIcons[I, False]) + ';';\r\n Result := Result + TTMSFNCUtils.SaveBitmapToHexStr(ExpandedIcons[I, True]) + ';';\r\n Result := Result + TTMSFNCUtils.SaveBitmapToHexStr(CollapsedIcons[I, False]) + ';';\r\n if I = Values.Count - 1 then\r\n Result := Result + TTMSFNCUtils.SaveBitmapToHexStr(CollapsedIcons[I, True])\r\n else\r\n Result := Result + TTMSFNCUtils.SaveBitmapToHexStr(CollapsedIcons[I, True]) + '|';\r\n end;\r\n end;\r\n\r\n if not ATextOnly then\r\n begin\r\n Result := Result + '{0}';\r\n Result := Result + BoolToStr(Extended) + '{0}';\r\n Result := Result + BoolToStr(Enabled);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetChecked(AColumn: integer;\r\n const Value: Boolean);\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n v.Checked := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetCheckStates(\r\n ACheckStates: TTMSFNCTreeViewNodeCheckStates);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(ACheckStates) - 1 do\r\n Checked[I] := ACheckStates[I];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetCheckType(AColumn: Integer;\r\n const Value: TTMSFNCTreeViewNodeCheckType);\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n v.CheckType := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetCheckTypes(\r\n ACheckTypes: TTMSFNCTreeViewNodeCheckTypes);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(ACheckTypes) - 1 do\r\n CheckTypes[I] := ACheckTypes[I];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetCollapsedIconNames(\r\n AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(AIconNames) - 1 do\r\n CollapsedIconNames[I, ALarge] := AIconNames[I];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetCollapsedIcons(AIcons: TTMSFNCTreeViewNodeIcons;\r\n ALarge: Boolean);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(AIcons) - 1 do\r\n CollapsedIcons[I, ALarge] := AIcons[I];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetCollapsedIcon(AColumn: Integer;\r\n ALarge: Boolean; const Value: TTMSFNCBitmap);\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n v.CollapsedIconLarge.Assign(Value)\r\n else\r\n v.CollapsedIcon.Assign(Value);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetCollapsedIconName(AColumn: Integer;\r\n ALarge: Boolean; const Value: String);\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n v.CollapsedIconLargeName := Value\r\n else\r\n v.CollapsedIconName := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetExpandedIconNames(\r\n AIconNames: TTMSFNCTreeViewNodeIconNames; ALarge: Boolean);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(AIconNames) - 1 do\r\n ExpandedIconNames[I, ALarge] := AIconNames[I];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetExpandedIcons(AIcons: TTMSFNCTreeViewNodeIcons;\r\n ALarge: Boolean);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(AIcons) - 1 do\r\n ExpandedIcons[I, ALarge] := AIcons[I];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetExpandedIcon(AColumn: Integer;\r\n ALarge: Boolean; const Value: TTMSFNCBitmap);\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n v.ExpandedIconLarge.Assign(Value)\r\n else\r\n v.ExpandedIcon.Assign(Value);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetExpandedIconName(AColumn: Integer;\r\n ALarge: Boolean; const Value: String);\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n v.ExpandedIconLargeName := Value\r\n else\r\n v.ExpandedIconName := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetText(AColumn: Integer; const Value: String);\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n v.Text := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetTextValues(\r\n ATextValues: TTMSFNCTreeViewNodeTextValues);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(ATextValues) - 1 do\r\n Text[I] := ATextValues[I];\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.AssignData(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewNode then\r\n begin\r\n FDataString := (Source as TTMSFNCTreeViewNode).DataString;\r\n FDataBoolean := (Source as TTMSFNCTreeViewNode).DataBoolean;\r\n FDataObject := (Source as TTMSFNCTreeViewNode).DataObject;\r\n FDataInteger := (Source as TTMSFNCTreeViewNode).DataInteger;\r\n FDBKey := (Source as TTMSFNCTreeViewNode).DBKey;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewNode then\r\n begin\r\n FTag := (Source as TTMSFNCTreeViewNode).Tag;\r\n FValues.Assign((Source as TTMSFNCTreeViewNode).Values);\r\n FExpanded := (Source as TTMSFNCTreeViewNode).Expanded;\r\n FExtended := (Source as TTMSFNCTreeViewNode).Extended;\r\n FEnabled := (Source as TTMSFNCTreeViewNode).Enabled;\r\n FNodes.Assign((Source as TTMSFNCTreeViewNode).Nodes);\r\n AssignData(Source);\r\n if Assigned(FTreeView) then\r\n begin\r\n if FExpanded then\r\n FTreeView.ExpandNode(Self)\r\n else\r\n FTreeView.CollapseNode(Self);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.Collapse(ARecurse: Boolean);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.CollapseNode(Self, ARecurse);\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewNode.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FTreeView := (Collection as TTMSFNCTreeViewNodes).TreeView;\r\n FValues := CreateNodeValues;\r\n\r\n FExpanded := False;\r\n FExtended := False;\r\n FEnabled := True;\r\n FNodes := CreateNodes;\r\n if Assigned(FTreeView) then\r\n begin\r\n if FTreeView.NodeListBuild then\r\n FTreeView.InsertItemInternal(Self)\r\n else\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.CreateNodes: TTMSFNCTreeViewNodes;\r\nbegin\r\n Result := TTMSFNCTreeViewNodes.Create(FTreeView, Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.CreateNodeValues: TTMSFNCTreeViewNodeValues;\r\nbegin\r\n Result := TTMSFNCTreeViewNodeValues.Create(FTreeView, Self);\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewNode.Destroy;\r\nvar\r\n ru: TTMSFNCTreeViewVirtualNodeRemoveData;\r\nbegin\r\n ru.RowIndex := -1;\r\n ru.Count := 0;\r\n ru.ParentNode := -1;\r\n if Assigned(FTreeView) then\r\n begin\r\n if FTreeView.NodeListBuild and not (FTreeView.BlockRemoveNode > 0) then\r\n ru := FTreeView.RemoveItemInternal(Self, False);\r\n end;\r\n FVirtualNode := nil;\r\n\r\n if Assigned(FTreeView) then\r\n FTreeView.BlockRemoveNode := FTreeView.BlockRemoveNode + 1;\r\n FNodes.Free;\r\n if Assigned(FTreeView) then\r\n FTreeView.BlockRemoveNode := FTreeView.BlockRemoveNode - 1;\r\n FValues.Free;\r\n\r\n inherited;\r\n\r\n if (ru.RowIndex <> -1) then\r\n FTreeView.UpdateNodesInternal(ru);\r\n\r\n if Assigned(FTreeView) then\r\n FTreeView.UpdateTreeViewCache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.Expand(ARecurse: Boolean);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.ExpandNode(Self, ARecurse);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetChecked(AColumn: integer): Boolean;\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := False;\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n Result := v.Checked;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetCheckType(\r\n AColumn: Integer): TTMSFNCTreeViewNodeCheckType;\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := tvntNone;\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n Result := v.CheckType;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetChildCount: Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNodeChildCount(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetCollapsedIcon(AColumn: Integer;\r\n ALarge: Boolean): TTMSFNCBitmap;\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := nil;\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n Result := v.CollapsedIconLarge\r\n else\r\n Result := v.CollapsedIcon;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetCollapsedIconName(AColumn: Integer;\r\n ALarge: Boolean): String;\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := '';\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n Result := v.CollapsedIconLargeName\r\n else\r\n Result := v.CollapsedIconName;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetExpandedIcon(AColumn: Integer;\r\n ALarge: Boolean): TTMSFNCBitmap;\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := nil;\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n Result := v.ExpandedIconLarge\r\n else\r\n Result := v.ExpandedIcon;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetExpandedIconName(AColumn: Integer;\r\n ALarge: Boolean): string;\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := '';\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n begin\r\n if ALarge then\r\n Result := v.ExpandedIconLargeName\r\n else\r\n Result := v.ExpandedIconName;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetFirstChild: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetFirstChildNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetLastChild: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetLastChildNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetNext: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNextNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetNextChild(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNextChildNode(Self, ANode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetNextSibling: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNextSiblingNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetParent: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetParentNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetPrevious: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetPreviousNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetPreviousChild(ANode: TTMSFNCTreeViewNode): TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetPreviousChildNode(Self, ANode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetPreviousSibling: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetPreviousSiblingNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetStrippedHTMLText(AColumn: Integer): String;\r\nbegin\r\n Result := TTMSFNCUtils.HTMLStrip(Text[AColumn]);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetText(AColumn: Integer): String;\r\nvar\r\n v: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := '';\r\n v := GetValueForColumn(AColumn);\r\n if Assigned(v) then\r\n Result := v.Text;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.GetValueForColumn(\r\n AColumn: Integer): TTMSFNCTreeViewNodeValue;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n if (AColumn >= 0) and (AColumn <= Values.Count - 1) then\r\n begin\r\n Result := Values[AColumn];\r\n Exit;\r\n end;\r\n\r\n FTreeView.BlockUpdateNode := True;\r\n for I := 0 to AColumn do\r\n begin\r\n if I > Values.Count - 1 then\r\n Result := Values.Add;\r\n end;\r\n FTreeView.BlockUpdateNode := False;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.LoadFromString(AString: String);\r\nvar\r\n k, l: Integer;\r\n a: TStringList;\r\n c, s: TStringList;\r\n y: Integer;\r\n st: string;\r\n ps: Integer;\r\n subst: string;\r\nbegin\r\n a := TStringList.Create;\r\n try\r\n st := AString;\r\n while st <> '' do\r\n begin\r\n ps := Pos('{0}', st);\r\n if ps = 0 then\r\n begin\r\n a.Add(st);\r\n Break;\r\n end;\r\n subst := Copy(st, 1, ps - 1);\r\n a.Add(subst);\r\n Delete(st, 1, ps - 1 + Length('{0}'));\r\n end;\r\n\r\n for K := 0 to a.Count - 1 do\r\n begin\r\n if a[K] <> '' then\r\n begin\r\n if K = 0 then\r\n begin\r\n c := TStringList.Create;\r\n try\r\n st := a[K];\r\n while st <> '' do\r\n begin\r\n ps := Pos('{1}', st);\r\n if ps = 0 then\r\n begin\r\n c.Add(st);\r\n Break;\r\n end;\r\n subst := Copy(st, 1, ps - 1);\r\n c.Add(subst);\r\n Delete(st, 1, ps - 1 + Length('{0}'));\r\n end;\r\n\r\n for L := 0 to c.Count - 1 do\r\n begin\r\n if c[L] <> '' then\r\n Text[L] := c[L];\r\n end;\r\n finally\r\n c.free;\r\n end;\r\n end\r\n else if K = 1 then\r\n begin\r\n c := TStringList.Create;\r\n try\r\n TTMSFNCUtils.Split('|', a[K], c);\r\n for L := 0 to c.Count - 1 do\r\n begin\r\n s := TStringList.Create;\r\n try\r\n TTMSFNCUtils.Split(';', c[L], s);\r\n for y := 0 to s.Count - 1 do\r\n begin\r\n if s[y] <> '' then\r\n begin\r\n if y = 0 then\r\n CheckTypes[L] := TTMSFNCTreeViewNodeCheckType(StrToInt(s[y]))\r\n else if y = 1 then\r\n Checked[L] := StrToBool(s[y])\r\n else if y = 2 then\r\n ExpandedIconNames[L, False] := s[y]\r\n else if y = 3 then\r\n ExpandedIconNames[L, True] := s[y]\r\n else if y = 4 then\r\n CollapsedIconNames[L, False] := s[y]\r\n else if y = 5 then\r\n CollapsedIconNames[L, True] := s[y]\r\n else if (y = 6) or (y = 7) or (y = 8) or (y = 9) then\r\n begin\r\n if y = 6 then\r\n TTMSFNCUtils.LoadBitmapFromHexStr(s[y], ExpandedIcons[L, False])\r\n else if y = 7 then\r\n TTMSFNCUtils.LoadBitmapFromHexStr(s[y], ExpandedIcons[L, True])\r\n else if y = 8 then\r\n TTMSFNCUtils.LoadBitmapFromHexStr(s[y], CollapsedIcons[L, False])\r\n else\r\n TTMSFNCUtils.LoadBitmapFromHexStr(s[y], CollapsedIcons[L, True]);\r\n end;\r\n end;\r\n end;\r\n finally\r\n s.Free;\r\n end;\r\n end;\r\n finally\r\n c.Free;\r\n end;\r\n end\r\n else if K = 2 then\r\n Extended := StrToBool(a[K])\r\n else if K = 3 then\r\n Enabled := StrToBool(a[K]);\r\n end;\r\n end;\r\n finally\r\n a.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.CopyTo(ADestination: TTMSFNCTreeViewNode; AIndex: Integer = -1);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.CopyNode(Self, ADestination, AIndex);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.MoveTo(ADestination: TTMSFNCTreeViewNode; AIndex: Integer = -1);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.MoveNode(Self, ADestination, AIndex);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.RemoveChildren;\r\nbegin\r\n Nodes.Clear;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNode.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetEnabled(const Value: Boolean);\r\nbegin\r\n if FEnabled <> Value then\r\n begin\r\n FEnabled := Value;\r\n UpdateNode;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetExpanded(const Value: Boolean);\r\nbegin\r\n if FExpanded <> Value then\r\n begin\r\n FExpanded := Value;\r\n if Assigned(FTreeView) then\r\n FTreeView.ToggleNode(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetExtended(const Value: Boolean);\r\nbegin\r\n if FExtended <> Value then\r\n begin\r\n FExtended := Value;\r\n UpdateNode;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetIndex(Value: Integer);\r\n\r\n procedure InsertSubNodes(ANodes: TTMSFNCTreeViewNodes);\r\n var\r\n I: Integer;\r\n begin\r\n for I := 0 to ANodes.Count - 1 do\r\n begin\r\n FTreeView.InsertItemInternal(ANodes[I]);\r\n InsertSubNodes(ANodes[I].Nodes);\r\n end;\r\n end;\r\n\r\nbegin\r\n inherited;\r\n if Assigned(FTreeView) then\r\n begin\r\n if FTreeView.NodeListBuild then\r\n begin\r\n FTreeView.RemoveItemInternal(Self);\r\n FTreeView.InsertItemInternal(Self);\r\n InsertSubNodes(Nodes);\r\n end\r\n else\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetNodes(const Value: TTMSFNCTreeViewNodes);\r\nbegin\r\n if FNodes <> Value then\r\n begin\r\n FNodes.Assign(Value);\r\n UpdateNode;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.SetValues(const Value: TTMSFNCTreeViewNodeValues);\r\nbegin\r\n if FValues <> Value then\r\n begin\r\n FValues.Assign(Value);\r\n UpdateNode;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.UpdateNode;\r\nvar\r\n c: TTMSFNCTreeViewData;\r\nbegin\r\n c := TreeView;\r\n if Assigned(c) then\r\n begin\r\n if FTreeView.NodeListBuild then\r\n c.UpdateNode(VirtualNode)\r\n else\r\n c.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNode.ValuesChanged(Sender: TObject);\r\nbegin\r\n UpdateNode;\r\nend;\r\n\r\n{ TTMSFNCTreeViewNodes }\r\n\r\nfunction TTMSFNCTreeViewNodes.Add: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := TTMSFNCTreeViewNode(inherited Add);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodes.Compare(ANode1, ANode2: TTMSFNCTreeViewNode; AColumn: Integer = 0; ACaseSensitive: Boolean = True;\r\n ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending): Integer;\r\nvar\r\n td: TTMSFNCTreeViewData;\r\nbegin\r\n Result := 0;\r\n\r\n td := TreeView;\r\n if not Assigned(td) then\r\n Exit;\r\n\r\n if not ACaseSensitive then\r\n Result := AnsiCompareStr(UpperCase(ANode1.StrippedHTMLText[AColumn]), UpperCase(ANode2.StrippedHTMLText[AColumn]))\r\n else\r\n Result := AnsiCompareStr(ANode1.StrippedHTMLText[AColumn], ANode2.StrippedHTMLText[AColumn]);\r\n\r\n case ASortingMode of\r\n nsmDescending: Result := Result * -1;\r\n end;\r\n\r\n td.DoNodeCompare(ANode1, ANode2, AColumn, Result);\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewNodes.Create(ATreeView: TTMSFNCTreeViewData; ANode: TTMSFNCTreeViewNode);\r\nbegin\r\n inherited Create(ATreeView, GetItemClass);\r\n FTreeView := ATreeView;\r\n FNode := ANode;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewNodes.Destroy;\r\nbegin\r\n FNode := nil;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodes.GetItem(Index: Integer): TTMSFNCTreeViewNode;\r\nbegin\r\n Result := TTMSFNCTreeViewNode(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodes.GetItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCTreeViewNode;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodes.Insert(Index: Integer): TTMSFNCTreeViewNode;\r\nbegin\r\n Result := TTMSFNCTreeViewNode(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodes.Node: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := FNode;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodes.QuickSort(L, R: Integer; AColumn: Integer = 0; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending);\r\nvar\r\n I, J, p: Integer;\r\n {$IFDEF LCLWEBLIB}\r\n SortList: TFPList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n {$IFDEF WEBLIB}\r\n Save: JSValue;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Save: Pointer;\r\n {$ENDIF}\r\n begin\r\n Save := SortList.Items[Index1];\r\n SortList.Items[Index1] := SortList.Items[Index2];\r\n SortList.Items[Index2] := Save;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n SortList: TList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n Save: TCollectionItem;\r\n begin\r\n Save := SortList[Index1];\r\n SortList[Index1] := SortList[Index2];\r\n SortList[Index2] := Save;\r\n Save.Index := Index2;\r\n end;\r\n {$ENDIF}\r\nbegin\r\n //This cast allows us to get at the private elements in the base class\r\n {$IFNDEF WEBLIB}\r\n SortList := {%H-}TShadowedCollection(Self).FItems;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n SortList := Self.FPList;\r\n {$ENDIF}\r\n\r\n repeat\r\n I := L;\r\n J := R;\r\n P := (L + R) shr 1;\r\n repeat\r\n while Compare(Items[I], Items[P], AColumn, ACaseSensitive, ASortingMode) < 0 do\r\n Inc(I);\r\n while Compare(Items[J], Items[P], AColumn, ACaseSensitive, ASortingMode) > 0 do\r\n Dec(J);\r\n if I <= J then\r\n begin\r\n ExchangeItems(I, J);\r\n if P = I then\r\n P := J\r\n else if P = J then\r\n P := I;\r\n Inc(I);\r\n Dec(J);\r\n end;\r\n until I > J;\r\n if L < J then\r\n QuickSort(L, J, AColumn, ACaseSensitive, ASortingMode);\r\n L := I;\r\n until I >= R;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodes.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodes.SetItem(Index: Integer;\r\n const Value: TTMSFNCTreeViewNode);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodes.Sort(AColumn: Integer = 0; ARecurse: Boolean = False; ACaseSensitive: Boolean = True;\r\n ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending; AClearNodeList: Boolean = True);\r\nvar\r\n td: TTMSFNCTreeViewData;\r\n I: Integer;\r\nbegin\r\n td := TreeView;\r\n if Assigned(td) then\r\n begin\r\n td.BeginUpdate;\r\n if AClearNodeList then\r\n td.ClearNodeList;\r\n BeginUpdate;\r\n if Count > 0 then\r\n begin\r\n QuickSort(0, Pred(Count), AColumn, ACaseSensitive, ASortingMode);\r\n if ARecurse then\r\n begin\r\n for I := 0 to Count - 1 do\r\n Self[I].Nodes.Sort(AColumn, ARecurse, ACaseSensitive, ASortingMode, AClearNodeList);\r\n end;\r\n end;\r\n EndUpdate;\r\n td.EndUpdate;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTreeViewColumn }\r\n\r\nprocedure TTMSFNCTreeViewColumn.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewColumn then\r\n begin\r\n FTag := (Source as TTMSFNCTreeViewColumn).Tag;\r\n FText := (Source as TTMSFNCTreeViewColumn).Text;\r\n FName := (Source as TTMSFNCTreeViewColumn).Name;\r\n FTrimming := (Source as TTMSFNCTreeViewColumn).Trimming;\r\n FWordWrapping := (Source as TTMSFNCTreeViewColumn).WordWrapping;\r\n FHorizontalTextAlign := (Source as TTMSFNCTreeViewColumn).HorizontalTextAlign;\r\n FVerticalTextAlign := (Source as TTMSFNCTreeViewColumn).VerticalTextAlign;\r\n FTitleTrimming := (Source as TTMSFNCTreeViewColumn).TitleTrimming;\r\n FTitleWordWrapping := (Source as TTMSFNCTreeViewColumn).TitleWordWrapping;\r\n FTitleHorizontalTextAlign := (Source as TTMSFNCTreeViewColumn).TitleHorizontalTextAlign;\r\n FTitleVerticalTextAlign := (Source as TTMSFNCTreeViewColumn).TitleVerticalTextAlign;\r\n FWidth := (Source as TTMSFNCTreeViewColumn).Width;\r\n FVisible := (Source as TTMSFNCTreeViewColumn).Visible;\r\n FUseDefaultAppearance := (Source as TTMSFNCTreeViewColumn).UseDefaultAppearance;\r\n FFill.Assign((Source as TTMSFNCTreeViewColumn).Fill);\r\n FDisabledFontColor := (Source as TTMSFNCTreeViewColumn).DisabledFontColor;\r\n FSelectedFontColor := (Source as TTMSFNCTreeViewColumn).SelectedFontColor;\r\n FDisabledTitleFontColor := (Source as TTMSFNCTreeViewColumn).DisabledTitleFontColor;\r\n FSelectedTitleFontColor := (Source as TTMSFNCTreeViewColumn).SelectedTitleFontColor;\r\n FTitleFont.Assign((Source as TTMSFNCTreeViewColumn).TitleFont);\r\n FFont.Assign((Source as TTMSFNCTreeViewColumn).Font);\r\n FStroke.Assign((Source as TTMSFNCTreeViewColumn).Stroke);\r\n FBottomFill.Assign((Source as TTMSFNCTreeViewColumn).BottomFill);\r\n FBottomFont.Assign((Source as TTMSFNCTreeViewColumn).BottomFont);\r\n FBottomStroke.Assign((Source as TTMSFNCTreeViewColumn).BottomStroke);\r\n FTopFill.Assign((Source as TTMSFNCTreeViewColumn).TopFill);\r\n FTopStroke.Assign((Source as TTMSFNCTreeViewColumn).TopStroke);\r\n FTopFont.Assign((Source as TTMSFNCTreeViewColumn).TopFont);\r\n FEditorType := (Source as TTMSFNCTreeViewColumn).EditorType;\r\n FEditorItems.Assign((Source as TTMSFNCTreeViewColumn).EditorItems);\r\n FCustomEditor := (Source as TTMSFNCTreeViewColumn).CustomEditor;\r\n FSorting := (Source as TTMSFNCTreeViewColumn).Sorting;\r\n FFiltering.Assign((Source as TTMSFNCTreeViewColumn).Filtering);\r\n FExpandingButtonSize := (Source as TTMSFNCTreeViewColumn).ExpandingButtonSize;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.Changed(Sender: TObject);\r\nbegin\r\n UpdateColumn;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewColumn.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FTreeView := (Collection as TTMSFNCTreeViewColumns).TreeView;\r\n\r\n FSorting := tcsNone;\r\n FExpandingButtonSize := 15;\r\n Expanded := True;\r\n FSortIndex := -1;\r\n FSortKind := nskNone;\r\n FFiltering := TTMSFNCTreeViewColumnFiltering.Create(Self);\r\n FEditorType := tcetNone;\r\n FWordWrapping := False;\r\n FTrimming := gttNone;\r\n FCustomEditor := False;\r\n FHorizontalTextAlign := gtaLeading;\r\n FVerticalTextAlign := gtaCenter;\r\n FTitleWordWrapping := False;\r\n FTitleTrimming := gttNone;\r\n FTitleHorizontalTextAlign := gtaLeading;\r\n FTitleVerticalTextAlign := gtaCenter;\r\n FEditorItems := TStringList.Create;\r\n if Assigned(Collection) then\r\n FText := TranslateTextEx(sTMSFNCTreeViewColumn) + ' ' + inttostr(Collection.Count - 1);\r\n\r\n FName := StringReplace(FText, ' ', '', [rfReplaceAll]);\r\n FWidth := 100;\r\n FVisible := True;\r\n FUseDefaultAppearance := True;\r\n\r\n FBottomFill := TTMSFNCGraphicsFill.Create(gfkNone, gcWhite);\r\n FBottomStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FTopFill := TTMSFNCGraphicsFill.Create(gfkNone, gcWhite);\r\n FTopStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcNull);\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FSelectedFontColor := gcWhite;\r\n FDisabledFontColor := gcSilver;\r\n\r\n FSelectedTitleFontColor := gcWhite;\r\n FDisabledTitleFontColor := gcSilver;\r\n\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FTitleFont := TTMSFNCGraphicsFont.Create;\r\n FTopFont := TTMSFNCGraphicsFont.Create;\r\n FBottomFont := TTMSFNCGraphicsFont.Create;\r\n\r\n FBottomFill.OnChanged := @Changed;\r\n FTopFill.OnChanged := @Changed;\r\n FBottomStroke.OnChanged := @Changed;\r\n FTopStroke.OnChanged := @Changed;\r\n FStroke.OnChanged := @Changed;\r\n FFill.OnChanged := @Changed;\r\n\r\n FFont.OnChanged := @Changed;\r\n FTitleFont.OnChanged := @Changed;\r\n FTopFont.OnChanged := @Changed;\r\n FBottomFont.OnChanged := @Changed;\r\n\r\n UpdateColumn;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewColumn.Destroy;\r\nbegin\r\n FFiltering.Free;\r\n FEditorItems.Free;\r\n FTopFill.Free;\r\n FTopStroke.Free;\r\n FTopFont.Free;\r\n FBottomFill.Free;\r\n FBottomStroke.Free;\r\n FBottomFont.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n FFont.Free;\r\n FTitleFont.Free;\r\n inherited;\r\n UpdateColumn;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumn.GetColumnText: String;\r\nbegin\r\n Result := Text;\r\n if (Result = '') or (AnsiPos(' 0) or (AnsiPos('/>', Result) > 0) or (AnsiPos('
', UpperCase(Result)) > 0) then\r\n begin\r\n Result := Name;\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCTreeViewColumn) + ' ' + inttostr(Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumn.GetText: String;\r\nbegin\r\n Result := Text;\r\n if Result = '' then\r\n begin\r\n Result := Name;\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCTreeViewColumn) + ' ' + inttostr(Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumn.IsExpandingButtonSizeStored: Boolean;\r\nbegin\r\n Result := ExpandingButtonSize <> 15;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumn.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FBottomFont <> Value then\r\n FBottomFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetBottomStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FBottomStroke <> Value then\r\n FBottomStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetDisabledFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledFontColor <> Value then\r\n begin\r\n FDisabledFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetDisabledTitleFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledTitleFontColor <> Value then\r\n begin\r\n FDisabledTitleFontColor := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetEditorItems(const Value: TStringList);\r\nbegin\r\n FEditorItems.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetEditorType(\r\n const Value: TTMSFNCTreeViewColumnEditorType);\r\nbegin\r\n if FEditorType <> Value then\r\n FEditorType := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetExpandable(const Value: Boolean);\r\nbegin\r\n if FExpandable <> Value then\r\n begin\r\n FExpandable := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetExpanded(const Value: Boolean);\r\nbegin\r\n if FExpanded <> Value then\r\n begin\r\n FExpanded := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetExpandingButtonSize(const Value: Single);\r\nbegin\r\n FExpandingButtonSize := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FBottomFill <> Value then\r\n FBottomFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FFont <> Value then\r\n FFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetSelectedFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedFontColor <> Value then\r\n begin\r\n FSelectedFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetSelectedTitleFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedTitleFontColor <> value then\r\n begin\r\n FSelectedTitleFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetSortIndex(const Value: Integer);\r\nbegin\r\n if FSortIndex <> Value then\r\n begin\r\n FSortIndex := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetSorting(const Value: TTMSFNCTreeViewColumnSorting);\r\nbegin\r\n if FSorting <> Value then\r\n begin\r\n FSorting := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetSortKind(\r\n const Value: TTMSFNCTreeViewNodesSortKind);\r\nbegin\r\n if FSortKind <> Value then\r\n begin\r\n FSortKind := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FStroke <> Value then\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FFill <> Value then\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetFiltering(\r\n const Value: TTMSFNCTreeViewColumnFiltering);\r\nbegin\r\n if FFiltering <> Value then\r\n FFiltering.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTopFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FTopFont <> Value then\r\n FTopFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTopStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FTopStroke <> Value then\r\n FTopStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTopFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FTopFill <> Value then\r\n FTopFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetName(const Value: String);\r\nbegin\r\n if FName <> Value then\r\n begin\r\n FName := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTitleFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FTitleFont <> Value then\r\n FTitleFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTitleHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTitleHorizontalTextAlign <> Value then\r\n begin\r\n FTitleHorizontalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTitleTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTitleTrimming <> Value then\r\n begin\r\n FTitleTrimming := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTitleVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTitleVerticalTextAlign <> Value then\r\n begin\r\n FTitleVerticalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTitleWordWrapping(const Value: Boolean);\r\nbegin\r\n if FTitleWordWrapping <> Value then\r\n begin\r\n FTitleWordWrapping := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetUseDefaultAppearance(const Value: Boolean);\r\nbegin\r\n if FUseDefaultAppearance <> Value then\r\n begin\r\n FUseDefaultAppearance := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetVisible(const Value: Boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetWidth(const Value: Double);\r\nbegin\r\n if FWidth <> Value then\r\n begin\r\n FWidth := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.Sort(ARecurse, ACaseSensitive: Boolean; ASortingMode: TTMSFNCTreeViewNodesSortMode);\r\nvar\r\n t: TTMSFNCTreeViewData;\r\nbegin\r\n t := TreeView;\r\n if Assigned(t) then\r\n t.Nodes.Sort(Index, ARecurse, ACaseSensitive, ASortingMode);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.UpdateColumn;\r\nvar\r\n t: TTMSFNCTreeViewData;\r\nbegin\r\n t := TreeView;\r\n if Assigned(t) then\r\n begin\r\n t.UpdateColumns;\r\n t.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumn.UpdateWidth(AWidth: Double);\r\nbegin\r\n FWidth := AWidth;\r\nend;\r\n\r\n{ TTMSFNCTreeViewColumns }\r\n\r\nfunction TTMSFNCTreeViewColumns.Add: TTMSFNCTreeViewColumn;\r\nbegin\r\n Result := TTMSFNCTreeViewColumn(inherited Add);\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewColumns.Create(ATreeView: TTMSFNCTreeViewData);\r\nbegin\r\n inherited Create(ATreeView, GetItemClass);\r\n FTreeView := ATreeView;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumns.GetItem(Index: Integer): TTMSFNCTreeViewColumn;\r\nbegin\r\n Result := TTMSFNCTreeViewColumn(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumns.GetItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCTreeViewColumn;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumns.Insert(Index: Integer): TTMSFNCTreeViewColumn;\r\nbegin\r\n Result := TTMSFNCTreeViewColumn(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumns.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumns.SetItem(Index: Integer;\r\n const Value: TTMSFNCTreeViewColumn);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TTMSFNCTreeViewNodeValue }\r\n\r\nfunction TTMSFNCTreeViewNodeValue.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.BitmapContainer;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewNodeValue then\r\n begin\r\n FTag := (Source as TTMSFNCTreeViewNodeValue).Tag;\r\n FText := (Source as TTMSFNCTreeViewNodeValue).Text;\r\n FTitleExpanded := (Source as TTMSFNCTreeViewNodeValue).TitleExpanded;\r\n FTitle := (Source as TTMSFNCTreeViewNodeValue).Title;\r\n FCheckType := (Source as TTMSFNCTreeViewNodeValue).CheckType;\r\n FChecked := (Source as TTMSFNCTreeViewNodeValue).Checked;\r\n FCollapsedIcon.Assign((Source as TTMSFNCTreeViewNodeValue).CollapsedIcon);\r\n FCollapsedIconLarge.Assign((Source as TTMSFNCTreeViewNodeValue).CollapsedIconLarge);\r\n FExpandedIcon.Assign((Source as TTMSFNCTreeViewNodeValue).ExpandedIcon);\r\n FExpandedIconLarge.Assign((Source as TTMSFNCTreeViewNodeValue).ExpandedIconLarge);\r\n FCollapsedIconName := (Source as TTMSFNCTreeViewNodeValue).CollapsedIconName;\r\n FCollapsedIconLargeName := (Source as TTMSFNCTreeViewNodeValue).CollapsedIconLargeName;\r\n FExpandedIconName := (Source as TTMSFNCTreeViewNodeValue).ExpandedIconName;\r\n FExpandedIconLargeName := (Source as TTMSFNCTreeViewNodeValue).ExpandedIconLargeName;\r\n AssignData(Source);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.AssignData(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewNodeValue then\r\n begin\r\n FDataString := (Source as TTMSFNCTreeViewNodeValue).DataString;\r\n FDataPointer := (Source as TTMSFNCTreeViewNodeValue).DataPointer;\r\n FDataBoolean := (Source as TTMSFNCTreeViewNodeValue).DataBoolean;\r\n FDataObject := (Source as TTMSFNCTreeViewNodeValue).DataObject;\r\n FDataInteger := (Source as TTMSFNCTreeViewNodeValue).DataInteger;\r\n FDBKey := (Source as TTMSFNCTreeViewNodeValue).DBKey;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.BitmapChanged(Sender: TObject);\r\nbegin\r\n UpdateNodeValue;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewNodeValue.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n begin\r\n FTreeView := (Collection as TTMSFNCTreeViewNodeValues).TreeView;\r\n FNode := (Collection as TTMSFNCTreeViewNodeValues).Node;\r\n end;\r\n FChecked := False;\r\n FTitleExpanded := True;\r\n FCheckType := tvntNone;\r\n FCollapsedIcon := TTMSFNCBitmap.Create;\r\n FCollapsedIcon.OnChange := @BitmapChanged;\r\n FExpandedIcon := TTMSFNCBitmap.Create;\r\n FExpandedIcon.OnChange := @BitmapChanged;\r\n\r\n FCollapsedIconLarge := TTMSFNCBitmap.Create;\r\n FCollapsedIconLarge.OnChange := @BitmapChanged;\r\n FExpandedIconLarge := TTMSFNCBitmap.Create;\r\n FExpandedIconLarge.OnChange := @BitmapChanged;\r\n\r\n UpdateNodeValue;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewNodeValue.Destroy;\r\nbegin\r\n FCollapsedIcon.Free;\r\n FCollapsedIconLarge.Free;\r\n FExpandedIcon.Free;\r\n FExpandedIconLarge.Free;\r\n inherited;\r\n UpdateNodeValue;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeValue.Node: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := FNode;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeValue.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetChecked(const Value: Boolean);\r\nvar\r\n chkst: TTMSFNCArrayBoolean;\r\n I: Integer;\r\n chk: Boolean;\r\n t: TTMSFNCTreeViewData;\r\n n: TTMSFNCTreeViewNode;\r\nbegin\r\n if FChecked <> Value then\r\n begin\r\n FChecked := Value;\r\n t := TreeView;\r\n n := Node;\r\n if Assigned(t) and Assigned(n) and Assigned(n.VirtualNode) then\r\n begin\r\n SetLength(chkst, 0);\r\n for I := 0 to t.ColumnCount - 1 do\r\n begin\r\n chk := False;\r\n TreeView.DoIsNodeChecked(Node.VirtualNode, I, chk);\r\n SetLength(chkst, Length(chkst) + 1);\r\n chkst[Length(chkst) - 1] := chk;\r\n end;\r\n\r\n TreeView.UpdateNodeCheckStates(Self.Node.VirtualNode, chkst);\r\n end;\r\n\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetCheckType(\r\n const Value: TTMSFNCTreeViewNodeCheckType);\r\nbegin\r\n if FCheckType <> Value then\r\n begin\r\n FCheckType := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetCollapsedIconName(const Value: String);\r\nbegin\r\n if FCollapsedIconName <> Value then\r\n begin\r\n FCollapsedIconName := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetCollapsedIconLargeName(const Value: String);\r\nbegin\r\n if FCollapsedIconLargeName <> Value then\r\n begin\r\n FCollapsedIconLargeName := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetExpandedIconName(const Value: String);\r\nbegin\r\n if FExpandedIconName <> Value then\r\n begin\r\n FExpandedIconName := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetExpandedIconLargeName(const Value: String);\r\nbegin\r\n if FExpandedIconLargeName <> Value then\r\n begin\r\n FExpandedIconLargeName := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetTitleExpanded(const Value: Boolean);\r\nbegin\r\n if FTitleExpanded <> Value then\r\n begin\r\n FTitleExpanded := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetCollapsedIcon(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FCollapsedIcon <> Value then\r\n begin\r\n FCollapsedIcon.Assign(Value);\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetCollapsedIconLarge(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FCollapsedIconLarge <> Value then\r\n begin\r\n FCollapsedIconLarge.Assign(Value);\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetExpandedIcon(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FExpandedIcon <> Value then\r\n begin\r\n FExpandedIcon.Assign(Value);\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetExpandedIconLarge(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FExpandedIconLarge <> Value then\r\n begin\r\n FExpandedIconLarge.Assign(Value);\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.SetTitle(const Value: String);\r\nbegin\r\n if FTitle <> Value then\r\n begin\r\n FTitle := Value;\r\n UpdateNodeValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValue.UpdateNodeValue;\r\nvar\r\n c: TTMSFNCTreeViewData;\r\n n: TTMSFNCTreeViewNode;\r\nbegin\r\n c := TreeView;\r\n n := Node;\r\n if Assigned(c) and Assigned(n) then\r\n c.UpdateNode(n.VirtualNode);\r\nend;\r\n\r\n{ TTMSFNCTreeViewNodeValues }\r\n\r\nfunction TTMSFNCTreeViewNodeValues.Add: TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := TTMSFNCTreeViewNodeValue(inherited Add);\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewNodeValues.Create(ATreeView: TTMSFNCTreeViewData; ANode: TTMSFNCTreeViewNode);\r\nbegin\r\n inherited Create(ATreeView, GetItemClass);\r\n FTreeView := ATreeView;\r\n FNode := ANode;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeValues.GetItem(Index: Integer): TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := TTMSFNCTreeViewNodeValue(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeValues.GetItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCTreeViewNodeValue;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeValues.Insert(Index: Integer): TTMSFNCTreeViewNodeValue;\r\nbegin\r\n Result := TTMSFNCTreeViewNodeValue(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeValues.Node: TTMSFNCTreeViewNode;\r\nbegin\r\n Result := FNode;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeValues.TreeView: TTMSFNCTreeViewData;\r\nbegin\r\n Result := FTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValues.UpdateChecked(AIndex: Integer;\r\n AValue: Boolean);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.UpdateCount := FTreeView.UpdateCount + 1;\r\n Items[AIndex].Checked := AValue;\r\n if Assigned(FTreeView) then\r\n FTreeView.UpdateCount := FTreeView.UpdateCount - 1;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeValues.SetItem(Index: Integer;\r\n const Value: TTMSFNCTreeViewNodeValue);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TTMSFNCTreeViewCacheItem }\r\n\r\nclass function TTMSFNCTreeViewCacheItem.CreateGroupBottom(ARect: TRectF; AGroup: Integer; AStartColumn, AEndColumn: Integer): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem.Create;\r\n Result.Kind := ikGroupBottom;\r\n Result.Group := AGroup;\r\n Result.StartColumn := AStartColumn;\r\n Result.EndColumn := AEndColumn;\r\n Result.Rect := ARect;\r\nend;\r\n\r\nclass function TTMSFNCTreeViewCacheItem.CreateGroupTop(\r\n ARect: TRectF; AGroup: Integer; AStartColumn, AEndColumn: Integer): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem.Create;\r\n Result.Kind := ikGroupTop;\r\n Result.Group := AGroup;\r\n Result.StartColumn := AStartColumn;\r\n Result.EndColumn := AEndColumn;\r\n Result.Rect := ARect;\r\nend;\r\n\r\nclass function TTMSFNCTreeViewCacheItem.CreateNode(ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem.Create;\r\n Result.Kind := ikNode;\r\n Result.Rect := ARect;\r\n Result.Node := ANode;\r\nend;\r\n\r\nclass function TTMSFNCTreeViewCacheItem.CreateColumnTop(ARect: TRectF; AColumn: Integer): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem.Create;\r\n Result.Kind := ikColumnTop;\r\n Result.Column := AColumn;\r\n Result.Rect := ARect;\r\nend;\r\n\r\nclass function TTMSFNCTreeViewCacheItem.CreateColumnBottom(ARect: TRectF; AColumn: Integer): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem.Create;\r\n Result.Kind := ikColumnBottom;\r\n Result.Column := AColumn;\r\n Result.Rect := ARect;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewCacheItem.Destroy;\r\nbegin\r\n FNode := nil;\r\n inherited;\r\nend;\r\n\r\n{ TTMSFNCTreeViewVirtualNode }\r\n\r\nprocedure TTMSFNCTreeViewVirtualNode.Collapse(ARecurse: Boolean = False);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.CollapseVirtualNode(Self, ARecurse);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewVirtualNode.CopyFrom(\r\n Source: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(Source) then\r\n begin\r\n FChildren := (Source as TTMSFNCTreeViewVirtualNode).Children;\r\n FTotalChildren := (Source as TTMSFNCTreeViewVirtualNode).TotalChildren;\r\n FExpanded := (Source as TTMSFNCTreeViewVirtualNode).Expanded;\r\n FExtended := (Source as TTMSFNCTreeViewVirtualNode).Extended;\r\n FLevel := (Source as TTMSFNCTreeViewVirtualNode).Level;\r\n FRow := (Source as TTMSFNCTreeViewVirtualNode).Row;\r\n FCalculated := (Source as TTMSFNCTreeViewVirtualNode).Calculated;\r\n FHeight := (Source as TTMSFNCTreeViewVirtualNode).Height;\r\n FParentNode := (Source as TTMSFNCTreeViewVirtualNode).ParentNode;\r\n FIndex := (Source as TTMSFNCTreeViewVirtualNode).Index;\r\n FTextRects := (Source as TTMSFNCTreeViewVirtualNode).TextRects;\r\n FExtraRects := (Source as TTMSFNCTreeViewVirtualNode).ExtraRects;\r\n FBitmapRects := (Source as TTMSFNCTreeViewVirtualNode).BitmapRects;\r\n FCheckRects := (Source as TTMSFNCTreeViewVirtualNode).CheckRects;\r\n FExpandRects := (Source as TTMSFNCTreeViewVirtualNode).ExpandRects;\r\n FCheckStates := (Source as TTMSFNCTreeViewVirtualNode).CheckStates;\r\n FNode := (Source as TTMSFNCTreeViewVirtualNode).Node;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewVirtualNode.Create(ATreeView: TTMSFNCTreeViewData);\r\nbegin\r\n FTreeView := ATreeView;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewVirtualNode.Destroy;\r\nbegin\r\n FCache := nil;\r\n FNode := nil;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewVirtualNode.Expand(ARecurse: Boolean = False);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.ExpandVirtualNode(Self, ARecurse);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetChildCount: Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetVirtualNodeChildCount(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetTitleExpanded(AColumn: Integer): Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetVirtualNodeTitleExpanded(Self, AColumn);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetFirstChild: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetFirstChildVirtualNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetLastChild: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetLastChildVirtualNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetNext: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNextVirtualNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetNextChild(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNextChildVirtualNode(Self, ANode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetNextSibling: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNextSiblingVirtualNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetParent: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetParentVirtualNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetPrevious: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetPreviousVirtualNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetPreviousChild(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetPreviousChildVirtualNode(Self, ANode);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetPreviousSibling: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetPreviousSiblingVirtualNode(Self);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetText(AColumn: Integer): String;\r\nbegin\r\n Result := '';\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetVirtualNodeText(Self, AColumn);\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVirtualNode.GetTitle(AColumn: Integer): String;\r\nbegin\r\n Result := '';\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetVirtualNodeTitle(Self, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewVirtualNode.RemoveChildren;\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.RemoveVirtualNodeChildren(Self);\r\nend;\r\n\r\n{ TTMSFNCTreeViewColumnFiltering }\r\n\r\nprocedure TTMSFNCTreeViewColumnFiltering.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewColumnFiltering then\r\n begin\r\n FEnabled := (Source as TTMSFNCTreeViewColumnFiltering).Enabled;\r\n FDropDownWidth := (Source as TTMSFNCTreeViewColumnFiltering).DropDownWidth;\r\n FDropDownHeight := (Source as TTMSFNCTreeViewColumnFiltering).DropDownHeight;\r\n FMultiColumn := (Source as TTMSFNCTreeViewColumnFiltering).MultiColumn;\r\n FButtonSize := (Source as TTMSFNCTreeViewColumnFiltering).ButtonSize;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewColumnFiltering.Create(AColumn: TTMSFNCTreeViewColumn);\r\nbegin\r\n FColumn := AColumn;\r\n FEnabled := False;\r\n FDropDownWidth := 100;\r\n FDropDownHeight := 120;\r\n FMultiColumn := False;\r\n FButtonSize := 15;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewColumnFiltering.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewColumnFiltering.IsButtonSizeStored: Boolean;\r\nbegin\r\n Result := ButtonSize <> 15;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnFiltering.SetButtonSize(const Value: Single);\r\nbegin\r\n if FButtonSize <> Value then\r\n begin\r\n FButtonSize := Value;\r\n if Assigned(FColumn) then\r\n FColumn.UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnFiltering.SetEnabled(const Value: Boolean);\r\nbegin\r\n if FEnabled <> Value then\r\n begin\r\n FEnabled := Value;\r\n if Assigned(FColumn) then\r\n FColumn.UpdateColumn;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTreeViewFilterData }\r\n\r\nprocedure TTMSFNCTreeViewFilterData.Assign(Source: TPersistent);\r\nvar\r\n ASrcFilterData: TTMSFNCTreeViewFilterData;\r\nbegin\r\n ASrcFilterData := Source as TTMSFNCTreeViewFilterData;\r\n if Assigned(ASrcFilterData) then\r\n begin\r\n FColumn := ASrcFilterData.Column;\r\n FCondition := ASrcFilterData.Condition;\r\n FCaseSensitive := ASrcFilterData.CaseSensitive;\r\n FPrefix := ASrcFilterData.Prefix;\r\n FSuffix := ASrcFilterData.Suffix;\r\n FOperation := ASrcFilterData.Operation;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewFilterData.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FCaseSensitive := True;\r\nend;\r\n\r\n{ TTMSFNCTreeViewFilter }\r\n\r\nfunction TTMSFNCTreeViewFilter.Add: TTMSFNCTreeViewFilterData;\r\nbegin\r\n Result := TTMSFNCTreeViewFilterData(inherited Add);\r\n if Count = 1 then\r\n Result.Operation := tfoNone\r\n else\r\n Result.Operation := tfoAND;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewFilter.Create(AOwner: TTMSFNCTreeViewData);\r\nbegin\r\n inherited Create(AOwner, TTMSFNCTreeViewFilterData);\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewFilter.GetColFilter(Col: Integer): TTMSFNCTreeViewFilterData;\r\nvar\r\n i: Integer;\r\nbegin\r\n for i := 1 to Count do\r\n begin\r\n if Items[i - 1].Column = Col then\r\n begin\r\n Result := Items[i - 1];\r\n Exit;\r\n end;\r\n end;\r\n Result := Add;\r\n Result.Column := Col;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewFilter.GetItem(Index: Integer): TTMSFNCTreeViewFilterData;\r\nbegin\r\n Result := TTMSFNCTreeViewFilterData(inherited GetItem(Index));\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewFilter.RemoveColumnFilter(Col: integer);\r\nvar\r\n i: integer;\r\nbegin\r\n i := Count;\r\n\r\n while i > 0 do\r\n begin\r\n dec(i);\r\n if Items[i].Column = Col then\r\n Delete(i);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewFilter.HasFilter(Col: integer): Boolean;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := false;\r\n\r\n for i := 1 to Count do\r\n begin\r\n if Items[i - 1].Column = Col then\r\n begin\r\n Result := true;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewFilter.Insert(index: Integer): TTMSFNCTreeViewFilterData;\r\nbegin\r\n Result := TTMSFNCTreeViewFilterData(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewFilter.SetItem(Index: Integer; const Value: TTMSFNCTreeViewFilterData);\r\nbegin\r\n inherited SetItem(Index, Value);\r\nend;\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCTreeViewCacheItemList.GetItem(Index: Integer): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewCacheItemList.SetItem(Index: Integer; const Value: TTMSFNCTreeViewCacheItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewIntegerList.GetItem(Index: Integer): Integer;\r\nbegin\r\n Result := Integer(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewIntegerList.SetItem(Index: Integer; const Value: Integer);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodeStructure.GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := TTMSFNCTreeViewVirtualNode(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodeStructure.SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewVisibleNodes.GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := TTMSFNCTreeViewVirtualNode(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewVisibleNodes.SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewDisplayGroups.GetItem(Index: Integer): TTMSFNCTreeViewDisplayGroup;\r\nbegin\r\n Result := TTMSFNCTreeViewDisplayGroup(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewDisplayGroups.SetItem(Index: Integer; const Value: TTMSFNCTreeViewDisplayGroup);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 - 2017 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCPopup;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n {$IFDEF MSWINDOWS}\r\n Windows,\r\n {$ENDIF}\r\n Classes, WEBLib.Controls, WEBLib.TMSFNCCustomComponent, WEBLib.TMSFNCGraphics, WEBLib.Graphics,\r\n WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphicsTypes, WEBLib.Forms, WEBLib.ExtCtrls\r\n {$IFNDEF LCLLIB}\r\n ,Types\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 22}\r\n ,UITypes\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ,Messages\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n {$IFNDEF MSWINDOWS}\r\n ,LMessages\r\n {$ENDIF}\r\n ,LCLType, LCLIntf\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 3; // Build nr.\r\n\r\n // version history\r\n // v1.0.0.0 : first release\r\n // v1.0.0.1 : Fixed: Issue with popup on Android\r\n // v1.0.0.2 : Fixed: Issue with multi-monitor screen detection\r\n // v1.0.0.3 : Fixed: Issue with multi-moniutor screen detection on LCL and VCL\r\n\r\ntype\r\n TTMSFNCPopupPlacement = (ppBottom, ppTop, ppLeft, ppRight, ppCenter, ppBottomCenter, ppTopCenter, ppLeftCenter, ppRightCenter, ppAbsolute,\r\n ppMouse, ppMouseCenter, ppAboveMouse, ppAboveMouseCenter);\r\n\r\n TTMSFNCPopupPaint = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF) of object;\r\n\r\n TTMSFNCCustomPopupFormClass = class of TTMSFNCCustomPopupForm;\r\n\r\n TTMSFNCCustomPopup = class;\r\n\r\n TTMSFNCCustomPopupForm = class(TCustomForm)\r\n private\r\n FPreferedDisplayIndex: Integer;\r\n FHintWindow: Boolean;\r\n FTimer: TTimer;\r\n FFirstShow: Boolean;\r\n FOwner: TComponent;\r\n FShowModal: Boolean;\r\n FPlacement: TTMSFNCPopupPlacement;\r\n FRealPlacement: TTMSFNCPopupPlacement;\r\n FPlacementControl: TControl;\r\n FOffset: TPointF;\r\n FSize: TSizeF;\r\n FPlacementRectangle: TTMSFNCMargins;\r\n FScreenPlacementRect: TRectF;\r\n FPlacementChanged: Boolean;\r\n FDragWithParent: Boolean;\r\n FOnBeforeClose: TNotifyEvent;\r\n FOnBeforeShow: TNotifyEvent;\r\n FScreenContentRect: TRectF;\r\n FContentPadding: TTMSFNCMargins;\r\n FContentControl: TControl;\r\n FOnRealPlacementChanged: TNotifyEvent;\r\n FOnPopupPaint: TTMSFNCPopupPaint;\r\n procedure SetOffset(const Value: TPointF);\r\n procedure SetSize(const Value: TSizeF);\r\n procedure TimerProc(Sender: TObject);\r\n procedure SetPlacementRectangle(const Value: TTMSFNCMargins);\r\n procedure SetPlacement(const Value: TTMSFNCPopupPlacement);\r\n procedure SetPlacementControl(const Value: TControl);\r\n procedure SetDragWithParent(const Value: Boolean);\r\n procedure SetContentPadding(const Value: TTMSFNCMargins);\r\n procedure SetContentControl(const Value: TControl);\r\n function GetPopup: TTMSFNCCustomPopup;\r\n protected\r\n procedure DoBeforeShow; virtual;\r\n procedure DoBeforeClose; virtual;\r\n procedure UpdateBounds(LRect: TRectF); virtual;\r\n procedure DoClose(var CloseAction: TCloseAction); override;\r\n procedure DoApplyPlacement; virtual;\r\n procedure Loaded; override;\r\n procedure Updated; override;\r\n procedure HandleFocusedControl;\r\n function GetPopupParent: TControl;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure DoRealPlacementChanged; virtual;\r\n property DragWithParent: Boolean read FDragWithParent write SetDragWithParent;\r\n property Popup: TTMSFNCCustomPopup read GetPopup;\r\n public\r\n {$IFDEF CMNWEBLIB}\r\n constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n constructor CreateNew(AOwner: TComponent; Dummy: NativeInt = 0); override;\r\n {$ENDIF}\r\n constructor Create(AOwner: TComponent; APlacementControl: TControl = nil); reintroduce;\r\n destructor Destroy; override;\r\n procedure ApplyPlacement; virtual;\r\n procedure KeyDown(var Key: Word; {$IFDEF FMXLIB}var KeyChar: WideChar;{$ENDIF} Shift: TShiftState); override;\r\n function CloseQuery: Boolean; override;\r\n property HintWindow: Boolean read FHintWindow write FHintWindow;\r\n property ContentControl: TControl read FContentControl write SetContentControl;\r\n property ContentPadding: TTMSFNCMargins read FContentPadding write SetContentPadding;\r\n property Offset: TPointF read FOffset write SetOffset;\r\n property Placement: TTMSFNCPopupPlacement read FPlacement write SetPlacement;\r\n property PlacementRectangle: TTMSFNCMargins read FPlacementRectangle write SetPlacementRectangle;\r\n property PlacementControl: TControl read FPlacementControl write SetPlacementControl;\r\n property RealPlacement: TTMSFNCPopupPlacement read FRealPlacement;\r\n property ScreenContentRect: TRectF read FScreenContentRect;\r\n property ScreenPlacementRect: TRectF read FScreenPlacementRect;\r\n property Size: TSizeF read FSize write SetSize;\r\n property OnBeforeShow: TNotifyEvent read FOnBeforeShow write FOnBeforeShow;\r\n property OnBeforeClose: TNotifyEvent read FOnBeforeClose write FOnBeforeClose;\r\n property OnRealPlacementChanged: TNotifyEvent read FOnRealPlacementChanged write FOnRealPlacementChanged;\r\n property OnPopupPaint: TTMSFNCPopupPaint read FOnPopupPaint write FOnPopupPaint;\r\n end;\r\n\r\n TTMSFNCCustomPopup = class(TTMSFNCCustomComponent)\r\n private\r\n {$IFDEF FMXLIB}\r\n FPopup: TPopup;\r\n {$ENDIF}\r\n FOwner: TComponent;\r\n FCustomOwner: TComponent;\r\n FPlacementControl: TControl;\r\n FPopupForm: TTMSFNCCustomPopupForm;\r\n FStaysOpen: Boolean;\r\n FPlacement: TTMSFNCPopupPlacement;\r\n FPlacementRectangle: TTMSFNCMargins;\r\n FHorizontalOffset: Single;\r\n FVerticalOffset: Single;\r\n FDragWithParent: Boolean;\r\n FModalResult: TModalResult;\r\n FModal: Boolean;\r\n FOnClosePopup: TNotifyEvent;\r\n FOnPopup: TNotifyEvent;\r\n FPopupFormSize: TSizeF;\r\n FContentControl: TControl;\r\n FDropDownHeight: Single;\r\n FDropDownWidth: Single;\r\n FFocusable: Boolean;\r\n FFocusedControl: TControl;\r\n FOnPopupPaint: TTMSFNCPopupPaint;\r\n FOnPopupShown: TNotifyEvent;\r\n FIsOpen: Boolean;\r\n procedure SetIsOpen(const Value: Boolean);\r\n procedure SetPlacementRectangle(const Value: TTMSFNCMargins);\r\n procedure SetModalResult(const Value: TModalResult);\r\n procedure SetPlacementControl(const Value: TControl);\r\n procedure SetPlacement(const Value: TTMSFNCPopupPlacement);\r\n procedure SetDragWithParent(const Value: Boolean);\r\n procedure BeforeShowProc(Sender: TObject);\r\n procedure BeforeCloseProc(Sender: TObject);\r\n procedure CloseProc(Sender: TObject; var {%H-}CloseAction: TCloseAction);\r\n procedure ShowProc(Sender: TObject);\r\n procedure DeactivateProc(Sender: TObject);\r\n procedure SetPopupFormSize(const Value: TSizeF);\r\n procedure UpdatePopupSize;\r\n procedure SetContentControl(const Value: TControl);\r\n procedure SetDropDownHeight(const Value: Single);\r\n procedure SetDropDownWidth(const Value: Single);\r\n protected\r\n function GetInstance: NativeUInt; override;\r\n function GetVersion: String; override;\r\n {$IFDEF FNCLIB}\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n {$ENDIF}\r\n procedure ShowPopup(AModal: Boolean); virtual;\r\n procedure HandleFocusedControl;\r\n {$IFDEF FMXLIB}\r\n procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure FormPaint(Sender: TObject);\r\n {$ENDIF}\r\n procedure DoPopupPaint(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF); virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure MarginsChanged(Sender: TObject);\r\n procedure DoClosePopup; virtual;\r\n procedure DoPopup; virtual;\r\n procedure DoPopupShown; virtual;\r\n procedure ClosePopup; virtual;\r\n procedure DoCreatePopup(const AShowModal: Boolean = False); virtual;\r\n function GetPopupFormClass: TTMSFNCCustomPopupFormClass; virtual;\r\n function GetParent: TControl;\r\n function CreatePopupForm: TTMSFNCCustomPopupForm; virtual;\r\n property IsOpen: Boolean read FIsOpen write SetIsOpen;\r\n property ModalResult: TModalResult read FModalResult write SetModalResult;\r\n property PopupFormSize: TSizeF read FPopupFormSize write SetPopupFormSize;\r\n property DragWithParent: Boolean read FDragWithParent write SetDragWithParent default False;\r\n property PopupForm: TTMSFNCCustomPopupForm read FPopupForm;\r\n property StaysOpen: Boolean read FStaysOpen write FStaysOpen default False;\r\n property DropDownHeight: Single read FDropDownHeight write SetDropDownHeight;\r\n property DropDownWidth: Single read FDropDownWidth write SetDropDownWidth;\r\n property HorizontalOffset: Single read FHorizontalOffset write FHorizontalOffset;\r\n property Placement: TTMSFNCPopupPlacement read FPlacement write SetPlacement default ppBottom;\r\n property PlacementRectangle: TTMSFNCMargins read FPlacementRectangle write SetPlacementRectangle;\r\n property PlacementControl: TControl read FPlacementControl write SetPlacementControl;\r\n property VerticalOffset: Single read FVerticalOffset write FVerticalOffset;\r\n property FocusedControl: TControl read FFocusedControl write FFocusedControl;\r\n property ContentControl: TControl read FContentControl write SetContentControl;\r\n property OnClosePopup: TNotifyEvent read FOnClosePopup write FOnClosePopup;\r\n property OnPopupPaint: TTMSFNCPopupPaint read FOnPopupPaint write FOnPopupPaint;\r\n property OnPopup: TNotifyEvent read FOnPopup write FOnPopup;\r\n property CustomOwner: TComponent read FCustomOwner write FCustomOwner;\r\n property OnPopupShown: TNotifyEvent read FOnPopupShown write FOnPopupShown;\r\n property Version: String read GetVersion;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n procedure Assign(Source: TPersistent); override;\r\n destructor Destroy; override;\r\n function HasPopupForm: Boolean;\r\n function PointInPopup(APoint: TPointF): Boolean; virtual;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCPopup = class(TTMSFNCCustomPopup)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n public\r\n function PopupModal: TModalResult; virtual;\r\n procedure Popup(const AShowModal: Boolean = False); virtual;\r\n property AdaptToStyle;\r\n property ModalResult;\r\n property IsOpen;\r\n property PopupFormSize;\r\n property DragWithParent;\r\n property PopupForm;\r\n published\r\n property StaysOpen;\r\n property DropDownHeight;\r\n property DropDownWidth;\r\n property HorizontalOffset;\r\n property Placement;\r\n property PlacementRectangle;\r\n property PlacementControl;\r\n property VerticalOffset;\r\n property FocusedControl;\r\n property ContentControl;\r\n property OnClosePopup;\r\n property OnPopupPaint;\r\n property OnPopup;\r\n property OnPopupShown;\r\n property Version;\r\n end;\r\n\r\n{$IFDEF CMNLIB}\r\n{$IFDEF MSWINDOWS}\r\ntype\r\n LInteger = LONG_PTR;\r\n IntPtr = Pointer;\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\ntype\r\n TTMSFNCCustomNonFocusablePopupForm = class(TTMSFNCCustomPopupForm)\r\n private\r\n {$IFDEF CMNLIB}\r\n {$IFDEF MSWINDOWS}\r\n procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;\r\n procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;\r\n {$ELSE}\r\n procedure WMActivate(var Message: TLMActivate); message LM_ACTIVATE;\r\n procedure WMNCHitTest(var Message: TLMessage); message LM_NCHITTEST;\r\n {$ENDIF}\r\n {$ENDIF}\r\n protected\r\n procedure UpdateBounds(LRect: TRectF); override;\r\n {$IFDEF CMNLIB}\r\n {$IFDEF MSWINDOWS}\r\n procedure CreateParams(var Params: TCreateParams); override;\r\n {$ENDIF}\r\n {$ENDIF}\r\n public\r\n {$IFDEF CMNLIB}\r\n {$IFDEF MSWINDOWS}\r\n constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;\r\n destructor Destroy; override;\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\n\r\n TTMSFNCCustomNonFocusablePopup = class(TTMSFNCCustomPopup)\r\n private\r\n {$IFDEF CMNLIB}\r\n FActiveWindow: HWND;\r\n {$ENDIF}\r\n protected\r\n procedure ActivatePreviousWindow; virtual;\r\n procedure ShowPopup({%H-}AModal: Boolean); override;\r\n function GetPopupFormClass: TTMSFNCCustomPopupFormClass; override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTMSFNCNonFocusablePopup = class(TTMSFNCCustomNonFocusablePopup)\r\n public\r\n procedure Deactivate; virtual;\r\n procedure Activate; virtual;\r\n published\r\n property ContentControl;\r\n property Placement;\r\n property PlacementRectangle;\r\n property PlacementControl;\r\n end;\r\n\r\nimplementation\r\n\r\n{$R TMSFNCPopup.res}\r\n\r\nuses\r\n SysUtils, WEBLib.TMSFNCUtils, Math\r\n {$IFDEF FNCLIB}\r\n , WEBLib.TMSFNCStyles\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n , Web\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n , FMX.Platform\r\n {$ENDIF}\r\n ;\r\n\r\n{$IFDEF CMNLIB}\r\n{$IFDEF MSWINDOWS}\r\ntype\r\n WndProcRec = record\r\n FWindowHandle: HWND;\r\n FProc: LInteger;\r\n end;\r\n\r\nvar\r\n PrevWndProcs: array of WndProcRec;\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\n{ TTMSFNCPopup }\r\n\r\nconstructor TTMSFNCCustomPopup.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n FOwner := AOwner;\r\n FPlacement := ppBottom;\r\n FFocusable := True;\r\n FStaysOpen := False;\r\n FPlacementRectangle := TTMSFNCMargins.Create;\r\n FPlacementRectangle.OnChange := @MarginsChanged;\r\nend;\r\n\r\ndestructor TTMSFNCCustomPopup.Destroy;\r\nbegin\r\n FContentControl := nil;\r\n ClosePopup;\r\n if HasPopupForm then\r\n begin\r\n FreeAndNil(FPopupForm);\r\n end;\r\n FreeAndNil(FPlacementRectangle);\r\n {$IFDEF FMXLIB}\r\n FreeAndNil(FPopup);\r\n {$ENDIF}\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.DeactivateProc(Sender: TObject);\r\nbegin\r\n if Assigned(FPopupForm) and not FPopupForm.FShowModal and not StaysOpen then\r\n begin\r\n FPopupForm.Visible := False;\r\n FPopupForm.Close;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.HandleFocusedControl;\r\nvar\r\n frm: TCustomForm;\r\nbegin\r\n if Assigned(FPopupForm) and Assigned(FocusedControl) then\r\n begin\r\n if not FPopupForm.FShowModal then\r\n begin\r\n frm := TTMSFNCUtils.GetParentForm(FocusedControl);\r\n if Assigned(frm) and (frm <> FPopupForm) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n frm.Activate;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n frm.SetFocus;\r\n {$ENDIF}\r\n end;\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n if FocusedControl.CanFocus then\r\n FocusedControl.SetFocus;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n if FocusedControl is TWinControl then\r\n begin\r\n if (FocusedControl as TWinControl).CanFocus then\r\n (FocusedControl as TWinControl).SetFocus;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n if FocusedControl is TControl then\r\n begin\r\n if (FocusedControl as TControl).CanFocus then\r\n (FocusedControl as TControl).SetFocus;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopup.HasPopupForm: Boolean;\r\nbegin\r\n Result := FPopupForm <> nil;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.MarginsChanged(Sender: TObject);\r\nbegin\r\n if (FPopupForm <> nil) then\r\n FPopupForm.PlacementRectangle := PlacementRectangle;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopup.CreatePopupForm: TTMSFNCCustomPopupForm;\r\nvar\r\n NewForm: TTMSFNCCustomPopupForm;\r\n cls: TTMSFNCCustomPopupFormClass;\r\nbegin\r\n NewForm := nil;\r\n try\r\n cls := GetPopupFormClass;\r\n {$IFDEF FMXLIB}\r\n FPopup := TPopup.Create(Self);\r\n NewForm := cls.Create(FPopup, PlacementControl);\r\n {$ELSE}\r\n NewForm := cls.Create(Self, PlacementControl);\r\n {$ENDIF}\r\n except\r\n FreeAndNil(NewForm);\r\n Raise;\r\n end;\r\n Result := NewForm;\r\nend;\r\n\r\nprocedure TTMSFNCPopup.Popup(const AShowModal: Boolean = False);\r\nbegin\r\n DoCreatePopup(AShowModal);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetModalResult(const Value: TModalResult);\r\nbegin\r\n FModalResult := Value;\r\n if Assigned(FPopupForm) then\r\n FPopupForm.ModalResult := FModalResult;\r\nend;\r\n\r\nfunction TTMSFNCPopup.PopupModal: TModalResult;\r\nvar\r\n LStaysOpen : Boolean;\r\nbegin\r\n Result := 0;\r\n if FIsOpen then\r\n Exit;\r\n\r\n if HasPopupForm then\r\n FPopupForm.Close;\r\n\r\n LStaysOpen := FStaysOpen;\r\n try\r\n FStaysOpen := True;\r\n Popup(True);\r\n Result := FModalResult;\r\n IsOpen := False;\r\n finally\r\n FStaysOpen := LStaysOpen;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPopup.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCPopup);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.ClosePopup;\r\nvar\r\n p: TControl;\r\nbegin\r\n if not HasPopupForm then\r\n Exit;\r\n if FModal and (FModalResult = 0) then\r\n begin\r\n ModalResult := mrCancel;\r\n Exit;\r\n end;\r\n\r\n FIsOpen := False;\r\n if Assigned(FContentControl) then\r\n begin\r\n p := GetParent;\r\n FContentControl.Visible := False;\r\n {$IFDEF FMXLIB}\r\n FContentControl.Parent := p;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if Assigned(p) and (p is TWinControl) then\r\n FContentControl.Parent := p as TWinControl;\r\n {$ENDIF}\r\n end;\r\n\r\n if not (csDestroying in ComponentState) then\r\n begin\r\n if HasPopupForm then\r\n begin\r\n if Self is TTMSFNCNonFocusablePopup then\r\n FPopupForm.Free;\r\n DoClosePopup;\r\n FPopupForm := nil;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.DoClosePopup;\r\nbegin\r\n if Assigned(FOnClosePopup) then\r\n FOnClosePopup(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.DoCreatePopup(const AShowModal: Boolean = False);\r\n{$IFDEF FNCLIB}\r\nvar\r\n ia: ITMSFNCAdaptToStyle;\r\n{$ENDIF}\r\nbegin\r\n if FIsOpen then\r\n Exit;\r\n\r\n if HasPopupForm then\r\n FPopupForm.Close;\r\n\r\n FPopupForm := CreatePopupForm;\r\n try\r\n try\r\n {$IFDEF FMXLIB}\r\n {$IFDEF FMXMOBILE}\r\n if AShowModal then\r\n FPopupForm.FormStyle := TFormStyle.Normal;\r\n {$ENDIF}\r\n {$IFNDEF FMXMOBILE}\r\n FPopupForm.FormStyle := TFormStyle.StayOnTop;\r\n {$ENDIF}\r\n if Assigned(CustomOwner) and (CustomOwner is TFmxObject) then\r\n FPopupForm.Parent := (CustomOwner as TFmxObject)\r\n else if Assigned(Owner) and (Owner is TFmxObject) then\r\n FPopupForm.Parent := TFmxObject(Owner);\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n FPopupForm.FormStyle := fsStayOnTop;\r\n {$ENDIF}\r\n\r\n FPopupForm.OnPaint := FormPaint;\r\n FPopupForm.OnPopupPaint := DoPopupPaint;\r\n\r\n TComponent(FPopupForm).FreeNotification(Self);\r\n FPopupForm.Placement := Placement;\r\n FPopupForm.Offset := PointF(Self.HorizontalOffset, Self.VerticalOffset);\r\n FPopupForm.PlacementRectangle := Self.PlacementRectangle;\r\n FPopupForm.DragWithParent := DragWithParent;\r\n UpdatePopupSize;\r\n FPopupForm.OnDeactivate := DeactivateProc;\r\n FPopupForm.OnBeforeShow := BeforeShowProc;\r\n FPopupForm.OnBeforeClose := BeforeCloseProc;\r\n FPopupForm.OnClose := CloseProc;\r\n FPopupForm.OnShow := ShowProc;\r\n FPopupForm.FShowModal := AShowModal;\r\n\r\n FPopupForm.ContentControl := FContentControl;\r\n {$IFDEF FNCLIB}\r\n if Supports(FContentControl, ITMSFNCAdaptToStyle, ia) then\r\n ia.AdaptToStyle := AdaptToStyle;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n if Assigned(FContentControl) then\r\n FContentControl.Align := TAlignLayout.Client;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if Assigned(FContentControl) then\r\n FContentControl.Align := alClient;\r\n {$ENDIF}\r\n finally\r\n end;\r\n except\r\n FreeAndNil(FPopupForm);\r\n Raise;\r\n end;\r\n\r\n if (not (csDestroying in ComponentState)) then\r\n FPopupForm.DoBeforeShow;\r\n\r\n ShowPopup(AShowModal);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.Notification(AComponent: TComponent; Operation: TOperation);\r\nbegin\r\n inherited;\r\n if Operation = opRemove then\r\n begin\r\n if AComponent = FContentControl then\r\n FContentControl := nil;\r\n\r\n if AComponent = FFocusedControl then\r\n FFocusedControl := nil;\r\n\r\n if (AComponent = FPopupForm) then\r\n FPopupForm := nil;\r\n if (AComponent = FPlacementControl) then\r\n begin\r\n FPlacementControl := nil;\r\n if HasPopupForm then\r\n FPopupForm.PlacementControl := nil;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopup.PointInPopup(APoint: TPointF): Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FPopupForm) then\r\n Result := PtInRectEx(RectF(FPopupForm.Left, FPopupForm.Top, FPopupForm.Left + FPopupForm.Width, FPopupForm.Top + FPopupForm.Height), APoint);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetIsOpen(const Value: Boolean);\r\nbegin\r\n if FIsOpen <> Value then\r\n begin\r\n if csDesigning in ComponentState then\r\n begin\r\n FIsOpen := False;\r\n Exit;\r\n end;\r\n if Value then\r\n DoCreatePopup\r\n else\r\n begin\r\n if HasPopupForm then\r\n FPopupForm.Close\r\n else\r\n FIsOpen := Value;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.BeforeShowProc(Sender: TObject);\r\nbegin\r\n FIsOpen := True;\r\n DoPopup;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.UpdatePopupSize;\r\nvar\r\n LSize: TSizeF;\r\nbegin\r\n if FPopupForm <> nil then\r\n begin\r\n if (FPopupFormSize.cx > 0) then\r\n LSize.cx := FPopupFormSize.cx\r\n else\r\n LSize.cx := DropDownWidth;\r\n if (FPopupFormSize.cy > 0) then\r\n LSize.cy := FPopupFormSize.cy\r\n else\r\n LSize.cy := DropDownHeight;\r\n\r\n FPopupForm.Size := LSize;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomPopup then\r\n begin\r\n FModalResult := (Source as TTMSFNCCustomPopup).ModalResult;\r\n FPopupFormSize := (Source as TTMSFNCCustomPopup).PopupFormSize;\r\n FDragWithParent := (Source as TTMSFNCCustomPopup).DragWithParent;\r\n FStaysOpen := (Source as TTMSFNCCustomPopup).StaysOpen;\r\n FDropDownHeight := (Source as TTMSFNCCustomPopup).DropDownHeight;\r\n FDropDownWidth := (Source as TTMSFNCCustomPopup).DropDownWidth;\r\n FHorizontalOffset := (Source as TTMSFNCCustomPopup).HorizontalOffset;\r\n FPlacementControl := (Source as TTMSFNCCustomPopup).PlacementControl;\r\n FPlacement := (Source as TTMSFNCCustomPopup).Placement;\r\n FPlacementRectangle.Assign((Source as TTMSFNCCustomPopup).PlacementRectangle);\r\n FVerticalOffset := (Source as TTMSFNCCustomPopup).VerticalOffset;\r\n FFocusedControl := (Source as TTMSFNCCustomPopup).FocusedControl;\r\n FContentControl := (Source as TTMSFNCCustomPopup).ContentControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.BeforeCloseProc(Sender: TObject);\r\nbegin\r\n FIsOpen := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.CloseProc(Sender: TObject; var CloseAction: TCloseAction);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if Assigned(PopupForm) and (PopupForm.FormStyle = TFormStyle.Popup) then\r\n begin\r\n if not StaysOpen then\r\n ClosePopup\r\n else\r\n CloseAction := TCloseAction.caNone;\r\n end\r\n else\r\n ClosePopup;\r\n {$ELSE}\r\n ClosePopup;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.DoPopup;\r\nbegin\r\n if Assigned(FOnPopup) then\r\n FOnPopup(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.DoPopupPaint(Sender: TObject; AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nbegin\r\n if Assigned(OnPopupPaint) then\r\n OnPopupPaint(Self, AGraphics, ARect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.DoPopupShown;\r\nbegin\r\n if Assigned(FOnPopupShown) then\r\n FOnPopupShown(Self);\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomPopup.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomPopup.FormPaint(Sender: TObject);\r\n{$ENDIF}\r\nvar\r\n g: TTMSFNCGraphics;\r\n r: TRectF;\r\nbegin\r\n if Assigned(FPopupForm) then\r\n begin\r\n g := TTMSFNCGraphics.Create(FPopupForm.Canvas);\r\n try\r\n g.Fill.Kind := gfkSolid;\r\n g.Stroke.Kind := gskSolid;\r\n g.Fill.Color := TTMSFNCGraphics.DefaultPopupFillColor;\r\n g.Stroke.Color := TTMSFNCGraphics.DefaultPopupStrokeColor;\r\n r := RectF(0, 0, FPopupForm.Width, FPopupForm.Height);\r\n g.DrawRectangle(r);\r\n\r\n if Assigned(OnPopupPaint) then\r\n OnPopupPaint(Self, g, r);\r\n finally\r\n g.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopup.GetInstance: NativeUInt;\r\nbegin\r\n Result := HInstance;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopup.GetParent: TControl;\r\nbegin\r\n Result := PlacementControl;\r\n if not Assigned(Result) and (FOwner is TControl) then\r\n Result := FOwner as TControl;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopup.GetPopupFormClass: TTMSFNCCustomPopupFormClass;\r\nbegin\r\n Result := TTMSFNCCustomPopupForm;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopup.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetPlacement(const Value: TTMSFNCPopupPlacement);\r\nbegin\r\n if FPlacement <> Value then\r\n begin\r\n FPlacement := Value;\r\n if HasPopupForm then\r\n PopupForm.Placement := FPlacement;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetPlacementRectangle(const Value: TTMSFNCMargins);\r\nbegin\r\n FPlacementRectangle.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetPlacementControl(const Value: TControl);\r\nbegin\r\n if FPlacementControl <> Value then\r\n begin\r\n if FPlacementControl <> nil then\r\n FPlacementControl.RemoveFreeNotification(self);\r\n FPlacementControl := Value;\r\n if HasPopupForm then\r\n FPopupForm.PlacementControl := FPlacementControl;\r\n if FPlacementControl <> nil then\r\n FPlacementControl.FreeNotification(self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetPopupFormSize(const Value: TSizeF);\r\nbegin\r\n if (FPopupFormSize.cx <> Value.cx) or (FPopupFormSize.cy <> Value.cy) then\r\n begin\r\n FPopupFormSize := Value;\r\n UpdatePopupSize;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.ShowPopup(AModal: Boolean);\r\nbegin\r\n if AModal then\r\n FModalResult := FPopupForm.ShowModal\r\n else\r\n begin\r\n FPopupForm.Show;\r\n {$IFDEF CMNLIB}\r\n {$IFNDEF MSWINDOWS}\r\n BorderStyle := bsNone;\r\n BorderStyle := bsSingle;\r\n {$ENDIF}\r\n {$ENDIF}\r\n HandleFocusedControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.ShowProc(Sender: TObject);\r\nbegin\r\n if Assigned(FPopupForm) and FPopupForm.FShowModal then\r\n HandleFocusedControl;\r\n\r\n DoPopupShown;\r\nend;\r\n\r\n{$IFDEF FNCLIB}\r\nprocedure TTMSFNCCustomPopup.SetAdaptToStyle(const Value: Boolean);\r\nvar\r\n ia: ITMSFNCAdaptToStyle;\r\nbegin\r\n inherited;\r\n if Assigned(ContentControl) then\r\n begin\r\n if Supports(ContentControl, ITMSFNCAdaptToStyle, ia) then\r\n ia.AdaptToStyle := AdaptToStyle;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomPopup.SetContentControl(const Value: TControl);\r\nbegin\r\n if Value = nil then\r\n begin\r\n if Assigned(FContentControl) then\r\n FContentControl.Visible := True;\r\n end;\r\n\r\n FContentControl := Value;\r\n if Assigned(FContentControl) then\r\n begin\r\n FContentControl.Visible := False;\r\n DropDownWidth := FContentControl.Width;\r\n DropDownHeight := FContentControl.Height;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetDragWithParent(const Value: Boolean);\r\nbegin\r\n if FDragWithParent <> Value then\r\n begin\r\n FDragWithParent := Value;\r\n if HasPopupForm then\r\n FPopupForm.DragWithParent := FDragWithParent;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetDropDownHeight(const Value: Single);\r\nbegin\r\n if FDropDownHeight <> Value then\r\n begin\r\n FDropDownHeight := Value;\r\n if Assigned(PopupForm) then\r\n PopupForm.Height := Round(Value);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopup.SetDropDownWidth(const Value: Single);\r\nbegin\r\n if FDropDownWidth <> Value then\r\n begin\r\n FDropDownWidth := Value;\r\n if Assigned(PopupForm) then\r\n PopupForm.Width := Round(Value);\r\n end;\r\nend;\r\n\r\n{ TTMSFNCCustomPopupForm }\r\n\r\nconstructor TTMSFNCCustomPopupForm.Create(AOwner: TComponent; APlacementControl: TControl = nil);\r\nbegin\r\n CreateNew(AOwner);\r\n try\r\n if APlacementControl <> nil then\r\n FPlacementControl := APlacementControl;\r\n if FPlacementControl <> nil then\r\n TComponent(FPlacementControl).FreeNotification(Self);\r\n finally\r\n end;\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nconstructor TTMSFNCCustomPopupForm.CreateNew(AOwner: TComponent; Dummy: Integer);\r\n{$ENDIF}\r\n{$IFDEF FMXLIB}\r\nconstructor TTMSFNCCustomPopupForm.CreateNew(AOwner: TComponent; Dummy: NativeInt);\r\n{$ENDIF}\r\n function FindUniqueFormName(const Name: string): string;\r\n var\r\n I: Integer;\r\n begin\r\n I := 0;\r\n Result := Name;\r\n while (FindGlobalComponent(Result) <> nil) or\r\n ((AOwner <> nil) and (AOwner.FindComponent(Result) <> nil)) do\r\n begin\r\n Inc(I);\r\n Result := Format('%s_%d', [Name, I]);\r\n end;\r\n end;\r\nbegin\r\n Name := FindUniqueFormName('CustomPopupForm');\r\n inherited;\r\n FPreferedDisplayIndex := -1;\r\n FOwner := AOwner;\r\n FDragWithParent := True;\r\n FPlacementRectangle := TTMSFNCMargins.Create;\r\n FContentPadding := TTMSFNCMargins.Create;\r\n FSize.cx := 320;\r\n FSize.cy := 200;\r\n FPlacement := ppBottom;\r\n FRealPlacement := FPlacement;\r\n Visible := False;\r\n try\r\n {$IFDEF FMXLIB}\r\n BeginUpdate;\r\n FormStyle := TFormStyle.Popup;\r\n Position := TFormPosition.Designed;\r\n BorderStyle := TFmxFormBorderStyle.None;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n KeyPreview := True;\r\n Position := poDesigned;\r\n BorderStyle := bsNone;\r\n BorderIcons := [];\r\n {$IFDEF VCLLIB}\r\n Ctl3D := False;\r\n {$ENDIF}\r\n {$ENDIF}\r\n finally\r\n {$IFDEF FMXLIB}\r\n EndUpdate;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\ndestructor TTMSFNCCustomPopupForm.Destroy;\r\nbegin\r\n FreeAndNil(FTimer);\r\n if FPlacementControl <> nil then\r\n begin\r\n TComponent(FPlacementControl).RemoveFreeNotification(Self);\r\n FPlacementControl := nil;\r\n end;\r\n FreeAndNil(FContentPadding);\r\n FreeAndNil(FPlacementRectangle);\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.DoClose(var CloseAction: TCloseAction);\r\nbegin\r\n {$IFNDEF FMXMOBILE}\r\n CloseAction := TCloseAction.caFree;\r\n {$ENDIF}\r\n inherited;\r\n if CloseAction <> TCloseAction.caNone then\r\n begin\r\n if Assigned(FTimer) then\r\n FTimer.Enabled := False;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.DoRealPlacementChanged;\r\nbegin\r\n if Assigned(FOnRealPlacementChanged) then\r\n FOnRealPlacementChanged(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.KeyDown(var Key: Word; {$IFDEF FMXLIB}var KeyChar: WideChar;{$ENDIF} Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if Shift <> [] then\r\n Exit;\r\n\r\n case Key of\r\n KEY_ESCAPE, KEY_F4: Close;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopupForm.GetPopup: TTMSFNCCustomPopup;\r\nbegin\r\n Result := nil;\r\n if FOwner is TTMSFNCCustomPopup then\r\n Result := FOwner as TTMSFNCCustomPopup;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopupForm.GetPopupParent: TControl;\r\nbegin\r\n Result := nil;\r\n if Assigned(FOwner) and (FOwner is TTMSFNCCustomPopup) then\r\n Result := (FOwner as TTMSFNCCustomPopup).GetParent;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.HandleFocusedControl;\r\nbegin\r\n if Assigned(Popup) then\r\n Popup.HandleFocusedControl;\r\nend;\r\n\r\nfunction TTMSFNCCustomPopupForm.CloseQuery: Boolean;\r\nbegin\r\n Result := inherited CloseQuery;\r\n if Result and (not (csDestroying in ComponentState)) then\r\n DoBeforeClose;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.Notification(AComponent: TComponent; Operation: TOperation);\r\nbegin\r\n inherited;\r\n if Operation = opRemove then\r\n begin\r\n if AComponent = FPlacementControl then\r\n begin\r\n FPlacementControl := nil;\r\n ApplyPlacement;\r\n end;\r\n if AComponent = FContentControl then\r\n FContentControl := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetDragWithParent(const Value: Boolean);\r\nbegin\r\n FDragWithParent := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetContentControl(const Value: TControl);\r\nbegin\r\n if FContentControl <> Value then\r\n begin\r\n if FContentControl <> nil then\r\n TComponent(FContentControl).RemoveFreeNotification(Self);\r\n FContentControl := Value;\r\n if FContentControl <> nil then\r\n begin\r\n TComponent(FContentControl).FreeNotification(Self);\r\n try\r\n FContentControl.Parent := Self;\r\n {$IFDEF FMXLIB}\r\n FContentControl.Align := TAlignLayout.None;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FContentControl.Align := alNone;\r\n {$ENDIF}\r\n FContentControl.Visible := True;\r\n finally\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetContentPadding(const Value: TTMSFNCMargins);\r\nbegin\r\n FContentPadding.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetOffset(const Value: TPointF);\r\nbegin\r\n if (FOffset.X <> Value.X) or (FOffset.Y <> Value.Y) then\r\n begin\r\n FOffset := Value;\r\n ApplyPlacement;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetPlacement(const Value: TTMSFNCPopupPlacement);\r\nbegin\r\n if FPlacement <> Value then\r\n begin\r\n FPlacement := Value;\r\n ApplyPlacement;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetPlacementRectangle(const Value: TTMSFNCMargins);\r\nbegin\r\n FPlacementRectangle.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetPlacementControl(const Value: TControl);\r\nbegin\r\n if FPlacementControl <> Value then\r\n begin\r\n if FPlacementControl <> nil then\r\n TComponent(FPlacementControl).RemoveFreeNotification(self);\r\n FPlacementControl := Value;\r\n if FPlacementControl <> nil then\r\n TComponent(FPlacementControl).FreeNotification(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.SetSize(const Value: TSizeF);\r\nbegin\r\n if (FSize.cx <> Value.cx) or (FSize.cy <> Value.cy) then\r\n begin\r\n FSize := Value;\r\n ApplyPlacement;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TTMSFNCCustomPopupForm.Loaded;\r\nbegin\r\n inherited;\r\n if FPlacementChanged then\r\n ApplyPlacement;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.UpdateBounds(LRect: TRectF);\r\nbegin\r\n SetBounds(Round(LRect.Left), Round(LRect.Top), Round(LRect.Right - LRect.Left), Round(LRect.Bottom - LRect.Top));\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.Updated;\r\nbegin\r\n inherited;\r\n if FPlacementChanged then\r\n ApplyPlacement;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.DoApplyPlacement;\r\nvar\r\n {$IFDEF FMXLIB}\r\n Pos: TPointF;\r\n AbsolutePos: TPointF;\r\n MouseSvc: IFMXMouseService;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n pt, Pos, AbsolutePos: TPoint;\r\n {$ENDIF}\r\n LRect: TRectF;\r\n LPlacement: TTMSFNCPopupPlacement;\r\n LOffset: TPointF;\r\n LStep: Byte;\r\n LSoGood: Boolean;\r\n SourceSize: TSizeF;\r\n PlacementByTarget: Boolean;\r\n function UpdateRectByScreen(var R: TRectF; cs: TComponentState): Boolean;\r\n var\r\n WorkareaRect: TRect;\r\n WorkareaRectF: TRectF;\r\n W, H: Single;\r\n {$IFDEF FMXLIB}\r\n P: TPointF;\r\n {$ENDIF}\r\n {$IFNDEF FMXLIB}\r\n P: TPoint;\r\n {$ENDIF}\r\n begin\r\n Result := True;\r\n R.Left := Round(R.Left);\r\n R.Top := Round(R.Top);\r\n R.Right := Round(R.Right);\r\n R.Bottom := Round(R.Bottom);\r\n {$IFDEF FMXLIB}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 27}\r\n case LPlacement of\r\n ppAbsolute:\r\n WorkareaRect := Screen.DisplayFromRect(R).WorkareaRect;\r\n ppMouse, ppMouseCenter, ppAboveMouse, ppAboveMouseCenter:\r\n WorkareaRect := Screen.DisplayFromPoint(Screen.MousePos).WorkareaRect\r\n else\r\n if not InRange(FPreferedDisplayIndex, 0, Screen.DisplayCount - 1) then\r\n begin\r\n if (PlacementControl <> nil) and (PlacementControl.Root is TCommonCustomForm) and\r\n TCommonCustomForm(PlacementControl.Root).Visible then\r\n begin\r\n P := PointF(PlacementControl.Width / 2, PlacementControl.Height / 2);\r\n P := PlacementControl.LocalToAbsolute(P);\r\n FPreferedDisplayIndex := Screen.DisplayFromForm(TCommonCustomForm(PlacementControl.Root), P).Index;\r\n end\r\n else\r\n FPreferedDisplayIndex := Screen.DisplayFromForm(Self).Index;\r\n end;\r\n WorkareaRect := Screen.Displays[FPreferedDisplayIndex].WorkareaRect;\r\n end;\r\n {$ELSE}\r\n WorkareaRect := Rect(0, 0, Screen.Size.Width, Screen.Size.Height);\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n WorkareaRect.Left := 0;\r\n WorkareaRect.Top := 0;\r\n WorkareaRect.Right := window.innerWidth;\r\n WorkareaRect.Bottom := window.innerHeight;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n case LPlacement of\r\n ppAbsolute:\r\n WorkareaRect := Screen.MonitorFromRect(ConvertToRect(R)).WorkareaRect;\r\n ppMouse, ppMouseCenter, ppAboveMouse, ppAboveMouseCenter:\r\n WorkareaRect := Screen.MonitorFromPoint(ConvertToPoint(TTMSFNCUtils.GetMousePos)).WorkareaRect\r\n else\r\n if not InRange(FPreferedDisplayIndex, 0, Screen.MonitorCount - 1) then\r\n begin\r\n if (PlacementControl <> nil) and (TTMSFNCUtils.GetParentForm(PlacementControl) is TCustomForm) and\r\n TCustomForm(TTMSFNCUtils.GetParentForm(PlacementControl)).Visible then\r\n begin\r\n P := Point(PlacementControl.Width div 2, PlacementControl.Height div 2);\r\n P := PlacementControl.ClientToScreen(P);\r\n FPreferedDisplayIndex := Screen.MonitorFromWindow(TTMSFNCUtils.GetParentForm(PlacementControl).Handle).MonitorNum;\r\n end\r\n else\r\n FPreferedDisplayIndex := Screen.MonitorFromWindow(Self.Handle).MonitorNum;\r\n end;\r\n WorkareaRect := Screen.Monitors[FPreferedDisplayIndex].WorkareaRect;\r\n end;\r\n {$ENDIF}\r\n WorkareaRectF := RectF(WorkareaRect.Left - ContentPadding.Left, WorkareaRect.Top - ContentPadding.Top,\r\n WorkareaRect.Right + ContentPadding.Right, WorkareaRect.Bottom + ContentPadding.Bottom);\r\n if not (csDesigning in cs) then\r\n begin\r\n W := R.Right - R.Left;\r\n H := R.Bottom - R.Top;\r\n if R.Left > WorkareaRectF.Left then\r\n begin\r\n if R.Left > WorkareaRectF.Right - W then\r\n begin\r\n R.Left := WorkareaRectF.Right - W;\r\n if LPlacement = ppRight then\r\n begin\r\n LPlacement := ppLeft;\r\n Result := False;\r\n end;\r\n if LPlacement = ppRightCenter then\r\n begin\r\n LPlacement := ppLeftCenter;\r\n Result := False;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n R.Left := WorkareaRectF.Left;\r\n if LPlacement = ppLeft then\r\n begin\r\n LPlacement := ppRight;\r\n Result := False;\r\n end;\r\n if LPlacement = ppLeftCenter then\r\n begin\r\n LPlacement := ppRightCenter;\r\n Result := False;\r\n end;\r\n end;\r\n if R.Top > WorkareaRectF.Top then\r\n begin\r\n if R.Top > WorkareaRectF.Bottom - H then\r\n begin\r\n R.Top := WorkareaRectF.Bottom - H;\r\n if LPlacement = ppBottom then\r\n begin\r\n LPlacement := ppTop;\r\n Result := False;\r\n end;\r\n if LPlacement = ppBottomCenter then\r\n begin\r\n LPlacement := ppTopCenter;\r\n Result := False;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n R.Top := WorkareaRectF.Top;\r\n if LPlacement = ppTop then\r\n begin\r\n LPlacement := ppBottom;\r\n Result := False;\r\n end;\r\n if LPlacement = ppTopCenter then\r\n begin\r\n LPlacement := ppBottomCenter;\r\n Result := False;\r\n end;\r\n end;\r\n R.Right := R.Left + W;\r\n R.Bottom := R.Top + H;\r\n end;\r\n end;\r\nbegin\r\n FPlacementChanged := False;\r\n LOffset := Offset;\r\n LPlacement := Placement;\r\n LStep := 0;\r\n repeat\r\n LRect := RectF(FPlacementRectangle.Left, FPlacementRectangle.Top, FPlacementRectangle.Right, FPlacementRectangle.Bottom);\r\n if (PlacementControl <> nil) and FPlacementRectangle.Empty then\r\n LRect := RectF(0, 0, PlacementControl.Width, PlacementControl.Height);\r\n if (PlacementControl = nil) and PlacementRectangle.Empty and\r\n (not (LPlacement in [ppAbsolute, ppMouse, ppMouseCenter, ppAboveMouse, ppAboveMouseCenter])) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n if not TPlatformServices.Current.SupportsPlatformService(IFMXMouseService, IInterface(MouseSvc)) then\r\n LPlacement := ppAbsolute\r\n else\r\n LPlacement := ppMouse;\r\n {$ENDIF}\r\n end;\r\n FScreenPlacementRect := LRect;\r\n // Vertical Offset\r\n if LPlacement in [ppTop, ppTopCenter] then\r\n OffsetRectEx(LRect, 0, ContentPadding.Bottom - LOffset.Y)\r\n else\r\n OffsetRectEx(LRect, 0, LOffset.Y - ContentPadding.Top);\r\n // Horizontal Offset\r\n if LPlacement in [ppLeft, ppLeftCenter] then\r\n OffsetRectEx(LRect, ContentPadding.Right - LOffset.X, 0)\r\n else\r\n OffsetRectEx(LRect, LOffset.X - ContentPadding.Left, 0);\r\n // Offset by rect\r\n PlacementByTarget := not (LPlacement in [ppAbsolute, ppMouse, ppMouseCenter, ppAboveMouse, ppAboveMouseCenter]);\r\n SourceSize := Size;\r\n\r\n case LPlacement of\r\n ppBottom:\r\n OffsetRectEx(LRect, 0, (LRect.Bottom - LRect.Top));\r\n ppTop:\r\n OffsetRectEx(LRect, 0, -SourceSize.cy);\r\n ppLeft:\r\n OffsetRectEx(LRect, -SourceSize.cx, 0);\r\n ppRight:\r\n OffsetRectEx(LRect, (LRect.Right - LRect.Top), 0);\r\n ppCenter:\r\n OffsetRectEx(LRect, ((LRect.Right - LRect.Top) - SourceSize.cx) / 2, ((LRect.Bottom - LRect.Top) - SourceSize.cy) / 2);\r\n ppBottomCenter:\r\n OffsetRectEx(LRect, ((LRect.Right - LRect.Top) - SourceSize.cx) / 2, (LRect.Bottom - LRect.Top));\r\n ppTopCenter:\r\n OffsetRectEx(LRect, ((LRect.Right - LRect.Top) - SourceSize.cx) / 2, -SourceSize.cy);\r\n ppLeftCenter:\r\n OffsetRectEx(LRect, -SourceSize.cx, ((LRect.Bottom - LRect.Top) - SourceSize.cy) / 2);\r\n ppRightCenter:\r\n OffsetRectEx(LRect, (LRect.Right - LRect.Top), ((LRect.Bottom - LRect.Top) - SourceSize.cy) / 2);\r\n ppAbsolute:\r\n begin\r\n if FPlacementRectangle.Empty then\r\n LRect := RectF(FPlacementRectangle.Rect.Left, FPlacementRectangle.Rect.Top, FPlacementRectangle.Rect.Left + SourceSize.cx, FPlacementRectangle.Rect.Top + SourceSize.cy)\r\n else\r\n LRect := FPlacementRectangle.Rect;\r\n end;\r\n ppMouse, ppMouseCenter, ppAboveMouse, ppAboveMouseCenter:\r\n begin\r\n {$IFDEF FMXLIB}\r\n Pos := Screen.MousePos;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n Pos := Mouse.CursorPos;\r\n {$ENDIF}\r\n LRect := RectF(Pos.X, Pos.Y, Pos.X + SourceSize.cx, Pos.Y + SourceSize.cy);\r\n if LPlacement = ppMouseCenter then\r\n OffsetRectEx(LRect, -SourceSize.cx / 2, -SourceSize.cy / 2);\r\n if LPlacement = ppAboveMouseCenter then\r\n OffsetRectEx(LRect, -SourceSize.cx / 2, -SourceSize.cy - 5);\r\n if LPlacement = ppAboveMouse then\r\n OffsetRectEx(LRect, 0, -SourceSize.cy - 5);\r\n end;\r\n end;\r\n // use border\r\n if PlacementByTarget then\r\n begin\r\n {$IFDEF FMXLIB}\r\n AbsolutePos := PointF(LRect.Left, LRect.Top);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n AbsolutePos := Point(Round(LRect.Left), Round(LRect.Top));\r\n {$ENDIF}\r\n if PlacementControl <> nil then\r\n begin\r\n {$IFDEF FMXLIB}\r\n AbsolutePos := PlacementControl.LocalToAbsolute(AbsolutePos);\r\n FScreenPlacementRect.TopLeft := PlacementControl.LocalToAbsolute(FScreenPlacementRect.TopLeft);\r\n FScreenPlacementRect.BottomRight := PlacementControl.LocalToAbsolute(FScreenPlacementRect.BottomRight);\r\n if PlacementControl.Scene <> nil then\r\n begin\r\n AbsolutePos := PlacementControl.Scene.LocalToScreen(AbsolutePos);\r\n FScreenPlacementRect.TopLeft := PlacementControl.Scene.LocalToScreen(FScreenPlacementRect.TopLeft);\r\n FScreenPlacementRect.BottomRight := PlacementControl.Scene.LocalToScreen(FScreenPlacementRect.BottomRight);\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n AbsolutePos := PlacementControl.ClientToScreen(AbsolutePos);\r\n pt := Point(Round(FScreenPlacementRect.Left), Round(FScreenPlacementRect.Top));\r\n pt := PlacementControl.ClientToScreen(pt);\r\n FScreenPlacementRect.Left := pt.X;\r\n FScreenPlacementRect.Top := pt.Y;\r\n pt := Point(Round(FScreenPlacementRect.Right), Round(FScreenPlacementRect.Bottom));\r\n pt := PlacementControl.ClientToScreen(pt);\r\n FScreenPlacementRect.Right := pt.X;\r\n FScreenPlacementRect.Bottom := pt.Y;\r\n {$ENDIF}\r\n end;\r\n LRect := RectF(AbsolutePos.X, AbsolutePos.Y, AbsolutePos.X + Size.cx, AbsolutePos.Y + Size.cy);\r\n end;\r\n LSoGood := UpdateRectByScreen(LRect, ComponentState);\r\n Inc(LStep);\r\n until LSoGood or (LStep > 1);\r\n FScreenContentRect := LRect;\r\n FScreenContentRect := RectF(FScreenContentRect.Left + FContentPadding.Left, FScreenContentRect.Top + FContentPadding.Top, FScreenContentRect.Right - FContentPadding.Right, FScreenContentRect.Bottom - FContentPadding.Bottom);\r\n FRealPlacement := LPlacement;\r\n UpdateBounds(LRect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.DoBeforeClose;\r\nbegin\r\n if Assigned(OnBeforeClose) then\r\n OnBeforeClose(self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.DoBeforeShow;\r\nbegin\r\n FHintWindow := False;\r\n if Assigned(OnBeforeShow) then\r\n OnBeforeShow(self);\r\n\r\n FFirstShow := True;\r\n\r\n if not Assigned(FTimer) then\r\n FTimer := TTimer.Create(Self);\r\n\r\n FTimer.Interval := 20;\r\n FTimer.OnTimer := TimerProc;\r\n FTimer.Enabled := True;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.TimerProc(Sender: TObject);\r\nbegin\r\n if (Visible or FHintWindow) and (FFirstShow or FDragWithParent) then\r\n ApplyPlacement;\r\n if (Visible or FHintWindow) and (FFirstShow) then\r\n begin\r\n FFirstShow := False;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPopupForm.ApplyPlacement;\r\nvar\r\n OldRect, NewRect: TRect;\r\n OldRealPlacement: TTMSFNCPopupPlacement;\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n if not (csLoading in ComponentState) and not (csUpdating in ComponentState) and not (csDestroying in ComponentState) then\r\n {$ENDIF}\r\n begin\r\n OldRect := Rect(Left, Top, Left + Width, Top + Height);\r\n OldRealPlacement := FRealPlacement;\r\n DoApplyPlacement;\r\n NewRect := Rect(Left, Top, Left + Width, Top + Height);\r\n if (NewRect.Left <> OldRect.Left) or (NewRect.Top <> OldRect.Top) or (NewRect.Bottom <> OldRect.Bottom) or (NewRect.Right <> OldRect.Right)\r\n or (OldRealPlacement <> RealPlacement) then\r\n DoRealPlacementChanged;\r\n end\r\n {$IFNDEF WEBLIB}\r\n else\r\n FPlacementChanged := True;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomNonFocusablePopup.ActivatePreviousWindow;\r\nbegin\r\n {$IFDEF CMNLIB}\r\n SetActiveWindow(FActiveWindow);\r\n {$ENDIF}\r\nend;\r\n\r\nconstructor TTMSFNCCustomNonFocusablePopup.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n StaysOpen := True;\r\nend;\r\n\r\ndestructor TTMSFNCCustomNonFocusablePopup.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCCustomNonFocusablePopup.GetPopupFormClass: TTMSFNCCustomPopupFormClass;\r\nbegin\r\n Result := TTMSFNCCustomNonFocusablePopupForm;\r\nend;\r\n\r\nprocedure TTMSFNCCustomNonFocusablePopup.ShowPopup(AModal: Boolean);\r\n{$IFDEF CMNLIB}\r\n{$IFDEF MSWINDOWS}\r\nvar\r\n hWin: HWND;\r\n{$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n {$IFDEF FMXLIB}\r\n PopupForm.FormStyle := TFormStyle.Popup;\r\n inherited;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n FActiveWindow := GetActiveWindow;\r\n {$IFDEF MSWINDOWS}\r\n PopupForm.HintWindow := True;\r\n hWin := PopupForm.Handle;\r\n SetWindowPos(hwin, HWND_TOPMOST, PopupForm.Left, PopupForm.Top, PopupForm.Width, PopupForm.Height, SWP_NOACTIVATE);\r\n ShowWindow(hWin, SW_SHOWNOACTIVATE);\r\n PopupForm.Visible := True;\r\n {$ELSE}\r\n PopupForm.SetBounds(PopupForm.Left, PopupForm.Top, PopupForm.Width, PopupForm.Height);\r\n PopupForm.Visible := True;\r\n PopupForm.BorderStyle := bsSingle;\r\n PopupForm.BorderStyle := bsNone;\r\n {$ENDIF}\r\n SetActiveWindow(FActiveWindow);\r\n {$ENDIF}\r\n\r\n FIsOpen := True;\r\nend;\r\n\r\n{ TTMSFNCCustomNonFocusablePopupForm }\r\n\r\nprocedure TTMSFNCCustomNonFocusablePopupForm.UpdateBounds(LRect: TRectF);\r\n{$IFDEF CMNLIB}\r\n{$IFDEF MSWINDOWS}\r\nvar\r\n hWin: HWND;\r\n{$ENDIF}\r\n{$ENDIF}\r\nbegin\r\n inherited;\r\n {$IFDEF CMNLIB}\r\n {$IFDEF MSWINDOWS}\r\n hWin := Handle;\r\n SetWindowPos(hwin, HWND_TOPMOST, Round(LRect.Left), Round(LRect.Top), Round((LRect.Right - LRect.Left)), Round((LRect.Bottom - LRect.Top)), SWP_NOACTIVATE);\r\n {$ELSE}\r\n SetBounds(Round(LRect.Left), Round(LRect.Top), Round((LRect.Right - LRect.Top)), Round((LRect.Bottom - LRect.Top)));\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF CMNLIB}\r\n{$IFDEF MSWINDOWS}\r\nfunction HintWindowProc(hWnd: hWnd; uMsg: Integer; WParam: WParam;\r\n lParam: lParam): LRESULT; stdcall;\r\nvar\r\n I: Integer;\r\n pr: LInteger;\r\nbegin\r\n case uMsg of\r\n WM_MOUSEACTIVATE:\r\n begin\r\n Result := MA_NOACTIVATE;\r\n Exit;\r\n end;\r\n end;\r\n\r\n pr := 0;\r\n for I := 0 to Length(PrevWndProcs) - 1 do\r\n begin\r\n if PrevWndProcs[I].FWindowHandle = hWnd then\r\n pr := PrevWndProcs[I].FProc;\r\n end;\r\n\r\n Result := CallWindowProc({%H-}IntPtr(pr), hWnd, uMsg, WParam, lParam);\r\nend;\r\n\r\ndestructor TTMSFNCCustomNonFocusablePopupForm.Destroy;\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Length(PrevWndProcs) - 1 do\r\n begin\r\n if PrevWndProcs[I].FWindowHandle = Self.Handle then\r\n SetWindowLongPtr(Self.Handle, GWL_WNDPROC, PrevWndProcs[I].FProc);\r\n end;\r\n inherited;\r\nend;\r\n\r\nconstructor TTMSFNCCustomNonFocusablePopupForm.CreateNew(AOwner: TComponent; Dummy: Integer = 0);\r\nvar\r\n r: WndProcRec;\r\nbegin\r\n inherited;\r\n SetLength(PrevWndProcs, Length(PrevWndProcs) + 1);\r\n r.FWindowHandle := Self.Handle;\r\n r.FProc := SetWindowLongPtr(Self.Handle, GWL_WNDPROC, {%H-}LInteger(@HintWindowProc));\r\n PrevWndProcs[Length(PrevWndProcs) - 1] := r;\r\nend;\r\n\r\nprocedure TTMSFNCCustomNonFocusablePopupForm.CreateParams(var Params: TCreateParams);\r\nbegin\r\n inherited CreateParams(Params);\r\n with Params do\r\n begin\r\n Style := WS_POPUP;\r\n WindowClass.Style := WindowClass.Style or CS_SAVEBITS;\r\n if NewStyleControls then\r\n ExStyle := WS_EX_TOOLWINDOW or WS_EX_NOACTIVATE;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomNonFocusablePopupForm.WMNCHitTest(var Message: TWMNCHitTest);\r\nbegin\r\n Message.Result := HTTRANSPARENT;\r\nend;\r\n\r\nprocedure TTMSFNCCustomNonFocusablePopupForm.WMActivate(var Message: TWMActivate);\r\nbegin\r\n Message.Result := 1;\r\nend;\r\n\r\n{$ELSE}\r\nprocedure TTMSFNCCustomNonFocusablePopupForm.WMNCHitTest(var Message: TLMessage);\r\nbegin\r\n Message.Result := HTTRANSPARENT;\r\nend;\r\n\r\nprocedure TTMSFNCCustomNonFocusablePopupForm.WMActivate(var Message: TLMActivate);\r\nbegin\r\n Message.Result := 1;\r\n if (Owner is TTMSFNCCustomNonFocusablePopup) then\r\n (Owner as TTMSFNCCustomNonFocusablePopup).ActivatePreviousWindow;\r\nend;\r\n{$ENDIF}\r\n{$ENDIF}\r\n\r\n{ TTMSFNCNonFocusablePopup }\r\n\r\nprocedure TTMSFNCNonFocusablePopup.Deactivate;\r\nbegin\r\n ClosePopup;\r\nend;\r\n\r\nprocedure TTMSFNCNonFocusablePopup.Activate;\r\nbegin\r\n DoCreatePopup(False);\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCImage;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomControl, WEBLib.TMSFNCBitmapContainer,\r\n WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCGraphicsTypes\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n , UITypes, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr.\r\n\r\n // version history\r\n // v1.0.0.0 : First Release\r\n\r\ntype\r\n TBool2DArray = array of array of boolean;\r\n\r\n {$IFDEF FNCLIB}\r\n TTMSFNCCustomImage = class(TTMSFNCCustomControl, ITMSFNCBitmapContainer)\r\n {$ENDIF}\r\n {$IFNDEF FNCLIB}\r\n TTMSFNCCustomImage = class(TTMSFNCCustomControl)\r\n {$ENDIF}\r\n private\r\n FBitmap: TTMSFNCBitmap;\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n FStretch: Boolean;\r\n FBitmaps: TTMSFNCScaledBitmaps;\r\n FCropping: Boolean;\r\n FCenter: Boolean;\r\n FAutoSize: Boolean;\r\n FAspectRatio: Boolean;\r\n FOnBitmapChanged: TNotifyEvent;\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n procedure SetStretch(const Value: Boolean);\r\n procedure SetBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetCropping(const Value: Boolean);\r\n procedure SetCenter(const Value: Boolean);\r\n procedure SetAS(const Value: Boolean);\r\n procedure SetAspectRatio(const Value: Boolean);\r\n procedure SetBitmap(const Value: TTMSFNCBitmap);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n protected\r\n function GetVersion: string; override;\r\n procedure ApplyAutoSize;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure BitmapChanged(Sender: TObject);\r\n property AspectRatio: Boolean read FAspectRatio write SetAspectRatio default True;\r\n property Version: String read GetVersion;\r\n property Bitmaps: TTMSFNCScaledBitmaps read FBitmaps write SetBitmaps;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n property Stretch: Boolean read FStretch write SetStretch default False;\r\n property Cropping: Boolean read FCropping write SetCropping default False;\r\n property Center: Boolean read FCenter write SetCenter default True;\r\n property AutoSize: Boolean read FAutoSize write SetAS default False;\r\n property Bitmap: TTMSFNCBitmap read FBitmap write SetBitmap;\r\n public\r\n procedure Clear;\r\n function GetPaintRectangle: TRectF;\r\n function GetBitmap: TTMSFNCBitmap;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n property OnBitmapChanged: TNotifyEvent read FOnBitmapChanged write FOnBitmapChanged;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCImage = class(TTMSFNCCustomImage)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n published\r\n property AspectRatio;\r\n property Bitmap;\r\n property Version;\r\n property Bitmaps;\r\n property BitmapContainer;\r\n property Stretch;\r\n property Cropping;\r\n property Center;\r\n property AutoSize;\r\n property Fill;\r\n property Stroke;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Controls, WEBLib.Graphics, WEBLib.TMSFNCUtils;\r\n\r\nprocedure TTMSFNCCustomImage.ApplyAutoSize;\r\nvar\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n bmp := GetBitmap;\r\n if Assigned(bmp) then\r\n begin\r\n if FAutoSize and not IsBitmapEmpty(bmp) then\r\n begin\r\n Self.Width := bmp.Width;\r\n Self.Height := bmp.Height;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.BitmapChanged(Sender: TObject);\r\nbegin\r\n if Assigned(OnBitmapChanged) then\r\n OnBitmapChanged(Self);\r\n\r\n ApplyAutoSize;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.Clear;\r\nbegin\r\n Bitmaps.Clear;\r\nend;\r\n\r\nconstructor TTMSFNCCustomImage.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n if IsDesignTime then\r\n DisableBackground;\r\n\r\n FCenter := True;\r\n FStretch := False;\r\n FAspectRatio := True;\r\n FCropping := False;\r\n FBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FBitmaps.OnChange := @BitmapChanged;\r\n FBitmap := TTMSFNCBitmap.Create;\r\n FBitmap.OnChange := @BitmapChanged;\r\n Width := 100;\r\n Height := 100;\r\nend;\r\n\r\ndestructor TTMSFNCCustomImage.Destroy;\r\nbegin\r\n FBitmap.Free;\r\n FBitmaps.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCCustomImage.GetBitmap: TTMSFNCBitmap;\r\nbegin\r\n if not IsBitmapEmpty(FBitmap) then\r\n Result := FBitmap\r\n else\r\n Result := TTMSFNCGraphics.GetScaledBitmap(Bitmaps, 0, FBitmapContainer);\r\nend;\r\n\r\nfunction TTMSFNCCustomImage.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := FBitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCCustomImage.GetPaintRectangle: TRectF;\r\nvar\r\n bmp: TTMSFNCBitmap;\r\n rdest: TRectF;\r\n w, h: Single;\r\n x, y: Single;\r\nbegin\r\n Result := RectF(0, 0, 0, 0);\r\n bmp := GetBitmap;\r\n if Assigned(bmp) then\r\n begin\r\n x := 0;\r\n y := 0;\r\n w := 0;\r\n h := 0;\r\n TTMSFNCGraphics.GetAspectSize(w, h, bmp.Width, bmp.Height, Width, Height, AspectRatio, Stretch, Cropping);\r\n if Center or Cropping then\r\n begin\r\n x := (width - w) / 2;\r\n y := (height - h) / 2;\r\n end;\r\n\r\n rdest := RectF(x, y, x + w, y + h);\r\n Result := rdest;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomImage.GetVersion: string;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FBitmapContainer) then\r\n FBitmapContainer := nil;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n bmp: TTMSFNCBitmap;\r\n rdest: TRectF;\r\n w, h: Single;\r\n x, y: Single;\r\nbegin\r\n inherited;\r\n if csDesigning in ComponentState then\r\n begin\r\n AGraphics.Stroke.Kind := gskDot;\r\n AGraphics.DrawRectangle(ARect);\r\n end;\r\n\r\n bmp := GetBitmap;\r\n if Assigned(bmp) then\r\n begin\r\n x := 0;\r\n y := 0;\r\n w := 0;\r\n h := 0;\r\n TTMSFNCGraphics.GetAspectSize(w, h, bmp.Width, bmp.Height, Width, Height, AspectRatio, Stretch, Cropping);\r\n if Center or Cropping then\r\n begin\r\n x := (width - w) / 2;\r\n y := (height - h) / 2;\r\n end;\r\n\r\n x := Round(x);\r\n y := Round(y);\r\n\r\n rdest := RectF(x, y, x + w, y + h);\r\n AGraphics.DrawBitmap(rdest, BitmapToDrawBitmap(bmp));\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetAspectRatio(const Value: Boolean);\r\nbegin\r\n FAspectRatio := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetAS(const Value: Boolean);\r\nbegin\r\n FAutoSize := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetBitmaps(const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FBitmaps.Assign(Value);\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetBitmap(const Value: TTMSFNCBitmap);\r\nbegin\r\n FBitmap.Assign(Value);\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nbegin\r\n FBitmapContainer := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetCenter(const Value: Boolean);\r\nbegin\r\n FCenter := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetCropping(const Value: Boolean);\r\nbegin\r\n FCropping := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomImage.SetStretch(const Value: Boolean);\r\nbegin\r\n FStretch := Value;\r\n Invalidate;\r\nend;\r\n\r\n{ TTMSFNCImage }\r\n\r\nprocedure TTMSFNCImage.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCImage);\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCCustomTreeView;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF FMXLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE FMXWEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCTreeViewData, WEBLib.TMSFNCCustomComponent, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCPopup, WEBLib.TMSFNCImage,\r\n Types, WEBLib.TMSFNCTypes, WEBLib.Controls, WEBLib.ExtCtrls, WEBLib.StdCtrls, WEBLib.TMSFNCGraphicsTypes\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,Generics.Collections, UITypes\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ,Contnrs\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types, FMX.Memo, FMX.Edit, FMX.ListBox\r\n {$WARNINGS OFF}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 28}\r\n ,FMX.Memo.Types\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$WARNINGS ON}\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n TTMSFNCTreeViewDocURL = 'http://www.tmssoftware.biz/download/manuals/TMSFNCTreeViewDevGuide.pdf';\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 1; // Minor version nr.\r\n REL_VER = 3; // Release nr.\r\n BLD_VER = 9; // Build nr.\r\n CLP_FMT = '#TREEVIEW#';\r\n ENDOFLINE = #13#10;\r\n ANIMATIONFACTOR = 2.5;\r\n {$IFDEF FMXMOBILE}\r\n ANIMATIONEASING = 0.1;\r\n {$ELSE}\r\n ANIMATIONEASING = 0.01;\r\n {$ENDIF}\r\n DRAGMARGIN = 10;\r\n\r\n\r\n // version history\r\n // v1.0.0.0 : first release\r\n // v1.0.0.1 : Fixed: Issue with reintroducing BeginUpdate with additional parameter,\r\n // please use BeginUpdate in combination with ClearNodeList to clear all nodes\r\n // v1.1.0.0 : New: Clipboard support\r\n // : New: Column sorting\r\n // : New: Drag & Drop support\r\n // : New: Reordering\r\n // : New: Filtering\r\n // : New: Keyboard Lookup\r\n // : Fixed: Issue with font initialization\r\n // v1.1.0.1 : Fixed: Issue with copying and moving node data properties\r\n // v1.1.0.2 : Fixed: Issue with selecting all nodes when multi-select is false\r\n // v1.1.0.3 : Fixed: Access violation calling stopedit in OnExit of custom editor\r\n // : Fixed: Issue loading complex tree files\r\n // v1.1.0.4 : Fixed: Issue assigning child node data\r\n // v1.1.0.5 : Fixed: Issue drag & drop interaction in combination with expand / collapse\r\n // v1.1.0.6 : Improved: Handling keyboard ALT, SHIFT and CTRL keys without navigating to selecting item\r\n // v1.1.0.7 : Fixed: Issue with displaying icons on high dpi systems\r\n // v1.1.0.8 : Fixed: Issue setting check state without rebuilding node list\r\n // v1.1.1.0 : New: FindNodeByRow and GetTotalNodeCount functions\r\n // : Fixed: Issue with OnAfterSizeColumn not called\r\n // v1.1.1.1 : Fixed: Issue with HTML calculation and wordwrapping\r\n // : Fixed: Issue with drawing node background color in VCL/LCL\r\n // : Fixed: Issue with ScrollToNode in combination with variable node height\r\n // v1.1.1.2 : Improved: ShowFocus default true\r\n // : Improved: SelectNode := nil clears selection\r\n // : Improved: Double-click on node area to expand/collapse\r\n // v1.1.1.3 : Fixed: Issue with sizing invisible columns\r\n // v1.1.1.4 : Fixed: Issue with ScrollToNode hanging on collapsed nodes\r\n // v1.1.2.0 : New: FindNodeByTextAndColumn function\r\n // v1.1.3.0 : New: FindNodeByDBKey function\r\n // v1.1.3.1 : Fixed: Access violation when destroying editor\r\n // v1.1.3.2 : Fixed: Access violation during move node operation\r\n // v1.1.3.3 : Fixed: Issue panning and dblclick combination\r\n // v1.1.3.4 : Fixed: Issue sorting and sizing columns occurs simultaneously\r\n // v1.1.3.5 : Improved: Retrieve text of virtual node\r\n // v1.1.3.6 : Fixed: Issue with presetting combobox editor value\r\n // v1.1.3.7 : Fixed: Issue with missing assignment of DBKey property\r\n // v1.1.3.8 : Fixed: Issue with multi-select on mobile platforms\r\n // v1.1.3.9 : Fixed: Issue with node checking still active while Interaction.ReadOnly property is set.\r\n\r\n CACHEWIDTH = 1000;\r\n CACHEHEIGHT = 1000;\r\n {$IFDEF ANDROID}\r\n SCROLLINGDELAY = 40;\r\n {$ELSE}\r\n SCROLLINGDELAY = 0;\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n TTMSFNCTreeViewColorExtended = $FFF4F4F4;\r\n TTMSFNCTreeViewColorSelection = $FF1BADF8;\r\n {$ELSE}\r\n TTMSFNCTreeViewColorExtended = $F4F4F4;\r\n TTMSFNCTreeViewColorSelection = $F8AD1B;\r\n {$ENDIF}\r\n\r\nresourcestring\r\n sTMSFNCTreeViewFilterAll = '(All)';\r\n\r\ntype\r\n TTMSFNCCustomTreeView = class;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewCache = class(TObjectList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewCacheItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewCacheItem);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewCacheItem read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewCache = class(TObjectList);\r\n {$ENDIF}\r\n TTMSFNCTreeViewNodeCache = class(TTMSFNCTreeViewCache);\r\n TTMSFNCTreeViewColumnsCache = class(TTMSFNCTreeViewCache);\r\n TTMSFNCTreeViewColumnsTopCache = class(TTMSFNCTreeViewColumnsCache);\r\n TTMSFNCTreeViewColumnsBottomCache = class(TTMSFNCTreeViewColumnsCache);\r\n TTMSFNCTreeViewGroupsCache = class(TTMSFNCTreeViewCache);\r\n TTMSFNCTreeViewGroupsTopCache = class(TTMSFNCTreeViewGroupsCache);\r\n TTMSFNCTreeViewGroupsBottomCache = class(TTMSFNCTreeViewGroupsCache);\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewDisplayList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewCacheItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewCacheItem);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewCacheItem read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewDisplayList = class(TList);\r\n {$ENDIF}\r\n TTMSFNCTreeViewNodeDisplayList = class(TTMSFNCTreeViewDisplayList);\r\n TTMSFNCTreeViewColumnsDisplayList = class(TTMSFNCTreeViewDisplayList);\r\n TTMSFNCTreeViewColumnsTopDisplayList = class(TTMSFNCTreeViewColumnsDisplayList);\r\n TTMSFNCTreeViewColumnsBottomDisplayList = class(TTMSFNCTreeViewColumnsDisplayList);\r\n TTMSFNCTreeViewGroupsDisplayList = class(TTMSFNCTreeViewDisplayList);\r\n TTMSFNCTreeViewGroupsTopDisplayList = class(TTMSFNCTreeViewGroupsDisplayList);\r\n TTMSFNCTreeViewGroupsBottomDisplayList = class(TTMSFNCTreeViewGroupsDisplayList);\r\n\r\n TTMSFNCTreeViewColumnsLayout = (tclTop, tclBottom);\r\n TTMSFNCTreeViewColumnsLayouts = set of TTMSFNCTreeViewColumnsLayout;\r\n\r\n TTMSFNCTreeViewGroupLayout = (tglTop, tglBottom);\r\n TTMSFNCTreeViewGroupsLayouts = set of TTMSFNCTreeViewGroupLayout;\r\n\r\n TTMSFNCTreeViewNodeHeightMode = (tnhmFixed, tnhmVariable);\r\n\r\n TTMSFNCTreeViewSelectionArea = (tsaDefault, tsaFull, tsaFromLevel, tsaFromText);\r\n\r\n TTMSFNCTreeViewNodesAppearance = class(TPersistent)\r\n private\r\n FTreeView: TTMSFNCCustomTreeView;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FFont: TTMSFNCGraphicsFont;\r\n FDisabledFill: TTMSFNCGraphicsFill;\r\n FSelectedFill: TTMSFNCGraphicsFill;\r\n FDisabledStroke: TTMSFNCGraphicsStroke;\r\n FSelectedStroke: TTMSFNCGraphicsStroke;\r\n FSelectionArea: TTMSFNCTreeViewSelectionArea;\r\n FExpandColumn: Integer;\r\n FExpandWidth: Double;\r\n FExpandHeight: Double;\r\n FLevelIndent: Double;\r\n FHeightMode: TTMSFNCTreeViewNodeHeightMode;\r\n FFixedHeight: Double;\r\n FVariableMinimumHeight: Double;\r\n FSelectedFontColor: TTMSFNCGraphicsColor;\r\n FDisabledFontColor: TTMSFNCGraphicsColor;\r\n FExtendedFontColor: TTMSFNCGraphicsColor;\r\n FExtendedSelectedFontColor: TTMSFNCGraphicsColor;\r\n FExtendedDisabledFontColor: TTMSFNCGraphicsColor;\r\n FExtendedDisabledFill: TTMSFNCGraphicsFill;\r\n FExtendedFont: TTMSFNCGraphicsFont;\r\n FExtendedSelectedFill: TTMSFNCGraphicsFill;\r\n FExtendedDisabledStroke: TTMSFNCGraphicsStroke;\r\n FExtendedSelectedStroke: TTMSFNCGraphicsStroke;\r\n FExtendedFill: TTMSFNCGraphicsFill;\r\n FExtendedStroke: TTMSFNCGraphicsStroke;\r\n FShowLines: Boolean;\r\n FExpandNodeIcon: TTMSFNCBitmap;\r\n FCollapseNodeIcon: TTMSFNCBitmap;\r\n FExpandNodeIconLarge: TTMSFNCBitmap;\r\n FCollapseNodeIconLarge: TTMSFNCBitmap;\r\n FColumnStroke: TTMSFNCGraphicsStroke;\r\n FLineStroke: TTMSFNCGraphicsStroke;\r\n FShowFocus: Boolean;\r\n FSpacing: Double;\r\n FDisabledTitleFontColor: TTMSFNCGraphicsColor;\r\n FSelectedTitleFontColor: TTMSFNCGraphicsColor;\r\n FTitleFont: TTMSFNCGraphicsFont;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetDisabledFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetDisabledStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetSelectedFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetSelectedStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetSelectionArea(const Value: TTMSFNCTreeViewSelectionArea);\r\n procedure SetExtendedFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetExtendedStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetExtendedFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetExtendedDisabledFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetExtendedDisabledStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetExtendedSelectedFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetExtendedSelectedStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetExpandColumn(const Value: Integer);\r\n procedure SetExpandWidth(const Value: Double);\r\n procedure SetExpandHeight(const Value: Double);\r\n procedure SetLevelIndent(const Value: Double);\r\n procedure SetFixedHeight(const Value: Double);\r\n procedure SetVariableMinimumHeight(const Value: Double);\r\n procedure SetSelectedFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetDisabledFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetExtendedFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetExtendedSelectedFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetExtendedDisabledFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetHeightMode(const Value: TTMSFNCTreeViewNodeHeightMode);\r\n procedure SetShowLines(const Value: Boolean);\r\n procedure SetCollapseNodeIcon(const Value: TTMSFNCBitmap);\r\n procedure SetExpandNodeIcon(const Value: TTMSFNCBitmap);\r\n procedure SetCollapseNodeIconLarge(const Value: TTMSFNCBitmap);\r\n procedure SetExpandNodeIconLarge(const Value: TTMSFNCBitmap);\r\n procedure SetColumnStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetLineStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetShowFocus(const Value: Boolean);\r\n function IsSpacingStored: Boolean;\r\n procedure SetSpacing(const Value: Double);\r\n procedure SetDisabledTitleFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetSelectedTitleFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTitleFont(const Value: TTMSFNCGraphicsFont);\r\n protected\r\n procedure Changed(Sender: TObject);\r\n procedure BitmapChanged(Sender: TObject);\r\n public\r\n constructor Create(ATreeView: TTMSFNCCustomTreeView);\r\n procedure Assign(Source: TPersistent); override;\r\n destructor Destroy; override;\r\n published\r\n property ShowFocus: Boolean read FShowFocus write SetShowFocus default True;\r\n property ExpandColumn: Integer read FExpandColumn write SetExpandColumn default 0;\r\n property ExpandWidth: Double read FExpandWidth write SetExpandWidth;\r\n property ExpandHeight: Double read FExpandHeight write SetExpandHeight;\r\n property LevelIndent: Double read FLevelIndent write SetLevelIndent;\r\n property Spacing: Double read FSpacing write SetSpacing stored IsSpacingStored nodefault;\r\n property FixedHeight: Double read FFixedHeight write SetFixedHeight;\r\n property VariableMinimumHeight: Double read FVariableMinimumHeight write SetVariableMinimumHeight;\r\n property HeightMode: TTMSFNCTreeViewNodeHeightMode read FHeightMode write SetHeightMode default tnhmFixed;\r\n property ShowLines: Boolean read FShowLines write SetShowLines default True;\r\n\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property ColumnStroke: TTMSFNCGraphicsStroke read FColumnStroke write SetColumnStroke;\r\n property LineStroke: TTMSFNCGraphicsStroke read FLineStroke write SetLineStroke;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property TitleFont: TTMSFNCGraphicsFont read FTitleFont write SetTitleFont;\r\n property SelectedFontColor: TTMSFNCGraphicsColor read FSelectedFontColor write SetSelectedFontColor default gcWhite;\r\n property DisabledFontColor: TTMSFNCGraphicsColor read FDisabledFontColor write SetDisabledFontColor default gcSilver;\r\n property SelectedTitleFontColor: TTMSFNCGraphicsColor read FSelectedTitleFontColor write SetSelectedTitleFontColor default gcWhite;\r\n property DisabledTitleFontColor: TTMSFNCGraphicsColor read FDisabledTitleFontColor write SetDisabledTitleFontColor default gcSilver;\r\n\r\n property ExtendedFontColor: TTMSFNCGraphicsColor read FExtendedFontColor write SetExtendedFontColor default gcBlack;\r\n property ExtendedSelectedFontColor: TTMSFNCGraphicsColor read FExtendedSelectedFontColor write SetExtendedSelectedFontColor default gcWhite;\r\n property ExtendedDisabledFontColor: TTMSFNCGraphicsColor read FExtendedDisabledFontColor write SetExtendedDisabledFontColor default gcSilver;\r\n\r\n property SelectedFill: TTMSFNCGraphicsFill read FSelectedFill write SetSelectedFill;\r\n property SelectedStroke: TTMSFNCGraphicsStroke read FSelectedStroke write SetSelectedStroke;\r\n property SelectionArea: TTMSFNCTreeViewSelectionArea read FSelectionArea write SetSelectionArea default tsaFromText;\r\n\r\n property DisabledFill: TTMSFNCGraphicsFill read FDisabledFill write SetDisabledFill;\r\n property DisabledStroke: TTMSFNCGraphicsStroke read FDisabledStroke write SetDisabledStroke;\r\n\r\n property ExtendedFill: TTMSFNCGraphicsFill read FExtendedFill write SetExtendedFill;\r\n property ExtendedStroke: TTMSFNCGraphicsStroke read FExtendedStroke write SetExtendedStroke;\r\n property ExtendedFont: TTMSFNCGraphicsFont read FExtendedFont write SetExtendedFont;\r\n\r\n property ExtendedSelectedFill: TTMSFNCGraphicsFill read FExtendedSelectedFill write SetExtendedSelectedFill;\r\n property ExtendedSelectedStroke: TTMSFNCGraphicsStroke read FExtendedSelectedStroke write SetExtendedSelectedStroke;\r\n\r\n property ExtendedDisabledFill: TTMSFNCGraphicsFill read FExtendedDisabledFill write SetExtendedDisabledFill;\r\n property ExtendedDisabledStroke: TTMSFNCGraphicsStroke read FExtendedDisabledStroke write SetExtendedDisabledStroke;\r\n\r\n property ExpandNodeIcon: TTMSFNCBitmap read FExpandNodeIcon write SetExpandNodeIcon;\r\n property CollapseNodeIcon: TTMSFNCBitmap read FCollapseNodeIcon write SetCollapseNodeIcon;\r\n property ExpandNodeIconLarge: TTMSFNCBitmap read FExpandNodeIconLarge write SetExpandNodeIconLarge;\r\n property CollapseNodeIconLarge: TTMSFNCBitmap read FCollapseNodeIconLarge write SetCollapseNodeIconLarge;\r\n end;\r\n\r\n TTMSFNCTreeViewColumnsAppearance = class(TPersistent)\r\n private\r\n FTreeView: TTMSFNCCustomTreeView;\r\n FLayouts: TTMSFNCTreeViewColumnsLayouts;\r\n FStretch: Boolean;\r\n FStretchColumn: Integer;\r\n FStretchAll: Boolean;\r\n FBottomSize: Double;\r\n FTopSize: Double;\r\n FBottomFill: TTMSFNCGraphicsFill;\r\n FBottomStroke: TTMSFNCGraphicsStroke;\r\n FTopFill: TTMSFNCGraphicsFill;\r\n FTopStroke: TTMSFNCGraphicsStroke;\r\n FTopFont: TTMSFNCGraphicsFont;\r\n FBottomFont: TTMSFNCGraphicsFont;\r\n FTopVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTopHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FBottomHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FBottomVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTopVerticalText: Boolean;\r\n FBottomVerticalText: Boolean;\r\n FFillEmptySpaces: Boolean;\r\n FSortIndicatorColor: TTMSFNCGraphicsColor;\r\n procedure SetLayouts(const Value: TTMSFNCTreeViewColumnsLayouts);\r\n procedure SetStretch(const Value: Boolean);\r\n procedure SetStretchAll(const Value: Boolean);\r\n procedure SetStretchColumn(const Value: Integer);\r\n procedure SetBottomSize(const Value: Double);\r\n procedure SetTopSize(const Value: Double);\r\n procedure SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetBottomStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetTopFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetTopStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetTopFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetTopVerticalText(const Value: Boolean);\r\n procedure SetBottomVerticalText(const Value: Boolean);\r\n procedure SetFillEmptySpaces(const Value: Boolean);\r\n procedure SetSortIndicatorColor(const Value: TTMSFNCGraphicsColor);\r\n protected\r\n procedure Changed(Sender: TObject);\r\n public\r\n constructor Create(ATreeView: TTMSFNCCustomTreeView);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Layouts: TTMSFNCTreeViewColumnsLayouts read FLayouts write SetLayouts default [tclTop];\r\n property Stretch: Boolean read FStretch write SetStretch default True;\r\n property StretchColumn: Integer read FStretchColumn write SetStretchColumn default -1;\r\n property StretchAll: Boolean read FStretchAll write SetStretchAll default True;\r\n property TopSize: Double read FTopSize write SetTopSize;\r\n property BottomSize: Double read FBottomSize write SetBottomSize;\r\n property TopFont: TTMSFNCGraphicsFont read FTopFont write SetTopFont;\r\n property BottomFont: TTMSFNCGraphicsFont read FBottomFont write SetBottomFont;\r\n property TopFill: TTMSFNCGraphicsFill read FTopFill write SetTopFill;\r\n property BottomFill: TTMSFNCGraphicsFill read FBottomFill write SetBottomFill;\r\n property TopStroke: TTMSFNCGraphicsStroke read FTopStroke write SetTopStroke;\r\n property BottomStroke: TTMSFNCGraphicsStroke read FBottomStroke write SetBottomStroke;\r\n property TopVerticalText: Boolean read FTopVerticalText write SetTopVerticalText default False;\r\n property BottomVerticalText: Boolean read FBottomVerticalText write SetBottomVerticalText default False;\r\n property FillEmptySpaces: Boolean read FFillEmptySpaces write SetFillEmptySpaces default True;\r\n property SortIndicatorColor: TTMSFNCGraphicsColor read FSortIndicatorColor write SetSortIndicatorColor default gcSteelblue;\r\n end;\r\n\r\n TTMSFNCTreeViewColumnEmptySpace = (tcesTopLeft, tcesTopRight, tcesBottomLeft, tcesBottomRight);\r\n TTMSFNCTreeViewGroupEmptySpace = (tgesTopLeft, tgesTopRight, tgesBottomLeft, tgesBottomRight);\r\n\r\n TTMSFNCTreeViewGroupsAppearance = class(TPersistent)\r\n private\r\n FTreeView: TTMSFNCCustomTreeView;\r\n FLayouts: TTMSFNCTreeViewGroupsLayouts;\r\n FBottomSize: Double;\r\n FTopSize: Double;\r\n FBottomFill: TTMSFNCGraphicsFill;\r\n FBottomStroke: TTMSFNCGraphicsStroke;\r\n FTopFill: TTMSFNCGraphicsFill;\r\n FTopStroke: TTMSFNCGraphicsStroke;\r\n FTopFont: TTMSFNCGraphicsFont;\r\n FBottomFont: TTMSFNCGraphicsFont;\r\n FBottomHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTopVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTopHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FBottomVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTopVerticalText: Boolean;\r\n FBottomVerticalText: Boolean;\r\n FFillEmptySpaces: Boolean;\r\n procedure SetLayouts(const Value: TTMSFNCTreeViewGroupsLayouts);\r\n procedure SetBottomSize(const Value: Double);\r\n procedure SetTopSize(const Value: Double);\r\n procedure SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetBottomStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetTopFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetTopStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetTopFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetBottomHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetBottomVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTopHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTopVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTopVerticalText(const Value: Boolean);\r\n procedure SetBottomVerticalText(const Value: Boolean);\r\n procedure SetFillEmptySpaces(const Value: Boolean);\r\n protected\r\n procedure Changed(Sender: TObject);\r\n public\r\n constructor Create(ATreeView: TTMSFNCCustomTreeView);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Layouts: TTMSFNCTreeViewGroupsLayouts read FLayouts write SetLayouts default [tglTop];\r\n property TopSize: Double read FTopSize write SetTopSize;\r\n property BottomSize: Double read FBottomSize write SetBottomSize;\r\n property TopFill: TTMSFNCGraphicsFill read FTopFill write SetTopFill;\r\n property BottomFill: TTMSFNCGraphicsFill read FBottomFill write SetBottomFill;\r\n property TopFont: TTMSFNCGraphicsFont read FTopFont write SetTopFont;\r\n property BottomFont: TTMSFNCGraphicsFont read FBottomFont write SetBottomFont;\r\n property TopStroke: TTMSFNCGraphicsStroke read FTopStroke write SetTopStroke;\r\n property BottomStroke: TTMSFNCGraphicsStroke read FBottomStroke write SetBottomStroke;\r\n property TopHorizontalTextAlign: TTMSFNCGraphicsTextAlign read FTopHorizontalTextAlign write SetTopHorizontalTextAlign default gtaCenter;\r\n property TopVerticalTextAlign: TTMSFNCGraphicsTextAlign read FTopVerticalTextAlign write SetTopVerticalTextAlign default gtaCenter;\r\n property BottomHorizontalTextAlign: TTMSFNCGraphicsTextAlign read FBottomHorizontalTextAlign write SetBottomHorizontalTextAlign default gtaCenter;\r\n property BottomVerticalTextAlign: TTMSFNCGraphicsTextAlign read FBottomVerticalTextAlign write SetBottomVerticalTextAlign default gtaCenter;\r\n property TopVerticalText: Boolean read FTopVerticalText write SetTopVerticalText default False;\r\n property BottomVerticalText: Boolean read FBottomVerticalText write SetBottomVerticalText default False;\r\n property FillEmptySpaces: Boolean read FFillEmptySpaces write SetFillEmptySpaces default True;\r\n end;\r\n\r\n TTMSFNCTreeViewBeforeDrawSortIndicatorEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawSortIndicatorEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind) of object;\r\n TTMSFNCTreeViewNodeCompareEvent = procedure(Sender: TObject; Node1, Node2: TTMSFNCTreeViewNode; AColumn: Integer; var ACompareResult: Integer) of object;\r\n TTMSFNCTreeViewBeforeSizeColumnEvent = procedure(Sender: TObject; AColumn: Integer; AColumnSize: Double; var ANewColumnSize: Double; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterSizeColumnEvent = procedure(Sender: TObject; AColumn: Integer; AColumnSize: Double) of object;\r\n TTMSFNCTreeViewBeforeDrawColumnEmptySpaceEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewColumnEmptySpace; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawColumnEmptySpaceEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewColumnEmptySpace) of object;\r\n TTMSFNCTreeViewBeforeDrawGroupEmptySpaceEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewGroupEmptySpace; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawGroupEmptySpaceEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewGroupEmptySpace) of object;\r\n\r\n TTMSFNCTreeViewNeedFilterDropDownDataEvent = procedure(Sender: TObject; AColumn: Integer; AValues: TStrings) of object;\r\n TTMSFNCTreeViewBeforeDrawColumnEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawColumnEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer) of object;\r\n TTMSFNCTreeViewBeforeDrawColumnHeaderEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawColumnHeaderEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind) of object;\r\n TTMSFNCTreeViewBeforeDrawGroupEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawGroupEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind) of object;\r\n\r\n TTMSFNCTreeViewBeforeDrawNodeEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n\r\n TTMSFNCTreeViewGetNumberOfNodesEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer) of object;\r\n\r\n TTMSFNCTreeViewGetColumnTextEvent = procedure(Sender: TObject; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AText: String) of object;\r\n TTMSFNCTreeViewBeforeDrawColumnTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawColumnTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String) of object;\r\n TTMSFNCTreeViewGetGroupTextEvent = procedure(Sender: TObject; AGroup: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AText: String) of object;\r\n TTMSFNCTreeViewBeforeDrawGroupTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawGroupTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String) of object;\r\n TTMSFNCTreeViewNodeAnchorClickEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AAnchor: String) of object;\r\n TTMSFNCTreeViewNodeTitleAnchorClickEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AAnchor: String) of object;\r\n TTMSFNCTreeViewNodeChangedEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewGetNodeTextEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var AText: String) of object;\r\n TTMSFNCTreeViewGetNodeTitleEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var ATitle: String) of object;\r\n TTMSFNCTreeViewGetNodeTitleExpandedEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExpanded: Boolean) of object;\r\n TTMSFNCTreeViewGetNodeSidesEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ASides: TTMSFNCGraphicsSides) of object;\r\n TTMSFNCTreeViewGetNodeTrimmingEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATrimming: TTMSFNCGraphicsTextTrimming) of object;\r\n TTMSFNCTreeViewGetNodeHorizontalTextAlignEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign) of object;\r\n TTMSFNCTreeViewGetNodeVerticalTextAlignEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AVerticalTextAlign: TTMSFNCGraphicsTextAlign) of object;\r\n TTMSFNCTreeViewGetNodeWordWrappingEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AWordWrapping: Boolean) of object;\r\n TTMSFNCTreeViewGetNodeExtraSizeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExtraSize: Single) of object;\r\n TTMSFNCTreeViewGetNodeTitleExtraSizeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleExtraSize: Single) of object;\r\n TTMSFNCTreeViewGetColumnTrimmingEvent = procedure(Sender: TObject; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var ATrimming: TTMSFNCGraphicsTextTrimming) of object;\r\n TTMSFNCTreeViewGetColumnHorizontalTextAlignEvent = procedure(Sender: TObject; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign) of object;\r\n TTMSFNCTreeViewGetColumnVerticalTextAlignEvent = procedure(Sender: TObject; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AVerticalTextAlign: TTMSFNCGraphicsTextAlign) of object;\r\n TTMSFNCTreeViewGetColumnWordWrappingEvent = procedure(Sender: TObject; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AWordWrapping: Boolean) of object;\r\n TTMSFNCTreeViewGetNodeIconEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ALarge: Boolean; var AIcon: TTMSFNCBitmap) of object;\r\n TTMSFNCTreeViewGetNodeHeightEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AHeight: Double) of object;\r\n TTMSFNCTreeViewBeforeDrawNodeTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String) of object;\r\n TTMSFNCTreeViewBeforeDrawNodeTitleEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ATitle: String; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeTitleEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ATitle: String) of object;\r\n TTMSFNCTreeViewBeforeDrawNodeExpandEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AExpand:TTMSFNCBitmap; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeExpandEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AExpand:TTMSFNCBitmap) of object;\r\n TTMSFNCTreeViewBeforeDrawNodeIconEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AIcon:TTMSFNCBitmap; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeIconEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AIcon:TTMSFNCBitmap) of object;\r\n TTMSFNCTreeViewBeforeDrawNodeExtraEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeExtraEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewDrawNodeExtraEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewBeforeDrawNodeTitleExtraEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeTitleExtraEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewDrawNodeTitleExtraEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewBeforeDrawNodeCheckEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap; var AAllow: Boolean) of object;\r\n TTMSFNCTreeViewAfterDrawNodeCheckEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap) of object;\r\n TTMSFNCTreeViewGetNodeColorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor) of object;\r\n TTMSFNCTreeViewGetNodeCheckTypeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACheckType: TTMSFNCTreeViewNodeCheckType) of object;\r\n TTMSFNCTreeViewGetNodeTextColorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor) of object;\r\n TTMSFNCTreeViewGetNodeTitleColorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleColor: TTMSFNCGraphicsColor) of object;\r\n TTMSFNCTreeViewIsNodeExtendedEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AExtended: Boolean) of object;\r\n\r\n TTMSFNCTreeViewIsNodeDeletableEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ADeletable: Boolean) of object;\r\n TTMSFNCTreeViewIsNodeCheckedEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AChecked: Boolean) of object;\r\n TTMSFNCTreeViewIsNodeExpandedEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AExpanded: Boolean) of object;\r\n TTMSFNCTreeViewIsNodeVisibleEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AVisible: Boolean) of object;\r\n TTMSFNCTreeViewIsNodeEnabledEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AEnabled: Boolean) of object;\r\n\r\n TTMSFNCTreeViewBeforeUpdateNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AText: String; var ACanUpdate: Boolean) of object;\r\n TTMSFNCTreeViewAfterUpdateNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer) of object;\r\n TTMSFNCTreeViewBeforeCollapseNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ACanCollapse: Boolean) of object;\r\n TTMSFNCTreeViewAfterCollapseNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewBeforeExpandNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ACanExpand: Boolean) of object;\r\n TTMSFNCTreeViewAfterExpandNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewBeforeCheckNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanCheck: Boolean) of object;\r\n TTMSFNCTreeViewAfterCheckNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer) of object;\r\n TTMSFNCTreeViewBeforeUnCheckNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanUnCheck: Boolean) of object;\r\n TTMSFNCTreeViewAfterUnCheckNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer) of object;\r\n\r\n TTMSFNCTreeViewBeforeSelectNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ACanSelect: Boolean) of object;\r\n TTMSFNCTreeViewAfterSelectNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewBeforeUnSelectNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ACanUnSelect: Boolean) of object;\r\n TTMSFNCTreeViewAfterUnSelectNodeEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n\r\n TTMSFNCTreeViewNodeClickEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode) of object;\r\n\r\n TTMSFNCTreeViewScrollEvent = procedure(Sender: TObject; APosition: Single) of object;\r\n\r\n {$IFDEF FMXLIB}\r\n TTMSFNCTreeViewInplaceEditor = TControl;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n TTMSFNCTreeViewInplaceEditor = TWinControl;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewInplaceEditor = TControl;\r\n TTMSFNCTreeViewInplaceEditorClass = class of TControl;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewInplaceEditorClass = class of TTMSFNCTreeViewInplaceEditor;\r\n {$ENDIF}\r\n\r\n TTMSFNCTreeViewCustomizeInplaceEditorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AInplaceEditor: TTMSFNCTreeViewInplaceEditor) of object;\r\n TTMSFNCTreeViewGetInplaceEditorRectEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AInplaceEditor: TTMSFNCTreeViewInplaceEditor; var AInplaceEditorRect: TRectF) of object;\r\n TTMSFNCTreeViewGetInplaceEditorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;{$IFDEF FMXLIB} var ATransparent: Boolean; {$ENDIF}var AInplaceEditorClass: TTMSFNCTreeViewInplaceEditorClass) of object;\r\n TTMSFNCTreeViewBeforeOpenInplaceEditorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanOpen: Boolean) of object;\r\n TTMSFNCTreeViewAfterOpenInplaceEditorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AInplaceEditor: TTMSFNCTreeViewInplaceEditor; AInplaceEditorRect: TRectF) of object;\r\n TTMSFNCTreeViewCloseInplaceEditorEvent = procedure(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AInplaceEditor: TTMSFNCTreeViewInplaceEditor; ACancelled: Boolean; var ACanClose: Boolean) of object;\r\n TTMSFNCTreeViewBeforeReorderNodeEvent = procedure(Sender: TObject; AFromNode, AToNode: TTMSFNCTreeViewVirtualNode; var ACanReorder: Boolean) of object;\r\n TTMSFNCTreeViewAfterReorderNodeEvent = procedure(Sender: TObject; AFromNode, AToNode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewBeforeDropNodeEvent = procedure(Sender: TObject; AFromNode, AToNode: TTMSFNCTreeViewVirtualNode; var ACanDrop: Boolean) of object;\r\n TTMSFNCTreeViewAfterDropNodeEvent = procedure(Sender: TObject; AFromNode, AToNode: TTMSFNCTreeViewVirtualNode) of object;\r\n TTMSFNCTreeViewBeforeCopyToClipboardEvent = procedure(Sender: TObject; var ACanCopy: Boolean) of object;\r\n TTMSFNCTreeViewBeforeCutToClipboardEvent = procedure(Sender: TObject; var ACanCut: Boolean) of object;\r\n TTMSFNCTreeViewBeforePasteFromClipboardEvent = procedure(Sender: TObject; var ACanPaste: Boolean) of object;\r\n TTMSFNCTreeViewAfterCopyToClipboardEvent = procedure(Sender: TObject) of object;\r\n TTMSFNCTreeViewAfterCutToClipboardEvent = procedure(Sender: TObject) of object;\r\n TTMSFNCTreeViewAfterPasteFromClipboardEvent = procedure(Sender: TObject) of object;\r\n\r\n TTMSFNCTreeViewFilterSelectEvent = procedure(Sender: TObject; AColumn: Integer; var ACondition: string) of object;\r\n\r\n TTMSFNCTreeViewMouseEditMode = (tmemDoubleClick, tmemSingleClick, tmemSingleClickOnSelectedNode);\r\n\r\n TTMSFNCTreeViewClipboardMode = (tcmNone, tcmTextOnly, tcmFull);\r\n TTMSFNCTreeViewDragDropMode = (tdmNone, tdmMove, tdmCopy);\r\n\r\n TTMSFNCTreeViewInteraction = class;\r\n\r\n TTMSFNCTreeViewLookup = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCTreeViewInteraction;\r\n FEnabled: Boolean;\r\n FCaseSensitive: Boolean;\r\n FIncremental: Boolean;\r\n FColumn: Integer;\r\n FAutoSelect: Boolean;\r\n FRootNodesOnly: Boolean;\r\n FAutoExpand: Boolean;\r\n public\r\n constructor Create(AOwner: TTMSFNCTreeViewInteraction);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive default False;\r\n property Enabled: Boolean read FEnabled write FEnabled default True;\r\n property Incremental: Boolean read FIncremental write FIncremental default True;\r\n property Column: Integer read FColumn write FColumn default -1;\r\n property RootNodesOnly: Boolean read FRootNodesOnly write FRootNodesOnly default False;\r\n property AutoExpand: Boolean read FAutoExpand write FAutoExpand default False;\r\n property AutoSelect: Boolean read FAutoSelect write FAutoSelect default True;\r\n end;\r\n\r\n TTMSFNCTreeViewInteraction = class(TPersistent)\r\n private\r\n FTreeView: TTMSFNCCustomTreeView;\r\n FMultiSelect: Boolean;\r\n FTouchScrolling: Boolean;\r\n FReadOnly: Boolean;\r\n FColumnSizing: Boolean;\r\n FColumnAutoSizeOnDblClick: Boolean;\r\n FExtendedSelectable: Boolean;\r\n FSelectionFollowsFocus: Boolean;\r\n FKeyboardEdit: Boolean;\r\n FMouseEditMode: TTMSFNCTreeViewMouseEditMode;\r\n FExtendedEditable: Boolean;\r\n FClipboardMode: TTMSFNCTreeViewClipboardMode;\r\n FReorder: Boolean;\r\n FDragDropMode: TTMSFNCTreeViewDragDropMode;\r\n FLookup: TTMSFNCTreeViewLookup;\r\n FExpandCollapseOnDblClick: Boolean;\r\n FAutoOpenURL: Boolean;\r\n procedure SetMultiSelect(const Value: Boolean);\r\n procedure SetTouchScrolling(const Value: Boolean);\r\n procedure SetReadOnly(const Value: Boolean);\r\n procedure SetColumnSizing(const Value: Boolean);\r\n procedure SetColumnAutoSizeOnDblClick(const Value: Boolean);\r\n procedure SetExtendedSelectable(const Value: Boolean);\r\n procedure SetSelectionFollowsFocus(const Value: Boolean);\r\n procedure SetMouseEditMode(const Value: TTMSFNCTreeViewMouseEditMode);\r\n procedure SetExtendedEditable(const Value: Boolean);\r\n procedure SetDragDropMode(const Value: TTMSFNCTreeViewDragDropMode);\r\n procedure SetReorder(const Value: Boolean);\r\n procedure SetLookup(const Value: TTMSFNCTreeViewLookup);\r\n procedure SetExpandCollapseOnDblClick(const Value: Boolean);\r\n protected\r\n property SelectionFollowsFocus: Boolean read FSelectionFollowsFocus write SetSelectionFollowsFocus default True;\r\n public\r\n constructor Create(ATreeView: TTMSFNCCustomTreeView);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property AutoOpenURL: Boolean read FAutoOpenURL write FAutoOpenURL default True;\r\n property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default false;\r\n property ExtendedSelectable: Boolean read FExtendedSelectable write SetExtendedSelectable default False;\r\n property ExtendedEditable: Boolean read FExtendedEditable write SetExtendedEditable default False;\r\n property MouseEditMode: TTMSFNCTreeViewMouseEditMode read FMouseEditMode write SetMouseEditMode default tmemSingleClickOnSelectedNode;\r\n property TouchScrolling: Boolean read FTouchScrolling write SetTouchScrolling default True;\r\n property KeyboardEdit: Boolean read FKeyboardEdit write FKeyboardEdit default True;\r\n property ReadOnly: Boolean read FReadOnly write SetReadOnly default False;\r\n property ExpandCollapseOnDblClick: Boolean read FExpandCollapseOnDblClick write SetExpandCollapseOnDblClick default True;\r\n property ColumnSizing: Boolean read FColumnSizing write SetColumnSizing default False;\r\n property ColumnAutoSizeOnDblClick: Boolean read FColumnAutoSizeOnDblClick write SetColumnAutoSizeOnDblClick default False;\r\n property ClipboardMode: TTMSFNCTreeViewClipboardMode read FClipboardMode write FClipboardMode default tcmNone;\r\n property Reorder: Boolean read FReorder write SetReorder default False;\r\n property DragDropMode: TTMSFNCTreeViewDragDropMode read FDragDropMode write SetDragDropMode default tdmNone;\r\n property Lookup: TTMSFNCTreeViewLookup read FLookup write SetLookup;\r\n end;\r\n\r\n TTMSFNCTreeViewSceneDrawingScale = record\r\n SceneScale: Double;\r\n DrawingScale: TPointF;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewSelectedNodes = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewVirtualNode read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewSelectedNodes = class(TList);\r\n {$ENDIF}\r\n TTMSFNCTreeViewNodeArray = array of TTMSFNCTreeViewNode;\r\n\r\n TTMSFNCTreeViewNodeCheck = record\r\n AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode;\r\n end;\r\n\r\n TTMSFNCTreeViewNodeAnchor = record\r\n AAnchor: String;\r\n AColumn: Integer;\r\n end;\r\n\r\n TTMSFNCTreeViewComboBox = class(TComboBox);\r\n {$IFDEF FMXLIB}\r\n TTMSFNCTreeViewCaretPosition = TCaretPosition;\r\n TTMSFNCTreeViewMemo = class(TMemo)\r\n end;\r\n TTMSFNCTreeViewEdit = class(TEdit)\r\n protected\r\n function GetDefaultStyleLookupName: string; override;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n TTMSFNCTreeViewCaretPosition = TPoint;\r\n TTMSFNCTreeViewMemo = class(TMemo)\r\n private\r\n FTreeView: TTMSFNCCustomTreeView;\r\n protected\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure DoExit; override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n TTMSFNCTreeViewEdit = class(TEdit)\r\n private\r\n FTreeView: TTMSFNCCustomTreeView;\r\n protected\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure DoExit; override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n {$ENDIF}\r\n\r\n TTMSFNCTreeViewCopyNodes = class(TTMSFNCTreeViewNodes);\r\n\r\n TTMSFNCTreeViewDragOverEvent = procedure(Sender: TObject; Source: TObject; Point: TPointF; var Accept: Boolean) of object;\r\n TTMSFNCTreeViewDragDropEvent = procedure(Sender: TObject; Source: TObject; Point: TPointF) of object;\r\n TTMSFNCTreeViewColumnSortEvent = procedure(Sender: TObject; AColumn: Integer; ASortMode: TTMSFNCTreeViewNodesSortMode) of object;\r\n TTMSFNCTreeViewLookupEvent = procedure(Sender: TObject; ALookupString: String) of object;\r\n TTMSFNCTreeViewReorderEvent = procedure(Sender: TObject; AFromNode, AToNode: TTMSFNCTreeViewVirtualNode) of object;\r\n\r\n TTMSFNCTreeViewExportState = (tvesExportStart, tvesExportNewRow, tvesExportDone, tvesExportSelRow, tvesExportFail, tvesExportNextRow, tvesExportFindRow);\r\n\r\n TTMSFNCTreeViewAdapter = class(TTMSFNCCustomComponent)\r\n private\r\n FBlockAdd: Boolean;\r\n FTreeView: TTMSFNCCustomTreeView;\r\n FActive: boolean;\r\n procedure SetActive(const Value: boolean);\r\n procedure SetTreeView(const Value: TTMSFNCCustomTreeView);\r\n protected\r\n function GetInstance: NativeUInt; override;\r\n procedure GetNumberOfNodes(ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer); virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure UpdateBounds; virtual;\r\n procedure Initialize; virtual;\r\n procedure ScrollTreeView({%H-}ADelta: Integer); virtual;\r\n procedure SelectNode({%H-}ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure GetNodeText({%H-}ACol: Integer;{%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}AText: String); virtual;\r\n procedure ExportNotification({%H-}AState: TTMSFNCTreeViewExportState; {%H-}ARow: Integer); virtual;\r\n function GetColumnDisplayName({%H-}ACol: Integer): String; virtual;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n published\r\n property Active: Boolean read FActive write SetActive default False;\r\n property TreeView: TTMSFNCCustomTreeView read FTreeView write SetTreeView;\r\n end;\r\n\r\n TTMSFNCCustomTreeView = class(TTMSFNCTreeViewData)\r\n private\r\n FOldTopRow: Integer;\r\n FCompactMode: Boolean;\r\n FVerticalOffset, FVerticalOffsetTo: Double;\r\n FAccepted: Boolean;\r\n FLookupString: String;\r\n FY, FDragY, FSaveDragY: Single;\r\n FX: Single;\r\n FDragBitmap: TTMSFNCImage;\r\n FReorderMode, FDragMode, FDragModeStarted: Boolean;\r\n FSortColumn: Integer;\r\n FClosing: Boolean;\r\n FInplaceEditorClosed: Boolean;\r\n FColumnSize: Double;\r\n FCloseWithDialogKey: Boolean;\r\n FFilterPopup: TTMSFNCPopup;\r\n FFilterListBox: TListBox;\r\n FFilterTimer: TTimer;\r\n FInplaceEditorClass: TTMSFNCTreeViewInplaceEditorClass;\r\n FInplaceEditor: TTMSFNCTreeViewInplaceEditor;\r\n FInplaceEditorActive: Boolean;\r\n FSizeColumn, FDownColumn, FDownColumnFilter, FDownColumnExpand: Integer;\r\n FUpdateNodeColumn: Integer;\r\n FUpdateNode: TTMSFNCTreeViewVirtualNode;\r\n FCopyNodes: TTMSFNCTreeViewCopyNodes;\r\n {$IFDEF FMXLIB}\r\n FScrollBarTimer: TTimer;\r\n FInplaceEditorTimer: TTimer;\r\n {$ENDIF}\r\n FDoubleSelection: Boolean;\r\n FDragTimer: TTimer;\r\n FDragRow: Integer;\r\n FDownNode, FFocusedNode, FDragNode: TTMSFNCTreeViewVirtualNode;\r\n FDblClicked: Boolean;\r\n FDoNodeAnchor, FDoNodeTitleAnchor: TTMSFNCTreeViewNodeAnchor;\r\n FDoNodeCheck: TTMSFNCTreeViewNodeCheck;\r\n FDoNodeExpand: Boolean;\r\n FDoNodeExtra: Boolean;\r\n FDoNodeTitleExtra: Boolean;\r\n FScrolling: Boolean;\r\n FMouseUp, FAnimateVerticalPos, FAnimateHorizontalPos, FAnimateVerticalOffset: Boolean;\r\n FAnimating: Boolean;\r\n FSpX, FSpY: Double;\r\n FScrollX, FScrollY, FDownX, FDownY, FMouseX, FMouseY, FSizeX: Double;\r\n FScrollVTo, FScrollHTo: Double;\r\n FTimeStart, FTimeStop: Double;\r\n FAnimateTimer: TTimer;\r\n FNodeCache: TTMSFNCTreeViewNodeCache;\r\n FColumnsTopCache: TTMSFNCTreeViewColumnsTopCache;\r\n FColumnsBottomCache: TTMSFNCTreeViewColumnsBottomCache;\r\n FGroupsTopCache: TTMSFNCTreeViewGroupsTopCache;\r\n FGroupsBottomCache: TTMSFNCTreeViewGroupsBottomCache;\r\n FNodeDisplay: TTMSFNCTreeViewNodeDisplayList;\r\n FColumnsTopDisplay: TTMSFNCTreeViewColumnsTopDisplayList;\r\n FColumnsBottomDisplay: TTMSFNCTreeViewColumnsBottomDisplayList;\r\n FGroupsTopDisplay: TTMSFNCTreeViewGroupsTopDisplayList;\r\n FGroupsBottomDisplay: TTMSFNCTreeViewGroupsBottomDisplayList;\r\n FNodesAppearance: TTMSFNCTreeViewNodesAppearance;\r\n FColumnsCaching: Boolean;\r\n FGroupsCaching: Boolean;\r\n FGroupsAppearance: TTMSFNCTreeViewGroupsAppearance;\r\n FColumnsAppearance: TTMSFNCTreeViewColumnsAppearance;\r\n FOnAfterDrawGroup: TTMSFNCTreeViewAfterDrawGroupEvent;\r\n FOnNodeCompare: TTMSFNCTreeViewNodeCompareEvent;\r\n FOnBeforeSizeColumn: TTMSFNCTreeViewBeforeSizeColumnEvent;\r\n FOnAfterSizeColumn: TTMSFNCTreeViewAfterSizeColumnEvent;\r\n FOnBeforeDrawColumn: TTMSFNCTreeViewBeforeDrawColumnEvent;\r\n FOnBeforeDrawColumnHeader: TTMSFNCTreeViewBeforeDrawColumnHeaderEvent;\r\n FOnAfterDrawColumnHeader: TTMSFNCTreeViewAfterDrawColumnHeaderEvent;\r\n FOnBeforeDrawNode: TTMSFNCTreeViewBeforeDrawNodeEvent;\r\n FOnAfterDrawColumn: TTMSFNCTreeViewAfterDrawColumnEvent;\r\n FOnBeforeDrawGroup: TTMSFNCTreeViewBeforeDrawGroupEvent;\r\n FOnAfterDrawNode: TTMSFNCTreeViewAfterDrawNodeEvent;\r\n FOnBeforeDrawNodeText: TTMSFNCTreeViewBeforeDrawNodeTextEvent;\r\n FOnBeforeDrawNodeTitle: TTMSFNCTreeViewBeforeDrawNodeTitleEvent;\r\n FOnGetNodeHeight: TTMSFNCTreeViewGetNodeHeightEvent;\r\n FOnAfterDrawColumnText: TTMSFNCTreeViewAfterDrawColumnTextEvent;\r\n FOnBeforeDrawGroupText: TTMSFNCTreeViewBeforeDrawGroupTextEvent;\r\n FOnAfterDrawNodeText: TTMSFNCTreeViewAfterDrawNodeTextEvent;\r\n FOnAfterDrawNodeTitle: TTMSFNCTreeViewAfterDrawNodeTitleEvent;\r\n FOnAfterDrawGroupText: TTMSFNCTreeViewAfterDrawGroupTextEvent;\r\n FOnBeforeDrawColumnText: TTMSFNCTreeViewBeforeDrawColumnTextEvent;\r\n FInteraction: TTMSFNCTreeViewInteraction;\r\n FOnAfterUpdateNode: TTMSFNCTreeViewAfterUpdateNodeEvent;\r\n FOnBeforeUpdateNode: TTMSFNCTreeViewBeforeUpdateNodeEvent;\r\n FOnAfterUnCheckNode: TTMSFNCTreeViewAfterUnCheckNodeEvent;\r\n FOnBeforeUnCheckNode: TTMSFNCTreeViewBeforeUnCheckNodeEvent;\r\n FOnAfterCheckNode: TTMSFNCTreeViewAfterCheckNodeEvent;\r\n FOnBeforeCheckNode: TTMSFNCTreeViewBeforeCheckNodeEvent;\r\n FOnAfterExpandNode: TTMSFNCTreeViewAfterExpandNodeEvent;\r\n FOnBeforeExpandNode: TTMSFNCTreeViewBeforeExpandNodeEvent;\r\n FOnAfterCollapseNode: TTMSFNCTreeViewAfterCollapseNodeEvent;\r\n FOnBeforeCollapseNode: TTMSFNCTreeViewBeforeCollapseNodeEvent;\r\n FOnBeforeSelectNode: TTMSFNCTreeViewBeforeSelectNodeEvent;\r\n FOnAfterSelectNode: TTMSFNCTreeViewAfterSelectNodeEvent;\r\n FOnNodeClick: TTMSFNCTreeViewNodeClickEvent;\r\n FOnNodeDblClick: TTMSFNCTreeViewNodeClickEvent;\r\n FOnGetNodeText: TTMSFNCTreeViewGetNodeTextEvent;\r\n FOnGetNodeTitle: TTMSFNCTreeViewGetNodeTitleEvent;\r\n FOnGetColumnText: TTMSFNCTreeViewGetColumnTextEvent;\r\n FOnGetGroupText: TTMSFNCTreeViewGetGroupTextEvent;\r\n FOnNodeAnchorClick: TTMSFNCTreeViewNodeAnchorClickEvent;\r\n FOnVScroll: TTMSFNCTreeViewScrollEvent;\r\n FOnHScroll: TTMSFNCTreeViewScrollEvent;\r\n FOnBeforeDrawColumnEmptySpace: TTMSFNCTreeViewBeforeDrawColumnEmptySpaceEvent;\r\n FOnAfterDrawColumnEmptySpace: TTMSFNCTreeViewAfterDrawColumnEmptySpaceEvent;\r\n FOnBeforeDrawGroupEmptySpace: TTMSFNCTreeViewBeforeDrawGroupEmptySpaceEvent;\r\n FOnAfterDrawGroupEmptySpace: TTMSFNCTreeViewAfterDrawGroupEmptySpaceEvent;\r\n FOnGetNumberOfNodes: TTMSFNCTreeViewGetNumberOfNodesEvent;\r\n FOnIsNodeExpanded: TTMSFNCTreeViewIsNodeExpandedEvent;\r\n FOnIsNodeEnabled: TTMSFNCTreeViewIsNodeEnabledEvent;\r\n FOnIsNodeVisible: TTMSFNCTreeViewIsNodeVisibleEvent;\r\n FSelectedNodes: TTMSFNCTreeViewSelectedNodes;\r\n FOnGetNodeDisabledColor: TTMSFNCTreeViewGetNodeColorEvent;\r\n FOnGetNodeTextColor: TTMSFNCTreeViewGetNodeTextColorEvent;\r\n FOnGetNodeTitleColor: TTMSFNCTreeViewGetNodeTitleColorEvent;\r\n FOnGetNodeSelectedColor: TTMSFNCTreeViewGetNodeColorEvent;\r\n FOnGetNodeColor: TTMSFNCTreeViewGetNodeColorEvent;\r\n FOnGetNodeDisabledTextColor: TTMSFNCTreeViewGetNodeTextColorEvent;\r\n FOnGetNodeSelectedTextColor: TTMSFNCTreeViewGetNodeTextColorEvent;\r\n FOnGetNodeDisabledTitleColor: TTMSFNCTreeViewGetNodeTitleColorEvent;\r\n FOnGetNodeSelectedTitleColor: TTMSFNCTreeViewGetNodeTitleColorEvent;\r\n FOnIsNodeExtended: TTMSFNCTreeViewIsNodeExtendedEvent;\r\n FOnGetNodeIcon: TTMSFNCTreeViewGetNodeIconEvent;\r\n FOnGetColumnWordWrapping: TTMSFNCTreeViewGetColumnWordWrappingEvent;\r\n FOnGetColumnVerticalTextAlign: TTMSFNCTreeViewGetColumnVerticalTextAlignEvent;\r\n FOnGetColumnTrimming: TTMSFNCTreeViewGetColumnTrimmingEvent;\r\n FOnGetColumnHorizontalTextAlign: TTMSFNCTreeViewGetColumnHorizontalTextAlignEvent;\r\n FOnGetNodeWordWrapping: TTMSFNCTreeViewGetNodeWordWrappingEvent;\r\n FOnGetNodeVerticalTextAlign: TTMSFNCTreeViewGetNodeVerticalTextAlignEvent;\r\n FOnGetNodeTrimming: TTMSFNCTreeViewGetNodeTrimmingEvent;\r\n FOnGetNodeHorizontalTextAlign: TTMSFNCTreeViewGetNodeHorizontalTextAlignEvent;\r\n FOnIsNodeChecked: TTMSFNCTreeViewIsNodeCheckedEvent;\r\n FOnBeforeDrawNodeIcon: TTMSFNCTreeViewBeforeDrawNodeIconEvent;\r\n FOnBeforeDrawNodeExpand: TTMSFNCTreeViewBeforeDrawNodeExpandEvent;\r\n FOnAfterDrawNodeIcon: TTMSFNCTreeViewAfterDrawNodeIconEvent;\r\n FOnAfterDrawNodeExpand: TTMSFNCTreeViewAfterDrawNodeExpandEvent;\r\n FOnGetNodeCheckType: TTMSFNCTreeViewGetNodeCheckTypeEvent;\r\n FOnAfterDrawNodeCheck: TTMSFNCTreeViewAfterDrawNodeCheckEvent;\r\n FOnBeforeDrawNodeCheck: TTMSFNCTreeViewBeforeDrawNodeCheckEvent;\r\n FColumnStroke: TTMSFNCGraphicsStroke;\r\n FOnAfterDrawNodeColumn: TTMSFNCTreeViewAfterDrawColumnEvent;\r\n FOnBeforeDrawNodeColumn: TTMSFNCTreeViewBeforeDrawColumnEvent;\r\n FOnBeforeUnSelectNode: TTMSFNCTreeViewBeforeUnSelectNodeEvent;\r\n FOnAfterUnSelectNode: TTMSFNCTreeViewAfterUnSelectNodeEvent;\r\n FOnAfterOpenInplaceEditor: TTMSFNCTreeViewAfterOpenInplaceEditorEvent;\r\n FOnGetInplaceEditor: TTMSFNCTreeViewGetInplaceEditorEvent;\r\n FOnCloseInplaceEditor: TTMSFNCTreeViewCloseInplaceEditorEvent;\r\n FOnBeforeOpenInplaceEditor: TTMSFNCTreeViewBeforeOpenInplaceEditorEvent;\r\n FOnNodeChanged: TTMSFNCTreeViewNodeChangedEvent;\r\n FOnCustomizeInplaceEditor: TTMSFNCTreeViewCustomizeInplaceEditorEvent;\r\n FOnGetInplaceEditorRect: TTMSFNCTreeViewGetInplaceEditorRectEvent;\r\n FOnBeforeReorderNode: TTMSFNCTreeViewBeforeReorderNodeEvent;\r\n FOnAfterReorderNode: TTMSFNCTreeViewAfterReorderNodeEvent;\r\n FOnAfterDropNode: TTMSFNCTreeViewAfterDropNodeEvent;\r\n FOnBeforeDropNode: TTMSFNCTreeViewBeforeDropNodeEvent;\r\n FOnAfterCutToClipboard: TTMSFNCTreeViewAfterCutToClipboardEvent;\r\n FOnBeforePasteFromClipboard: TTMSFNCTreeViewBeforePasteFromClipboardEvent;\r\n FOnBeforeCopyToClipboard: TTMSFNCTreeViewBeforeCopyToClipboardEvent;\r\n FOnAfterPasteFromClipboard: TTMSFNCTreeViewAfterPasteFromClipboardEvent;\r\n FOnBeforeCutToClipboard: TTMSFNCTreeViewBeforeCutToClipboardEvent;\r\n FOnAfterCopyToClipboard: TTMSFNCTreeViewAfterCopyToClipboardEvent;\r\n FOnNeedFilterDropDownData: TTMSFNCTreeViewNeedFilterDropDownDataEvent;\r\n FOnFilterSelect: TTMSFNCTreeViewFilterSelectEvent;\r\n FOnCustomReorder: TTMSFNCTreeViewReorderEvent;\r\n FOnCustomDragDrop: TTMSFNCTreeViewDragDropEvent;\r\n FOnCustomDragOver: TTMSFNCTreeViewDragOverEvent;\r\n FOnCustomCopyToClipboard: TNotifyEvent;\r\n FOnCustomCutToClipboard: TNotifyEvent;\r\n FOnCustomPasteFromClipboard: TNotifyEvent;\r\n FOnCustomColumnSort: TTMSFNCTreeViewColumnSortEvent;\r\n FOnCustomLookup: TTMSFNCTreeViewLookupEvent;\r\n FOnBeforeDrawSortIndicator: TTMSFNCTreeViewBeforeDrawSortIndicatorEvent;\r\n FOnAfterDrawSortIndicator: TTMSFNCTreeViewAfterDrawSortIndicatorEvent;\r\n FAdapter: TTMSFNCTreeViewAdapter;\r\n FOnGetNodeSides: TTMSFNCTreeViewGetNodeSidesEvent;\r\n FOnGetNodeExtraSize: TTMSFNCTreeViewGetNodeExtraSizeEvent;\r\n FOnGetNodeTitleExtraSize: TTMSFNCTreeViewGetNodeTitleExtraSizeEvent;\r\n FOnAfterDrawNodeExtra: TTMSFNCTreeViewAfterDrawNodeExtraEvent;\r\n FOnBeforeDrawNodeExtra: TTMSFNCTreeViewBeforeDrawNodeExtraEvent;\r\n FOnDrawNodeExtra: TTMSFNCTreeViewDrawNodeExtraEvent;\r\n FOnGetNodeTitleTrimming: TTMSFNCTreeViewGetNodeTrimmingEvent;\r\n FOnGetNodeTitleHorizontalTextAlign: TTMSFNCTreeViewGetNodeHorizontalTextAlignEvent;\r\n FOnGetNodeTitleWordWrapping: TTMSFNCTreeViewGetNodeWordWrappingEvent;\r\n FOnGetNodeTitleVerticalTextAlign: TTMSFNCTreeViewGetNodeVerticalTextAlignEvent;\r\n FOnNodeTitleAnchorClick: TTMSFNCTreeViewNodeTitleAnchorClickEvent;\r\n FOnGetNodeExpanded: TTMSFNCTreeViewGetNodeTitleExpandedEvent;\r\n FOnBeforeDrawNodeTitleExtra: TTMSFNCTreeViewBeforeDrawNodeTitleExtraEvent;\r\n FOnAfterDrawNodeTitleExtra: TTMSFNCTreeViewAfterDrawNodeTitleExtraEvent;\r\n FOnDrawNodeTitleExtra: TTMSFNCTreeViewDrawNodeTitleExtraEvent;\r\n procedure SetNodesAppearance(const Value: TTMSFNCTreeViewNodesAppearance);\r\n procedure SetGroupsAppearance(const Value: TTMSFNCTreeViewGroupsAppearance);\r\n procedure SetColumnsAppearance(const Value: TTMSFNCTreeViewColumnsAppearance);\r\n procedure SetInteraction(const Value: TTMSFNCTreeViewInteraction);\r\n function GetFocusedNode: TTMSFNCTreeViewNode;\r\n function GetFocusedVirtualNode: TTMSFNCTreeViewVirtualNode;\r\n function GetSelNode(AIndex: Integer): TTMSFNCTreeViewNode;\r\n function GetSelVirtualNode(AIndex: Integer): TTMSFNCTreeViewVirtualNode;\r\n procedure SetColumnStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetFocusedNode(const Value: TTMSFNCTreeViewNode);\r\n procedure SetFocusedVirtualNode(const Value: TTMSFNCTreeViewVirtualNode);\r\n procedure SetSortColumn(const Value: Integer);\r\n procedure HandleFilterTimer(Sender: TObject);\r\n procedure SetAdapter(const Value: TTMSFNCTreeViewAdapter);\r\n procedure SetSelectedNode(const Value: TTMSFNCTreeViewNode);\r\n procedure SetSelectedVirtualNode(const Value: TTMSFNCTreeViewVirtualNode);\r\n procedure SetCompactMode(const Value: Boolean);\r\n function GetSelectedVirtualNodeRow: Integer;\r\n function GetTopRow: Integer;\r\n procedure SetTopRow(const Value: Integer);\r\n function GetBottomRow: Integer;\r\n protected\r\n procedure ChangeDPIScale(M, D: Integer); override;\r\n procedure RegisterRuntimeClasses; override;\r\n procedure ApplyStyle; override;\r\n procedure DoEnter; override;\r\n procedure DoExit; override;\r\n procedure UpdateControlAfterResize; override;\r\n procedure ResetToDefaultStyle; override;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure InitializeColumnSorting(AColumn: Integer; ASortMode: TTMSFNCTreeViewNodesSortMode); virtual;\r\n procedure AutoSizeColumnInternal(ACol: Integer; AUpdate: Boolean = False; ACallEventHandlers: Boolean = False); override;\r\n procedure DoNodeCompare(ANode1, ANode2: TTMSFNCTreeViewNode; AColumn: Integer; var ACompareResult: Integer); override;\r\n\r\n procedure ExportNotification(AState: TTMSFNCTreeViewExportState; ARow: Integer); virtual;\r\n procedure DoBeforeDrawSortIndicator(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawSortIndicator(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind); virtual;\r\n procedure DoBeforeCutToClipboard(var ACanCut: Boolean); virtual;\r\n procedure DoBeforeCopyToClipboard(var ACanCopy: Boolean); virtual;\r\n procedure DoBeforePasteFromClipboard(var ACanPaste: Boolean); virtual;\r\n procedure DoAfterCutToClipboard; virtual;\r\n procedure DoAfterCopyToClipboard; virtual;\r\n procedure DoAfterPasteFromClipboard; virtual;\r\n\r\n procedure DoBeforeReorderNode(AFromNode, AToNode: TTMSFNCTreeViewVirtualNode; var ACanReorder: Boolean); virtual;\r\n procedure DoAfterReorderNode(AFromNode, AToNode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoBeforeDropNode(AFromNode, AToNode: TTMSFNCTreeViewVirtualNode; var ACanDrop: Boolean); virtual;\r\n procedure DoAfterDropNode(AFromNode, AToNode: TTMSFNCTreeViewVirtualNode); virtual;\r\n\r\n procedure DoBeforeDrawColumnEmptySpace(AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewColumnEmptySpace; var AAllow: Boolean; var ADefaultDraw: Boolean);\r\n procedure DoAfterDrawColumnEmptySpace(AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewColumnEmptySpace);\r\n procedure DoBeforeDrawGroupEmptySpace(AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewGroupEmptySpace; var AAllow: Boolean; var ADefaultDraw: Boolean);\r\n procedure DoAfterDrawGroupEmptySpace(AGraphics: TTMSFNCGraphics; ARect: TRectF; ASpace: TTMSFNCTreeViewGroupEmptySpace);\r\n\r\n procedure DoBeforeDrawColumnHeader(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawColumnHeader(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind); virtual;\r\n procedure DoBeforeDrawColumn(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawColumn(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer); virtual;\r\n procedure DoBeforeDrawNodeColumn(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawNodeColumn(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer); virtual;\r\n procedure DoBeforeDrawGroup(AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawGroup(AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind); virtual;\r\n procedure DoBeforeDrawNode(AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawNode(AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n\r\n procedure DoGetColumnText(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AText: String); virtual;\r\n procedure DoBeforeDrawColumnText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawColumnText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String); virtual;\r\n procedure DoGetGroupText(AGroup: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AText: String); virtual;\r\n procedure DoBeforeDrawGroupText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawGroupText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String); virtual;\r\n procedure DoNodeClick(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoNodeDblClick(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n\r\n procedure DoGetNumberOfNodes(ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer); override;\r\n procedure DoGetNodeText(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var AText: String); override;\r\n procedure DoGetNodeTitle(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var ATitle: String); override;\r\n procedure DoGetNodeTitleExpanded(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExpanded: Boolean); override;\r\n procedure DoGetNodeTrimming(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATrimming: TTMSFNCGraphicsTextTrimming); override;\r\n procedure DoGetNodeHorizontalTextAlign(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); override;\r\n procedure DoGetNodeVerticalTextAlign(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AVerticalTextAlign: TTMSFNCGraphicsTextAlign); override;\r\n procedure DoGetNodeWordWrapping(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AWordWrapping: Boolean); override;\r\n procedure DoGetNodeTitleTrimming(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATrimming: TTMSFNCGraphicsTextTrimming); override;\r\n procedure DoGetNodeTitleHorizontalTextAlign(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); override;\r\n procedure DoGetNodeTitleVerticalTextAlign(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AVerticalTextAlign: TTMSFNCGraphicsTextAlign); override;\r\n procedure DoGetNodeTitleWordWrapping(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AWordWrapping: Boolean); override;\r\n procedure DoGetNodeExtraSize(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExtraSize: Single); override;\r\n procedure DoGetNodeTitleExtraSize(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleExtraSize: Single); override;\r\n procedure DoGetColumnTrimming(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var ATrimming: TTMSFNCGraphicsTextTrimming); override;\r\n procedure DoGetColumnHorizontalTextAlign(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); override;\r\n procedure DoGetColumnVerticalTextAlign(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AVerticalTextAlign: TTMSFNCGraphicsTextAlign); override;\r\n procedure DoGetColumnWordWrapping(AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AWordWrapping: Boolean); override;\r\n procedure DoGetNodeCheckType(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACheckType: TTMSFNCTreeViewNodeCheckType); override;\r\n procedure DoGetNodeHeight(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AHeight: Double); virtual;\r\n procedure DoGetNodeIcon(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ALarge: Boolean; var AIcon: TTMSFNCBitmap); override;\r\n procedure DoGetNodeSelectedColor(ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeSides(ANode: TTMSFNCTreeViewVirtualNode; var ASides: TTMSFNCGraphicsSides); override;\r\n procedure DoGetNodeDisabledColor(ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeColor(ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeSelectedTextColor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeDisabledTextColor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeTextColor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeSelectedTitleColor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeDisabledTitleColor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleColor: TTMSFNCGraphicsColor); override;\r\n procedure DoGetNodeTitleColor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleColor: TTMSFNCGraphicsColor); override;\r\n procedure DoIsNodeExpanded(ANode: TTMSFNCTreeViewVirtualNode; var AExpanded: Boolean); override;\r\n procedure DoIsNodeExtended(ANode: TTMSFNCTreeViewVirtualNode; var AExtended: Boolean); override;\r\n procedure DoIsNodeChecked(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AChecked: Boolean); override;\r\n procedure DoIsNodeVisible(ANode: TTMSFNCTreeViewVirtualNode; var AVisible: Boolean); override;\r\n procedure DoIsNodeEnabled(ANode: TTMSFNCTreeViewVirtualNode; var AEnabled: Boolean); override;\r\n\r\n procedure DoBeforeDrawNodeText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String); virtual;\r\n procedure DoBeforeDrawNodeTitle(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ATitle: String; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeTitle(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ATitle: String); virtual;\r\n procedure DoBeforeDrawNodeIcon(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AIcon: TTMSFNCBitmap; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeIcon(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AIcon: TTMSFNCBitmap); virtual;\r\n procedure DoBeforeDrawNodeExtra(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean); virtual;\r\n procedure DoDrawNodeExtra({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF; {%H-}AColumn: Integer; {%H-}ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoAfterDrawNodeExtra(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoBeforeDrawNodeTitleExtra(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean); virtual;\r\n procedure DoDrawNodeTitleExtra({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF; {%H-}AColumn: Integer; {%H-}ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoAfterDrawNodeTitleExtra(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoBeforeDrawNodeCheck(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeCheck(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap); virtual;\r\n procedure DoBeforeDrawNodeExpand(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AExpand: TTMSFNCBitmap; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeExpand(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AExpand: TTMSFNCBitmap); virtual;\r\n procedure DoBeforeSelectNode(ANode: TTMSFNCTreeViewVirtualNode; var ACanSelect: Boolean); virtual;\r\n procedure DoBeforeUnSelectNode(ANode: TTMSFNCTreeViewVirtualNode; var ACanUnSelect: Boolean); virtual;\r\n\r\n procedure DoBeforeSizeColumn(AColumn: Integer; AColumnSize: Double; var ANewColumnSize: Double; var AAllow: Boolean); virtual;\r\n procedure DoAfterSizeColumn(AColumn: Integer; AColumnSize: Double); virtual;\r\n procedure DoBeforeUpdateNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AText: String; var ACanUpdate: Boolean); virtual;\r\n procedure DoNodeChanged(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoAfterUpdateNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer); virtual;\r\n procedure DoUpdateNodeText({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}AText: String); virtual;\r\n procedure DoUpdateNodeTitle({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}ATitle: String); virtual;\r\n procedure DoBeforeExpandNode(ANode: TTMSFNCTreeViewVirtualNode; var ACanExpand: Boolean); virtual;\r\n procedure DoAfterExpandNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoBeforeCollapseNode(ANode: TTMSFNCTreeViewVirtualNode; var ACanCollapse: Boolean); virtual;\r\n procedure DoAfterCollapseNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoBeforeCheckNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanCheck: Boolean); virtual;\r\n procedure DoAfterCheckNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer); virtual;\r\n procedure DoBeforeUnCheckNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanUnCheck: Boolean); virtual;\r\n procedure DoAfterUnCheckNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer); virtual;\r\n procedure DoNodeAnchorClick(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AAnchor: String); virtual;\r\n procedure DoNodeTitleAnchorClick(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AAnchor: String); virtual;\r\n {$IFDEF FMXLIB}\r\n procedure ApplyInplaceEditorStyleLookup(Sender: TObject);\r\n {$ENDIF}\r\n\r\n procedure DoBeforeOpenInplaceEditor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanOpen: Boolean); virtual;\r\n procedure DoAfterOpenInplaceEditor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AInplaceEditor: TTMSFNCTreeViewInplaceEditor; AInplaceEditorRect: TRectF); virtual;\r\n procedure DoCloseInplaceEditor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AInplaceEditor: TTMSFNCTreeViewInplaceEditor; ACancelled: Boolean; var ACanClose: Boolean); virtual;\r\n procedure UpdateInplaceEditorPosition; virtual;\r\n\r\n procedure DoGetInplaceEditor(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;{$IFDEF FMXLIB} var ATransparent: Boolean;{$ENDIF} var AInplaceEditorClass: TTMSFNCTreeViewInplaceEditorClass); virtual;\r\n procedure CloseInplaceEditor(ACancel: Boolean); virtual;\r\n\r\n procedure DoAfterSelectNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoAfterUnSelectNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoHScroll(APosition: Single); virtual;\r\n procedure DoVScroll(APosition: Single); virtual;\r\n procedure ResetNodes(AUpdateAll: Boolean = True); override;\r\n procedure CreateDragBitmap; virtual;\r\n procedure DestroyDragBitmap; virtual;\r\n\r\n procedure HandleSelectNode(ANode: TTMSFNCTreeViewVirtualNode; ATriggerEvents: Boolean; AKeyBoard: Boolean; AMultiSelect: Boolean);\r\n procedure Animate(Sender: TObject);\r\n {$IFDEF FMXLIB}\r\n procedure ScrollBarChanged(Sender: TObject);\r\n procedure DoInplaceEditorTimer(Sender: TObject);\r\n {$ENDIF}\r\n procedure ColumnStrokeChanged(Sender: TObject);\r\n procedure DragTime(Sender: TObject);\r\n procedure StopAnimationTimer; override;\r\n procedure HandleNodeToggle(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure HandleNodeExtra({%H-}ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure HandleNodeTitleExtra({%H-}ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure HandleNodeToggleCheck(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer); virtual;\r\n procedure HandleNodeExpand(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure HandleNodeCollapse(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure HandleCustomKeys({%H-}AKey: Word); virtual;\r\n procedure OffsetNodeRects(ANode: TTMSFNCTreeViewVirtualNode; AX, AY: Single; var ARect: TRectF); virtual;\r\n procedure BuildDisplay(ACache: TTMSFNCTreeViewCache; ADisplay: TTMSFNCTreeViewDisplayList); virtual;\r\n procedure UpdateCalculations; override;\r\n procedure UpdateAutoSizing; override;\r\n procedure UpdateColumnRowCalculations(AUpdateTotalRowHeight: Boolean = True); override;\r\n procedure UpdateColumnsCache; override;\r\n procedure UpdateColumnCache(ACache: TTMSFNCTreeViewCache); overload; virtual;\r\n procedure UpdateGroupsCache; override;\r\n procedure UpdateGroupCache(ACache: TTMSFNCTreeViewCache); overload; virtual;\r\n procedure UpdateNodesCache(AUpdateNodes: Boolean = True; AResetNodes: Boolean = False); override;\r\n procedure UpdateNodeCache; virtual;\r\n procedure CustomizeNodeCache({%H-}AGraphics: TTMSFNCGraphics; {%H-}AStartY: Single); virtual;\r\n procedure UpdateDisplay; override;\r\n procedure UpdateTreeViewCache; override;\r\n procedure UpdateColumnsDisplay; virtual;\r\n procedure UpdateGroupsDisplay; virtual;\r\n procedure UpdateNodeDisplay; virtual;\r\n procedure VerticalScrollPositionChanged; override;\r\n procedure Scroll(AHorizontalPos, AVerticalPos: Double); override;\r\n procedure HorizontalScrollPositionChanged; override;\r\n procedure DrawNode({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF; {%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}ACaching: Boolean = False; {%H-}AOffsetX: Single = 0; {%H-}AOffsetY: Single = 0); virtual;\r\n procedure DrawGroup({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF; {%H-}AGroup: Integer; {%H-}AStartColumn, {%H-}AEndColumn: Integer; {%H-}AKind: TTMSFNCTreeViewCacheItemKind); virtual;\r\n procedure DrawColumn({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF; {%H-}AColumn: Integer; {%H-}AKind: TTMSFNCTreeViewCacheItemKind); virtual;\r\n procedure DrawNodes({%H-}AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawColumns({%H-}AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawNodeColumns({%H-}AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawGroups({%H-}AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawBorders({%H-}AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawEmptySpaces({%H-}AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawDisplay(AGraphics: TTMSFNCGraphics; ADisplay: TTMSFNCTreeViewDisplayList); virtual;\r\n procedure HandleDragStart({%H-}X, {%H-}Y: Single); virtual;\r\n procedure HandleDragOver(const Source: TObject; const Point: TPointF; var Accept: Boolean); override;\r\n procedure HandleDragDrop(const Source: TObject; const Point: TPointF); override;\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleDblClick(X, Y: Single); override;\r\n procedure DoNeedFilterDropDownData(AColumn: Integer; AValues: TStrings); virtual;\r\n procedure DoFilterSelect(AColumn: integer; var ACondition: string); virtual;\r\n procedure HandleFilter(AColumn: Integer); virtual;\r\n procedure HandleExpand({%H-}AColumn: Integer); virtual;\r\n procedure HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure StartVerticalOffsetAnimation; virtual;\r\n procedure SetVerticalOffset(AVerticalOffset: Single); virtual;\r\n procedure HandleKeyPress(var Key: Char); override;\r\n procedure HandleKeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleDialogKey(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleFilterListClick(Sender: TObject);\r\n {$IFDEF FMXLIB}\r\n procedure ApplyFilterListBoxStyleLookUp(Sender: TObject);\r\n {$ENDIF}\r\n procedure HandleKeyUp(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleMouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override;\r\n procedure HandleNodeEditing(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer); virtual;\r\n procedure CustomizeInplaceEditor(AInplaceEditor: TTMSFNCTreeViewInplaceEditor; ANode: TTMSFNCTreeViewVirtualNode; AColumn: TTMSFNCTreeViewColumn); virtual;\r\n procedure StartReload; virtual;\r\n procedure ConfigureNodeRect({%H-}AIndex: Integer; {%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}ARect: TRectF); virtual;\r\n procedure GetNodeOffset({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}ALeft, {%H-}ATop, {%H-}ARight, {%H-}ABottom: Single); virtual;\r\n procedure GetNodeMargins(var {%H-}ALeft, {%H-}ATop, {%H-}ARight, {%H-}ABottom: Single); virtual;\r\n procedure HandleAlternativeDragOver({%H-}X, {%H-}Y: Single); virtual;\r\n procedure HandleAlternativeDragDrop({%H-}X, {%H-}Y: Single); virtual;\r\n procedure InternalSelectVirtualNode({%H-}ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n function CanStartDragFromMouseDown: Boolean; virtual;\r\n function CanStartDragFromMouseMove: Boolean; virtual;\r\n function AlternativeDragDrop: Boolean; virtual;\r\n function GetNodesSpacing: Single; override;\r\n function IsAnimating: Boolean; virtual;\r\n function GetNodesRect: TRectF; virtual;\r\n function CanApplyVerticalOffset: Boolean; virtual;\r\n function GetReloadOffset: Single; virtual;\r\n function NeedsReload({%H-}AVerticalOffset: Single): Boolean; virtual;\r\n function IsVariableNodeHeight: Boolean; override;\r\n function GetDragObjectScreenShot: TTMSFNCBitmap; override;\r\n function ColumnStretchingActive: Boolean; override;\r\n function GetBufStart(ABuffer: string; var ALevel: Integer): string;\r\n function GetFirstEditableColumn: Integer; virtual;\r\n function GetLastEditableColumn: Integer; virtual;\r\n function GetPreviousEditableColumn(AColumn: Integer): Integer; virtual;\r\n function GetNextEditableColumn(AColumn: Integer): Integer; virtual;\r\n function GetInplaceEditorRect(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): TRectF;\r\n function GetNextFocusableNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetPreviousFocusableNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetVersion: string; override;\r\n function ConfigureNode(AGraphics: TTMSFNCGraphics; AIndex: Integer; ANode: TTMSFNCTreeViewVirtualNode; var AStartY: Single): Boolean; virtual;\r\n function GetDocURL: string; override;\r\n function GetRowHeight(ARow: Integer): Double; override;\r\n function GetColumnText(AColumn: Integer): String; virtual;\r\n function GetGroupText(AGroup: Integer): String;virtual;\r\n function GetColumnsTopSize: Double; virtual;\r\n function GetColumnsExtraSize: Double; virtual;\r\n function GetColumnsBottomSize: Double; virtual;\r\n function GetGroupsTopSize: Double; virtual;\r\n function GetGroupsBottomSize: Double; virtual;\r\n function GetContentClipRect: TRectF; override;\r\n function GetContentRect: TRectF; override;\r\n function GetCalculationRect: TRectF; override;\r\n function GetGroupsTopRect: TRectF; virtual;\r\n function GetGroupsBottomRect: TRectF; virtual;\r\n function GetColumnsTopRect: TRectF; virtual;\r\n function GetColumnTopLeftEmptyRect: TRectF; virtual;\r\n function GetColumnBottomLeftEmptyRect: TRectF; virtual;\r\n function GetColumnBottomRightEmptyRect: TRectF; virtual;\r\n function GetColumnTopRightEmptyRect: TRectF; virtual;\r\n function GetGroupTopLeftEmptyRect: TRectF; virtual;\r\n function GetGroupBottomLeftEmptyRect: TRectF; virtual;\r\n function GetGroupBottomRightEmptyRect: TRectF; virtual;\r\n function GetGroupTopRightEmptyRect: TRectF; virtual;\r\n function GetColumnsBottomRect: TRectF; virtual;\r\n function GetCacheWidth: Integer; virtual;\r\n function GetCacheHeight: Integer; virtual;\r\n function XYToCacheItem(X, Y: Double; OffsetX: Single = 0): TTMSFNCTreeViewCacheItem; virtual;\r\n function GetFirstVisibleCacheItem: TTMSFNCTreeViewCacheItem; virtual;\r\n function IsReorderActive: Boolean; virtual;\r\n function IsDragDropActive: Boolean; virtual;\r\n \r\n property SelectedVirtualNodeRow: Integer read GetSelectedVirtualNodeRow;\r\n\r\n property Adapter: TTMSFNCTreeViewAdapter read FAdapter write SetAdapter;\r\n property NodesAppearance: TTMSFNCTreeViewNodesAppearance read FNodesAppearance write SetNodesAppearance;\r\n property ColumnsAppearance: TTMSFNCTreeViewColumnsAppearance read FColumnsAppearance write SetColumnsAppearance;\r\n property GroupsAppearance: TTMSFNCTreeViewGroupsAppearance read FGroupsAppearance write SetGroupsAppearance;\r\n\r\n property OnBeforeCutToClipboard: TTMSFNCTreeViewBeforeCutToClipboardEvent read FOnBeforeCutToClipboard write FOnBeforeCutToClipboard;\r\n property OnBeforeCopyToClipboard: TTMSFNCTreeViewBeforeCopyToClipboardEvent read FOnBeforeCopyToClipboard write FOnBeforeCopyToClipboard;\r\n property OnBeforePasteFromClipboard: TTMSFNCTreeViewBeforePasteFromClipboardEvent read FOnBeforePasteFromClipboard write FOnBeforePasteFromClipboard;\r\n property OnAfterCutToClipboard: TTMSFNCTreeViewAfterCutToClipboardEvent read FOnAfterCutToClipboard write FOnAfterCutToClipboard;\r\n property OnAfterCopyToClipboard: TTMSFNCTreeViewAfterCopyToClipboardEvent read FOnAfterCopyToClipboard write FOnAfterCopyToClipboard;\r\n property OnAfterPasteFromClipboard: TTMSFNCTreeViewAfterPasteFromClipboardEvent read FOnAfterPasteFromClipboard write FOnAfterPasteFromClipboard;\r\n\r\n property OnBeforeReorderNode: TTMSFNCTreeViewBeforeReorderNodeEvent read FOnBeforeReorderNode write FOnBeforeReorderNode;\r\n property OnAfterReorderNode: TTMSFNCTreeViewAfterReorderNodeEvent read FOnAfterReorderNode write FOnAfterReorderNode;\r\n property OnBeforeDropNode: TTMSFNCTreeViewBeforeDropNodeEvent read FOnBeforeDropNode write FOnBeforeDropNode;\r\n property OnAfterDropNode: TTMSFNCTreeViewAfterDropNodeEvent read FOnAfterDropNode write FOnAfterDropNode;\r\n\r\n property OnBeforeOpenInplaceEditor: TTMSFNCTreeViewBeforeOpenInplaceEditorEvent read FOnBeforeOpenInplaceEditor write FOnBeforeOpenInplaceEditor;\r\n property OnCloseInplaceEditor: TTMSFNCTreeViewCloseInplaceEditorEvent read FOnCloseInplaceEditor write FOnCloseInplaceEditor;\r\n property OnAfterOpenInplaceEditor: TTMSFNCTreeViewAfterOpenInplaceEditorEvent read FOnAfterOpenInplaceEditor write FOnAfterOpenInplaceEditor;\r\n property OnGetInplaceEditor: TTMSFNCTreeViewGetInplaceEditorEvent read FOnGetInplaceEditor write FOnGetInplaceEditor;\r\n property OnCustomizeInplaceEditor: TTMSFNCTreeViewCustomizeInplaceEditorEvent read FOnCustomizeInplaceEditor write FOnCustomizeInplaceEditor;\r\n property OnGetInplaceEditorRect: TTMSFNCTreeViewGetInplaceEditorRectEvent read FOnGetInplaceEditorRect write FOnGetInplaceEditorRect;\r\n\r\n property OnNodeCompare: TTMSFNCTreeViewNodeCompareEvent read FOnNodeCompare write FOnNodeCompare;\r\n property OnBeforeSizeColumn: TTMSFNCTreeViewBeforeSizeColumnEvent read FOnBeforeSizeColumn write FOnBeforeSizeColumn;\r\n property OnAfterSizeColumn: TTMSFNCTreeViewAfterSizeColumnEvent read FOnAfterSizeColumn write FOnAfterSizeColumn;\r\n property OnBeforeDrawColumnEmptySpace: TTMSFNCTreeViewBeforeDrawColumnEmptySpaceEvent read FOnBeforeDrawColumnEmptySpace write FOnBeforeDrawColumnEmptySpace;\r\n property OnAfterDrawColumnEmptySpace: TTMSFNCTreeViewAfterDrawColumnEmptySpaceEvent read FOnAfterDrawColumnEmptySpace write FOnAfterDrawColumnEmptySpace;\r\n property OnBeforeDrawGroupEmptySpace: TTMSFNCTreeViewBeforeDrawGroupEmptySpaceEvent read FOnBeforeDrawGroupEmptySpace write FOnBeforeDrawGroupEmptySpace;\r\n property OnAfterDrawGroupEmptySpace: TTMSFNCTreeViewAfterDrawGroupEmptySpaceEvent read FOnAfterDrawGroupEmptySpace write FOnAfterDrawGroupEmptySpace;\r\n\r\n property OnNeedFilterDropDownData: TTMSFNCTreeViewNeedFilterDropDownDataEvent read FOnNeedFilterDropDownData write FOnNeedFilterDropDownData;\r\n property OnFilterSelect: TTMSFNCTreeViewFilterSelectEvent read FOnFilterSelect write FOnFilterSelect;\r\n property OnBeforeDrawColumn: TTMSFNCTreeViewBeforeDrawColumnEvent read FOnBeforeDrawColumn write FOnBeforeDrawColumn;\r\n property OnAfterDrawColumn: TTMSFNCTreeViewAfterDrawColumnEvent read FOnAfterDrawColumn write FOnAfterDrawColumn;\r\n property OnBeforeDrawNodeColumn: TTMSFNCTreeViewBeforeDrawColumnEvent read FOnBeforeDrawNodeColumn write FOnBeforeDrawNodeColumn;\r\n property OnAfterDrawNodeColumn: TTMSFNCTreeViewAfterDrawColumnEvent read FOnAfterDrawNodeColumn write FOnAfterDrawNodeColumn;\r\n property OnBeforeDrawColumnHeader: TTMSFNCTreeViewBeforeDrawColumnHeaderEvent read FOnBeforeDrawColumnHeader write FOnBeforeDrawColumnHeader;\r\n property OnAfterDrawColumnHeader: TTMSFNCTreeViewAfterDrawColumnHeaderEvent read FOnAfterDrawColumnHeader write FOnAfterDrawColumnHeader;\r\n property OnBeforeDrawGroup: TTMSFNCTreeViewBeforeDrawGroupEvent read FOnBeforeDrawGroup write FOnBeforeDrawGroup;\r\n property OnAfterDrawGroup: TTMSFNCTreeViewAfterDrawGroupEvent read FOnAfterDrawGroup write FOnAfterDrawGroup;\r\n property OnBeforeDrawNode: TTMSFNCTreeViewBeforeDrawNodeEvent read FOnBeforeDrawNode write FOnBeforeDrawNode;\r\n property OnAfterDrawNode: TTMSFNCTreeViewAfterDrawNodeEvent read FOnAfterDrawNode write FOnAfterDrawNode;\r\n property OnBeforeDrawColumnText: TTMSFNCTreeViewBeforeDrawColumnTextEvent read FOnBeforeDrawColumnText write FOnBeforeDrawColumnText;\r\n property OnGetColumnText: TTMSFNCTreeViewGetColumnTextEvent read FOnGetColumnText write FOnGetColumnText;\r\n property OnAfterDrawColumnText: TTMSFNCTreeViewAfterDrawColumnTextEvent read FOnAfterDrawColumnText write FOnAfterDrawColumnText;\r\n property OnBeforeDrawGroupText: TTMSFNCTreeViewBeforeDrawGroupTextEvent read FOnBeforeDrawGroupText write FOnBeforeDrawGroupText;\r\n property OnGetGroupText: TTMSFNCTreeViewGetGroupTextEvent read FOnGetGroupText write FOnGetGroupText;\r\n property OnAfterDrawGroupText: TTMSFNCTreeViewAfterDrawGroupTextEvent read FOnAfterDrawGroupText write FOnAfterDrawGroupText;\r\n property OnBeforeDrawNodeText: TTMSFNCTreeViewBeforeDrawNodeTextEvent read FOnBeforeDrawNodeText write FOnBeforeDrawNodeText;\r\n property OnBeforeDrawNodeTitle: TTMSFNCTreeViewBeforeDrawNodeTitleEvent read FOnBeforeDrawNodeTitle write FOnBeforeDrawNodeTitle;\r\n property OnAfterDrawSortIndicator: TTMSFNCTreeViewAfterDrawSortIndicatorEvent read FOnAfterDrawSortIndicator write FOnAfterDrawSortIndicator;\r\n property OnBeforeDrawSortIndicator: TTMSFNCTreeViewBeforeDrawSortIndicatorEvent read FOnBeforeDrawSortIndicator write FOnBeforeDrawSortIndicator;\r\n property OnGetNodeHeight: TTMSFNCTreeViewGetNodeHeightEvent read FOnGetNodeHeight write FOnGetNodeHeight;\r\n property OnGetNodeText: TTMSFNCTreeViewGetNodeTextEvent read FOnGetNodeText write FOnGetNodeText;\r\n property OnGetNodeTitle: TTMSFNCTreeViewGetNodeTitleEvent read FOnGetNodeTitle write FOnGetNodeTitle;\r\n property OnGetNodeTitleExpanded: TTMSFNCTreeViewGetNodeTitleExpandedEvent read FOnGetNodeExpanded write FOnGetNodeExpanded;\r\n property OnGetNodeSides: TTMSFNCTreeViewGetNodeSidesEvent read FOnGetNodeSides write FOnGetNodeSides;\r\n property OnGetNodeTrimming: TTMSFNCTreeViewGetNodeTrimmingEvent read FOnGetNodeTrimming write FOnGetNodeTrimming;\r\n property OnGetNodeWordWrapping: TTMSFNCTreeViewGetNodeWordWrappingEvent read FOnGetNodeWordWrapping write FOnGetNodeWordWrapping;\r\n property OnGetNodeTitleTrimming: TTMSFNCTreeViewGetNodeTrimmingEvent read FOnGetNodeTitleTrimming write FOnGetNodeTitleTrimming;\r\n property OnGetNodeTitleWordWrapping: TTMSFNCTreeViewGetNodeWordWrappingEvent read FOnGetNodeTitleWordWrapping write FOnGetNodeTitleWordWrapping;\r\n property OnGetNodeExtraSize: TTMSFNCTreeViewGetNodeExtraSizeEvent read FOnGetNodeExtraSize write FOnGetNodeExtraSize;\r\n property OnGetNodeTitleExtraSize: TTMSFNCTreeViewGetNodeTitleExtraSizeEvent read FOnGetNodeTitleExtraSize write FOnGetNodeTitleExtraSize;\r\n property OnGetNodeHorizontalTextAlign: TTMSFNCTreeViewGetNodeHorizontalTextAlignEvent read FOnGetNodeHorizontalTextAlign write FOnGetNodeHorizontalTextAlign;\r\n property OnGetNodeVerticalTextAlign: TTMSFNCTreeViewGetNodeVerticalTextAlignEvent read FOnGetNodeVerticalTextAlign write FOnGetNodeVerticalTextAlign;\r\n property OnGetNodeTitleHorizontalTextAlign: TTMSFNCTreeViewGetNodeHorizontalTextAlignEvent read FOnGetNodeTitleHorizontalTextAlign write FOnGetNodeTitleHorizontalTextAlign;\r\n property OnGetNodeTitleVerticalTextAlign: TTMSFNCTreeViewGetNodeVerticalTextAlignEvent read FOnGetNodeTitleVerticalTextAlign write FOnGetNodeTitleVerticalTextAlign;\r\n property OnGetColumnTrimming: TTMSFNCTreeViewGetColumnTrimmingEvent read FOnGetColumnTrimming write FOnGetColumnTrimming;\r\n property OnGetColumnWordWrapping: TTMSFNCTreeViewGetColumnWordWrappingEvent read FOnGetColumnWordWrapping write FOnGetColumnWordWrapping;\r\n property OnGetColumnHorizontalTextAlign: TTMSFNCTreeViewGetColumnHorizontalTextAlignEvent read FOnGetColumnHorizontalTextAlign write FOnGetColumnHorizontalTextAlign;\r\n property OnGetColumnVerticalTextAlign: TTMSFNCTreeViewGetColumnVerticalTextAlignEvent read FOnGetColumnVerticalTextAlign write FOnGetColumnVerticalTextAlign;\r\n property OnGetNodeIcon: TTMSFNCTreeViewGetNodeIconEvent read FOnGetNodeIcon write FOnGetNodeIcon;\r\n property OnGetNumberOfNodes: TTMSFNCTreeViewGetNumberOfNodesEvent read FOnGetNumberOfNodes write FOnGetNumberOfNodes;\r\n property OnAfterDrawNodeText: TTMSFNCTreeViewAfterDrawNodeTextEvent read FOnAfterDrawNodeText write FOnAfterDrawNodeText;\r\n property OnAfterDrawNodeTitle: TTMSFNCTreeViewAfterDrawNodeTitleEvent read FOnAfterDrawNodeTitle write FOnAfterDrawNodeTitle;\r\n property OnAfterDrawNodeIcon: TTMSFNCTreeViewAfterDrawNodeIconEvent read FOnAfterDrawNodeIcon write FOnAfterDrawNodeIcon;\r\n property OnBeforeDrawNodeIcon: TTMSFNCTreeViewBeforeDrawNodeIconEvent read FOnBeforeDrawNodeIcon write FOnBeforeDrawNodeIcon;\r\n property OnAfterDrawNodeExtra: TTMSFNCTreeViewAfterDrawNodeExtraEvent read FOnAfterDrawNodeExtra write FOnAfterDrawNodeExtra;\r\n property OnDrawNodeExtra: TTMSFNCTreeViewDrawNodeExtraEvent read FOnDrawNodeExtra write FOnDrawNodeExtra;\r\n property OnBeforeDrawNodeExtra: TTMSFNCTreeViewBeforeDrawNodeExtraEvent read FOnBeforeDrawNodeExtra write FOnBeforeDrawNodeExtra;\r\n property OnAfterDrawNodeTitleExtra: TTMSFNCTreeViewAfterDrawNodeTitleExtraEvent read FOnAfterDrawNodeTitleExtra write FOnAfterDrawNodeTitleExtra;\r\n property OnDrawNodeTitleExtra: TTMSFNCTreeViewDrawNodeTitleExtraEvent read FOnDrawNodeTitleExtra write FOnDrawNodeTitleExtra;\r\n property OnBeforeDrawNodeTitleExtra: TTMSFNCTreeViewBeforeDrawNodeTitleExtraEvent read FOnBeforeDrawNodeTitleExtra write FOnBeforeDrawNodeTitleExtra;\r\n property OnAfterDrawNodeExpand: TTMSFNCTreeViewAfterDrawNodeExpandEvent read FOnAfterDrawNodeExpand write FOnAfterDrawNodeExpand;\r\n property OnBeforeDrawNodeExpand: TTMSFNCTreeViewBeforeDrawNodeExpandEvent read FOnBeforeDrawNodeExpand write FOnBeforeDrawNodeExpand;\r\n property OnAfterDrawNodeCheck: TTMSFNCTreeViewAfterDrawNodeCheckEvent read FOnAfterDrawNodeCheck write FOnAfterDrawNodeCheck;\r\n property OnBeforeDrawNodeCheck: TTMSFNCTreeViewBeforeDrawNodeCheckEvent read FOnBeforeDrawNodeCheck write FOnBeforeDrawNodeCheck;\r\n property OnBeforeUpdateNode: TTMSFNCTreeViewBeforeUpdateNodeEvent read FOnBeforeUpdateNode write FOnBeforeUpdateNode;\r\n property OnAfterUpdateNode: TTMSFNCTreeViewAfterUpdateNodeEvent read FOnAfterUpdateNode write FOnAfterUpdateNode;\r\n property OnBeforeUnCheckNode: TTMSFNCTreeViewBeforeUnCheckNodeEvent read FOnBeforeUnCheckNode write FOnBeforeUnCheckNode;\r\n property OnAfterUnCheckNode: TTMSFNCTreeViewAfterUnCheckNodeEvent read FOnAfterUnCheckNode write FOnAfterUnCheckNode;\r\n property OnBeforeCheckNode: TTMSFNCTreeViewBeforeCheckNodeEvent read FOnBeforeCheckNode write FOnBeforeCheckNode;\r\n property OnAfterCheckNode: TTMSFNCTreeViewAfterCheckNodeEvent read FOnAfterCheckNode write FOnAfterCheckNode;\r\n property OnBeforeCollapseNode: TTMSFNCTreeViewBeforeCollapseNodeEvent read FOnBeforeCollapseNode write FOnBeforeCollapseNode;\r\n property OnAfterCollapseNode: TTMSFNCTreeViewAfterCollapseNodeEvent read FOnAfterCollapseNode write FOnAfterCollapseNode;\r\n property OnBeforeExpandNode: TTMSFNCTreeViewBeforeExpandNodeEvent read FOnBeforeExpandNode write FOnBeforeExpandNode;\r\n property OnAfterExpandNode: TTMSFNCTreeViewAfterExpandNodeEvent read FOnAfterExpandNode write FOnAfterExpandNode;\r\n property OnBeforeSelectNode: TTMSFNCTreeViewBeforeSelectNodeEvent read FOnBeforeSelectNode write FOnBeforeSelectNode;\r\n property OnAfterSelectNode: TTMSFNCTreeViewAfterSelectNodeEvent read FOnAfterSelectNode write FOnAfterSelectNode;\r\n property OnNodeClick: TTMSFNCTreeViewNodeClickEvent read FOnNodeClick write FOnNodeClick;\r\n property OnNodeDblClick: TTMSFNCTreeViewNodeClickEvent read FOnNodeDblClick write FOnNodeDblClick;\r\n property OnBeforeUnSelectNode: TTMSFNCTreeViewBeforeUnSelectNodeEvent read FOnBeforeUnSelectNode write FOnBeforeUnSelectNode;\r\n property OnAfterUnSelectNode: TTMSFNCTreeViewAfterUnSelectNodeEvent read FOnAfterUnSelectNode write FOnAfterUnSelectNode;\r\n property OnIsNodeChecked: TTMSFNCTreeViewIsNodeCheckedEvent read FOnIsNodeChecked write FOnIsNodeChecked;\r\n property OnIsNodeExpanded: TTMSFNCTreeViewIsNodeExpandedEvent read FOnIsNodeExpanded write FOnIsNodeExpanded;\r\n property OnIsNodeVisible: TTMSFNCTreeViewIsNodeVisibleEvent read FOnIsNodeVisible write FOnIsNodeVisible;\r\n property OnIsNodeEnabled: TTMSFNCTreeViewIsNodeEnabledEvent read FOnIsNodeEnabled write FOnIsNodeEnabled;\r\n property OnGetNodeColor: TTMSFNCTreeViewGetNodeColorEvent read FOnGetNodeColor write FOnGetNodeColor;\r\n property OnGetNodeCheckType: TTMSFNCTreeViewGetNodeCheckTypeEvent read FOnGetNodeCheckType write FOnGetNodeCheckType;\r\n property OnGetNodeSelectedColor: TTMSFNCTreeViewGetNodeColorEvent read FOnGetNodeSelectedColor write FOnGetNodeSelectedColor;\r\n property OnGetNodeDisabledColor: TTMSFNCTreeViewGetNodeColorEvent read FOnGetNodeDisabledColor write FOnGetNodeDisabledColor;\r\n property OnGetNodeTextColor: TTMSFNCTreeViewGetNodeTextColorEvent read FOnGetNodeTextColor write FOnGetNodeTextColor;\r\n property OnGetNodeSelectedTextColor: TTMSFNCTreeViewGetNodeTextColorEvent read FOnGetNodeSelectedTextColor write FOnGetNodeSelectedTextColor;\r\n property OnGetNodeDisabledTextColor: TTMSFNCTreeViewGetNodeTextColorEvent read FOnGetNodeDisabledTextColor write FOnGetNodeDisabledTextColor;\r\n property OnGetNodeTitleColor: TTMSFNCTreeViewGetNodeTitleColorEvent read FOnGetNodeTitleColor write FOnGetNodeTitleColor;\r\n property OnGetNodeSelectedTitleColor: TTMSFNCTreeViewGetNodeTitleColorEvent read FOnGetNodeSelectedTitleColor write FOnGetNodeSelectedTitleColor;\r\n property OnGetNodeDisabledTitleColor: TTMSFNCTreeViewGetNodeTitleColorEvent read FOnGetNodeDisabledTitleColor write FOnGetNodeDisabledTitleColor;\r\n property OnIsNodeExtended: TTMSFNCTreeViewIsNodeExtendedEvent read FOnIsNodeExtended write FOnIsNodeExtended;\r\n property OnNodeAnchorClick: TTMSFNCTreeViewNodeAnchorClickEvent read FOnNodeAnchorClick write FOnNodeAnchorClick;\r\n property OnNodeTitleAnchorClick: TTMSFNCTreeViewNodeTitleAnchorClickEvent read FOnNodeTitleAnchorClick write FOnNodeTitleAnchorClick;\r\n property OnNodeChanged: TTMSFNCTreeViewNodeChangedEvent read FOnNodeChanged write FOnNodeChanged;\r\n property Interaction: TTMSFNCTreeViewInteraction read FInteraction write SetInteraction;\r\n property OnVScroll: TTMSFNCTreeViewScrollEvent read FOnVScroll write FOnVScroll;\r\n property OnHScroll: TTMSFNCTreeViewScrollEvent read FOnHScroll write FOnHScroll;\r\n property Version: string read GetVersion;\r\n property ColumnStroke: TTMSFNCGraphicsStroke read FColumnStroke write SetColumnStroke;\r\n property InplaceEditorActive: Boolean read FInplaceEditorActive write FInplaceEditorActive;\r\n property UpdateNodeColumn: Integer read FUpdateNodeColumn write FUpdateNodeColumn;\r\n\r\n property OnCustomReorder: TTMSFNCTreeViewReorderEvent read FOnCustomReorder write FOnCustomReorder;\r\n property OnCustomDragOver: TTMSFNCTreeViewDragOverEvent read FOnCustomDragOver write FOnCustomDragOver;\r\n property OnCustomDragDrop: TTMSFNCTreeViewDragDropEvent read FOnCustomDragDrop write FOnCustomDragDrop;\r\n property OnCustomCopyToClipboard: TNotifyEvent read FOnCustomCopyToClipboard write FOnCustomCopyToClipboard;\r\n property OnCustomCutToClipboard: TNotifyEvent read FOnCustomCutToClipboard write FOnCustomCutToClipboard;\r\n property OnCustomPasteFromClipboard: TNotifyEvent read FOnCustomPasteFromClipboard write FOnCustomPasteFromClipboard;\r\n property OnCustomColumnSort: TTMSFNCTreeViewColumnSortEvent read FOnCustomColumnSort write FOnCustomColumnSort;\r\n property OnCustomLookup: TTMSFNCTreeViewLookupEvent read FOnCustomLookup write FOnCustomLookup;\r\n\r\n property DragBitmap: TTMSFNCImage read FDragBitmap;\r\n\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n procedure InitSample; virtual;\r\n procedure CutToClipboard(ATextOnly: Boolean = False); virtual;\r\n procedure CopyToClipboard(ATextOnly: Boolean = False); virtual;\r\n procedure PasteFromClipboard; virtual;\r\n procedure Sort(AColumn: Integer = 0; ARecurse: Boolean = False; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending; AClearNodeList: Boolean = True); {$IFDEF FMXLIB}reintroduce;{$ENDIF} virtual;\r\n procedure ClearSorting;\r\n\r\n {$IFNDEF WEBLIB}\r\n procedure LoadFromFile(const AFileName: string); overload;\r\n procedure LoadFromStream(const AStream: TStream); overload;\r\n procedure SaveToFile(const AFileName: string; const ATextOnly: Boolean = True); overload;\r\n procedure SaveToStream(const AStream: TStream; const ATextOnly: Boolean = True); overload;\r\n {$ENDIF}\r\n\r\n procedure RemoveSelectedVirtualNodes; virtual;\r\n procedure RemoveSelectedNodes; virtual;\r\n procedure UnSelectAllNodes; virtual;\r\n procedure SelectAllNodes; virtual;\r\n procedure UnSelectAllVirtualNodes; virtual;\r\n procedure SelectAllVirtualNodes; virtual;\r\n procedure SelectNode(ANode: TTMSFNCTreeViewNode); virtual;\r\n procedure SelectVirtualNodeByRow(ARow: Integer); virtual;\r\n procedure SelectVirtualNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure SelectNodes(ANodes: TTMSFNCTreeViewNodeArray); virtual;\r\n procedure SelectVirtualNodes(ANodes: TTMSFNCTreeViewVirtualNodeArray); virtual;\r\n procedure UnSelectNode(ANode: TTMSFNCTreeViewNode); virtual;\r\n procedure UnSelectVirtualNode(ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure UnSelectNodes(ANodes: TTMSFNCTreeViewNodeArray); virtual;\r\n procedure UnSelectVirtualNodes(ANodes: TTMSFNCTreeViewVirtualNodeArray); virtual;\r\n procedure RemoveNodeFromSelection(ANode: TTMSFNCTreeViewVirtualNode); override;\r\n procedure EditNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer); virtual;\r\n procedure EditVirtualNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer); virtual;\r\n procedure StopEditing; virtual;\r\n procedure CancelEditing; virtual;\r\n procedure Clear; virtual;\r\n function GetVisibleNodeCount: Integer; virtual;\r\n function GetFirstVisibleVirtualNode: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetLastVisibleVirtualNode: TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetFirstVisibleVirtualNodeRow: Integer; virtual;\r\n function GetLastVisibleVirtualNodeRow: Integer; virtual;\r\n function GetNodesFromClipboard: TTMSFNCTreeViewCopyNodes; virtual;\r\n function IsEditing: Boolean; virtual;\r\n function LookupNode(ALookupString: String; ARootNodesOnly: Boolean = False; AColumn: Integer = -1; ACaseSensitive: Boolean = False; AAutoSelect: Boolean = False; AAutoExpand: Boolean = False): TTMSFNCTreeViewVirtualNode; virtual;\r\n function GetInplaceEditor: TTMSFNCTreeViewInplaceEditor; virtual;\r\n function IsNodeSelectable(ANode: TTMSFNCTreeViewNode): Boolean; virtual;\r\n function IsVirtualNodeSelectable(ANode: TTMSFNCTreeViewVirtualNode): Boolean; virtual;\r\n function XYToNode(X, Y: Double; OffsetX: Single = 0): TTMSFNCTreeViewVirtualNode; virtual;\r\n function XYToNodeAnchor(ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): TTMSFNCTreeViewNodeAnchor; virtual;\r\n function XYToNodeTitleAnchor(ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): TTMSFNCTreeViewNodeAnchor; virtual;\r\n function XYToNodeExpand(ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): Boolean; virtual;\r\n function XYToNodeExtra(ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): Boolean; virtual;\r\n function XYToNodeTitleExtra(ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): Boolean; virtual;\r\n function XYToNodeCheck(ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): TTMSFNCTreeViewNodeCheck; virtual;\r\n function XYToNodeTextColumn(ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): Integer; virtual;\r\n function XYToColumnSize(X, Y: Single): Integer; virtual;\r\n function XYToColumn(X, Y: Single): Integer; virtual;\r\n function XYToColumnFilter(X, Y: Single): Integer; virtual;\r\n function XYToColumnExpand(X, Y: Single): Integer; virtual;\r\n function SelectedNodeCount: Integer; virtual;\r\n function SelectedVirtualNodeCount: Integer; virtual;\r\n function IsNodeSelected(ANode: TTMSFNCTreeViewNode): Boolean; virtual;\r\n function IsVirtualNodeSelected(ANode: TTMSFNCTreeViewVirtualNode): Boolean; virtual;\r\n property FocusedVirtualNode: TTMSFNCTreeViewVirtualNode read GetFocusedVirtualNode write SetFocusedVirtualNode;\r\n property FocusedNode: TTMSFNCTreeViewNode read GetFocusedNode write SetFocusedNode;\r\n property SelectedNodes[AIndex: Integer]: TTMSFNCTreeViewNode read GetSelNode;\r\n property SelectedVirtualNode: TTMSFNCTreeViewVirtualNode read GetFocusedVirtualNode write SetSelectedVirtualNode;\r\n property SelectedNode: TTMSFNCTreeViewNode read GetFocusedNode write SetSelectedNode;\r\n property SelectedVirtualNodes[AIndex: Integer]: TTMSFNCTreeViewVirtualNode read GetSelVirtualNode;\r\n property SortColumn: Integer read FSortColumn write SetSortColumn default -1;\r\n property DragNode: TTMSFNCTreeViewVirtualNode read FDragNode write FDragNode;\r\n property DragModeStarted: Boolean read FDragModeStarted;\r\n property CompactMode: Boolean read FCompactMode write SetCompactMode;\r\n property TopRow: Integer read GetTopRow write SetTopRow;\r\n property BottomRow: Integer read GetBottomRow;\r\n end;\r\n\r\n TTMSFNCTreeViewPublished = class(TTMSFNCCustomTreeView)\r\n published\r\n property BitmapContainer;\r\n property HorizontalScrollBarVisible;\r\n property VerticalScrollBarVisible;\r\n property Groups;\r\n property GroupsAppearance;\r\n property ColumnStroke;\r\n property Columns;\r\n property Nodes;\r\n property ColumnsAppearance;\r\n property NodesAppearance;\r\n property Interaction;\r\n property StretchScrollBars;\r\n property Version;\r\n property PopupMenu;\r\n property OnNeedFilterDropDownData;\r\n property OnFilterSelect;\r\n property OnBeforeDrawColumn;\r\n property OnAfterDrawColumn;\r\n property OnBeforeDrawColumnHeader;\r\n property OnAfterDrawColumnHeader;\r\n property OnBeforeDrawNodeColumn;\r\n property OnAfterDrawNodeColumn;\r\n property OnBeforeDrawGroup;\r\n property OnAfterDrawGroup;\r\n property OnBeforeDrawNode;\r\n property OnAfterDrawNode;\r\n property OnBeforeDrawColumnText;\r\n property OnGetColumnText;\r\n property OnNodeCompare;\r\n property OnAfterDrawColumnText;\r\n property OnBeforeDrawGroupText;\r\n property OnGetGroupText;\r\n property OnAfterDrawGroupText;\r\n property OnBeforeDrawNodeText;\r\n property OnAfterDrawNodeIcon;\r\n property OnAfterDrawNodeExpand;\r\n property OnBeforeDrawNodeIcon;\r\n property OnBeforeDrawNodeExpand;\r\n property OnAfterDrawNodeCheck;\r\n property OnBeforeDrawNodeCheck;\r\n property OnGetNodeCheckType;\r\n property OnGetNodeText;\r\n property OnBeforeSizeColumn;\r\n property OnAfterSizeColumn;\r\n property OnGetNodeTrimming;\r\n property OnGetNodeWordWrapping;\r\n property OnGetNodeHorizontalTextAlign;\r\n property OnGetNodeVerticalTextAlign;\r\n property OnGetColumnTrimming;\r\n property OnGetColumnWordWrapping;\r\n property OnGetColumnHorizontalTextAlign;\r\n property OnGetColumnVerticalTextAlign;\r\n property OnBeforeUnCheckNode;\r\n property OnAfterUnCheckNode;\r\n property OnBeforeCheckNode;\r\n property OnAfterCheckNode;\r\n property OnBeforeCollapseNode;\r\n property OnAfterCollapseNode;\r\n property OnBeforeExpandNode;\r\n property OnAfterExpandNode;\r\n property OnGetNodeIcon;\r\n property OnGetNumberOfNodes;\r\n property OnIsNodeExtended;\r\n property OnIsNodeExpanded;\r\n property OnAfterDrawNodeText;\r\n property OnIsNodeChecked;\r\n property OnNodeAnchorClick;\r\n property OnBeforeUpdateNode;\r\n property OnAfterUpdateNode;\r\n property OnBeforeSelectNode;\r\n property OnAfterSelectNode;\r\n property OnNodeClick;\r\n property OnNodeDblClick;\r\n property OnBeforeUnSelectNode;\r\n property OnAfterUnSelectNode;\r\n property OnGetNodeSides;\r\n property OnBeforeOpenInplaceEditor;\r\n property OnCloseInplaceEditor;\r\n property OnAfterOpenInplaceEditor;\r\n property OnGetInplaceEditor;\r\n property OnCustomizeInplaceEditor;\r\n property OnGetInplaceEditorRect;\r\n property OnNodeChanged;\r\n property OnHScroll;\r\n property OnVScroll;\r\n property OnBeforeDrawColumnEmptySpace;\r\n property OnAfterDrawColumnEmptySpace;\r\n property OnBeforeDrawGroupEmptySpace;\r\n property OnAfterDrawGroupEmptySpace;\r\n// property OnIsNodeVisible;\r\n property OnIsNodeEnabled;\r\n property OnGetNodeColor;\r\n property OnGetNodeSelectedColor;\r\n property OnGetNodeDisabledColor;\r\n property OnGetNodeTextColor;\r\n property OnGetNodeSelectedTextColor;\r\n property OnGetNodeDisabledTextColor;\r\n property OnGetNodeHeight;\r\n property OnBeforeReorderNode;\r\n property OnAfterReorderNode;\r\n property OnBeforeDropNode;\r\n property OnAfterDropNode;\r\n property OnBeforeCutToClipboard;\r\n property OnBeforeCopyToClipboard;\r\n property OnBeforePasteFromClipboard;\r\n property OnAfterCutToClipboard;\r\n property OnAfterCopyToClipboard;\r\n property OnAfterPasteFromClipboard;\r\n property OnBeforeDrawSortIndicator;\r\n property OnAfterDrawSortIndicator;\r\n end;\r\n\r\n\r\n{$IFDEF WEBLIB}\r\nconst\r\n TTMSFNCTREEVIEWEXPAND = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAIAAAAmzuBxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAA'+\r\n 'AJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNvyMY98AAAAySURBVChT'+\r\n 'Y6iurcaPQCr+4wZYVHj5ekFZYEBdFUAJTISiAg4gEnBAIxVoAKoCH6qtBgAs4hCpNRg4EQAAAABJRU5ErkJggg'+\r\n '==';\r\n TTMSFNCTREEVIEWCOLLAPSE = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAIAAAAmzuBxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA'+\r\n 'AAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNvyMY98AAAAmSURB'+\r\n 'VChTY6iurcaPQCr+4wYDoMLL1wsZQQRJNAMroKIKfKi2GgCBNiGJV4wrvQAAAABJRU5ErkJggg==';\r\n TTMSFNCTREEVIEWEXPANDLARGE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAAAXNSR0IArs4'+\r\n 'c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50'+\r\n 'Lm5ldCA0LjAuNvyMY98AAABDSURBVDhPY6iuraYQUc+I/2QBehnh5esFRFAOBhg1AgFoYwREAzEIop42R'+\r\n 'mACZA2YYNQIBKCXEfgBtY2gBFFsRG01AN+TQqHfgmnlAAAAAElFTkSuQmCC';\r\n TTMSFNCTREEVIEWCOLLAPSELARGE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAIAAABL1vtsAAAABGdBTUEAALGP'+\r\n 'C/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC42/Ixj3w'+\r\n 'AAADRJREFUOE9jqK6tphBRz4j/ZIFRIxBg+Bvh5euFB0EVgQEtjSAejBqBAMPTCEoQxUbUVgMAPoCGIXvOpikAAAAASUVORK5CYII=';\r\n{$ENDIF}\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, Math, WEBLib.TMSFNCTreeViewBase, WEBLib.TMSFNCUtils,\r\n WEBLib.TMSFNCStyles, WEBLib.Forms, WEBLib.Graphics\r\n {$IFDEF FMXLIB}\r\n ,FMX.Styles.Objects\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n ,Rtti\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\n{$R TMSFNCTreeView.res}\r\n\r\ntype\r\n TTMSFNCTreeViewGroupOpen = class(TTMSFNCTreeViewGroup);\r\n TTMSFNCTreeViewNodeOpen = class(TTMSFNCTreeViewNode);\r\n TTMSFNCTreeViewColumnOpen = class(TTMSFNCTreeViewColumn);\r\n TTMSFNCTreeViewVirtualNodeOpen = class(TTMSFNCTreeViewVirtualNode);\r\n\r\nfunction GetTickCountX: DWORD;\r\nvar\r\n h, m, s, ms: Word;\r\nbegin\r\n DecodeTime(Now, h, m, s, ms);\r\n Result := ms + s * 1000 + m * 60 * 1000 + h * 60 * 60 * 1000;\r\nend;\r\n\r\nfunction AnimateDouble(var Start, Stop: Double; Delta, Margin: Double): Boolean;\r\nbegin\r\n Result := true;\r\n if (Start > Stop - Margin) and (Start < Stop + Margin) then\r\n begin\r\n Start := Stop;\r\n Result := false;\r\n end\r\n else\r\n begin\r\n Delta := Max(Margin, Delta);\r\n if Start < Stop then\r\n Start := Start + Delta\r\n else\r\n Start := Start - Delta;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCCustomTreeView }\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomTreeView.LoadFromFile(const AFileName: string);\r\nvar\r\n Stream: TStream;\r\nbegin\r\n Stream := TFileStream.Create(AFileName, fmOpenRead);\r\n try\r\n LoadFromStream(Stream);\r\n finally\r\n Stream.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.LoadFromStream(const AStream: TStream);\r\nvar\r\n List: TStringList;\r\n ANode, NextNode: TTMSFNCTreeViewNode;\r\n ALevel, i: Integer;\r\n CurrStr: string;\r\nbegin\r\n List := TStringList.Create;\r\n BeginUpdate;\r\n ClearNodeList;\r\n try\r\n try\r\n ClearNodes;\r\n List.LoadFromStream(AStream);\r\n ANode := nil;\r\n for i := 0 to List.Count - 1 do\r\n begin\r\n ALevel := -1;\r\n CurrStr := GetBufStart(List[i], ALevel);\r\n\r\n if ANode = nil then\r\n ANode := AddNode\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level = ALevel) then\r\n ANode := AddNode(ANode.GetParent)\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level = ALevel - 1) then\r\n ANode := AddNode(ANode)\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level > ALevel) then\r\n begin\r\n NextNode := ANode.GetParent;\r\n while Assigned(NextNode) and Assigned(NextNode.VirtualNode) and (NextNode.VirtualNode.Level > ALevel) do\r\n NextNode := NextNode.GetParent;\r\n ANode := AddNode(NextNode.GetParent);\r\n end;\r\n\r\n if Assigned(ANode) then\r\n ANode.LoadFromString(CurrStr);\r\n\r\n BuildNodeList;\r\n end;\r\n finally\r\n EndUpdate;\r\n List.Free;\r\n end;\r\n except\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomTreeView.LookupNode(ALookupString: String; ARootNodesOnly: Boolean = False; AColumn: Integer = -1; ACaseSensitive: Boolean = False; AAutoSelect: Boolean = False; AAutoExpand: Boolean = False): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n v: String;\r\n n: TTMSFNCTreeViewVirtualNode;\r\n s: String;\r\n sr, er, m: Integer;\r\n C: Integer;\r\n fnd: Boolean;\r\nbegin\r\n Result := nil;\r\n v := ALookupString;\r\n if not ACaseSensitive then\r\n v := Uppercase(v);\r\n\r\n if ARootNodesOnly then\r\n begin\r\n n := GetFirstRootVirtualNode;\r\n while Assigned(n) do\r\n begin\r\n if (AColumn >= 0) and (AColumn <= Columns.Count - 1) then\r\n begin\r\n s := '';\r\n DoGetNodeText(n, AColumn, tntmDrawing, s);\r\n\r\n s := TTMSFNCUtils.HTMLStrip(s);\r\n\r\n if not ACaseSensitive then\r\n s := UpperCase(s);\r\n\r\n if Pos(v, s) = 1 then\r\n begin\r\n Result := n;\r\n Break;\r\n end;\r\n end\r\n else\r\n begin\r\n fnd := False;\r\n for C := 0 to Columns.Count - 1 do\r\n begin\r\n s := '';\r\n DoGetNodeText(n, C, tntmDrawing, s);\r\n\r\n s := TTMSFNCUtils.HTMLStrip(s);\r\n\r\n if not ACaseSensitive then\r\n s := UpperCase(s);\r\n\r\n if Pos(v, s) = 1 then\r\n begin\r\n Result := n;\r\n fnd := True;\r\n Break;\r\n end;\r\n end;\r\n if fnd then\r\n Break;\r\n end;\r\n n := n.GetNextSibling;\r\n end;\r\n end\r\n else\r\n begin\r\n sr := 0;\r\n er := NodeStructure.Count - 1;\r\n\r\n for m := sr to er do\r\n begin\r\n n := GetNodeFromNodeStructure(m);\r\n if Assigned(n) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= Columns.Count - 1) then\r\n begin\r\n s := '';\r\n DoGetNodeText(n, AColumn, tntmDrawing, s);\r\n\r\n s := TTMSFNCUtils.HTMLStrip(s);\r\n\r\n if not ACaseSensitive then\r\n s := UpperCase(s);\r\n\r\n if Pos(v, s) = 1 then\r\n begin\r\n Result := n;\r\n Break;\r\n end;\r\n end\r\n else\r\n begin\r\n fnd := False;\r\n for C := 0 to Columns.Count - 1 do\r\n begin\r\n s := '';\r\n DoGetNodeText(n, C, tntmDrawing, s);\r\n\r\n s := TTMSFNCUtils.HTMLStrip(s);\r\n\r\n if not ACaseSensitive then\r\n s := UpperCase(s);\r\n\r\n if Pos(v, s) = 1 then\r\n begin\r\n Result := n;\r\n fnd := True;\r\n Break;\r\n end;\r\n end;\r\n if fnd then\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n if Assigned(Result) and IsVirtualNodeSelectable(Result) and AAutoSelect then\r\n begin\r\n if AAutoExpand then\r\n begin\r\n n := Result.GetParent;\r\n while Assigned(n) and (n.Level > 0) do\r\n n := n.GetParent;\r\n\r\n if Assigned(n) then\r\n n.Expand(True);\r\n end;\r\n\r\n SelectVirtualNode(Result);\r\n ScrollToVirtualNode(Result, True);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.NeedsReload(AVerticalOffset: Single): Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (AComponent = FAdapter) and (Operation = opRemove) then\r\n FAdapter := nil;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.OffsetNodeRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; AX, AY: Single; var ARect: TRectF);\r\nvar\r\n C: Integer;\r\n nr: TRectF;\r\n r: TRectF;\r\nbegin\r\n r := GetNodesRect;\r\n OffsetRectEx(ARect, AX + r.Left, AY + r.Top);\r\n for C := 0 to ColumnCount - 1 do\r\n begin\r\n if (C >= 0) and (C <= Length(ANode.TitleRects) - 1) then\r\n begin\r\n nr := ANode.TitleRects[C];\r\n OffsetRectEx(nr, AX + r.Left, AY + r.Top);\r\n ANode.TitleRects[C] := nr;\r\n end;\r\n if (C >= 0) and (C <= Length(ANode.TextRects) - 1) then\r\n begin\r\n nr := ANode.TextRects[C];\r\n OffsetRectEx(nr, AX + r.Left, AY + r.Top);\r\n ANode.TextRects[C] := nr;\r\n end;\r\n if (C >= 0) and (C <= Length(ANode.ExtraRects) - 1) then\r\n begin\r\n nr := ANode.ExtraRects[C];\r\n OffsetRectEx(nr, AX + r.Left, AY + r.Top);\r\n ANode.ExtraRects[C] := nr;\r\n end;\r\n if (C >= 0) and (C <= Length(ANode.TitleExtraRects) - 1) then\r\n begin\r\n nr := ANode.TitleExtraRects[C];\r\n OffsetRectEx(nr, AX + r.Left, AY + r.Top);\r\n ANode.TitleExtraRects[C] := nr;\r\n end;\r\n if (C >= 0) and (C <= Length(ANode.BitmapRects) - 1) then\r\n begin\r\n nr := ANode.BitmapRects[C];\r\n OffsetRectEx(nr, AX + r.Left, AY + r.Top);\r\n ANode.BitmapRects[C] := nr;\r\n end;\r\n if (C >= 0) and (C <= Length(ANode.ExpandRects) - 1) then\r\n begin\r\n nr := ANode.ExpandRects[C];\r\n OffsetRectEx(nr, AX + r.Left, AY + r.Top);\r\n ANode.ExpandRects[C] := nr;\r\n end;\r\n if (C >= 0) and (C <= Length(ANode.CheckRects) - 1) then\r\n begin\r\n nr := ANode.CheckRects[C];\r\n OffsetRectEx(nr, AX + r.Left, AY + r.Top);\r\n ANode.CheckRects[C] := nr;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.PasteFromClipboard;\r\nvar\r\n s: String;\r\n a: TStringList;\r\n ANode, ANextNode: TTMSFNCTreeViewNode;\r\n ALevel: Integer;\r\n I, off: Integer;\r\n CurrStr: String;\r\nbegin\r\n if Assigned(OnCustomPasteFromClipboard) then\r\n OnCustomPasteFromClipboard(Self)\r\n else\r\n begin\r\n if TTMSFNCClipBoard.HasFormat(TTMSFNCClipBoardFormat.cfText) then\r\n begin\r\n s := TTMSFNCClipBoard.GetText;\r\n if (Pos(CLP_FMT, s) > 0) then\r\n begin\r\n a := TStringList.Create;\r\n try\r\n s := StringReplace(s, CLP_FMT, '', [rfReplaceAll]);\r\n a.Text := s;\r\n try\r\n ANode := nil;\r\n off := 0;\r\n for I := 0 to a.Count - 1 do\r\n begin\r\n ALevel := -1;\r\n CurrStr := GetBufStart(a[i], ALevel);\r\n\r\n if ANode = nil then\r\n begin\r\n ANode := AddNode(FocusedNode);\r\n off := ALevel;\r\n if Assigned(FocusedNode) then\r\n off := off - FocusedNode.VirtualNode.Level;\r\n end\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level = ALevel - off) then\r\n ANode := AddNode(ANode.GetParent)\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level = ALevel - 1 - off) then\r\n ANode := AddNode(ANode)\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level > ALevel - off) then\r\n begin\r\n ANextNode := ANode.GetParent;\r\n while Assigned(ANextNode) and Assigned(ANextNode.VirtualNode) and (ANextNode.VirtualNode.Level > ALevel - off) do\r\n ANextNode := ANextNode.GetParent;\r\n ANode := AddNode(ANextNode.GetParent);\r\n end;\r\n\r\n if Assigned(ANode) then\r\n ANode.LoadFromString(CurrStr);\r\n end;\r\n finally\r\n end;\r\n finally\r\n a.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomTreeView.SaveToFile(const AFileName: string; const ATextOnly: Boolean = True);\r\nvar\r\n Stream: TStream;\r\nbegin\r\n Stream := TFileStream.Create(AFileName, fmCreate);\r\n try\r\n SaveToStream(Stream, ATextOnly);\r\n finally\r\n Stream.Free;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomTreeView.ColumnStretchingActive: Boolean;\r\nbegin\r\n Result := ColumnsAppearance.Stretch and ColumnsAppearance.StretchAll;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ColumnStrokeChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.ConfigureNode(AGraphics: TTMSFNCGraphics; AIndex: Integer; ANode: TTMSFNCTreeViewVirtualNode; var AStartY: Single): Boolean;\r\nvar\r\n rt: TRectF;\r\n bw, bh: Double;\r\n x, y: Double;\r\n rc: TRectF;\r\n cache: TTMSFNCTreeViewCacheItem;\r\n C: Integer;\r\n cr, urc: TRectF;\r\n vs: Double;\r\n v: TTMSFNCTreeViewVirtualNode;\r\n lvlw: Double;\r\n rcalc, rcalctw, rcalct: TRectF;\r\n strc, strt: String;\r\n texp: Boolean;\r\n cx, cw: Double;\r\n maxh: Double;\r\n st, stp: Integer;\r\n bmpn: TTMSFNCBitmap;\r\n bmpw, bmph, expw, exph: Double;\r\n ww, wwt: Boolean;\r\n colw: Double;\r\n chk: TTMSFNCTreeViewNodeCheckType;\r\n ext: Boolean;\r\n chksz: Double;\r\n cl: TTMSFNCTreeViewColumn;\r\n expr, bmpr, txtr, titr, chkr, extr, textr: TTMSFNCArrayTRectF;\r\n vl: Double;\r\n r: TRectF;\r\n sz, szt, th: Single;\r\n loff, toff, roff, boff: Single;\r\n lm, tm, rm, bm: Single;\r\nbegin\r\n loff := 0;\r\n toff := 0;\r\n roff := 0;\r\n boff := 0;\r\n GetNodeOffset(ANode, loff, toff, roff, boff);\r\n\r\n lm := 0;\r\n tm := 0;\r\n rm := 0;\r\n bm := 0;\r\n GetNodeMargins(lm, tm, rm, bm);\r\n\r\n vs := GetVerticalScrollPosition;\r\n cr := GetNodesRect;\r\n v := ANode;\r\n bw := GetTotalColumnNodeWidth - rm - lm;\r\n lvlw := NodesAppearance.LevelIndent * v.Level;\r\n\r\n if NodesAppearance.ExpandColumn = 0 then\r\n begin\r\n x := lvlw;\r\n bw := bw - lvlw;\r\n end\r\n else\r\n x := 0;\r\n\r\n maxh := 0;\r\n y := AStartY;\r\n bh := 0;\r\n x := x + lm;\r\n y := y + tm;\r\n\r\n {$IFDEF FMXWEBLIB}\r\n rt := RectF(Int(x), Int(y), Int(x + bw), Int(y + bh));\r\n\r\n if HorizontalScrollBar.Visible or ColumnsAppearance.Stretch then\r\n begin\r\n if AIndex = 0 then\r\n rc := RectF(rt.Left + 1.5, rt.Top + 1.5, rt.Right - 1.5, rt.Bottom + 0.5)\r\n else if AIndex = RowCount - 1 then\r\n rc := RectF(rt.Left + 1.5, rt.Top + 0.5, rt.Right - 1.5, rt.Bottom + 0.5)\r\n else\r\n rc := RectF(rt.Left + 1.5, rt.Top + 0.5, rt.Right - 1.5, rt.Bottom + 0.5);\r\n end\r\n else\r\n begin\r\n if AIndex = 0 then\r\n rc := RectF(rt.Left + 1.5, rt.Top + 1.5, rt.Right - 0.5, rt.Bottom + 0.5)\r\n else if AIndex = RowCount - 1 then\r\n rc := RectF(rt.Left + 1.5, rt.Top + 0.5, rt.Right - 0.5, rt.Bottom + 0.5)\r\n else\r\n rc := RectF(rt.Left + 1.5, rt.Top + 0.5, rt.Right - 0.5, rt.Bottom + 0.5);\r\n end;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n rt := RectF(x, y, x + bw, y + bh);\r\n\r\n if HorizontalScrollBar.Visible or ColumnsAppearance.Stretch then\r\n begin\r\n if AIndex = 0 then\r\n rc := RectF(rt.Left + 1, rt.Top + 1, rt.Right - 1, rt.Bottom)\r\n else if AIndex = RowCount - 1 then\r\n rc := RectF(rt.Left + 1, rt.Top, rt.Right - 1, rt.Bottom)\r\n else\r\n rc := RectF(rt.Left + 1, rt.Top, rt.Right - 1, rt.Bottom);\r\n end\r\n else\r\n begin\r\n if AIndex = 0 then\r\n rc := RectF(rt.Left + 1, rt.Top + 1, rt.Right, rt.Bottom)\r\n else if AIndex = RowCount - 1 then\r\n rc := RectF(rt.Left + 1, rt.Top, rt.Right, rt.Bottom)\r\n else\r\n rc := RectF(rt.Left + 1, rt.Top, rt.Right, rt.Bottom);\r\n end;\r\n {$ENDIF}\r\n\r\n ConfigureNodeRect(AIndex, ANode, rc);\r\n\r\n if v.Calculated then\r\n bh := v.Height\r\n else\r\n begin\r\n UpdateNodeCalculated(v, True);\r\n\r\n if NodesAppearance.HeightMode = tnhmVariable then\r\n begin\r\n st := 0;\r\n stp := ColumnCount - 1;\r\n ext := False;\r\n DoIsNodeExtended(v, ext);\r\n\r\n if ext then\r\n stp := Min(0, ColumnCount - 1);\r\n\r\n for C := st to stp do\r\n begin\r\n colw := ColumnWidths[C];\r\n if (colw > 0) or ext then\r\n begin\r\n strc := '';\r\n DoGetNodeText(v, C, tntmDrawing, strc);\r\n strt := '';\r\n DoGetNodeTitle(v, C, tntmDrawing, strt);\r\n texp := True;\r\n DoGetNodeTitleExpanded(v, C, texp);\r\n\r\n if CompactMode then\r\n begin\r\n strt := '';\r\n strc := '';\r\n texp := False;\r\n end;\r\n\r\n cx := ColumnPositions[C];\r\n if C = st then\r\n cx := cx + rc.Left;\r\n\r\n if ext then\r\n cw := cx + bw\r\n else\r\n cw := cx + ColumnWidths[C];\r\n\r\n if C = st then\r\n cw := cw - rc.Left;\r\n\r\n if (NodesAppearance.ExpandColumn = C) and (C > st) then\r\n cx := cx + lvlw;\r\n\r\n cw := cw - loff - roff - rm - lm;\r\n\r\n if C = NodesAppearance.ExpandColumn then\r\n begin\r\n expw := NodesAppearance.ExpandWidth + 4;\r\n exph := NodesAppearance.ExpandHeight + 4;\r\n cx := cx + expw;\r\n if exph > maxh then\r\n maxh := exph;\r\n end;\r\n\r\n chk := tvntNone;\r\n DoGetNodeCheckType(v, C, chk);\r\n if chk <> tvntNone then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n chksz := 29;\r\n {$ELSE}\r\n {$IFDEF CMNWEBLIB}\r\n chksz := 20;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n chksz := 23;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n cx := cx + Max(0, chksz);\r\n if chksz > maxh then\r\n maxh := chksz;\r\n end;\r\n\r\n bmpn := nil;\r\n DoGetNodeIcon(v, C, False, bmpn);\r\n if not Assigned(bmpn) and TTMSFNCUtils.IsHighDPIScale then\r\n DoGetNodeIcon(v, C, True, bmpn);\r\n\r\n if Assigned(bmpn) and (bmpn.Width > 0) and (bmpn.Height > 0) then\r\n begin\r\n bmpw := bmpn.Width + 4;\r\n bmph := bmpn.Height + 4;\r\n\r\n cx := cx + bmpw;\r\n if bmph > maxh then\r\n maxh := bmph;\r\n end;\r\n\r\n ww := False;\r\n wwt := False;\r\n if (C >= 0) and (C <= Columns.Count - 1) then\r\n begin\r\n ww := Columns[C].WordWrapping;\r\n wwt := Columns[C].TitleWordWrapping;\r\n end;\r\n\r\n DoGetNodeWordWrapping(v, C, ww);\r\n DoGetNodeTitleWordWrapping(v, C, wwt);\r\n\r\n sz := 0;\r\n DoGetNodeExtraSize(v, C, sz);\r\n\r\n szt := 0;\r\n DoGetNodeTitleExtraSize(v, C, szt);\r\n\r\n rcalc := RectF(cx, 0, cw - sz, 10000);\r\n InflateRectEx(rcalc, -2, 0);\r\n\r\n rcalctw := RectF(cx, 0, cw - szt, 10000);\r\n InflateRectEx(rcalctw, -2, 0);\r\n\r\n cl := nil;\r\n if (C >= 0) and (C <= ColumnCount - 1) then\r\n cl := Columns[C];\r\n\r\n if Assigned(cl) and not cl.UseDefaultAppearance and not ext then\r\n AGraphics.Font.Assign(cl.Font)\r\n else\r\n begin\r\n if ext then\r\n AGraphics.Font.Assign(NodesAppearance.ExtendedFont)\r\n else\r\n AGraphics.Font.Assign(NodesAppearance.Font);\r\n end;\r\n\r\n if texp then\r\n begin\r\n rcalc := AGraphics.CalculateText(strc, rcalc, ww);\r\n rcalc.Bottom := rcalc.Bottom + 4;\r\n\r\n vl := (rcalc.Bottom - rcalc.Top);\r\n end\r\n else\r\n vl := 0;\r\n\r\n if strt <> '' then\r\n begin\r\n if Assigned(cl) and not cl.UseDefaultAppearance then\r\n AGraphics.Font.Assign(cl.TitleFont)\r\n else\r\n AGraphics.Font.Assign(NodesAppearance.TitleFont);\r\n\r\n rcalct := AGraphics.CalculateText(strt, rcalctw, wwt);\r\n rcalct.Bottom := rcalct.Bottom + 4;\r\n th := rcalct.Bottom - rcalct.Top;\r\n end\r\n else\r\n th := 0;\r\n\r\n UpdateNodeTitleHeight(v, Max(szt, th)); \r\n vl := vl + v.TitleHeight;\r\n\r\n DoGetNodeHeight(v, C, vl);\r\n\r\n if vl > maxh then\r\n maxh := vl;\r\n end;\r\n end;\r\n\r\n bh := Max(DefaultRowHeight, maxh);\r\n bh := bh + GetNodesSpacing + toff + boff;\r\n UpdateNodeHeight(v, Int(bh));\r\n TotalRowHeight := (TotalRowHeight - DefaultRowHeight) + v.Height;\r\n end\r\n else\r\n begin\r\n bh := DefaultRowHeight;\r\n bh := bh + GetNodesSpacing + toff + boff;\r\n UpdateNodeHeight(v, bh);\r\n end;\r\n end;\r\n\r\n AStartY := AStartY + Int(bh);\r\n rc.Bottom := rc.Bottom + Int(bh);\r\n rc.Bottom := rc.Bottom - GetNodesSpacing;\r\n\r\n urc := rc;\r\n urc.Left := urc.Left + loff;\r\n urc.Top := urc.Top + toff;\r\n urc.Right := urc.Right + roff;\r\n urc.Bottom := urc.Bottom + boff;\r\n\r\n SetLength(extr, 0);\r\n SetLength(textr, 0);\r\n SetLength(txtr, 0);\r\n SetLength(titr, 0);\r\n SetLength(bmpr, 0);\r\n SetLength(expr, 0);\r\n SetLength(chkr, 0);\r\n\r\n st := 0;\r\n stp := ColumnCount - 1;\r\n ext := False;\r\n DoIsNodeExtended(v, ext);\r\n if ext then\r\n stp := Min(0, ColumnCount - 1);\r\n\r\n for C := st to stp do\r\n begin\r\n colw := GetColumnWidth(C);\r\n cx := GetColumnPosition(C);\r\n if C = st then\r\n cx := cx + urc.Left;\r\n\r\n if ext then\r\n cw := cx + bw\r\n else\r\n cw := cx + colw;\r\n\r\n if C = st then\r\n cw := cw - urc.Left;\r\n\r\n if (NodesAppearance.ExpandColumn = C) and (C > st) then\r\n cx := cx + lvlw;\r\n\r\n if ext then\r\n cw := cw + lvlw;\r\n\r\n cw := cw - rm - roff;\r\n\r\n expw := 0;\r\n exph := 0;\r\n if C = NodesAppearance.ExpandColumn then\r\n begin\r\n expw := NodesAppearance.ExpandWidth + 4;\r\n exph := NodesAppearance.ExpandHeight + 4;\r\n end;\r\n\r\n SetLength(expr, Length(expr) + 1);\r\n expr[Length(expr) - 1] := RectF(Int(cx + 2), Int(urc.Top + ((urc.Bottom - urc.Top) - exph) / 2 + 2), Int(cx + expw - 2),\r\n Int(urc.Top + ((urc.Bottom - urc.Top) - exph) / 2 + exph - 2));\r\n\r\n cx := cx + expw;\r\n\r\n chk := tvntNone;\r\n chksz := 0;\r\n DoGetNodeCheckType(v, C, chk);\r\n if chk <> tvntNone then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n chksz := 29;\r\n {$ELSE}\r\n {$IFDEF CMNWEBLIB}\r\n chksz := 20;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n chksz := 23;\r\n {$ENDIF}\r\n {$ENDIF}\r\n end;\r\n\r\n SetLength(chkr, Length(chkr) + 1);\r\n chkr[Length(chkr) - 1] := RectF(Int(cx + 4), Int(urc.Top + ((urc.Bottom - urc.Top) - chksz) / 2 + 2), Int(cx + chksz), Int(urc.Top + ((urc.Bottom - urc.Top) - chksz) / 2 + chksz - 2));\r\n\r\n cx := cx + Max(0, chksz);\r\n\r\n bmpn := nil;\r\n DoGetNodeIcon(v, C, False, bmpn);\r\n if not Assigned(bmpn) and TTMSFNCUtils.IsHighDPIScale then\r\n DoGetNodeIcon(v, C, True, bmpn);\r\n\r\n bmpw := 0;\r\n bmph := 0;\r\n if Assigned(bmpn) and (bmpn.Width > 0) and (bmpn.Height > 0) then\r\n begin\r\n bmpw := bmpn.Width + 4;\r\n bmph := bmpn.Height + 4;\r\n end;\r\n\r\n SetLength(bmpr, Length(bmpr) + 1);\r\n bmpr[Length(bmpr) - 1] := RectF(Int(cx + 2), Int(urc.Top + ((urc.Bottom - urc.Top) - bmph) / 2 + 2), Int(cx + bmpw - 2), Int(urc.Top + ((urc.Bottom - urc.Top) - bmph) / 2 + bmph - 2));\r\n cx := cx + bmpw;\r\n\r\n sz := 0;\r\n DoGetNodeExtraSize(v, C, sz);\r\n\r\n szt := 0;\r\n DoGetNodeTitleExtraSize(v, C, szt);\r\n\r\n if ((v.Title[C] <> '') or (v.TitleHeight > 0)) and (v.Text[C] <> '') and v.TitleExpanded[C] then\r\n begin\r\n r := RectF(cx, urc.Top, cw - szt, urc.Top + v.TitleHeight);\r\n SetLength(titr, Length(titr) + 1);\r\n titr[Length(titr) - 1] := r;\r\n\r\n SetLength(textr, Length(textr) + 1);\r\n textr[Length(textr) - 1] := RectF(r.Right, urc.Top, r.Right + szt, urc.Top + szt);\r\n\r\n r := RectF(cx, r.Bottom, cw - sz, urc.Bottom);\r\n SetLength(txtr, Length(txtr) + 1);\r\n txtr[Length(txtr) - 1] := r;\r\n end\r\n else\r\n begin\r\n r := RectF(cx, urc.Top + ((urc.Bottom - urc.Top) - (rc.Bottom - rc.Top)) / 2, cw - szt, urc.Top + ((urc.Bottom - urc.Top) - (rc.Bottom - rc.Top)) / 2 + (rc.Bottom - rc.Top));\r\n SetLength(titr, Length(titr) + 1);\r\n titr[Length(titr) - 1] := r;\r\n\r\n SetLength(textr, Length(textr) + 1);\r\n textr[Length(textr) - 1] := RectF(r.Right, urc.Top, r.Right + szt, urc.Top + szt);\r\n\r\n r := RectF(cx, urc.Top + ((urc.Bottom - urc.Top) - (rc.Bottom - rc.Top)) / 2, cw - sz, urc.Top + ((urc.Bottom - urc.Top) - (rc.Bottom - rc.Top)) / 2 + (rc.Bottom - rc.Top));\r\n SetLength(txtr, Length(txtr) + 1);\r\n txtr[Length(txtr) - 1] := r;\r\n end;\r\n\r\n SetLength(extr, Length(extr) + 1);\r\n extr[Length(extr) - 1] := RectF(r.Right, r.Top, r.Right + sz, r.Bottom);\r\n end;\r\n\r\n UpdateNodeExtraRects(v, extr);\r\n UpdateNodeTitleExtraRects(v, textr);\r\n UpdateNodeTextRects(v, txtr);\r\n UpdateNodeTitleRects(v, titr);\r\n UpdateNodeBitmapRects(v, bmpr);\r\n UpdateNodeExpandRects(v, expr);\r\n UpdateNodeCheckRects(v, chkr);\r\n\r\n cache := TTMSFNCTreeViewCacheItem.CreateNode(rc, v);\r\n FNodeCache.Add(cache);\r\n UpdateNodeCacheReference(v, cache);\r\n\r\n Result := y - vs > (cr.Bottom - cr.Top);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ConfigureNodeRect(AIndex: Integer; ANode: TTMSFNCTreeViewVirtualNode; var ARect: TRectF);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.CopyToClipboard(ATextOnly: Boolean = False);\r\nvar\r\n s: String;\r\n I, K: Integer;\r\n n: TTMSFNCTreeViewVirtualNode;\r\n v: TTMSFNCTreeViewVirtualNode;\r\n cl: TTMSFNCTreeViewIntegerList;\r\nbegin\r\n if Assigned(OnCustomCopyToClipboard) then\r\n OnCustomCopyToClipboard(Self)\r\n else\r\n begin\r\n cl := TTMSFNCTreeViewIntegerList.Create;\r\n try\r\n s := '';\r\n for I := 0 to SelectedVirtualNodeCount - 1 do\r\n begin\r\n n := SelectedVirtualNodes[I];\r\n if Assigned(n) and (cl.IndexOf(n.Row) = -1) then\r\n begin\r\n if Assigned(n.Node) then\r\n s := s + n.Node.SaveToString(ATextOnly) + ENDOFLINE;\r\n\r\n cl.Add(n.Row);\r\n end;\r\n\r\n if Assigned(n) then\r\n begin\r\n for K := n.Row + 1 to n.Row + n.TotalChildren do\r\n begin\r\n v := GetNodeFromNodeStructure(K);\r\n if Assigned(v) and Assigned(v.Node) and (cl.IndexOf(v.Row) = -1) then\r\n begin\r\n s := s + v.Node.SaveToString(ATextOnly) + ENDOFLINE;\r\n cl.Add(v.Row);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n if s <> '' then\r\n TTMSFNCClipBoard.SetText(CLP_FMT + s);\r\n finally\r\n cl.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCCustomTreeView);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.RemoveNodeFromSelection(ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n FSelectedNodes.Remove(ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoNodeCompare(ANode1: TTMSFNCTreeViewNode; ANode2: TTMSFNCTreeViewNode; AColumn: Integer; var ACompareResult: Integer);\r\nbegin\r\n if Assigned(OnNodeCompare) then\r\n OnNodeCompare(Self, ANode1, ANode2, AColumn, ACompareResult);\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomTreeView.SaveToStream(const AStream: TStream; const ATextOnly: Boolean = True);\r\nvar\r\n ANode: TTMSFNCTreeViewNode;\r\n NodeStr: string;\r\n Buffer: TBytes;\r\n {$IFDEF LCLWEBLIB}\r\n I: Integer;\r\n {$ENDIF}\r\nbegin\r\n if Nodes.Count > 0 then\r\n begin\r\n ANode := Nodes[0];\r\n while ANode <> nil do\r\n begin\r\n NodeStr := ANode.SaveToString(ATextOnly);\r\n NodeStr := NodeStr + EndOfLine;\r\n {$IFNDEF LCLWEBLIB}\r\n Buffer := TEncoding.Default.GetBytes(NodeStr);\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n SetLength(Buffer, Length(NodeStr));\r\n for I := 1 to Length(NodeStr) do\r\n Buffer[I - 1] := Ord(NodeStr[I]);\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNLIB}\r\n AStream.Write(Buffer[0], Length(Buffer));\r\n {$ELSE}\r\n AStream.Write(Buffer, Length(Buffer));\r\n {$ENDIF}\r\n\r\n ANode := ANode.GetNext;\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomTreeView.Scroll(AHorizontalPos, AVerticalPos: Double);\r\nvar\r\n h, v: Double;\r\nbegin\r\n h := GetHorizontalScrollPosition;\r\n v := GetVerticalScrollPosition;\r\n inherited;\r\n if h <> AHorizontalPos then\r\n DoHScroll(AHorizontalPos);\r\n\r\n if v <> AVerticalPos then\r\n DoVScroll(AVerticalPos);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetPreviousEditableColumn(AColumn: Integer): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n if (AColumn > 0) and (AColumn <= Columns.Count - 1) then\r\n begin\r\n for I := AColumn - 1 downto 0 do\r\n begin\r\n if (Columns[I].EditorType <> tcetNone) or Columns[I].CustomEditor then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetNextEditableColumn(AColumn: Integer): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n if (AColumn >= 0) and (AColumn < Columns.Count - 1) then\r\n begin\r\n for I := AColumn + 1 to Columns.Count - 1 do\r\n begin\r\n if (Columns[I].EditorType <> tcetNone) or Columns[I].CustomEditor then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetBottomRow: Integer;\r\nbegin\r\n Result := GetLastVisibleVirtualNodeRow;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetBufStart(ABuffer: string; var ALevel: Integer): string;\r\nvar\r\n Pos: Integer;\r\nbegin\r\n Pos := 1;\r\n ALevel := 0;\r\n while CharInArray(ABuffer[Pos{$IFDEF FMXMOBILE}-1{$ENDIF}], [' ', #9]) do\r\n begin\r\n Inc(Pos);\r\n Inc(ALevel);\r\n end;\r\n Result := Copy(ABuffer, Pos, Length(ABuffer) - Pos + 1);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetFirstEditableColumn: Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n if (Columns[I].EditorType <> tcetNone) or Columns[I].CustomEditor then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetFirstVisibleCacheItem: TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := nil;\r\n if FNodeDisplay.Count > 0 then\r\n Result := FNodeDisplay[0];\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetFirstVisibleVirtualNode: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if FNodeDisplay.Count > 0 then\r\n Result := FNodeDisplay[0].Node;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetFirstVisibleVirtualNodeRow: Integer;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n n := GetFirstVisibleVirtualNode;\r\n Result := 0;\r\n if Assigned(n) then\r\n Result := n.Row; \r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetLastEditableColumn: Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n for I := Columns.Count - 1 downto 0 do\r\n begin\r\n if (Columns[I].EditorType <> tcetNone) or Columns[I].CustomEditor then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetLastVisibleVirtualNode: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if FNodeDisplay.Count > 0 then\r\n Result := FNodeDisplay[FNodeDisplay.Count - 1].Node;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetLastVisibleVirtualNodeRow: Integer;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n n := GetLastVisibleVirtualNode;\r\n Result := 0;\r\n if Assigned(n) then\r\n Result := n.Row;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetFocusedNode: TTMSFNCTreeViewNode;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n n := FFocusedNode;\r\n if Assigned(n) then\r\n Result := n.Node;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetFocusedVirtualNode: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := FFocusedNode;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetSelectedVirtualNodeRow: Integer;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := -1;\r\n n := SelectedVirtualNode;\r\n if Assigned(n) then\r\n Result := n.Row; \r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetSelNode(AIndex: Integer): TTMSFNCTreeViewNode;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n v := SelectedVirtualNodes[AIndex];\r\n if Assigned(v) then\r\n Result := v.Node;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetSelVirtualNode(\r\n AIndex: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if (AIndex >= 0) and (AIndex <= SelectedVirtualNodeCount - 1) then\r\n Result := FSelectedNodes[AIndex];\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetTopRow: Integer;\r\nbegin\r\n Result := GetFirstVisibleVirtualNodeRow;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomTreeView.DoInplaceEditorTimer(Sender: TObject);\r\nbegin\r\n if Assigned(FInplaceEditor) then\r\n begin\r\n FInplaceEditor.DisposeOf;\r\n FInplaceEditor := nil;\r\n end;\r\n\r\n FInplaceEditorTimer.Enabled := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ScrollBarChanged(Sender: TObject);\r\nbegin\r\n UpdateScrollBars(True, False);\r\n FScrollBarTimer.Enabled := False;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawGroup(AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind);\r\nbegin\r\n if Assigned(OnAfterDrawGroup) then\r\n OnAfterDrawGroup(Self, AGraphics, ARect, AGroup, AStartColumn, AEndColumn, AKind);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawGroupEmptySpace(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; ASpace: TTMSFNCTreeViewGroupEmptySpace);\r\nbegin\r\n if Assigned(OnAfterDrawGroupEmptySpace) then\r\n OnAfterDrawGroupEmptySpace(Self, AGraphics, ARect, ASpace);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawGroupText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String);\r\nbegin\r\n if Assigned(OnAfterDrawGroupText) then\r\n OnAfterDrawGroupText(Self, AGraphics, ARect, AGroup, AStartColumn, AEndColumn, AKind, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNode(AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterDrawNode) then\r\n OnAfterDrawNode(Self, AGraphics, ARect, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeCheck(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode\r\n ;ACheck: TTMSFNCBitmap);\r\nbegin\r\n if Assigned(OnAfterDrawNodeCheck) then\r\n OnAfterDrawNodeCheck(Self, AGraphics, ARect, AColumn, ANode, ACheck);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeExpand(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode;\r\n AExpand: TTMSFNCBitmap);\r\nbegin\r\n if Assigned(OnAfterDrawNodeExpand) then\r\n OnAfterDrawNodeExpand(Self, AGraphics, ARect, AColumn, ANode, AExpand);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeExtra(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterDrawNodeExtra) then\r\n OnAfterDrawNodeExtra(Self, AGraphics, ARect, AColumn, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeIcon(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode;\r\n AIcon: TTMSFNCBitmap);\r\nbegin\r\n if Assigned(OnAfterDrawNodeIcon) then\r\n OnAfterDrawNodeIcon(Self, AGraphics, ARect, AColumn, ANode, AIcon);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String);\r\nbegin\r\n if Assigned(OnAfterDrawNodeText) then\r\n OnAfterDrawNodeText(Self, AGraphics, ARect, AColumn, ANode, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeTitle(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode;\r\n ATitle: String);\r\nbegin\r\n if Assigned(OnAfterDrawNodeTitle) then\r\n OnAfterDrawNodeTitle(Self, AGraphics, ARect, AColumn, ANode, ATitle);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeTitleExtra(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterDrawNodeTitleExtra) then\r\n OnAfterDrawNodeTitleExtra(Self, AGraphics, ARect, AColumn, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawSortIndicator(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ASortIndex: Integer;\r\n ASortKind: TTMSFNCTreeViewNodesSortKind);\r\nbegin\r\n if Assigned(OnAfterDrawSortIndicator) then\r\n OnAfterDrawSortIndicator(Self, AGraphics, ARect, AColumn, ASortIndex, ASortKind);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDropNode(AFromNode,\r\n AToNode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterDropNode) then\r\n OnAfterDropNode(Self, AFromNode, AToNode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterExpandNode(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterExpandNode) then\r\n OnAfterExpandNode(Self, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterOpenInplaceEditor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n AInplaceEditor: TTMSFNCTreeViewInplaceEditor; AInplaceEditorRect: TRectF);\r\nbegin\r\n if Assigned(OnAfterOpenInplaceEditor) then\r\n OnAfterOpenInplaceEditor(Self, ANode, AColumn, AInplaceEditor, AInplaceEditorRect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterPasteFromClipboard;\r\nbegin\r\n if Assigned(OnAfterPasteFromClipboard) then\r\n OnAfterPasteFromClipboard(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterReorderNode(AFromNode,\r\n AToNode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterReorderNode) then\r\n OnAfterReorderNode(Self, AFromNode, AToNode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawNodeColumn(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer);\r\nbegin\r\n if Assigned(OnAfterDrawNodeColumn) then\r\n OnAfterDrawNodeColumn(Self, AGraphics, ARect, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawColumn(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer);\r\nbegin\r\n if Assigned(OnAfterDrawColumn) then\r\n OnAfterDrawColumn(Self, AGraphics, ARect, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawColumnHeader(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind);\r\nbegin\r\n if Assigned(OnAfterDrawColumnHeader) then\r\n OnAfterDrawColumnHeader(Self, AGraphics, ARect, AColumn, AKind);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawColumnEmptySpace(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; ASpace: TTMSFNCTreeViewColumnEmptySpace);\r\nbegin\r\n if Assigned(OnAfterDrawColumnEmptySpace) then\r\n OnAfterDrawColumnEmptySpace(Self, AGraphics, ARect, ASpace);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterDrawColumnText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String);\r\nbegin\r\n if Assigned(OnAfterDrawColumnText) then\r\n OnAfterDrawColumnText(Self, AGraphics, ARect, AColumn, AKind, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterUnCheckNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer);\r\nbegin\r\n if Assigned(OnAfterUnCheckNode) then\r\n OnAfterUnCheckNode(Self, ANode, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterUnSelectNode(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterUnSelectNode) then\r\n OnAfterUnSelectNode(Self, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterUpdateNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer);\r\nbegin\r\n if Assigned(OnAfterUpdateNode) then\r\n OnAfterUpdateNode(Self, ANode, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawGroup(AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AAllow: Boolean; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawGroup) then\r\n OnBeforeDrawGroup(Self, AGraphics, ARect, AGroup, AStartColumn, AEndColumn, AKind, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawGroupEmptySpace(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; ASpace: TTMSFNCTreeViewGroupEmptySpace; var AAllow,\r\n ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawGroupEmptySpace) then\r\n OnBeforeDrawGroupEmptySpace(Self, AGraphics, ARect, ASpace, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawGroupText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AGroup, AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawGroupText) then\r\n OnBeforeDrawGroupText(Self, AGraphics, ARect, AGroup, AStartColumn, AEndColumn, AKind, AText, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNode(AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNode) then\r\n OnBeforeDrawNode(Self, AGraphics, ARect, ANode, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeCheck(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode;\r\n ACheck: TTMSFNCBitmap; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeCheck) then\r\n OnBeforeDrawNodeCheck(Self, AGraphics, ARect, AColumn, ANode, ACheck, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeExpand(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode;\r\n AExpand: TTMSFNCBitmap; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeExpand) then\r\n OnBeforeDrawNodeExpand(Self, AGraphics, ARect, AColumn, ANode, AExpand, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeExtra(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeExtra) then\r\n OnBeforeDrawNodeExtra(Self, AGraphics, ARect, AColumn, ANode, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeTitleExtra(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeTitleExtra) then\r\n OnBeforeDrawNodeTitleExtra(Self, AGraphics, ARect, AColumn, ANode, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeIcon(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode;\r\n AIcon: TTMSFNCBitmap; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeIcon) then\r\n OnBeforeDrawNodeIcon(Self, AGraphics, ARect, AColumn, ANode, AIcon, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeText) then\r\n OnBeforeDrawNodeText(Self, AGraphics, ARect, AColumn, ANode, AText, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeTitle(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; ATitle: String; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeTitle) then\r\n OnBeforeDrawNodeTitle(Self, AGraphics, ARect, AColumn, ANode, ATitle, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawSortIndicator(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; ASortIndex: Integer;\r\n ASortKind: TTMSFNCTreeViewNodesSortKind; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawSortIndicator) then\r\n OnBeforeDrawSortIndicator(Self, AGraphics, ARect, AColumn, ASortIndex, ASortKind, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDropNode(AFromNode,\r\n AToNode: TTMSFNCTreeViewVirtualNode; var ACanDrop: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDropNode) then\r\n OnBeforeDropNode(Self, AFromNode, AToNode, ACanDrop);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeCheckNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanCheck: Boolean);\r\nbegin\r\n if Assigned(OnBeforeCheckNode) then\r\n OnBeforeCheckNode(Self, ANode, AColumn, ACanCheck);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeCollapseNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; var ACanCollapse: Boolean);\r\nbegin\r\n if Assigned(OnBeforeCollapseNode) then\r\n OnBeforeCollapseNode(Self, ANode, ACanCollapse);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeCopyToClipboard(var ACanCopy: Boolean);\r\nbegin\r\n if Assigned(OnBeforeCopyToClipboard) then\r\n OnBeforeCopyToClipboard(Self, ACanCopy);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeCutToClipboard(var ACanCut: Boolean);\r\nbegin\r\n if Assigned(OnBeforeCutToClipboard) then\r\n OnBeforeCutToClipboard(Self, ACanCut);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeExpandNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; var ACanExpand: Boolean);\r\nbegin\r\n if Assigned(OnBeforeExpandNode) then\r\n OnBeforeExpandNode(Self, ANode, ACanExpand);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeOpenInplaceEditor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanOpen: Boolean);\r\nbegin\r\n if Assigned(OnBeforeOpenInplaceEditor) then\r\n OnBeforeOpenInplaceEditor(Self, ANode, AColumn, ACanOpen);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforePasteFromClipboard(\r\n var ACanPaste: Boolean);\r\nbegin\r\n if Assigned(OnBeforePasteFromClipboard) then\r\n OnBeforePasteFromClipboard(Self, ACanPaste);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeReorderNode(AFromNode,\r\n AToNode: TTMSFNCTreeViewVirtualNode; var ACanReorder: Boolean);\r\nbegin\r\n if Assigned(OnBeforeReorderNode) then\r\n OnBeforeReorderNode(Self, AFromNode, AToNode, ACanReorder);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawColumn(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; var AAllow: Boolean; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawColumn) then\r\n OnBeforeDrawColumn(Self, AGraphics, ARect, AColumn, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawNodeColumn(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; var AAllow: Boolean; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawNodeColumn) then\r\n OnBeforeDrawNodeColumn(Self, AGraphics, ARect, AColumn, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawColumnHeader(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AAllow: Boolean; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawColumnHeader) then\r\n OnBeforeDrawColumnHeader(Self, AGraphics, ARect, AColumn, AKind, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeSizeColumn(AColumn: Integer; AColumnSize: Double; var ANewColumnSize: Double; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeSizeColumn) then\r\n OnBeforeSizeColumn(Self, AColumn, AColumnSize, ANewColumnSize, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterSizeColumn(AColumn: Integer; AColumnSize: Double);\r\nbegin\r\n if Assigned(OnAfterSizeColumn) then\r\n OnAfterSizeColumn(Self, AColumn, AColumnSize);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawColumnEmptySpace(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; ASpace: TTMSFNCTreeViewColumnEmptySpace; var AAllow,\r\n ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawColumnEmptySpace) then\r\n OnBeforeDrawColumnEmptySpace(Self, AGraphics, ARect, ASpace, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeDrawColumnText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; AText: String; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawColumnText) then\r\n OnBeforeDrawColumnText(Self, AGraphics, ARect, AColumn, AKind, AText, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoNodeClick(ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnNodeClick) then\r\n OnNodeClick(Self, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoNodeDblClick(ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnNodeDblClick) then\r\n OnNodeDblClick(Self, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoNodeTitleAnchorClick(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AAnchor: String);\r\nbegin\r\n if Assigned(OnNodeTitleAnchorClick) then\r\n OnNodeTitleAnchorClick(Self, ANode, AColumn, AAnchor)\r\n else if Interaction.AutoOpenURL then\r\n TTMSFNCUtils.OpenURL(AAnchor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoUpdateNodeText(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AText: String);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoUpdateNodeTitle(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ATitle: String);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeSelectNode(ANode: TTMSFNCTreeViewVirtualNode;\r\n var ACanSelect: Boolean);\r\nbegin\r\n if Assigned(OnBeforeSelectNode) then\r\n OnBeforeSelectNode(Self, ANode, ACanSelect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeUnCheckNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ACanUnCheck: Boolean);\r\nbegin\r\n if Assigned(OnBeforeUnCheckNode) then\r\n OnBeforeUnCheckNode(Self, ANode, AColumn, ACanUnCheck);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeUnSelectNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; var ACanUnSelect: Boolean);\r\nbegin\r\n if Assigned(OnBeforeUnSelectNode) then\r\n OnBeforeUnSelectNode(Self, ANode, ACanUnSelect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoBeforeUpdateNode(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AText: String;\r\n var ACanUpdate: Boolean);\r\nbegin\r\n if Assigned(OnBeforeUpdateNode) then\r\n OnBeforeUpdateNode(Self, ANode, AColumn, AText, ACanUpdate);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoCloseInplaceEditor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AInplaceEditor: TTMSFNCTreeViewInplaceEditor; ACancelled: Boolean;\r\n var ACanClose: Boolean);\r\nbegin\r\n if Assigned(OnCloseInplaceEditor) then\r\n OnCloseInplaceEditor(Self, ANode, AColumn, AInplaceEditor, ACancelled, ACanClose);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoDrawNodeExtra(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnDrawNodeExtra) then\r\n OnDrawNodeExtra(Self, AGraphics, ARect, AColumn, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoDrawNodeTitleExtra(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnDrawNodeTitleExtra) then\r\n OnDrawNodeTitleExtra(Self, AGraphics, ARect, AColumn, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoEnter;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoExit;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoFilterSelect(AColumn: integer;\r\n var ACondition: string);\r\nbegin\r\n if Assigned(OnFilterSelect) then\r\n OnFilterSelect(Self, AColumn, ACondition);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterCheckNode(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer);\r\nbegin\r\n if Assigned(OnAfterCheckNode) then\r\n OnAfterCheckNode(Self, ANode, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterCollapseNode(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterCollapseNode) then\r\n OnAfterCollapseNode(Self, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterCopyToClipboard;\r\nbegin\r\n if Assigned(OnAfterCopyToClipboard) then\r\n OnAfterCopyToClipboard(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterCutToClipboard;\r\nbegin\r\n if Assigned(OnAfterCutToClipboard) then\r\n OnAfterCutToClipboard(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetGroupText(AGroup: Integer;\r\n AKind: TTMSFNCTreeViewCacheItemKind; var AText: String);\r\nbegin\r\n if Assigned(OnGetGroupText) then\r\n OnGetGroupText(Self, AGroup, AKind, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetInplaceEditor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; {$IFDEF FMXLIB}var ATransparent: Boolean;{$ENDIF}\r\n var AInplaceEditorClass: TTMSFNCTreeViewInplaceEditorClass);\r\nbegin\r\n if Assigned(OnGetInplaceEditor) then\r\n OnGetInplaceEditor(Self, ANode, AColumn, {$IFDEF FMXLIB}ATransparent, {$ENDIF}AInplaceEditorClass);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeCheckType(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ACheckType: TTMSFNCTreeViewNodeCheckType);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeCheckType) then\r\n OnGetNodeCheckType(Self, ANode, AColumn, ACheckType);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeHeight(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AHeight: Double);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeHeight) then\r\n OnGetNodeHeight(Self, ANode, AColumn, AHeight);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeColor(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeColor) then\r\n OnGetNodeColor(Self, ANode, AColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeDisabledColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeDisabledColor) then\r\n OnGetNodeDisabledColor(Self, ANode, AColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeDisabledTextColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeDisabledTextColor) then\r\n OnGetNodeDisabledTextColor(Self, ANode, AColumn, ATextColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeDisabledTitleColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATitleColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeDisabledTitleColor) then\r\n OnGetNodeDisabledTitleColor(Self, ANode, AColumn, ATitleColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeExtraSize(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExtraSize: Single);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeExtraSize) then\r\n OnGetNodeExtraSize(Self, ANode, AColumn, AExtraSize);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitleExtraSize(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATitleExtraSize: Single);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitleExtraSize) then\r\n OnGetNodeTitleExtraSize(Self, ANode, AColumn, ATitleExtraSize);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeHorizontalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeHorizontalTextAlign) then\r\n OnGetNodeHorizontalTextAlign(Self, ANode, AColumn, AHorizontalTextAlign);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeIcon(ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; ALarge: Boolean; var AIcon: TTMSFNCBitmap);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeIcon) then\r\n OnGetNodeIcon(Self, ANode, AColumn, ALarge, AIcon);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoIsNodeExtended(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AExtended: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnIsNodeExtended) then\r\n OnIsNodeExtended(Self, ANode, AExtended);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeSelectedColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeSelectedColor) then\r\n OnGetNodeSelectedColor(Self, ANode, AColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeSelectedTextColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeSelectedTextColor) then\r\n OnGetNodeSelectedTextColor(Self, ANode, AColumn, ATextColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeSelectedTitleColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATitleColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeSelectedTitleColor) then\r\n OnGetNodeSelectedTitleColor(Self, ANode, AColumn, ATitleColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeSides(\r\n ANode: TTMSFNCTreeViewVirtualNode; var ASides: TTMSFNCGraphicsSides);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeSides) then\r\n OnGetNodeSides(Self, ANode, ASides);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeText(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var AText: String);\r\nbegin\r\n inherited;\r\n if Assigned(Adapter) then\r\n Adapter.GetNodeText(AColumn, ANode, AText);\r\n\r\n if Assigned(OnGetNodeText) then\r\n OnGetNodeText(Self, ANode, AColumn, AMode, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTextColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTextColor) then\r\n OnGetNodeTextColor(Self, ANode, AColumn, ATextColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTrimming(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTrimming) then\r\n OnGetNodeTrimming(Self, ANode, AColumn, ATrimming);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitleExpanded(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExpanded: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitleExpanded) then\r\n OnGetNodeTitleExpanded(Self, ANode, AColumn, AExpanded);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitle(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n AMode: TTMSFNCTreeViewNodeTextMode; var ATitle: String);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitle) then\r\n OnGetNodeTitle(Self, ANode, AColumn, AMode, ATitle);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitleColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATitleColor: TTMSFNCGraphicsColor);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitleColor) then\r\n OnGetNodeTitleColor(Self, ANode, AColumn, ATitleColor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitleHorizontalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitleHorizontalTextAlign) then\r\n OnGetNodeTitleHorizontalTextAlign(Self, ANode, AColumn, AHorizontalTextAlign);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitleTrimming(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitleTrimming) then\r\n OnGetNodeTitleTrimming(Self, ANode, AColumn, ATrimming);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitleVerticalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitleVerticalTextAlign) then\r\n OnGetNodeTitleVerticalTextAlign(Self, ANode, AColumn, AVerticalTextAlign);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeTitleWordWrapping(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AWordWrapping: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeTitleWordWrapping) then\r\n OnGetNodeTitleWordWrapping(Self, ANode, AColumn, AWordWrapping);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeVerticalTextAlign(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if Assigned(OnGetNodeVerticalTextAlign) then\r\n OnGetNodeVerticalTextAlign(Self, ANode, AColumn, AVerticalTextAlign);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNodeWordWrapping(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AWordWrapping: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetNodeWordWrapping) then\r\n OnGetNodeWordWrapping(Self, ANode, AColumn, AWordWrapping);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetColumnTrimming(\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind;\r\n var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetColumnTrimming) then\r\n OnGetColumnTrimming(Self, AColumn, AKind, ATrimming);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetColumnVerticalTextAlign(\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if Assigned(OnGetColumnVerticalTextAlign) then\r\n OnGetColumnVerticalTextAlign(Self, AColumn, AKind, AVerticalTextAlign);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetColumnHorizontalTextAlign(\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if Assigned(OnGetColumnHorizontalTextAlign) then\r\n OnGetColumnHorizontalTextAlign(Self, AColumn, AKind, AHorizontalTextAlign);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetColumnWordWrapping(\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AWordWrapping: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnGetColumnWordWrapping) then\r\n OnGetColumnWordWrapping(Self, AColumn, AKind, AWordWrapping);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetNumberOfNodes(ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer);\r\nbegin\r\n inherited;\r\n if Assigned(Adapter) then\r\n Adapter.GetNumberOfNodes(ANode, ANumberOfNodes);\r\n\r\n if Assigned(OnGetNumberOfNodes) then\r\n begin\r\n UpdateCount := UpdateCount + 1;\r\n NodeListBuild := False;\r\n Nodes.Clear;\r\n UpdateCount := UpdateCount - 1;\r\n OnGetNumberOfNodes(Self, ANode, ANumberOfNodes);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoGetColumnText(AColumn: Integer;\r\n AKind: TTMSFNCTreeViewCacheItemKind; var AText: String);\r\nbegin\r\n if Assigned(OnGetColumnText) then\r\n OnGetColumnText(Self, AColumn, AKind, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoHScroll(APosition: Single);\r\nbegin\r\n if Assigned(OnHScroll) then\r\n OnHScroll(Self, APosition);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoIsNodeChecked(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AChecked: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnIsNodeChecked) then\r\n OnIsNodeChecked(Self, ANode, AChecked);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoIsNodeEnabled(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AEnabled: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnIsNodeEnabled) then\r\n OnIsNodeEnabled(Self, ANode, AEnabled);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoIsNodeExpanded(ANode: TTMSFNCTreeViewVirtualNode; var AExpanded: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnIsNodeExpanded) then\r\n OnIsNodeExpanded(Self, ANode, AExpanded);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoIsNodeVisible(ANode: TTMSFNCTreeViewVirtualNode;\r\n var AVisible: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(OnIsNodeVisible) then\r\n OnIsNodeVisible(ANode, ANode, AVisible);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoNeedFilterDropDownData(\r\n AColumn: Integer; AValues: TStrings);\r\nbegin\r\n if Assigned(OnNeedFilterDropDownData) then\r\n OnNeedFilterDropDownData(Self, AColumn, AValues);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoNodeAnchorClick(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AAnchor: String);\r\nbegin\r\n if Assigned(OnNodeAnchorClick) then\r\n OnNodeAnchorClick(Self, ANode, AColumn, AAnchor)\r\n else if Interaction.AutoOpenURL then\r\n TTMSFNCUtils.OpenURL(AAnchor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoNodeChanged(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnNodeChanged) then\r\n OnNodeChanged(Self, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoVScroll(APosition: Single);\r\nbegin\r\n if Assigned(Adapter) then\r\n Adapter.ScrollTreeView(GetFirstVisibleVirtualNodeRow - FOldTopRow);\r\n if Assigned(OnVScroll) then\r\n OnVScroll(Self, APosition);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DoAfterSelectNode(ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(Adapter) then\r\n Adapter.SelectNode(ANode);\r\n\r\n if Assigned(OnAfterSelectNode) then\r\n OnAfterSelectNode(Self, ANode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DragTime(Sender: TObject);\r\nvar\r\n contentr: TRectF;\r\nbegin\r\n if FReorderMode or ((FDragMode and FDragModeStarted) and AlternativeDragDrop) then\r\n begin\r\n contentr := GetNodesRect;\r\n\r\n if (FY >= contentr.Bottom) then\r\n begin\r\n FDragRow := FDragRow + 1;\r\n ScrollToVirtualNode(GetNodeForRow(FDragRow));\r\n end\r\n else if FY <= contentr.Top then\r\n begin\r\n FDragRow := FDragRow - 1;\r\n ScrollToVirtualNode(GetNodeForRow(FDragRow));\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.AlternativeDragDrop: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.Animate(Sender: TObject);\r\nvar\r\n dx, dy, posx, posy, dvo, posvo: Double;\r\n animh, animv, animvo: Boolean;\r\nbegin\r\n posy := GetVScrollValue;\r\n posx := GetHScrollValue;\r\n posvo := FVerticalOffset;\r\n\r\n dx := Abs(FScrollHTo - posx) / Max(1, Abs(FSpX) * ANIMATIONFACTOR);\r\n dy := Abs(FScrollVTo - posy) / Max(1, Abs(FSpY) * ANIMATIONFACTOR);\r\n dvo := Abs(FVerticalOffsetTo - posvo) / ANIMATIONFACTOR;\r\n\r\n animv := False;\r\n if FAnimateVerticalPos then\r\n animv := AnimateDouble(posy, FScrollVTo, dy, 0.01);\r\n\r\n animh := False;\r\n if FAnimateHorizontalPos then\r\n animh := AnimateDouble(posx, FScrollHTo, dx, 0.01);\r\n\r\n animvo := False;\r\n if FAnimateVerticalOffset then\r\n animvo := AnimateDouble(posvo, FVerticalOffsetTo, dvo, 0.01);\r\n\r\n FAnimating := animv or animh;\r\n if FAnimating then\r\n Scroll(posx, posy)\r\n else if animvo then\r\n begin\r\n FVerticalOffset := posvo;\r\n UpdateDisplay;\r\n end\r\n else\r\n begin\r\n FVerticalOffset := FVerticalOffsetTo;\r\n UpdateDisplay;\r\n FAnimateVerticalPos := False;\r\n FAnimateTimer.Enabled := False;\r\n FAnimateHorizontalPos := False;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.CustomizeInplaceEditor(\r\n AInplaceEditor: TTMSFNCTreeViewInplaceEditor;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: TTMSFNCTreeViewColumn);\r\n{$IFDEF FMXLIB}\r\nvar\r\n ext, sel: Boolean;\r\n f: TTMSFNCGraphicsFont;\r\n c: TAlphaColor;\r\n{$ENDIF}\r\nbegin\r\n if not Assigned(ANode) or not Assigned(AColumn) or not Assigned(AInplaceEditor) then\r\n Exit;\r\n\r\n {$IFDEF FMXLIB}\r\n\r\n sel := IsVirtualNodeSelected(ANode);\r\n\r\n ext := False;\r\n DoIsNodeExtended(ANode, ext);\r\n\r\n if Assigned(AColumn) and not AColumn.UseDefaultAppearance and not ext then\r\n begin\r\n f := AColumn.Font;\r\n if sel then\r\n c := AColumn.SelectedFontColor\r\n else\r\n c := AColumn.Font.Color;\r\n end\r\n else\r\n begin\r\n if ext then\r\n begin\r\n f := NodesAppearance.ExtendedFont;\r\n if sel then\r\n c := NodesAppearance.ExtendedSelectedFontColor\r\n else\r\n c := NodesAppearance.ExtendedFontColor;\r\n end\r\n else\r\n begin\r\n f := NodesAppearance.Font;\r\n if sel then\r\n c := NodesAppearance.SelectedFontColor\r\n else\r\n c := NodesAppearance.Font.Color\r\n end;\r\n end;\r\n\r\n if (AInplaceEditor is TEdit) then\r\n begin\r\n (AInplaceEditor as TEdit).StyledSettings := [];\r\n (AInplaceEditor as TEdit).Font.Assign(f);\r\n (AInplaceEditor as TEdit).FontColor := c;\r\n end\r\n else if (AInplaceEditor is TMemo) then\r\n begin\r\n (AInplaceEditor as TMemo).StyledSettings := [];\r\n (AInplaceEditor as TMemo).Font.Assign(f);\r\n (AInplaceEditor as TMemo).FontColor := c;\r\n end;\r\n {$ENDIF}\r\n\r\n if Assigned(OnCustomizeInplaceEditor) then\r\n OnCustomizeInplaceEditor(Self, ANode, AColumn.Index, FInplaceEditor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.CustomizeNodeCache(AGraphics: TTMSFNCGraphics;\r\n AStartY: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.CutToClipboard(ATextOnly: Boolean = False);\r\nvar\r\n I: Integer;\r\nbegin\r\n if Assigned(OnCustomCutToClipboard) then\r\n OnCustomCutToClipboard(Self)\r\n else\r\n begin\r\n BeginUpdate;\r\n CopyToClipboard(ATextOnly);\r\n for I := SelectedVirtualNodeCount - 1 downto 0 do\r\n RemoveVirtualNode(SelectedVirtualNodes[I]);\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomTreeView.ApplyInplaceEditorStyleLookup(Sender: TObject);\r\nvar\r\n obj: TFmxObject;\r\n function FindSRes(AObject: TFmxObject; AResName: String): TFMXObject;\r\n var\r\n I: Integer;\r\n begin\r\n Result := nil;\r\n if Assigned(AObject) then\r\n begin\r\n Result := AObject.FindStyleResource(AResName);\r\n if not Assigned(Result) then\r\n begin\r\n for I := 0 to AObject.ChildrenCount - 1 do\r\n begin\r\n Result := FindSRes(AObject.Children[I], AResName);\r\n if Assigned(Result) then\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nbegin\r\n if (Sender = FInplaceEditor) and ((FInplaceEditor is TMemo) or (FInplaceEditor is TEdit)) then\r\n begin\r\n obj := FindSRes(FInplaceEditor, 'background');\r\n if Assigned(obj) and (obj is TCustomStyleObject) then\r\n TCustomStyleObject(obj).Source := nil\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomTreeView.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n Fill.Color := c;\r\n\r\n if TTMSFNCStyles.GetStyleLineFillColor(c) then\r\n begin\r\n Stroke.Color := c;\r\n ColumnsAppearance.TopStroke.Color := c;\r\n ColumnsAppearance.BottomStroke.Color := c;\r\n GroupsAppearance.TopStroke.Color := c;\r\n GroupsAppearance.BottomStroke.Color := c;\r\n NodesAppearance.ExtendedFill.Color := c;\r\n NodesAppearance.ExtendedStroke.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleHeaderFillColor(c) then\r\n begin\r\n ColumnsAppearance.TopFill.Color := c;\r\n ColumnsAppearance.TopFill.Kind := gfkSolid;\r\n ColumnsAppearance.BottomFill.Color := c;\r\n ColumnsAppearance.BottomFill.Kind := gfkSolid;\r\n GroupsAppearance.TopFill.Color := c;\r\n GroupsAppearance.TopFill.Kind := gfkSolid;\r\n GroupsAppearance.BottomFill.Color := c;\r\n GroupsAppearance.BottomFill.Kind := gfkSolid;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleHeaderFillColorTo(c) then\r\n begin\r\n ColumnsAppearance.TopFill.ColorTo := c;\r\n ColumnsAppearance.TopFill.Kind := gfkGradient;\r\n ColumnsAppearance.BottomFill.ColorTo := c;\r\n ColumnsAppearance.BottomFill.Kind := gfkGradient;\r\n GroupsAppearance.TopFill.ColorTo := c;\r\n GroupsAppearance.TopFill.Kind := gfkGradient;\r\n GroupsAppearance.BottomFill.ColorTo := c;\r\n GroupsAppearance.BottomFill.Kind := gfkGradient;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleSelectionFillColor(c) then\r\n begin\r\n NodesAppearance.SelectedFill.Color := c;\r\n NodesAppearance.SelectedStroke.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleTextFontColor(c) then\r\n begin\r\n NodesAppearance.Font.Color := c;\r\n NodesAppearance.ExtendedFontColor := c;\r\n ColumnsAppearance.TopFont.Color := c;\r\n ColumnsAppearance.BottomFont.Color := c;\r\n GroupsAppearance.TopFont.Color := c;\r\n GroupsAppearance.BottomFont.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleAlternativeTextFontColor(c) then\r\n begin\r\n NodesAppearance.SelectedFontColor := c;\r\n NodesAppearance.SelectedTitleFontColor := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n Fill.Color := c;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.Assign(Source: TPersistent);\r\nbegin\r\n BeginUpdate;\r\n inherited;\r\n if Source is TTMSFNCCustomTreeView then\r\n begin\r\n FNodesAppearance.Assign((Source as TTMSFNCCustomTreeView).NodesAppearance);\r\n FColumnsAppearance.Assign((Source as TTMSFNCCustomTreeView).ColumnsAppearance);\r\n FGroupsAppearance.Assign((Source as TTMSFNCCustomTreeView).GroupsAppearance);\r\n FInteraction.Assign((Source as TTMSFNCCustomTreeView).Interaction);\r\n end;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.BuildDisplay(ACache: TTMSFNCTreeViewCache; ADisplay: TTMSFNCTreeViewDisplayList);\r\nvar\r\n x, y: Double;\r\n I: Integer;\r\n cache: TTMSFNCTreeViewCacheItem;\r\n r, rrt, rrb, rg, grt, grb: TRectF;\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) or not Assigned(ACache) or not Assigned(ADisplay) then\r\n Exit;\r\n\r\n ADisplay.Clear;\r\n\r\n x := -GetHorizontalScrollPosition;\r\n y := -GetVerticalScrollPosition;\r\n if CanApplyVerticalOffset then\r\n y := y + FVerticalOffset;\r\n\r\n r := GetNodesRect;\r\n grt := GetGroupsTopRect;\r\n grb := GetGroupsBottomRect;\r\n rrt := GetColumnsTopRect;\r\n rrb := GetColumnsBottomRect;\r\n for I := 0 to ACache.Count - 1 do\r\n begin\r\n cache := ACache[I];\r\n rg := cache.Rect;\r\n case cache.Kind of\r\n ikNode:\r\n begin\r\n n := cache.Node;\r\n if Assigned(n) then\r\n OffsetNodeRects(n, Int(x), Int(y), rg);\r\n end;\r\n ikGroupTop: OffsetRectEx(rg, int(x) + grt.Left, grt.Top);\r\n ikGroupBottom: OffsetRectEx(rg, int(x) + grb.Left, grb.Top - 1);\r\n ikColumnTop: OffsetRectEx(rg, int(x) + rrt.Left, rrt.Top);\r\n ikColumnBottom: OffsetRectEx(rg, int(x) + rrb.Left, rrb.Top - 1);\r\n end;\r\n\r\n cache.DrawRect := rg;\r\n case cache.Kind of\r\n ikNode:\r\n begin\r\n if RectIntersectsWithEx(rg, r) then\r\n ADisplay.Add(cache);\r\n end;\r\n ikColumnTop:\r\n begin\r\n if RectIntersectsWithEx(rg, rrt) then\r\n ADisplay.Add(cache);\r\n end;\r\n ikColumnBottom:\r\n begin\r\n if RectIntersectsWithEx(rg, rrb) then\r\n ADisplay.Add(cache);\r\n end;\r\n ikGroupTop:\r\n begin\r\n if RectIntersectsWithEx(rg, grt) then\r\n ADisplay.Add(cache);\r\n end;\r\n ikGroupBottom:\r\n begin\r\n if RectIntersectsWithEx(rg, grb) then\r\n ADisplay.Add(cache);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.AutoSizeColumnInternal(ACol: Integer; AUpdate: Boolean = False; ACallEventHandlers: Boolean = False);\r\nvar\r\n I: Integer;\r\n rcalc: TRectF;\r\n v: TTMSFNCTreeViewVirtualNode;\r\n g: TTMSFNCGraphics;\r\n strc, strt: String;\r\n ww, wwt: Boolean;\r\n maxw: Double;\r\n c: Boolean;\r\n colps: Double;\r\n def: Boolean;\r\n col: TTMSFNCTreeViewColumn;\r\n hs: Double;\r\nbegin\r\n if (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n if (ACol >= 0) and (ACol <= ColumnCount - 1) and not ColumnsAppearance.Stretch and NodeListBuild then\r\n begin\r\n hs := GetHorizontalScrollPosition;\r\n maxw := 0;\r\n colps := ColumnPositions[ACol];\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.BitmapContainer := BitmapContainer;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n\r\n try\r\n def := True;\r\n col := nil;\r\n if (ACol >= 0) and (ACol <= Columns.Count - 1) then\r\n begin\r\n col := Columns[ACol];\r\n if not col.UseDefaultAppearance then\r\n def := False;\r\n end;\r\n\r\n if tclTop in ColumnsAppearance.Layouts then\r\n begin\r\n strc := GetColumnText(ACol);\r\n DoGetColumnText(ACol, ikColumnTop, strc);\r\n if def then\r\n g.Font.Assign(ColumnsAppearance.TopFont)\r\n else\r\n g.Font.Assign(col.TopFont);\r\n\r\n rcalc := RectF(0, 0, 10000, 10000);\r\n rcalc := g.CalculateText(strc, rcalc);\r\n rcalc.Right := rcalc.Right + 4;\r\n\r\n if rcalc.Right - rcalc.Left > maxw then\r\n maxw := rcalc.Right - rcalc.Left;\r\n end;\r\n\r\n if tclBottom in ColumnsAppearance.Layouts then\r\n begin\r\n strc := GetColumnText(ACol);\r\n DoGetColumnText(ACol, ikColumnBottom, strc);\r\n if def then\r\n g.Font.Assign(ColumnsAppearance.BottomFont)\r\n else\r\n g.Font.Assign(col.BottomFont);\r\n\r\n rcalc := RectF(0, 0, 10000, 10000);\r\n rcalc := g.CalculateText(strc, rcalc);\r\n rcalc.Right := rcalc.Right + 4;\r\n\r\n if rcalc.Right - rcalc.Left > maxw then\r\n maxw := rcalc.Right - rcalc.Left;\r\n end;\r\n\r\n for I := StartRow to StopRow do\r\n begin\r\n v := GetNodeForRow(I);\r\n if Assigned(v) then\r\n begin\r\n strc := '';\r\n DoGetNodeText(v, ACol, tntmDrawing, strc);\r\n ww := False;\r\n if (ACol >= 0) and (ACol <= Columns.Count - 1) then\r\n ww := Columns[ACol].WordWrapping;\r\n\r\n DoGetNodeWordWrapping(v, ACol, ww);\r\n\r\n rcalc := RectF(0, 0, 10000, 10000);\r\n rcalc := g.CalculateText(strc, rcalc);\r\n rcalc.Right := rcalc.Right + 4;\r\n\r\n if ACol <= Length(v.BitmapRects) - 1 then\r\n rcalc.Right := rcalc.Right + v.BitmapRects[ACol].Right + hs - colps + 3;\r\n\r\n if rcalc.Right - rcalc.Left > maxw then\r\n maxw := rcalc.Right - rcalc.Left;\r\n\r\n strt := '';\r\n DoGetNodeTitle(v, ACol, tntmDrawing, strt);\r\n wwt := False;\r\n if (ACol >= 0) and (ACol <= Columns.Count - 1) then\r\n wwt := Columns[ACol].TitleWordWrapping;\r\n\r\n DoGetNodeTitleWordWrapping(v, ACol, wwt);\r\n\r\n rcalc := RectF(0, 0, 10000, 10000);\r\n rcalc := g.CalculateText(strt, rcalc);\r\n rcalc.Right := rcalc.Right + 4;\r\n\r\n if ACol <= Length(v.BitmapRects) - 1 then\r\n rcalc.Right := rcalc.Right + v.BitmapRects[ACol].Right + hs - colps + 3;\r\n\r\n if rcalc.Right - rcalc.Left > maxw then\r\n maxw := rcalc.Right - rcalc.Left;\r\n end;\r\n end;\r\n finally\r\n g.Free;\r\n end;\r\n\r\n maxw := Int(maxw);\r\n\r\n c := True;\r\n if ACallEventHandlers then\r\n DoBeforeSizeColumn(ACol, ColumnWidths[ACol], maxw, c);\r\n\r\n if c then\r\n begin\r\n ColumnWidths[ACol] := maxw;\r\n if ACallEventHandlers then\r\n DoAfterSizeColumn(ACol, maxw);\r\n\r\n if AUpdate then\r\n begin\r\n UpdateTreeView;\r\n Invalidate;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.CloseInplaceEditor(ACancel: Boolean);\r\nvar\r\n {$IFNDEF LCLWEBLIB}\r\n AContext: TRttiContext;\r\n rt: TRttiType;\r\n propt: TRttiProperty;\r\n {$ENDIF}\r\n str: String;\r\n b, c: Boolean;\r\n n: String;\r\n {$IFDEF FMXLIB}\r\n propi: TRttiProperty;\r\n li: TListBoxItem;\r\n obj: TObject;\r\n {$ENDIF}\r\nbegin\r\n if FClosing then\r\n Exit;\r\n\r\n FClosing := True;\r\n if Assigned(FUpdateNode) and (FUpdateNodeColumn <> -1) and Assigned(FInplaceEditor) then\r\n begin\r\n if not ACancel then\r\n begin\r\n {$IFNDEF LCLWEBLIB}\r\n AContext := TRttiContext.Create;\r\n {$ENDIF}\r\n try\r\n n := '';\r\n {$IFNDEF LCLWEBLIB}\r\n rt := AContext.GetType(FInplaceEditor.ClassInfo);\r\n propt := rt.GetProperty('Text');\r\n if Assigned(Propt) then\r\n str := propt.GetValue(FInplaceEditor).AsString\r\n else\r\n {$ENDIF}\r\n begin\r\n {$IFDEF FMXLIB}\r\n propi := rt.GetProperty('Selected');\r\n if Assigned(propi) then\r\n begin\r\n obj := propi.GetValue(FInplaceEditor).AsObject;\r\n if Assigned(obj) and (obj is TListBoxItem) then\r\n begin\r\n li := obj as TListBoxItem;\r\n if Assigned(li) then\r\n str := li.Text;\r\n end;\r\n end;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFDEF LCLWEBLIB}\r\n if FInplaceEditor is TEdit then\r\n str := (FInplaceEditor as TEdit).Text\r\n else if FInplaceEditor is TComboBox then\r\n str := (FInplaceEditor as TComboBox).Text\r\n else if FInplaceEditor is TMemo then\r\n str := (FInplaceEditor as TMemo).Text;\r\n {$ENDIF}\r\n\r\n n := str;\r\n finally\r\n {$IFNDEF LCLWEBLIB}\r\n AContext.Free;\r\n {$ENDIF}\r\n end;\r\n end;\r\n\r\n c := True;\r\n DoCloseInplaceEditor(FUpdateNode, FUpdateNodeColumn, FInplaceEditor, ACancel, c);\r\n if c then\r\n begin\r\n b := True;\r\n DoBeforeUpdateNode(FUpdateNode, FUpdateNodeColumn, n, b);\r\n if b and not ACancel then\r\n begin\r\n UpdateCount := UpdateCount + 1;\r\n if Assigned(FUpdateNode.Node) then\r\n FUpdateNode.Node.Text[FUpdateNodeColumn] := n;\r\n DoUpdateNodeText(FUpdateNode, FUpdateNodeColumn, n);\r\n UpdateCount := UpdateCount - 1;\r\n\r\n DoAfterUpdateNode(FUpdateNode, FUpdateNodeColumn);\r\n DoNodeChanged(FUpdateNode);\r\n end;\r\n\r\n FInplaceEditor.Parent := nil;\r\n {$IFDEF FMXLIB}\r\n FInplaceEditorTimer.Enabled := True;\r\n while FInplaceEditorTimer.Enabled do\r\n Application.ProcessMessages;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FInplaceEditor.Free;\r\n {$ENDIF}\r\n FInplaceEditor := nil;\r\n FInplaceEditorActive := False;\r\n end;\r\n\r\n ResetNodes(False);\r\n UpdateTreeView;\r\n Invalidate;\r\n if CanFocus then\r\n SetFocus;\r\n end;\r\n FClosing := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SelectVirtualNodes(ANodes: TTMSFNCTreeViewVirtualNodeArray);\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\n en: Boolean;\r\nbegin\r\n FSelectedNodes.Clear;\r\n for I := 0 to Length(ANodes) - 1 do\r\n begin\r\n v := ANodes[I];\r\n if Assigned(v) then\r\n begin\r\n en := IsVirtualNodeSelectable(v);\r\n if en then\r\n FSelectedNodes.Add(v);\r\n end;\r\n end;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SelectNodes(ANodes: TTMSFNCTreeViewNodeArray);\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewNode;\r\n en: Boolean;\r\nbegin\r\n FSelectedNodes.Clear;\r\n for I := 0 to Length(ANodes) - 1 do\r\n begin\r\n v := ANodes[I];\r\n if Assigned(v) then\r\n begin\r\n en := IsVirtualNodeSelectable(TTMSFNCTreeViewNodeOpen(v).VirtualNode);\r\n\r\n if en then\r\n FSelectedNodes.Add(TTMSFNCTreeViewNodeOpen(v).VirtualNode);\r\n end;\r\n end;\r\n\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SelectVirtualNode(ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n en: Boolean;\r\nbegin\r\n FSelectedNodes.Clear;\r\n if Assigned(ANode) then\r\n begin\r\n en := IsVirtualNodeSelectable(ANode);\r\n if en then\r\n begin\r\n FSelectedNodes.Add(ANode);\r\n FFocusedNode := ANode;\r\n InternalSelectVirtualNode(ANode);\r\n end;\r\n end;\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsAnimating: Boolean;\r\nbegin\r\n Result := (FAnimateTimer.Enabled = True) and FAnimating;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsDragDropActive: Boolean;\r\nbegin\r\n Result := FDragMode and (Interaction.DragDropMode <> tdmNone);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsEditing: Boolean;\r\nbegin\r\n Result := FInplaceEditorActive;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsNodeSelectable(\r\n ANode: TTMSFNCTreeViewNode): Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(ANode) then\r\n Result := IsVirtualNodeSelectable(TTMSFNCTreeViewNodeOpen(ANode).VirtualNode);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsNodeSelected(ANode: TTMSFNCTreeViewNode): Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(ANode) then\r\n Result := IsVirtualNodeSelected(TTMSFNCTreeViewNodeOpen(ANode).VirtualNode);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsReorderActive: Boolean;\r\nbegin\r\n Result := FReorderMode and Interaction.Reorder;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsVariableNodeHeight: Boolean;\r\nbegin\r\n Result := NodesAppearance.HeightMode = tnhmVariable;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsVirtualNodeSelectable(\r\n ANode: TTMSFNCTreeViewVirtualNode): Boolean;\r\nvar\r\n ext: Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(ANode) then\r\n begin\r\n DoIsNodeEnabled(ANode, Result);\r\n ext := False;\r\n DoIsNodeExtended(ANode, ext);\r\n if (ext and not Interaction.ExtendedSelectable) or not (VisibleNodes.IndexOf(ANode) > -1) then\r\n Result := False;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.IsVirtualNodeSelected(ANode: TTMSFNCTreeViewVirtualNode): Boolean;\r\nbegin\r\n Result := FSelectedNodes.IndexOf(ANode) > -1;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SelectAllNodes;\r\nbegin\r\n SelectAllVirtualNodes;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SelectAllVirtualNodes;\r\nvar\r\n I: Integer;\r\n n: TTMSFNCTreeViewVirtualNode;\r\n en: Boolean;\r\nbegin\r\n FSelectedNodes.Clear;\r\n for I := 0 to VisibleNodes.Count - 1 do\r\n begin\r\n n := VisibleNodes[I];\r\n if Assigned(n) then\r\n begin\r\n en := IsVirtualNodeSelectable(n);\r\n\r\n if en then\r\n FSelectedNodes.Add(n);\r\n end;\r\n end;\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.SelectedNodeCount: Integer;\r\nbegin\r\n Result := SelectedVirtualNodeCount;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.SelectedVirtualNodeCount: Integer;\r\nbegin\r\n Result := FSelectedNodes.Count;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SelectNode(ANode: TTMSFNCTreeViewNode);\r\nbegin\r\n if Assigned(ANode) then\r\n SelectVirtualNode(TTMSFNCTreeViewNodeOpen(ANode).VirtualNode)\r\n else\r\n SelectVirtualNode(nil);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SelectVirtualNodeByRow(ARow: Integer);\r\nbegin\r\n SelectVirtualNode(GetNodeForRow(ARow));\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.RemoveSelectedVirtualNodes;\r\nvar\r\n I: Integer;\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n BlockUpdate := True;\r\n for I := SelectedVirtualNodeCount - 1 downto 0 do\r\n begin\r\n n := SelectedVirtualNodes[I];\r\n FSelectedNodes.Remove(n);\r\n RemoveVirtualNode(n);\r\n end;\r\n BlockUpdate := False;\r\n\r\n ResetNodes(False);\r\n UpdateTreeView;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.RemoveSelectedNodes;\r\nvar\r\n I: Integer;\r\n n: TTMSFNCTreeViewNode;\r\nbegin\r\n BlockUpdate := True;\r\n for I := SelectedNodeCount - 1 downto 0 do\r\n begin\r\n n := SelectedNodes[I];\r\n FSelectedNodes.Remove(TTMSFNCTreeViewNodeOpen(n).VirtualNode);\r\n RemoveNode(n);\r\n end;\r\n BlockUpdate := False;\r\n\r\n ResetNodes(False);\r\n UpdateTreeView;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateInplaceEditorPosition;\r\nvar\r\n r: TRectF;\r\n {$IFDEF CMNWEBLIB}\r\n rt: TRect;\r\n {$ENDIF}\r\nbegin\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) then\r\n Exit;\r\n\r\n if Assigned(FUpdateNode) and (FUpdateNodeColumn <> -1) and Assigned(FInplaceEditor) and FInplaceEditorActive then\r\n begin\r\n if (FUpdateNode.Row >= StartRow) and (FUpdateNode.Row <= StopRow) then\r\n begin\r\n r := GetInplaceEditorRect(FUpdateNode, FUpdateNodeColumn);\r\n FInplaceEditor.Parent := Self;\r\n FInplaceEditor.Visible := False;\r\n if Assigned(FInplaceEditor) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n FInplaceEditor.BoundsRect := r;\r\n FInplaceEditor.BoundsRect := RectF(r.Left, r.Top + (r.Bottom - r.Top - FInplaceEditor.Height) / 2, r.Right, r.Top + (r.Bottom - r.Top - FInplaceEditor.Height) / 2 + FInplaceEditor.Height);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n rt := Rect(Round(r.Left), Round(r.Top), Round(r.Right), Round(r.Bottom));\r\n FInplaceEditor.BoundsRect := rt;\r\n FInplaceEditor.BoundsRect := Rect(rt.Left, rt.Top + (rt.Bottom - rt.Top - FInplaceEditor.Height) div 2, rt.Right, rt.Top + (rt.Bottom - rt.Top - FInplaceEditor.Height) div 2 + FInplaceEditor.Height);\r\n {$ENDIF}\r\n FInplaceEditor.Visible := True;\r\n end;\r\n end\r\n else\r\n FInplaceEditor.Parent := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState;\r\n X, Y: Single);\r\nvar\r\n dc: TTMSFNCTreeViewCacheItem;\r\nbegin\r\n inherited;\r\n if (Button = {$IFNDEF WEBLIB}TTMSFNCMouseButton.{$ENDIF}mbRight) or BlockUserInput or BlockMouseClick then\r\n Exit;\r\n\r\n CaptureEx;\r\n\r\n FDragMode := False;\r\n FDragModeStarted := False;\r\n FReorderMode := False;\r\n FDragNode := nil;\r\n\r\n if not FDblClicked then\r\n begin\r\n if CanFocus then\r\n SetFocus;\r\n\r\n if FInplaceEditorActive then\r\n CloseInplaceEditor(False);\r\n end;\r\n\r\n dc := XYToCacheItem(X, Y);\r\n FDownNode := nil;\r\n if Assigned(dc) then\r\n begin\r\n FDownNode := dc.Node;\r\n if FSelectedNodes.IndexOf(FDownNode) > -1 then\r\n begin\r\n FDragNode := FDownNode;\r\n FDragMode := Assigned(FDownNode) and (Interaction.DragDropMode <> tdmNone) and not FDblClicked and not XYToNodeExpand(FDownNode, X, Y)\r\n and not XYToNodeExtra(FDownNode, X, Y) and not XYToNodeTitleExtra(FDownNode, X, Y) and not Assigned(XYToNodeCheck(FDownNode, X, Y).ANode);\r\n FReorderMode := Assigned(FDownNode) and Interaction.Reorder and not FDragMode and not FDblClicked and not XYToNodeExpand(FDownNode, X, Y)\r\n and not XYToNodeExtra(FDownNode, X, Y) and not XYToNodeTitleExtra(FDownNode, X, Y) and not Assigned(XYToNodeCheck(FDownNode, X, Y).ANode);\r\n if FReorderMode then\r\n begin\r\n CreateDragBitmap;\r\n FSaveDragY := FDragBitmap.Top;\r\n end;\r\n end;\r\n end;\r\n\r\n if FDragMode then\r\n begin\r\n if CanStartDragFromMouseDown then\r\n begin\r\n FDragModeStarted := True;\r\n HandleDragStart(X, Y);\r\n BeginDrag;\r\n end;\r\n IsMouseDown := not FDblClicked;\r\n end\r\n else\r\n begin\r\n if Assigned(FDownNode) then\r\n begin\r\n FDoNodeExpand := XYToNodeExpand(FDownNode, X, Y);\r\n FDoNodeCheck := XYToNodeCheck(FDownNode, X, Y);\r\n FDoNodeAnchor := XYToNodeAnchor(FDownNode, X, Y);\r\n FDoNodeTitleAnchor := XYToNodeTitleAnchor(FDownNode, X, Y);\r\n FDoNodeExtra := XYToNodeExtra(FDownNode, X, Y);\r\n FDoNodeTitleExtra := XYToNodeTitleExtra(FDownNode, X, Y);\r\n end;\r\n\r\n FSizeColumn := -1;\r\n if Interaction.ColumnSizing then\r\n begin\r\n FSizeColumn := XYToColumnSize(X, Y);\r\n if (FSizeColumn >= 0) and (FSizeColumn <= ColumnCount - 1) then\r\n FColumnSize := ColumnWidths[FSizeColumn];\r\n end;\r\n\r\n FDownColumn := XYToColumn(X, Y);\r\n FDownColumnFilter := XYToColumnFilter(X, Y);\r\n FDownColumnExpand := XYToColumnExpand(X, Y);\r\n IsMouseDown := not FDblClicked;\r\n FTimeStart := GetTickCountX;\r\n FTimeStop := FTimeStart;\r\n FScrollVTo := GetVScrollValue;\r\n FScrollHTo := GetHScrollValue;\r\n FScrollX := X;\r\n FScrollY := Y;\r\n FDownX := X;\r\n FDownY := Y;\r\n FMouseX := X;\r\n FMouseY := Y;\r\n FSizeX := X;\r\n FDragY := Y;\r\n FVerticalOffset := 0;\r\n FVerticalOffsetTo := 0;\r\n FMouseUp := False;\r\n FDoubleSelection := not FAnimateTimer.Enabled;\r\n FScrolling := False;\r\n end;\r\n FDblClicked := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleMouseMove(Shift: TShiftState; X, Y: Single);\r\nvar\r\n f: Double;\r\n it: TTMSFNCTreeViewVirtualNode;\r\n doscroll: Boolean;\r\n dsp: TTMSFNCTreeViewCacheItem;\r\n sc: Integer;\r\n c: Boolean;\r\n colsz, newcolsz, newposy: Double;\r\n r: TRectF;\r\n n: TTMSFNCTreeViewVirtualNode;\r\n su, sd: Boolean;\r\nbegin\r\n inherited;\r\n\r\n if BlockUserInput or (FAnimating and not IsMouseDown) then\r\n Exit;\r\n\r\n FY := Y;\r\n FX := X;\r\n\r\n if IsMouseDown and FDragMode and CanStartDragFromMouseMove and ((Abs(FY - FDownY) > DRAGMARGIN) or (Abs(FX - FDownX) > DRAGMARGIN)) then\r\n begin\r\n if not FDragModeStarted then\r\n HandleDragStart(X, Y);\r\n\r\n FDragModeStarted := True;\r\n if AlternativeDragDrop then\r\n HandleAlternativeDragOver(X, Y)\r\n else\r\n BeginDrag;\r\n Exit;\r\n end;\r\n\r\n if FReorderMode and Assigned(FDragBitmap) and Interaction.Reorder then\r\n begin\r\n r := GetContentClipRect;\r\n newposy := FSaveDragY + (FY - FDragY);\r\n if (newposy <= r.Top + (r.Bottom - r.Top) - FDragBitmap.Height) and (newposy >= r.Top) then\r\n begin\r\n FDragBitmap.Top := Round(Max(r.Top, Min(r.Top + (r.Bottom - r.Top) - FDragBitmap.Height, newposy)));\r\n FSaveDragY := FDragBitmap.Top;\r\n FDragTimer.Enabled := False;\r\n if (newposy > r.Top) and (newposy < r.Top + (r.Right - r.Left)) then\r\n begin\r\n n := XYToNode((r.Right - r.Left) / 2, newposy);\r\n if Assigned(n) then\r\n FDragRow := n.Row;\r\n end;\r\n end\r\n else if (newposy > r.Top + (r.Bottom - r.Top) - FDragBitmap.Height) then\r\n begin\r\n FDragBitmap.Top := Round(r.Top + (r.Bottom - r.Top) - FDragBitmap.Height);\r\n FSaveDragY := newposy;\r\n FDragTimer.Enabled := True;\r\n end\r\n else if (newposy < r.Top) then\r\n begin\r\n FDragBitmap.Top := Round(r.Top);\r\n FSaveDragY := newposy;\r\n FDragTimer.Enabled := True;\r\n end;\r\n\r\n FDragY := FY;\r\n Exit;\r\n end;\r\n\r\n if (FSizeColumn >= 0) and (FSizeColumn <= ColumnCount - 1) then\r\n begin\r\n c := True;\r\n colsz := FColumnSize;\r\n FColumnSize := colsz + (X - FSizeX);\r\n newcolsz := Max(0, FColumnSize);\r\n FSizeX := X;\r\n DoBeforeSizeColumn(FSizeColumn, colsz, newcolsz, c);\r\n if c then\r\n begin\r\n ColumnWidths[FSizeColumn] := newcolsz;\r\n if (FSizeColumn >= 0) and (FSizeColumn <= Columns.Count - 1) then\r\n Columns[FSizeColumn].UpdateWidth(newcolsz);\r\n\r\n DoAfterSizeColumn(FSizeColumn, newcolsz);\r\n ResetNodes(True);\r\n UpdateTreeView;\r\n Invalidate;\r\n end;\r\n Exit;\r\n end;\r\n\r\n if IsMouseDown and not (FDoNodeAnchor.AAnchor <> '') and not (FDoNodeTitleAnchor.AAnchor <> '') then\r\n begin\r\n doscroll := not FDoNodeExpand and not Assigned(FDoNodeCheck.ANode);\r\n if doscroll then\r\n begin\r\n f := 1;\r\n case ScrollMode of\r\n smNodeScrolling: f := 0.1;\r\n end;\r\n\r\n c := True;\r\n if ScrollLimitation and (Abs(Y - FMouseY) < 5) then\r\n c := Abs(X - FMouseX) < 5;\r\n\r\n if (FScrolling or (Abs(FMouseX - X) > 3) or (Abs(FMouseY - Y) > 3)) and Interaction.TouchScrolling and c then\r\n begin\r\n FDragTimer.Enabled := False;\r\n if (Abs(X - FDownX) > SCROLLINGDELAY) or (Abs(Y - FDownY) > SCROLLINGDELAY) then\r\n begin\r\n FScrolling := True;\r\n FDoubleSelection := False;\r\n if IsMouseDown and not FMouseUp then\r\n begin\r\n su := CanScrollUp;\r\n sd := CanScrollDown;\r\n if (su and (Y - FDownY > 0)) or (sd and (Y - FDownY < 0)) and (FVerticalOffset = 0) then\r\n begin\r\n FVerticalOffset := 0;\r\n Scroll(GetHScrollValue - (X - FDownX) * f, GetVScrollValue - (Y - FDownY) * f)\r\n end\r\n else if CanApplyVerticalOffset then\r\n begin\r\n FVerticalOffset := Min(75, Max(-75, FVerticalOffset + (Y - FDownY)));\r\n UpdateDisplay;\r\n end;\r\n\r\n FDownY := Y;\r\n FDownX := X;\r\n end;\r\n end;\r\n end\r\n end\r\n end\r\n else\r\n begin\r\n it := nil;\r\n dsp := XYToCacheItem(X, Y);\r\n if Assigned(dsp) then\r\n it := dsp.Node;\r\n\r\n if Assigned(it) and Assigned(dsp) then\r\n begin\r\n if (XYToNodeAnchor(it, X, Y).AAnchor <> '') or (XYToNodeTitleAnchor(it, X, Y).AAnchor <> '') then\r\n Cursor := crHandPoint\r\n else\r\n Cursor := crDefault;\r\n end\r\n else\r\n begin\r\n if Interaction.ColumnSizing then\r\n begin\r\n sc := XYToColumnSize(X, Y);\r\n if (sc >= 0) and (sc <= ColumnCount - 1) then\r\n Cursor := crSizeWE\r\n else\r\n Cursor := crDefault;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState;\r\n X, Y: Single);\r\nvar\r\n f: Double;\r\n a: TTMSFNCTreeViewNodeAnchor;\r\n en, d, dosel, ext: Boolean;\r\n I: Integer;\r\n t: Integer;\r\n dn, prev: TTMSFNCTreeViewVirtualNode;\r\n b: Boolean;\r\n sz: Integer;\r\nbegin\r\n inherited;\r\n\r\n if (Button = {$IFNDEF WEBLIB}TTMSFNCMouseButton.{$ENDIF}mbRight) or BlockUserInput then\r\n Exit;\r\n\r\n ReleaseCaptureEx;\r\n\r\n if FDragMode and FDragModeStarted and AlternativeDragDrop then\r\n begin\r\n HandleAlternativeDragDrop(X, Y);\r\n DestroyDragBitmap;\r\n Cursor := crDefault; \r\n end;\r\n\r\n sz := FSizeColumn;\r\n FSizeColumn := -1;\r\n FDragTimer.Enabled := False;\r\n\r\n if not IsMouseDown then\r\n Exit;\r\n\r\n if FReorderMode and Interaction.Reorder then\r\n begin\r\n dn := XYToNode(X, Y);\r\n if Assigned(OnCustomReorder) then\r\n OnCustomReorder(Self, FDragNode, dn)\r\n else\r\n begin\r\n if Assigned(dn) and (dn <> FDragNode) and Assigned(dn.Node) and Assigned(FDragNode.Node) then\r\n begin\r\n b := True;\r\n DoBeforeReorderNode(FDragNode, dn, b);\r\n if b then\r\n begin\r\n if FDragNode.Level = dn.Level then\r\n FDragNode.Node.MoveTo(dn.Node.GetParent, dn.Node.Index);\r\n DoAfterReorderNode(FDragNode, dn);\r\n end;\r\n end;\r\n end;\r\n\r\n DestroyDragBitmap;\r\n FDragNode := nil;\r\n end;\r\n\r\n f := 1;\r\n case ScrollMode of\r\n smNodeScrolling: f := 0.1;\r\n end;\r\n\r\n IsMouseDown := False;\r\n FMouseUp := True;\r\n FScrolling := False;\r\n\r\n if FDownColumnFilter <> -1 then\r\n HandleFilter(FDownColumnFilter)\r\n else if FDownColumnExpand <> -1 then\r\n HandleExpand(FDownColumnExpand)\r\n else if (FDownColumn <> -1) and (sz = -1) then\r\n begin\r\n if (FDownColumn >= 0) and (FDownColumn <= ColumnCount - 1) then\r\n begin\r\n if (Columns[FDownColumn].Sorting <> tcsNone) then\r\n begin\r\n case TTMSFNCTreeViewColumnOpen(Columns[FDownColumn]).SortKind of\r\n nskNone, nskAscending:\r\n begin\r\n InitializeColumnSorting(FDownColumn, nsmDescending);\r\n if Assigned(OnCustomColumnSort) then\r\n OnCustomColumnSort(Self, FDownColumn, nsmDescending)\r\n else\r\n Nodes.Sort(FDownColumn, Columns[FDownColumn].Sorting in [tcsRecursive, tcsRecursiveCaseSensitive], Columns[FDownColumn].Sorting in [tcsNormalCaseSensitive, tcsRecursiveCaseSensitive], nsmDescending);\r\n end;\r\n nskDescending:\r\n begin\r\n InitializeColumnSorting(FDownColumn, nsmAscending);\r\n if Assigned(OnCustomColumnSort) then\r\n OnCustomColumnSort(Self, FDownColumn, nsmAscending)\r\n else\r\n Nodes.Sort(FDownColumn, Columns[FDownColumn].Sorting in [tcsRecursive, tcsRecursiveCaseSensitive], Columns[FDownColumn].Sorting in [tcsNormalCaseSensitive, tcsRecursiveCaseSensitive], nsmAscending);\r\n end;\r\n end;\r\n end;\r\n end;\r\n end\r\n else if not FReorderMode and not FDragModeStarted then\r\n begin\r\n if not FDoNodeExpand and not FDoNodeExtra and not FDoNodeTitleExtra and not Assigned(FDoNodeCheck.ANode) and not (FDoNodeAnchor.AAnchor <> '') and not (FDoNodeTitleAnchor.AAnchor <> '') then\r\n begin\r\n if not FDoubleSelection and Interaction.TouchScrolling then\r\n begin\r\n FTimeStop := GetTickCountX;\r\n if (FVerticalOffset = 0) and ((FTimeStop - FTimeStart) < SWIPECOUNT) and ((FTimeStop - FTimeStart) > 0) then\r\n begin\r\n FSpY := Abs(Y - FScrollY) / (FTimeStop - FTimeStart);\r\n if (FSpY > 0) then\r\n begin\r\n if (Y - FScrollY) > 0 then\r\n FScrollVTo := Max(0, Min(VerticalScrollBar.Max - GetVViewportSize, FScrollVTo - Round(Abs(Y - FScrollY) * FSpY * f * 3)))\r\n else\r\n FScrollVTo := Max(0, Min(VerticalScrollBar.Max - GetVViewportSize, FScrollVTo + Round(Abs(Y - FScrollY) * FSpY * f * 3)));\r\n\r\n FAnimateVerticalPos := True;\r\n FAnimateTimer.Enabled := True;\r\n end;\r\n\r\n FSpX := Abs(X - FScrollX) / (FTimeStop - FTimeStart);\r\n if (FSpX > 0) then\r\n begin\r\n if (X - FScrollX) > 0 then\r\n FScrollHTo := Max(0, Min(HorizontalScrollBar.Max - GetHViewportSize, FScrollHTo - Round(Abs(X - FScrollX) * FSpX * f * 3)))\r\n else\r\n FScrollHTo := Max(0, Min(HorizontalScrollBar.Max - GetHViewportSize, FScrollHTo + Round(Abs(X - FScrollX) * FSpX * f * 3)));\r\n\r\n FAnimateHorizontalPos := True;\r\n FAnimateTimer.Enabled := True;\r\n end;\r\n end\r\n else if CanApplyVerticalOffset then\r\n begin\r\n if NeedsReload(FVerticalOffset) then\r\n StartReload;\r\n\r\n StartVerticalOffsetAnimation;\r\n end;\r\n end\r\n else\r\n begin\r\n if Assigned(FDownNode) and not BlockMouseClick then\r\n begin\r\n en := IsVirtualNodeSelectable(FDownNode);\r\n prev := FFocusedNode;\r\n dosel := en;\r\n\r\n if en then\r\n begin\r\n if (ssShift in Shift) then\r\n begin\r\n if Assigned(FFocusedNode) then\r\n begin\r\n if FFocusedNode.Row <= FDownNode.Row then\r\n begin\r\n for I := FFocusedNode.Row + 1 to FDownNode.Row do\r\n HandleSelectNode(GetNodeFromNodeStructure(I), True, False, {$IFNDEF FMXMOBILE}(ssShift in Shift) and {$ENDIF} Interaction.MultiSelect);\r\n end\r\n else\r\n begin\r\n for I := FFocusedNode.Row - 1 downto FDownNode.Row do\r\n HandleSelectNode(GetNodeFromNodeStructure(I), True, False, {$IFNDEF FMXMOBILE}(ssShift in Shift) and {$ENDIF} Interaction.MultiSelect);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n if Interaction.MultiSelect then\r\n begin\r\n if IsVirtualNodeSelected(FDownNode) and Interaction.MultiSelect then\r\n UnSelectVirtualNode(FDownNode)\r\n else\r\n HandleSelectNode(FDownNode, True, False, Interaction.MultiSelect)\r\n end\r\n else\r\n begin\r\n {$ENDIF}\r\n if not (ssCtrl in Shift) and not (ssCommand in Shift) and (FSelectedNodes.Count > 0) then\r\n UnSelectVirtualNode(FDownNode);\r\n\r\n HandleSelectNode(FDownNode, True, False, ((ssCtrl in Shift) or (ssCommand in Shift)) and Interaction.MultiSelect);\r\n {$IFDEF FMXMOBILE}\r\n end;\r\n {$ENDIF}\r\n end;\r\n end;\r\n\r\n if dosel then\r\n FFocusedNode := FDownNode;\r\n\r\n if not FCompactMode and ((Interaction.MouseEditMode = tmemSingleClick) or ((Interaction.MouseEditMode = tmemSingleClickOnSelectedNode) and (FDownNode = prev))) and not Interaction.ReadOnly then\r\n begin\r\n if Assigned(FDownNode) then\r\n begin\r\n ext := False;\r\n DoIsNodeExtended(FDownNode, ext);\r\n d := True;\r\n DoIsNodeEnabled(FDownNode, d);\r\n if ((ext and Interaction.ExtendedSelectable and Interaction.ExtendedEditable) or not ext) and d then\r\n begin\r\n t := XYToNodeTextColumn(FDownNode, X, Y);\r\n if (t <> -1) and FDownNode.TitleExpanded[t] then\r\n begin\r\n HandleNodeEditing(FDownNode, t);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n Invalidate;\r\n end\r\n end\r\n end\r\n else if not FCompactMode then \r\n begin\r\n if FDoNodeExpand then\r\n HandleNodeToggle(FDownNode)\r\n else if FDoNodeExtra then\r\n HandleNodeExtra(FDownNode)\r\n else if FDoNodeTitleExtra then\r\n HandleNodeTitleExtra(FDownNode)\r\n else if Assigned(FDoNodeCheck.ANode) and not Interaction.ReadOnly then\r\n HandleNodeToggleCheck(FDownNode, FDoNodeCheck.AColumn)\r\n else\r\n begin\r\n a := XYToNodeAnchor(FDownNode, X, Y);\r\n if a.AAnchor <> '' then\r\n DoNodeAnchorClick(FDownNode, a.AColumn, a.AAnchor);\r\n\r\n a := XYToNodeTitleAnchor(FDownNode, X, Y);\r\n if a.AAnchor <> '' then\r\n DoNodeTitleAnchorClick(FDownNode, a.AColumn, a.AAnchor);\r\n end;\r\n end;\r\n end;\r\n\r\n FDoNodeExpand := False;\r\n FDoNodeExtra := False;\r\n FDoNodeTitleExtra := False;\r\n FDoNodeAnchor.AAnchor := '';\r\n FDoNodeAnchor.AColumn := -1;\r\n FDoNodeTitleAnchor.AAnchor := '';\r\n FDoNodeTitleAnchor.AColumn := -1;\r\n FDownColumn := -1;\r\n FDownColumnFilter := -1;\r\n FDownColumnExpand := -1;\r\n FReorderMode := False;\r\n FDragMode := False;\r\n FDragModeStarted := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleMouseWheel(Shift: TShiftState; WheelDelta: Integer;\r\n var Handled: Boolean);\r\nvar\r\n vpos, hpos: Double;\r\n sz: Single;\r\n R: Integer;\r\n nd: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n inherited;\r\n if BlockUserInput then\r\n Exit;\r\n\r\n vpos := GetVScrollValue;\r\n hpos := GetHScrollValue;\r\n\r\n if WheelDelta > 0 then\r\n R := StartRow - 1\r\n else\r\n R := StartRow;\r\n\r\n nd := GetNodeForRow(R);\r\n\r\n if Assigned(nd) then\r\n begin\r\n if WheelDelta > 0 then\r\n begin\r\n sz := nd.Height;\r\n Scroll(hpos, vpos - sz)\r\n end\r\n else\r\n begin\r\n sz := nd.Height;\r\n Scroll(hpos, vpos + sz);\r\n end;\r\n end\r\n else\r\n Scroll(hpos, 0);\r\n\r\n Handled := True;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateGroupCache(ACache: TTMSFNCTreeViewCache);\r\nvar\r\n h: Double;\r\n I: Integer;\r\n grp: TTMSFNCTreeViewDisplayGroup;\r\n x, y, bw, bh: Double;\r\n rt, rc: TRectF;\r\n cache: TTMSFNCTreeViewCacheItem;\r\nbegin\r\n inherited;\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) or (ColumnCount = 0) or (DisplayGroups.Count = 0) or not Assigned(ACache) then\r\n Exit;\r\n\r\n ACache.Clear;\r\n\r\n if (ACache is TTMSFNCTreeViewGroupsTopCache) and (not (tglTop in GroupsAppearance.Layouts) or (GroupsAppearance.TopSize <= 0)) then\r\n Exit;\r\n\r\n if (ACache is TTMSFNCTreeViewGroupsBottomCache) and (not (tglBottom in GroupsAppearance.Layouts) or (GroupsAppearance.BottomSize <= 0)) then\r\n Exit;\r\n\r\n if ACache is TTMSFNCTreeViewGroupsTopCache then\r\n h := GetGroupsTopSize + 1\r\n else\r\n h := GetGroupsBottomSize + 1;\r\n\r\n for I := 0 to DisplayGroups.Count - 1 do\r\n begin\r\n grp := DisplayGroups[I];\r\n {$IFDEF FMXWEBLIB}\r\n y := 0;\r\n x := Int(ColumnPositions[grp.StartColumn]);\r\n bh := h;\r\n bw := Int(ColumnPositions[grp.EndColumn + 1] - x);\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n y := 0;\r\n x := ColumnPositions[grp.StartColumn];\r\n bh := h;\r\n bw := ColumnPositions[grp.EndColumn + 1] - x;\r\n {$ENDIF}\r\n\r\n if (bw <= 0) or (bh <= 0) then\r\n Continue;\r\n\r\n rt := RectF(0, 0, bw, bh);\r\n\r\n {$IFDEF FMXWEBLIB}\r\n rc.Top := int(rt.Top) + 0.5;\r\n rc.Bottom := int(rt.Bottom) - 0.5;\r\n rc.Left := int(rt.Left) + 0.5;\r\n rc.Right := int(rt.Right) + 0.5;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n rc.Top := rt.Top;\r\n rc.Bottom := rt.Bottom;\r\n rc.Left := rt.Left;\r\n rc.Right := rt.Right + 1;\r\n {$ENDIF}\r\n\r\n OffsetRectEx(rc, x, y);\r\n if ACache is TTMSFNCTreeViewGroupsTopCache then\r\n cache := TTMSFNCTreeViewCacheItem.CreateGroupTop(rc, I, grp.StartColumn, grp.EndColumn)\r\n else\r\n cache := TTMSFNCTreeViewCacheItem.CreateGroupBottom(rc, I, grp.StartColumn, grp.EndColumn);\r\n\r\n ACache.Add(cache);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateGroupsCache;\r\nbegin\r\n UpdateGroupCache(FGroupsTopCache);\r\n UpdateGroupCache(FGroupsBottomCache);\r\n UpdateGroupsDisplay;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateGroupsDisplay;\r\nbegin\r\n BuildDisplay(FGroupsTopCache, FGroupsTopDisplay);\r\n BuildDisplay(FGroupsBottomCache, FGroupsBottomDisplay);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.CanApplyVerticalOffset: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.CancelEditing;\r\nbegin\r\n if FInplaceEditorActive then\r\n CloseInplaceEditor(True);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.CanStartDragFromMouseDown: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.CanStartDragFromMouseMove: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ChangeDPIScale(M, D: Integer);\r\nbegin\r\n inherited;\r\n ColumnsAppearance.BottomFont.Height := TTMSFNCUtils.MulDivInt(ColumnsAppearance.BottomFont.Height, M, D);\r\n ColumnsAppearance.TopFont.Height := TTMSFNCUtils.MulDivInt(ColumnsAppearance.TopFont.Height, M, D);\r\n NodesAppearance.ExtendedFont.Height := TTMSFNCUtils.MulDivInt(NodesAppearance.ExtendedFont.Height, M, D);\r\n NodesAppearance.Font.Height := TTMSFNCUtils.MulDivInt(NodesAppearance.Font.Height, M, D);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateNodeCache;\r\nvar\r\n g: TTMSFNCGraphics;\r\n vs, stty: Single;\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) or not Assigned(FNodeCache) then\r\n Exit;\r\n\r\n FNodeCache.Clear;\r\n\r\n if ColumnCount > 0 then\r\n begin\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.BitmapContainer := BitmapContainer;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n try\r\n vs := GetVerticalScrollPosition;\r\n stty := vs + StartOffset;\r\n\r\n for I := StartRow to StopRow do\r\n begin\r\n v := GetNodeForRow(I);\r\n if Assigned(v) then\r\n begin\r\n if ConfigureNode(g, I, v, stty) then\r\n Break;\r\n end;\r\n end;\r\n\r\n CustomizeNodeCache(g, stty);\r\n finally\r\n g.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateNodeDisplay;\r\nbegin\r\n BuildDisplay(FNodeCache, FNodeDisplay);\r\nend;\r\n\r\nconstructor TTMSFNCCustomTreeView.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FColumnStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcNull);\r\n FColumnStroke.OnChanged := @ColumnStrokeChanged;\r\n\r\n FSizeColumn := -1;\r\n FGroupsCaching := False;\r\n FColumnsCaching := False;\r\n FSelectedNodes := TTMSFNCTreeViewSelectedNodes.Create;\r\n FNodeCache := TTMSFNCTreeViewNodeCache.Create;\r\n FColumnsTopCache := TTMSFNCTreeViewColumnsTopCache.Create;\r\n FGroupsTopCache := TTMSFNCTreeViewGroupsTopCache.Create;\r\n FColumnsBottomCache := TTMSFNCTreeViewColumnsBottomCache.Create;\r\n FGroupsBottomCache := TTMSFNCTreeViewGroupsBottomCache.Create;\r\n\r\n FNodeDisplay := TTMSFNCTreeViewNodeDisplayList.Create;\r\n FColumnsTopDisplay := TTMSFNCTreeViewColumnsTopDisplayList.Create;\r\n FGroupsTopDisplay := TTMSFNCTreeViewGroupsTopDisplayList.Create;\r\n FColumnsBottomDisplay := TTMSFNCTreeViewColumnsBottomDisplayList.Create;\r\n FGroupsBottomDisplay := TTMSFNCTreeViewGroupsBottomDisplayList.Create;\r\n\r\n FNodesAppearance := TTMSFNCTreeViewNodesAppearance.Create(Self);\r\n FColumnsAppearance := TTMSFNCTreeViewColumnsAppearance.Create(Self);\r\n FGroupsAppearance := TTMSFNCTreeViewGroupsAppearance.Create(Self);\r\n FInteraction := TTMSFNCTreeViewInteraction.Create(Self);\r\n\r\n FDragTimer := TTimer.Create(Self);\r\n FDragTimer.Interval := 10;\r\n FDragTimer.Enabled := False;\r\n FDragTimer.OnTimer := DragTime;\r\n\r\n FAnimateTimer := TTimer.Create(Self);\r\n FAnimateTimer.Interval := 1;\r\n FAnimateTimer.Enabled := False;\r\n FAnimateTimer.OnTimer := Animate;\r\n\r\n {$IFDEF FMXLIB}\r\n FScrollBarTimer := TTimer.Create(Self);\r\n FScrollBarTimer.Interval := 1;\r\n FScrollBarTimer.Enabled := False;\r\n FScrollBarTimer.OnTimer := ScrollBarChanged;\r\n\r\n FInplaceEditorTimer := TTimer.Create(Self);\r\n FInplaceEditorTimer.Interval := 1;\r\n FInplaceEditorTimer.OnTimer := DoInplaceEditorTimer;\r\n FInplaceEditorTimer.Enabled := False;\r\n {$ENDIF}\r\n\r\n FCopyNodes := TTMSFNCTreeViewCopyNodes.Create(nil, nil);\r\n\r\n FFilterListBox := TListBox.Create(Self);\r\n {$IFDEF LCLLIB}\r\n FFilterListBox.ClickOnSelChange := False;\r\n {$ENDIF}\r\n FFilterListBox.Name := Name + 'fltr';\r\n FFilterListBox.Tag := -1;\r\n FFilterListBox.OnClick := HandleFilterListClick;\r\n {$IFDEF FMXLIB}\r\n FFilterListBox.OnApplyStyleLookup := ApplyFilterListBoxStyleLookUp;\r\n {$ENDIF}\r\n\r\n FFilterTimer := TTimer.Create(Self);\r\n FFilterTimer.OnTimer := HandleFilterTimer;\r\n FFilterTimer.Interval := 100;\r\n FFilterTimer.Enabled := False;\r\n\r\n FFilterPopup := TTMSFNCPopup.Create(Self);\r\n FFilterPopup.Placement := ppAbsolute;\r\n FFilterPopup.PlacementControl := Self;\r\n\r\n Width := 300;\r\n Height := 276;\r\n if IsDesignTime then\r\n InitSample;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.CreateDragBitmap;\r\nvar\r\n g: TTMSFNCGraphics;\r\n dr: TRectF;\r\n sc: Single;\r\n {$IFDEF WEBLIB}\r\n r: String;\r\n {$ENDIF}\r\nbegin\r\n if not Assigned(FDragNode) then\r\n Exit;\r\n\r\n DestroyDragBitmap;\r\n\r\n dr := TTMSFNCTreeViewVirtualNodeOpen(FDragNode).Cache.DrawRect;\r\n sc := TTMSFNCUtils.GetDPIScale;\r\n FDragBitmap := TTMSFNCImage.Create(Self);\r\n {$IFDEF FMXLIB}\r\n FDragBitmap.HitTest := False;\r\n FDragBitmap.Width := Round(dr.Right - dr.Left);\r\n FDragBitmap.Height := Round(dr.Bottom - dr.Top);\r\n FDragBitmap.Left := Round(dr.Left);\r\n FDragBitmap.Top := Round(dr.Top);\r\n {$ELSE}\r\n FDragBitmap.Width := Round((dr.Right - dr.Left) / sc);\r\n FDragBitmap.Height := Round((dr.Bottom - dr.Top) / sc);\r\n FDragBitmap.Left := Round(dr.Left / sc);\r\n FDragBitmap.Top := Round(dr.Top / sc);\r\n {$ENDIF}\r\n g := TTMSFNCGraphics.CreateBitmapCanvas(Round(FDragBitmap.Width * sc), Round(FDragBitmap.Height * sc), False);\r\n g.BitmapContainer := BitmapContainer;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n try\r\n g.BeginScene;\r\n DrawNode(g, RectF(0, 0, dr.Right - dr.Left, dr.Bottom - dr.Top), FDragNode, False, -dr.Left, -dr.Top);\r\n g.EndScene;\r\n {$IFDEF WEBLIB}\r\n r := g.Bitmap.GetBase64Image;\r\n FDragBitmap.Bitmaps.AddBitmapFromResource(r);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n FDragBitmap.Bitmaps.AddDrawBitmap(g.Bitmap);\r\n {$ENDIF}\r\n finally\r\n g.Free;\r\n end;\r\n\r\n FDragBitmap.Parent := Self;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleAlternativeDragDrop(X, Y: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleAlternativeDragOver(X, Y: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleCustomKeys(AKey: Word);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleDblClick(X, Y: Single);\r\nvar\r\n pf: TPointF;\r\n c: TTMSFNCTreeViewVirtualNode;\r\n col: Integer;\r\n en, ext: Boolean;\r\n t: Integer;\r\nbegin\r\n inherited;\r\n if BlockUserInput then\r\n Exit;\r\n\r\n FDblClicked := True;\r\n pf := PointF(X, Y);\r\n FDownNode := nil;\r\n c := XYToNode(pf.X, pf.Y);\r\n if Assigned(c) then\r\n begin\r\n if not XYToNodeExpand(c, pf.X, pf.Y) and not Assigned(XYToNodeCheck(c, pf.X, pf.Y).ANode) then\r\n begin\r\n FDownNode := c;\r\n if Assigned(FDownNode) then\r\n begin\r\n en := True;\r\n DoIsNodeEnabled(FDownNode, en);\r\n if en then\r\n begin\r\n ext := False;\r\n DoIsNodeExtended(FDownNode, ext);\r\n if not FCompactMode and ((ext and Interaction.ExtendedSelectable and Interaction.ExtendedEditable) or not ext) and (Interaction.MouseEditMode = tmemDoubleClick) and not Interaction.ReadOnly then\r\n begin\r\n t := XYToNodeTextColumn(FDownNode, pf.X, pf.Y);\r\n if t <> -1 then\r\n HandleNodeEditing(FDownNode, t);\r\n end\r\n else if Interaction.ExpandCollapseOnDblClick then\r\n HandleNodeToggle(FDownNode);\r\n end;\r\n\r\n DoNodeDblClick(FDownNode);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n col := XYToColumnSize(pf.X, pf.Y);\r\n if Interaction.ColumnAutoSizeOnDblClick then\r\n AutoSizeColumn(col);\r\n end;\r\n\r\n IsMouseDown := False;\r\n FMouseUp := True;\r\n FScrolling := False;\r\n\r\n FDoNodeExpand := False;\r\n FDoNodeExtra := False;\r\n FDoNodeTitleExtra := False;\r\n FDoNodeAnchor.AAnchor := '';\r\n FDoNodeAnchor.AColumn := -1;\r\n FDoNodeTitleAnchor.AAnchor := '';\r\n FDoNodeTitleAnchor.AColumn := -1;\r\n FDownColumn := -1;\r\n FDownColumnFilter := -1;\r\n FDownColumnExpand := -1;\r\n FReorderMode := False;\r\n FDragMode := False;\r\n FDragModeStarted := False;\r\nend;\r\n\r\ndestructor TTMSFNCCustomTreeView.Destroy;\r\nbegin\r\n FCopyNodes.Free;\r\n FFilterTimer.Free;\r\n FFilterListBox.Free;\r\n FFilterPopup.Free;\r\n\r\n if Assigned(FDragBitmap) then\r\n begin\r\n FDragBitmap.Free;\r\n FDragBitmap := nil;\r\n end;\r\n {$IFDEF FMXLIB}\r\n FScrollBarTimer.Free;\r\n FInplaceEditorTimer.Free;\r\n {$ENDIF}\r\n FColumnStroke.Free;\r\n FAnimateTimer.Free;\r\n FNodesAppearance.Free;\r\n FGroupsAppearance.Free;\r\n FInteraction.Free;\r\n FColumnsAppearance.Free;\r\n FGroupsTopDisplay.Free;\r\n FColumnsTopDisplay.Free;\r\n FGroupsBottomDisplay.Free;\r\n FColumnsBottomDisplay.Free;\r\n FSelectedNodes.Free;\r\n FNodeDisplay.Free;\r\n FNodeCache.Free;\r\n FGroupsTopCache.Free;\r\n FColumnsTopCache.Free;\r\n FGroupsBottomCache.Free;\r\n FColumnsBottomCache.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DestroyDragBitmap;\r\nbegin\r\n if Assigned(FDragBitmap) then\r\n begin\r\n FDragBitmap.Parent := nil;\r\n {$IFDEF FMXMOBILE}\r\n FDragBitmap.DisposeOf;\r\n {$ELSE}\r\n FDragBitmap.Free;\r\n {$ENDIF}\r\n FDragBitmap := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleFilter(AColumn: Integer);\r\nvar\r\n sl: TStringList;\r\n pt: TPointF;\r\n n: TTMSFNCTreeViewVirtualNode;\r\n s: String;\r\n topr, r, fr: TRectF;\r\n szd: Single;\r\n colw, colp: Single;\r\nbegin\r\n if (AColumn >= 0) and (AColumn <= Columns.Count - 1) and Columns[AColumn].Filtering.Enabled then\r\n begin\r\n colw := ColumnWidths[AColumn];\r\n if colw >= 0 then\r\n begin\r\n colp := ColumnPositions[AColumn];\r\n sl := TStringList.Create;\r\n try\r\n sl.Duplicates := dupIgnore;\r\n sl.Sorted := true;\r\n sl.Add(sTMSFNCTreeViewFilterAll);\r\n\r\n n := GetFirstRootVirtualNode;\r\n while Assigned(n) do\r\n begin\r\n s := '';\r\n DoGetNodeText(n, AColumn, tntmDrawing, s);\r\n s := TTMSFNCUtils.HTMLStrip(s);\r\n if s <> '' then\r\n sl.Add(s);\r\n n := n.GetNext;\r\n end;\r\n\r\n DoNeedFilterDropDownData(AColumn, sl);\r\n\r\n FFilterListBox.Parent := Self;\r\n {$IFDEF FMXLIB}\r\n FFilterListBox.BeginUpdate;\r\n {$ENDIF}\r\n FFilterListBox.Items.Assign(sl);\r\n FFilterListBox.ItemIndex := -1;\r\n {$IFDEF FMXLIB}\r\n FFilterListBox.EndUpdate;\r\n {$ENDIF}\r\n FFilterListBox.Parent := nil;\r\n\r\n FFilterListBox.Tag := AColumn;\r\n finally\r\n sl.Free;\r\n end;\r\n\r\n topr := GetColumnsTopRect;\r\n topr.Left := topr.Left - GetHorizontalScrollPosition;\r\n r := RectF(topr.Left + colp, topr.Top, topr.Left + colp + colw, topr.Bottom);\r\n szd := Columns[AColumn].Filtering.ButtonSize;\r\n fr := RectF(Round(r.Right - szd - 4), Round(r.Top + ((r.Bottom - r.Top) - szd) / 2), Round(r.Right - 4), Round(r.Top + ((r.Bottom - r.Top) - szd) / 2 + szd));\r\n\r\n pt := LocalToScreenEx(PointF(fr.Left + (fr.Right - fr.Left) - szd - 2, fr.Top + ((fr.Bottom - fr.Top) + szd) / 2));\r\n FFilterPopup.PlacementRectangle.Left := pt.X;\r\n FFilterPopup.PlacementRectangle.Top := pt.Y;\r\n FFilterPopup.PlacementRectangle.Right := pt.X + FFilterPopup.DropDownWidth;\r\n FFilterPopup.PlacementRectangle.Bottom := pt.Y + FFilterPopup.DropDownHeight;\r\n\r\n FFilterListBox.Width := Columns[AColumn].Filtering.DropDownWidth;\r\n FFilterListBox.Height := Columns[AColumn].Filtering.DropDownHeight;\r\n FFilterPopup.DropDownHeight := Columns[AColumn].Filtering.DropDownHeight;\r\n FFilterPopup.DropDownWidth := Columns[AColumn].Filtering.DropDownWidth;\r\n\r\n FFilterPopup.ContentControl := FFilterListBox;\r\n FFilterPopup.FocusedControl := FFilterListBox;\r\n\r\n FFilterPopup.Popup;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleFilterListClick(Sender: TObject);\r\nbegin\r\n FFilterTimer.Enabled := True;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomTreeView.ApplyFilterListBoxStyleLookUp(Sender: TObject);\r\nbegin\r\n (Sender as TListBox).ViewportPosition := PointF(0, 0);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleFilterTimer(Sender: TObject);\r\nvar\r\n fd: TTMSFNCTreeViewFilterData;\r\n cnd: string;\r\n i, filtercol: integer;\r\nbegin\r\n if Assigned(FFilterListBox) then\r\n begin\r\n filtercol := FFilterListBox.Tag;\r\n if (filtercol >= 0) and (filtercol <= Columns.Count - 1) then\r\n begin\r\n if Columns[filtercol].Filtering.MultiColumn then\r\n begin\r\n for i := Filter.Count - 1 downto 0 do\r\n begin\r\n if Filter.Items[i].Column = filtercol then\r\n Filter.Delete(i);\r\n end;\r\n end\r\n else\r\n Filter.Clear;\r\n\r\n fd := Filter.Add;\r\n fd.Column := filtercol;\r\n\r\n cnd := '';\r\n if (FFilterListBox.ItemIndex >= 0) and (FFilterListBox.ItemIndex <= FFilterListBox.Items.Count - 1) then\r\n cnd := FFilterListbox.Items[FFilterListbox.ItemIndex];\r\n\r\n if pos(' ',cnd) > 0 then\r\n cnd := '\"' + cnd + '\"';\r\n\r\n FFilterPopup.IsOpen := False;\r\n\r\n if cnd = sTMSFNCTreeViewFilterAll then\r\n begin\r\n RemoveFilters;\r\n end\r\n else\r\n begin\r\n DoFilterSelect(fd.Column, cnd);\r\n fd.Condition := cnd;\r\n ApplyFilter;\r\n end;\r\n end;\r\n end;\r\n\r\n FFilterTimer.Enabled := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleDialogKey(var Key: Word; Shift: TShiftState);\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\n c: Integer;\r\n ext: Boolean;\r\nbegin\r\n if FInplaceEditorClosed or BlockUserInput then\r\n begin\r\n inherited;\r\n Exit;\r\n end;\r\n\r\n if Assigned(FInplaceEditor) and FInplaceEditorActive and ((Key = KEY_ESCAPE) or (Key = KEY_TAB) or (Key = KEY_F2)\r\n or ((FInplaceEditor is TEdit) and (Key = KEY_RETURN))) or ((FInplaceEditor is TMemo) and (Key = KEY_RETURN) and not (ssCtrl in Shift)) then\r\n begin\r\n FCloseWithDialogKey := True;\r\n CloseInplaceEditor(Key = KEY_ESCAPE);\r\n if Key = KEY_TAB then\r\n begin\r\n if Assigned(FFocusedNode) then\r\n begin\r\n if ssShift in Shift then\r\n begin\r\n ext := False;\r\n DoIsNodeExtended(FFocusedNode, ext);\r\n if (FUpdateNodeColumn > GetFirstEditableColumn) and not ext then\r\n begin\r\n HandleNodeEditing(FFocusedNode, GetPreviousEditableColumn(FUpdateNodeColumn));\r\n Invalidate;\r\n Key := 0;\r\n end\r\n else\r\n begin\r\n n := GetPreviousFocusableNode(FFocusedNode);\r\n if Assigned(n)then\r\n begin\r\n ext := False;\r\n DoIsNodeExtended(n, ext);\r\n if (ext and Interaction.ExtendedEditable) or not ext then\r\n begin\r\n if not ext then\r\n c := GetLastEditableColumn\r\n else\r\n c := 0;\r\n\r\n FFocusedNode := n;\r\n SelectVirtualNode(n);\r\n ScrollToVirtualNode(n, True, tvnspTop);\r\n HandleNodeEditing(n, c);\r\n Invalidate;\r\n Key := 0;\r\n end;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n ext := False;\r\n DoIsNodeExtended(FFocusedNode, ext);\r\n if (FUpdateNodeColumn < GetLastEditableColumn) and not ext then\r\n begin\r\n EditVirtualNode(FFocusedNode, GetNextEditableColumn(FUpdateNodeColumn));\r\n Key := 0;\r\n end\r\n else\r\n begin\r\n n := GetNextFocusableNode(FFocusedNode);\r\n if Assigned(n) then\r\n begin\r\n ext := False;\r\n DoIsNodeExtended(n, ext);\r\n if (ext and Interaction.ExtendedEditable) or not ext then\r\n begin\r\n c := GetFirstEditableColumn;\r\n FFocusedNode := n;\r\n SelectVirtualNode(n);\r\n ScrollToVirtualNode(n, True, tvnspBottom);\r\n HandleNodeEditing(n, c);\r\n Invalidate;\r\n Key := 0;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleDragDrop(const Source: TObject;\r\n const Point: TPointF);\r\nvar\r\n dn, dragn: TTMSFNCTreeViewVirtualNode;\r\n b: Boolean;\r\nbegin\r\n inherited;\r\n\r\n if BlockUserInput then\r\n Exit;\r\n\r\n if Assigned(OnCustomDragDrop) then\r\n OnCustomDragDrop(Self, Source, Point)\r\n else\r\n begin\r\n if FAccepted and Assigned(Source) and (Source is TTMSFNCCustomTreeView) and ((Source as TTMSFNCCustomTreeView).Interaction.DragDropMode <> tdmNone) then\r\n begin\r\n dragn := (Source as TTMSFNCCustomTreeView).DragNode;\r\n if Assigned(dragn) then\r\n begin\r\n dn := XYToNode(Point.X, Point.Y);\r\n if (dn <> dragn) and Assigned(dragn.Node) and PtInRectEx(GetNodesRect, Point) then\r\n begin\r\n b := True;\r\n DoBeforeDropNode(dragn, dn, b);\r\n if b then\r\n begin\r\n BeginUpdate;\r\n (Source as TTMSFNCCustomTreeView).BeginUpdate;\r\n if Assigned(dn) and Assigned(dn.Node) then\r\n begin\r\n case (Source as TTMSFNCCustomTreeView).Interaction.DragDropMode of\r\n tdmMove: dragn.Node.MoveTo(dn.Node, dn.Node.Index);\r\n tdmCopy: dragn.Node.CopyTo(dn.Node, dn.Node.Index);\r\n end;\r\n end\r\n else\r\n begin\r\n Nodes.Add.Assign(dragn.Node);\r\n case (Source as TTMSFNCCustomTreeView).Interaction.DragDropMode of\r\n tdmMove: dragn.Node.TreeView.RemoveNode(dragn.Node);\r\n end;\r\n end;\r\n (Source as TTMSFNCCustomTreeView).DragNode := nil;\r\n (Source as TTMSFNCCustomTreeView).EndUpdate;\r\n EndUpdate;\r\n\r\n DoAfterDropNode(dragn, dn);\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleDragOver(const Source: TObject;\r\n const Point: TPointF; var Accept: Boolean);\r\nbegin\r\n inherited;\r\n if BlockUserInput then\r\n Exit;\r\n\r\n if not AlternativeDragDrop then\r\n begin\r\n FDragMode := False;\r\n FDragModeStarted := False;\r\n IsMouseDown := False;\r\n end;\r\n\r\n if Assigned(OnCustomDragOver) then\r\n OnCustomDragOver(Self, Source, Point, Accept)\r\n else\r\n begin\r\n Accept := (Interaction.DragDropMode <> tdmNone) and (Source is TTMSFNCCustomTreeView) and Assigned((Source as TTMSFNCCustomTreeView).DragNode);\r\n Accept := Accept and PtInRectEx(GetNodesRect, Point);\r\n end;\r\n\r\n FAccepted := Accept;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleDragStart(X, Y: Single);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleExpand(AColumn: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawBorders(AGraphics: TTMSFNCGraphics);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawDisplay(AGraphics: TTMSFNCGraphics; ADisplay: TTMSFNCTreeViewDisplayList);\r\nvar\r\n I: Integer;\r\n cache: TTMSFNCTreeViewCacheItem;\r\n st: TTMSFNCGraphicsSaveState;\r\n r: TRectF;\r\nbegin\r\n if ADisplay.Count = 0 then\r\n Exit;\r\n\r\n st := AGraphics.SaveState;\r\n if (ADisplay is TTMSFNCTreeViewNodeDisplayList) then\r\n begin\r\n r := GetContentClipRect;\r\n r.Right := r.Right + 1;\r\n end\r\n else if ADisplay is TTMSFNCTreeViewGroupsTopDisplayList then\r\n begin\r\n r := GetGroupsTopRect;\r\n r.Bottom := r.Bottom + 1;\r\n end\r\n else if ADisplay is TTMSFNCTreeViewGroupsBottomDisplayList then\r\n begin\r\n r := GetGroupsBottomRect;\r\n r.Top := r.Top - 1;\r\n end\r\n else if ADisplay is TTMSFNCTreeViewColumnsTopDisplayList then\r\n begin\r\n r := GetColumnsTopRect;\r\n r.Bottom := r.Bottom + 1;\r\n end\r\n else if ADisplay is TTMSFNCTreeViewColumnsBottomDisplayList then\r\n begin\r\n r := GetColumnsBottomRect;\r\n r.Top := r.Top - 1;\r\n end;\r\n\r\n AGraphics.ClipRect(r);\r\n\r\n for I := 0 to ADisplay.Count - 1 do\r\n begin\r\n cache := ADisplay[I];\r\n if ADisplay is TTMSFNCTreeViewNodeDisplayList then\r\n DrawNode(AGraphics, cache.DrawRect, cache.Node)\r\n else if ADisplay is TTMSFNCTreeViewColumnsDisplayList then\r\n DrawColumn(AGraphics, cache.DrawRect, cache.Column, cache.Kind)\r\n else if ADisplay is TTMSFNCTreeViewGroupsDisplayList then\r\n DrawGroup(AGraphics, cache.DrawRect, cache.Group, cache.StartColumn, cache.EndColumn, cache.Kind)\r\n end;\r\n\r\n AGraphics.RestoreState(st);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawEmptySpaces(AGraphics: TTMSFNCGraphics);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawGroup(AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup: Integer; AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawGroups(AGraphics: TTMSFNCGraphics);\r\nbegin\r\n DrawDisplay(AGraphics, FGroupsTopDisplay);\r\n DrawDisplay(AGraphics, FGroupsBottomDisplay);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawNode(AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode; ACaching: Boolean = False; AOffsetX: Single = 0; AOffsetY: Single = 0);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawNodeColumns(AGraphics: TTMSFNCGraphics);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawNodes(AGraphics: TTMSFNCGraphics);\r\nbegin\r\n DrawDisplay(AGraphics, FNodeDisplay);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawColumn(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.DrawColumns(AGraphics: TTMSFNCGraphics);\r\nbegin\r\n DrawDisplay(AGraphics, FColumnsTopDisplay);\r\n DrawDisplay(AGraphics, FColumnsBottomDisplay);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.EditNode(ANode: TTMSFNCTreeViewNode; AColumn: Integer);\r\nbegin\r\n if Assigned(ANode) then\r\n EditVirtualNode(TTMSFNCTreeViewNodeOpen(ANode).VirtualNode, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.EditVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer);\r\nbegin\r\n HandleNodeEditing(ANode, AColumn);\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ExportNotification(\r\n AState: TTMSFNCTreeViewExportState; ARow: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnBottomLeftEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetColumnsBottomRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := nr.Left;\r\n Result.Right := ptr.Left;\r\n Result.Bottom := ptr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnBottomRightEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetColumnsBottomRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := ptr.Right;\r\n Result.Right := nr.Right - 1;\r\n Result.Bottom := ptr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetCacheHeight: Integer;\r\nbegin\r\n Result := CACHEHEIGHT;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetCacheWidth: Integer;\r\nbegin\r\n Result := CACHEWIDTH\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetCalculationRect: TRectF;\r\nbegin\r\n Result := inherited GetCalculationRect;\r\n Result.Top := Result.Top + GetColumnsTopSize + GetGroupsTopSize;\r\n Result.Bottom := Result.Bottom - GetColumnsBottomSize - GetGroupsBottomSize;\r\n Result.Right := Result.Left + Max(0, Result.Right - Result.Left);\r\n Result.Bottom := Result.Top + Max(0, Result.Bottom - Result.Top);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetContentCliprect: TRectF;\r\nbegin\r\n Result := inherited GetContentClipRect;\r\n Result.Bottom := Result.Top + Min(GetTotalRowHeight, Result.Bottom - Result.Top);\r\n Result.Right := Result.Left + Min(GetTotalColumnWidth, Result.Right - Result.Left);\r\n Result.Left := Result.Left + 1;\r\n Result.Right := Result.Right - 1;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetContentRect: TRectF;\r\nbegin\r\n Result := inherited GetContentRect;\r\n Result.Top := Result.Top + GetColumnsTopSize + GetGroupsTopSize;\r\n Result.Bottom := Result.Bottom - GetColumnsBottomSize - GetGroupsBottomSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetDocURL: string;\r\nbegin\r\n Result := TTMSFNCTreeViewDocURL;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetDragObjectScreenShot: TTMSFNCBitmap;\r\nbegin\r\n CreateDragBitmap;\r\n Result := TTMSFNCBitmap.Create;\r\n if Assigned(FDragBitmap) then\r\n begin\r\n Result.Assign(FDragBitmap.GetBitmap);\r\n FDragBitmap.Free;\r\n FDragBitmap := nil;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupBottomLeftEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetGroupsBottomRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := nr.Left;\r\n Result.Right := ptr.Left;\r\n Result.Bottom := nr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupBottomRightEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetGroupsBottomRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := ptr.Right;\r\n Result.Right := nr.Right;\r\n Result.Bottom := ptr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupsBottomRect: TRectF;\r\nbegin\r\n Result := GetColumnsBottomRect;\r\n Result.Top := Result.Bottom;\r\n Result.Bottom := Result.Top + GetGroupsBottomSize\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupsBottomSize: Double;\r\nbegin\r\n Result := 0;\r\n if (tglBottom in GroupsAppearance.Layouts) and (DisplayGroups.Count > 0) and (ColumnCount > 0) then\r\n Result := GroupsAppearance.BottomSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupsTopRect: TRectF;\r\nbegin\r\n Result := GetColumnsTopRect;\r\n Result.Bottom := Result.Top;\r\n Result.Top := Result.Top - GetGroupsTopSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupsTopSize: Double;\r\nbegin\r\n Result := 0;\r\n if (tglTop in GroupsAppearance.Layouts) and (DisplayGroups.Count > 0) and (ColumnCount > 0) then\r\n Result := GroupsAppearance.TopSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupText(AGroup: Integer): String;\r\nbegin\r\n Result := TranslateTextEx(sTMSFNCTreeViewGroup) + ' ' + inttostr(AGroup);\r\n if (AGroup >= 0) and (AGroup <= Groups.Count - 1) then\r\n Result := TTMSFNCTreeViewGroupOpen(Groups[AGroup]).GetText;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupTopLeftEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetGroupsTopRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := nr.Left;\r\n Result.Right := ptr.Left;\r\n Result.Bottom := ptr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetGroupTopRightEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetGroupsTopRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := ptr.Right;\r\n Result.Right := nr.Right;\r\n Result.Bottom := ptr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetInplaceEditor: TTMSFNCTreeViewInplaceEditor;\r\nbegin\r\n Result := FInplaceEditor;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetInplaceEditorRect(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer): TRectF;\r\nvar\r\n cr, r: TRectF;\r\nbegin\r\n Result := RectF(0, 0, 0, 0);\r\n if not Assigned(ANode) then\r\n Exit;\r\n\r\n if (AColumn >= 0) and (AColumn <= Length(ANode.TextRects) - 1) then\r\n begin\r\n r := ANode.TextRects[AColumn];\r\n {$IFDEF CMNLIB}\r\n InflateRectEx(r, -2, -2);\r\n {$ENDIF}\r\n cr := GetContentClipRect;\r\n r.Top := Max(r.Top, cr.Top);\r\n r.Bottom := Min(r.Bottom, cr.Bottom);\r\n r.Left := Max(r.Left, cr.Left);\r\n r.Right := Min(r.Right, cr.Right);\r\n Result := RectF(Floor(r.Left), Floor(r.Top), Round(r.Right), Round(r.Bottom));\r\n\r\n if Assigned(OnGetInplaceEditorRect) then\r\n OnGetInplaceEditorRect(Self, ANode, AColumn, FInplaceEditor, Result);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnsBottomRect: TRectF;\r\nvar\r\n nr: TRectF;\r\nbegin\r\n nr := inherited GetContentRect;\r\n Result.Left := nr.Left;\r\n Result.Top := nr.Bottom - GetGroupsBottomSize - GetColumnsBottomSize;\r\n Result.Right := nr.Right + GetColumnsExtraSize;\r\n Result.Bottom := nr.Bottom - GetGroupsBottomSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnsBottomSize: Double;\r\nbegin\r\n Result := 0;\r\n if (tclBottom in ColumnsAppearance.Layouts) and (ColumnCount > 0) then\r\n Result := ColumnsAppearance.BottomSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnsExtraSize: Double;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnTopLeftEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetColumnsTopRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := nr.Left;\r\n Result.Right := ptr.Left;\r\n Result.Bottom := ptr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnTopRightEmptyRect: TRectF;\r\nvar\r\n ptr, nr: TRectF;\r\nbegin\r\n ptr := GetColumnsTopRect;\r\n nr := LocalRect;\r\n Result.Top := ptr.Top;\r\n Result.Left := ptr.Right;\r\n Result.Right := nr.Right - 1;\r\n Result.Bottom := ptr.Bottom;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetVersion: string;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetVisibleNodeCount: Integer;\r\nvar\r\n f, l: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := 0;\r\n f := GetFirstVisibleVirtualNode;\r\n l := GetLastVisibleVirtualNode;\r\n if Assigned(f) and Assigned(l) then\r\n Result := l.Row - f.Row;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnsTopRect: TRectF;\r\nvar\r\n nr: TRectF;\r\nbegin\r\n nr := inherited GetContentRect;\r\n Result.Left := nr.Left;\r\n Result.Top := nr.Top + GetGroupsTopSize;\r\n Result.Right := nr.Right + GetColumnsExtraSize;\r\n Result.Bottom := nr.Top + GetGroupsTopSize + GetColumnsTopSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnsTopSize: Double;\r\nbegin\r\n Result := 0;\r\n if (tclTop in ColumnsAppearance.Layouts) and (ColumnCount > 0) then\r\n Result := ColumnsAppearance.TopSize;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetColumnText(AColumn: Integer): String;\r\nbegin\r\n Result := TranslateTextEx(sTMSFNCTreeViewColumn) + ' ' + inttostr(AColumn);\r\n if (AColumn >= 0) and (AColumn <= ColumnCount - 1) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= Columns.Count - 1) then\r\n begin\r\n Result := Columns[AColumn].Text;\r\n if Result = '' then\r\n Result := Columns[AColumn].Name;\r\n end;\r\n\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCTreeViewColumn) + ' ' + inttostr(AColumn);\r\n end;\r\n\r\n if Assigned(Adapter) then\r\n Result := Adapter.GetColumnDisplayName(AColumn);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetPreviousFocusableNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n en: Boolean;\r\nbegin\r\n if Assigned(ANode) then\r\n Result := GetPreviousVirtualNode(ANode)\r\n else\r\n Result := GetLastVirtualNode;\r\n\r\n en := IsVirtualNodeSelectable(Result);\r\n\r\n while Assigned(Result) and not en do\r\n begin\r\n Result := GetPreviousVirtualNode(Result);\r\n en := IsVirtualNodeSelectable(Result);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.GetNodeMargins(var ALeft, ATop, ARight, ABottom: Single);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.GetNodeOffset(ANode: TTMSFNCTreeViewVirtualNode;\r\n var ALeft, ATop, ARight, ABottom: Single);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetNodesRect: TRectF;\r\nbegin\r\n Result := GetContentRect;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetNodesSpacing: Single;\r\nbegin\r\n Result := NodesAppearance.Spacing;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetNodesFromClipboard: TTMSFNCTreeViewCopyNodes;\r\nvar\r\n s: String;\r\n a: TStringList;\r\n ANode, ANextNode: TTMSFNCTreeViewNode;\r\n ALevel: Integer;\r\n I, off: Integer;\r\n CurrStr: String;\r\n tempt: TTMSFNCCustomTreeView;\r\nbegin\r\n if TTMSFNCClipBoard.HasFormat(TTMSFNCClipBoardFormat.cfText) then\r\n begin\r\n s := TTMSFNCClipBoard.GetText;\r\n if (Pos(CLP_FMT, s) > 0) then\r\n begin\r\n tempt := TTMSFNCCustomTreeView.Create(nil);\r\n a := TStringList.Create;\r\n try\r\n s := StringReplace(s, CLP_FMT, '', [rfReplaceAll]);\r\n a.Text := s;\r\n try\r\n ANode := nil;\r\n off := 0;\r\n for I := 0 to a.Count - 1 do\r\n begin\r\n ALevel := -1;\r\n CurrStr := GetBufStart(a[i], ALevel);\r\n\r\n if ANode = nil then\r\n begin\r\n ANode := tempt.AddNode;\r\n off := ALevel;\r\n end\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level = ALevel - off) then\r\n ANode := tempt.AddNode(ANode.GetParent)\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level = ALevel - 1 - off) then\r\n ANode := tempt.AddNode(ANode)\r\n else if Assigned(ANode.VirtualNode) and (ANode.VirtualNode.Level > ALevel - off) then\r\n begin\r\n ANextNode := ANode.GetParent;\r\n while Assigned(ANextNode) and Assigned(ANextNode.VirtualNode) and (ANextNode.VirtualNode.Level > ALevel - off) do\r\n ANextNode := ANextNode.GetParent;\r\n ANode := tempt.AddNode(ANextNode.GetParent);\r\n end;\r\n\r\n if Assigned(ANode) then\r\n ANode.LoadFromString(CurrStr);\r\n end;\r\n finally\r\n end;\r\n finally\r\n FCopyNodes.Assign(tempt.Nodes);\r\n a.Free;\r\n tempt.Free;\r\n end;\r\n end;\r\n end;\r\n\r\n Result := FCopyNodes;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetNextFocusableNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n en: Boolean;\r\nbegin\r\n if Assigned(ANode) then\r\n Result := GetNextVirtualNode(ANode)\r\n else\r\n Result := GetFirstRootVirtualNode;\r\n\r\n en := IsVirtualNodeSelectable(Result);\r\n\r\n while Assigned(Result) and not en do\r\n begin\r\n Result := GetNextVirtualNode(Result);\r\n en := IsVirtualNodeSelectable(Result);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetReloadOffset: Single;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.GetRowHeight(ARow: Integer): Double;\r\nvar\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := DefaultRowHeight;\r\n v := GetNodeForRow(ARow);\r\n if Assigned(v) and (v.Calculated) then\r\n Result := v.Height;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HorizontalScrollPositionChanged;\r\nbegin\r\n BlockScrollingUpdate := True;\r\n UpdateDisplay;\r\n BlockScrollingUpdate := False;\r\n DoHScroll(GetHScrollValue);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.Clear;\r\nbegin\r\n BeginUpdate;\r\n ClearNodes;\r\n ClearColumns;\r\n ClearSorting;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ClearSorting;\r\nvar\r\n I: Integer;\r\nbegin\r\n BeginUpdate;\r\n FSortColumn := -1;\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n TTMSFNCTreeViewColumnOpen(Columns[I]).SortKind := nskNone;\r\n TTMSFNCTreeViewColumnOpen(Columns[I]).SortIndex := -1;\r\n end;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.Sort(AColumn: Integer = 0; ARecurse: Boolean = False; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTreeViewNodesSortMode = nsmAscending; AClearNodeList: Boolean = True);\r\nbegin\r\n Nodes.Sort(AColumn, ARecurse, ACaseSensitive, ASortingMode, AClearNodeList);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.InitializeColumnSorting(AColumn: Integer; ASortMode: TTMSFNCTreeViewNodesSortMode);\r\nvar\r\n I: Integer;\r\nbegin\r\n UpdateCount := UpdateCount + 1;\r\n FSortColumn := AColumn;\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n case ASortMode of\r\n nsmAscending: Columns[I].SortKind := nskAscending;\r\n nsmDescending: Columns[I].SortKind := nskDescending;\r\n end;\r\n end;\r\n UpdateCount := UpdateCount - 1;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.InitSample;\r\nvar\r\n pAudi, pMercedes, pSub, n: TTMSFNCTreeViewNode;\r\nbegin\r\n BeginUpdate;\r\n ClearNodeList;\r\n Columns.Clear;\r\n Nodes.Clear;\r\n\r\n Columns.Add.Text := 'Model';\r\n Columns.Add.Text := 'Year';\r\n Columns.Add.Text := 'Miles';\r\n\r\n pAudi := AddNode;\r\n pAudi.Text[0] := 'Audi';\r\n pAudi.Extended := True;\r\n\r\n pSub := AddNode(pAudi);\r\n pSub.Text[0] := 'A3';\r\n pSub.Text[1] := '2010';\r\n pSub.Text[2] := '32,300';\r\n\r\n pSub := AddNode(pAudi);\r\n pSub.Text[0] := 'A5 series';\r\n\r\n n := AddNode(pSub);\r\n n.Text[0] := 'S5';\r\n n.Text[1] := '2016';\r\n n.Text[2] := '40,000';\r\n\r\n n := AddNode(pSub);\r\n n.Text[0] := 'RS5';\r\n n.Text[1] := '2012';\r\n n.Text[2] := '15,000';\r\n\r\n pSub := AddNode(pAudi);\r\n pSub.Text[0] := 'A8';\r\n pSub.Text[1] := '2005';\r\n pSub.Text[2] := '80,000';\r\n\r\n pMercedes := AddNode;\r\n pMercedes.Text[0] := 'Mercedes';\r\n pMercedes.Extended := True;\r\n\r\n pSub := AddNode(pMercedes);\r\n pSub.Text[0] := 'SLS';\r\n pSub.Text[1] := '2000';\r\n pSub.Text[2] := '300,000';\r\n\r\n pSub := AddNode(pMercedes);\r\n pSub.Text[0] := 'SLK';\r\n pSub.Text[1] := '2010';\r\n pSub.Text[2] := '20,000';\r\n\r\n pSub := AddNode(pMercedes);\r\n pSub.Text[0] := 'GLA';\r\n pSub.Text[1] := '2012';\r\n pSub.Text[2] := '14,500';\r\n\r\n ExpandAll;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.InternalSelectVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleKeyDown(var Key: Word; Shift: TShiftState);\r\nvar\r\n sel, prevsel, fsel: TTMSFNCTreeViewVirtualNode;\r\n spc, donext, doprev: Boolean;\r\n r: Integer;\r\n I: Integer;\r\n b: Boolean;\r\nbegin\r\n inherited;\r\n if FInplaceEditorClosed or BlockUserInput then\r\n Exit;\r\n\r\n if Key in [KEY_ESCAPE,KEY_INSERT,KEY_DELETE,KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_HOME,KEY_END,KEY_PRIOR,KEY_NEXT,KEY_TAB] then\r\n FLookupString := '';\r\n\r\n if (ssCtrl in Shift) or (ssCommand in Shift) then\r\n begin\r\n case Key of\r\n Ord('A'):\r\n begin\r\n if Interaction.MultiSelect then\r\n SelectAllNodes;\r\n Exit;\r\n end;\r\n Ord('X'):\r\n begin\r\n if Interaction.ClipboardMode <> tcmNone then\r\n begin\r\n b := True;\r\n DoBeforeCutToClipboard(b);\r\n if b then\r\n begin\r\n CutToClipboard(Interaction.ClipboardMode = tcmTextOnly);\r\n DoAfterCutToClipboard;\r\n end;\r\n end;\r\n Exit;\r\n end;\r\n Ord('C'):\r\n begin\r\n if Interaction.ClipboardMode <> tcmNone then\r\n begin\r\n b := True;\r\n DoBeforeCopyToClipboard(b);\r\n if b then\r\n begin\r\n CopyToClipboard(Interaction.ClipboardMode = tcmTextOnly);\r\n DoAfterCopyToClipboard;\r\n end;\r\n end;\r\n Exit;\r\n end;\r\n Ord('V'):\r\n begin\r\n if Interaction.ClipboardMode <> tcmNone then\r\n begin\r\n b := True;\r\n DoBeforePasteFromClipboard(b);\r\n if b then\r\n begin\r\n PasteFromClipboard;\r\n DoAfterPasteFromClipboard;\r\n end;\r\n end;\r\n Exit;\r\n end;\r\n end;\r\n end;\r\n\r\n sel := FocusedVirtualNode;\r\n donext := False;\r\n doprev := False;\r\n case Key of\r\n KEY_MENU, KEY_CONTROL, KEY_SHIFT: sel := nil;\r\n KEY_PRIOR:\r\n begin\r\n doprev := True;\r\n if Assigned(sel) then\r\n begin\r\n r := sel.Row - (StopRow - StartRow);\r\n sel := GetNodeFromNodeStructure(r);\r\n if Assigned(sel) then\r\n begin\r\n if not IsVirtualNodeSelectable(sel) then\r\n sel := GetPreviousFocusableNode(sel);\r\n end;\r\n\r\n if not Assigned(sel) then\r\n sel := GetNextFocusableNode(nil);\r\n end;\r\n end;\r\n KEY_NEXT:\r\n begin\r\n donext := True;\r\n if Assigned(sel) then\r\n begin\r\n r := sel.Row + (StopRow - StartRow);\r\n sel := GetNodeFromNodeStructure(r);\r\n if Assigned(sel) then\r\n begin\r\n if not IsVirtualNodeSelectable(sel) then\r\n sel := GetNextFocusableNode(sel);\r\n end;\r\n\r\n if not Assigned(sel) then\r\n sel := GetPreviousFocusableNode(nil);\r\n end;\r\n end;\r\n KEY_HOME:\r\n begin\r\n sel := GetNextFocusableNode(nil);\r\n doprev := True;\r\n end;\r\n KEY_END:\r\n begin\r\n sel := GetPreviousFocusableNode(nil);\r\n doprev := True\r\n end;\r\n KEY_DOWN:\r\n begin\r\n sel := GetNextFocusableNode(sel);\r\n donext := True;\r\n end;\r\n KEY_UP:\r\n begin\r\n sel := GetPreviousFocusableNode(sel);\r\n doprev := True;\r\n end;\r\n KEY_LEFT: HandleNodeCollapse(sel);\r\n KEY_RIGHT: HandleNodeExpand(sel);\r\n end;\r\n\r\n case Key of\r\n KEY_LEFT, KEY_RIGHT: HandleCustomKeys(Key);\r\n end;\r\n\r\n spc := False;\r\n if (Key = KEY_SPACE) then\r\n spc := True;\r\n\r\n if Assigned(sel) then\r\n begin\r\n if (Interaction.SelectionFollowsFocus and (donext or doprev)) or (spc and ((ssCtrl in Shift) or (ssCommand in Shift))) then\r\n begin\r\n if (ssShift in Shift) then\r\n begin\r\n if (FSelectedNodes.Count > 1) then\r\n begin\r\n prevsel := FSelectedNodes[FSelectedNodes.Count - 1];\r\n fsel := FSelectedNodes[0];\r\n if (doprev and (sel.Row < prevsel.Row) and (sel.Row >= fsel.Row)) or (donext and (sel.Row > prevsel.Row) and (sel.Row <= fsel.Row)) then\r\n begin\r\n if prevsel.Row <= sel.Row then\r\n begin\r\n for I := prevsel.Row to sel.Row do\r\n UnSelectVirtualNode(GetNodeFromNodeStructure(I));\r\n end\r\n else\r\n begin\r\n for I := prevsel.Row downto sel.Row do\r\n UnSelectVirtualNode(GetNodeFromNodeStructure(I));\r\n end;\r\n end;\r\n end;\r\n end\r\n else if not (ssCtrl in Shift) and not (ssCommand in Shift) and (donext or doprev) and (FSelectedNodes.Count > 0) then\r\n UnSelectVirtualNode(sel);\r\n\r\n if (ssShift in Shift) then\r\n begin\r\n if FFocusedNode.Row <= sel.Row then\r\n begin\r\n for I := FFocusedNode.Row + 1 to sel.Row do\r\n HandleSelectNode(GetNodeFromNodeStructure(I), True, True, {$IFNDEF FMXMOBILE}(ssShift in Shift) and {$ENDIF} Interaction.MultiSelect);\r\n end\r\n else\r\n begin\r\n for I := FFocusedNode.Row - 1 downto sel.Row do\r\n HandleSelectNode(GetNodeFromNodeStructure(I), True, True, {$IFNDEF FMXMOBILE}(ssShift in Shift) and {$ENDIF} Interaction.MultiSelect);\r\n end;\r\n end\r\n else\r\n HandleSelectNode(sel, True, True, {$IFNDEF FMXMOBILE}((ssCtrl in Shift) or (ssCommand in Shift)) and {$ENDIF} Interaction.MultiSelect);\r\n end\r\n else if spc then\r\n HandleNodeToggleCheck(sel, 0);\r\n\r\n FFocusedNode := sel;\r\n if donext then\r\n ScrollToVirtualNode(FFocusedNode, True, tvnspBottom)\r\n else\r\n ScrollToVirtualNode(FFocusedNode, True, tvnspTop);\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleKeyPress(var Key: Char);\r\nvar\r\n k: Integer;\r\nbegin\r\n inherited;\r\n if BlockUserInput then\r\n Exit;\r\n\r\n k := Ord(Key);\r\n\r\n if Interaction.Lookup.Enabled then\r\n begin\r\n if k in [KEY_ESCAPE,KEY_INSERT,KEY_DELETE,KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_HOME,KEY_END,KEY_PRIOR,KEY_NEXT,KEY_TAB] then\r\n FLookupString := ''\r\n else\r\n begin\r\n if Interaction.Lookup.Incremental then\r\n FLookupString := FLookupString + Key\r\n else\r\n FLookupString := Key;\r\n\r\n if Assigned(OnCustomLookup) then\r\n OnCustomLookup(Self, FLookupString)\r\n else\r\n begin\r\n LookupNode(FLookupString, Interaction.Lookup.RootNodesOnly, Interaction.Lookup.Column,\r\n Interaction.Lookup.CaseSensitive, Interaction.Lookup.AutoSelect, Interaction.Lookup.AutoExpand);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleKeyUp(var Key: Word; Shift: TShiftState);\r\nvar\r\n en, ext: Boolean;\r\n c: Integer;\r\nbegin\r\n inherited;\r\n if BlockUserInput then\r\n Exit;\r\n\r\n if FInplaceEditorClosed then\r\n begin\r\n FInplaceEditorClosed := False;\r\n Exit;\r\n end;\r\n\r\n if FCloseWithDialogKey then\r\n begin\r\n FCloseWithDialogKey := False;\r\n Exit;\r\n end;\r\n\r\n if Assigned(FFocusedNode) then\r\n begin\r\n if not FCompactMode and Interaction.KeyboardEdit and not Interaction.ReadOnly and (Shift = []) then\r\n begin\r\n case Key of\r\n KEY_F2, KEY_RETURN:\r\n begin\r\n en := True;\r\n DoIsNodeEnabled(FFocusedNode, en);\r\n if en then\r\n begin\r\n ext := False;\r\n DoIsNodeExtended(FFocusedNode, ext);\r\n if (ext and Interaction.ExtendedSelectable and Interaction.ExtendedEditable) or not ext then\r\n begin\r\n c := GetFirstEditableColumn;\r\n if (c <> -1) and FFocusedNode.TitleExpanded[c] then\r\n HandleNodeEditing(FFocusedNode, c);\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n st: TTMSFNCGraphicsSaveState;\r\nbegin\r\n inherited;\r\n AGraphics.BitmapContainer := BitmapContainer;\r\n DrawEmptySpaces(AGraphics);\r\n st := AGraphics.SaveState;\r\n AGraphics.ClipRect(GetContentClipRect);\r\n DrawNodeColumns(AGraphics);\r\n AGraphics.RestoreState(st);\r\n DrawNodes(AGraphics);\r\n DrawColumns(AGraphics);\r\n DrawGroups(AGraphics);\r\n DrawBorders(AGraphics);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ResetNodes(AUpdateAll: Boolean = True);\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\n st, stp: Integer;\r\nbegin\r\n if Assigned(VisibleNodes) then\r\n begin\r\n if AUpdateAll then\r\n begin\r\n st := 0;\r\n stp := RowCount - 1;\r\n end\r\n else\r\n begin\r\n st := StartRow;\r\n stp := StopRow;\r\n end;\r\n\r\n for I := st to stp do\r\n begin\r\n v := GetNodeForRow(I);\r\n if Assigned(v) then\r\n begin\r\n TotalRowHeight := TotalRowHeight - v.Height + DefaultRowHeight;\r\n UpdateNodeHeight(v, DefaultRowHeight);\r\n UpdateNodeCalculated(v, False);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.ResetToDefaultStyle;\r\nbegin\r\n BeginUpdate;\r\n Fill.Kind := gfkSolid;\r\n Stroke.Kind := gskSolid;\r\n Fill.Color := gcWhite;\r\n Stroke.Color := gcDarkGray;\r\n NodesAppearance.ExtendedFill.Color := TTMSFNCTreeViewColorExtended;\r\n ColumnsAppearance.TopFill.Color := gcWhite;\r\n ColumnsAppearance.BottomFill.Color := gcWhite;\r\n ColumnsAppearance.TopStroke.Color := gcDarkGray;\r\n ColumnsAppearance.BottomStroke.Color := gcDarkgray;\r\n ColumnsAppearance.TopFont.Color := gcBlack;\r\n ColumnsAppearance.BottomFont.Color := gcBlack;\r\n GroupsAppearance.TopFill.Color := gcWhite;\r\n GroupsAppearance.BottomFill.Color := gcWhite;\r\n GroupsAppearance.TopStroke.Color := gcDarkGray;\r\n GroupsAppearance.BottomStroke.Color := gcDarkgray;\r\n GroupsAppearance.TopFont.Color := gcBlack;\r\n GroupsAppearance.BottomFont.Color := gcBlack;\r\n ColumnsAppearance.TopFill.Kind := gfkNone;\r\n ColumnsAppearance.BottomFill.Kind := gfkNone;\r\n ColumnsAppearance.TopStroke.Kind := gskSolid;\r\n ColumnsAppearance.BottomStroke.Kind := gskSolid;\r\n GroupsAppearance.TopFill.Kind := gfkNone;\r\n GroupsAppearance.BottomFill.Kind := gfkNone;\r\n GroupsAppearance.TopStroke.Kind := gskSolid;\r\n GroupsAppearance.BottomStroke.Kind := gskSolid;\r\n NodesAppearance.Font.Color := gcBlack;\r\n NodesAppearance.ExtendedFontColor := gcBlack;\r\n ColumnsAppearance.TopFont.Color := gcBlack;\r\n ColumnsAppearance.BottomFont.Color := gcBlack;\r\n GroupsAppearance.TopFont.Color := gcBlack;\r\n GroupsAppearance.BottomFont.Color := gcBlack;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetInteraction(const Value: TTMSFNCTreeViewInteraction);\r\nbegin\r\n if FInteraction <> Value then\r\n FInteraction.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetNodesAppearance(const Value: TTMSFNCTreeViewNodesAppearance);\r\nbegin\r\n if FNodesAppearance <> Value then\r\n FNodesAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetSelectedNode(\r\n const Value: TTMSFNCTreeViewNode);\r\nbegin\r\n if Assigned(Value) then\r\n SelectedVirtualNode := TTMSFNCTreeViewNodeOpen(Value).VirtualNode\r\n else\r\n SelectedVirtualNode := nil;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetSelectedVirtualNode(\r\n const Value: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n FocusedVirtualNode := Value;\r\n SelectVirtualNode(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetSortColumn(const Value: Integer);\r\nbegin\r\n if FSortColumn <> Value then\r\n begin\r\n FSortColumn := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetTopRow(const Value: Integer);\r\nbegin\r\n ScrollToVirtualNodeRow(Value, True, tvnspTop, True);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetVerticalOffset(AVerticalOffset: Single);\r\nbegin\r\n FVerticalOffsetTo := AVerticalOffset;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetGroupsAppearance(\r\n const Value: TTMSFNCTreeViewGroupsAppearance);\r\nbegin\r\n if FGroupsAppearance <> Value then\r\n FGroupsAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetAdapter(const Value: TTMSFNCTreeViewAdapter);\r\nbegin\r\n if Assigned(Value) then\r\n Value.TreeView := Self;\r\n FAdapter := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetColumnsAppearance(\r\n const Value: TTMSFNCTreeViewColumnsAppearance);\r\nbegin\r\n if FColumnsAppearance <> Value then\r\n FColumnsAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetColumnStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FColumnStroke <> Value then\r\n FColumnStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetCompactMode(const Value: Boolean);\r\nbegin\r\n if FCompactMode <> Value then\r\n begin\r\n FCompactMode := Value;\r\n UpdateTreeView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetFocusedNode(\r\n const Value: TTMSFNCTreeViewNode);\r\nbegin\r\n if Assigned(Value) then\r\n FocusedVirtualNode := TTMSFNCTreeViewNodeOpen(Value).VirtualNode\r\n else\r\n FocusedVirtualNode := nil;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.SetFocusedVirtualNode(\r\n const Value: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n FFocusedNode := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.StartReload;\r\nbegin\r\n FVerticalOffsetTo := GetReloadOffset;\r\n StartVerticalOffsetAnimation;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.StartVerticalOffsetAnimation;\r\nbegin\r\n FAnimateVerticalOffset := True;\r\n FAnimateTimer.Enabled := True;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.StopAnimationTimer;\r\nbegin\r\n FAnimateTimer.Enabled := False;\r\n FAnimating := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.StopEditing;\r\nbegin\r\n if FInplaceEditorActive then\r\n CloseInplaceEditor(False);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UnSelectAllNodes;\r\nbegin\r\n UnSelectAllVirtualNodes;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UnSelectAllVirtualNodes;\r\nbegin\r\n FSelectedNodes.Clear;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UnSelectNode(ANode: TTMSFNCTreeViewNode);\r\nbegin\r\n if Assigned(ANode) then\r\n UnSelectVirtualNode(TTMSFNCTreeViewNodeOpen(ANode).VirtualNode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UnSelectNodes(ANodes: TTMSFNCTreeViewNodeArray);\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewNode;\r\nbegin\r\n for I := 0 to Length(ANodes) - 1 do\r\n begin\r\n v := ANodes[I];\r\n if Assigned(v) then\r\n FSelectedNodes.Remove(TTMSFNCTreeViewNodeOpen(v).VirtualNode);\r\n end;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UnSelectVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n FSelectedNodes.Remove(ANode);\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UnSelectVirtualNodes(\r\n ANodes: TTMSFNCTreeViewVirtualNodeArray);\r\nvar\r\n I: Integer;\r\n v: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n for I := 0 to Length(ANodes) - 1 do\r\n begin\r\n v := ANodes[I];\r\n FSelectedNodes.Remove(v);\r\n end;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateAutoSizing;\r\nbegin\r\n if ColumnsAppearance.Stretch then\r\n StretchColumn(ColumnsAppearance.StretchAll, ColumnsAppearance.StretchColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateCalculations;\r\nbegin\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) or (csLoading in ComponentState) then\r\n Exit;\r\n\r\n FOldTopRow := GetFirstVisibleVirtualNodeRow;\r\n\r\n ColumnCount := Columns.Count;\r\n\r\n if NodesAppearance.HeightMode = tnhmFixed then\r\n DefaultRowHeight := NodesAppearance.FixedHeight\r\n else\r\n DefaultRowHeight := NodesAppearance.VariableMinimumHeight;\r\n\r\n if (UpdateCount = 0) and not BlockUpdateNodeList and not ((csDestroying in ComponentState) or (csReading in ComponentState) or (csLoading in ComponentState)) then\r\n BuildNodeList;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateColumnRowCalculations(AUpdateTotalRowHeight: Boolean = True);\r\nvar\r\n I: Integer;\r\n r, c: Double;\r\n lm, tm, rm, bm: Single;\r\nbegin\r\n ColumnP.Clear;\r\n c := 0;\r\n ColumnPositions[0] := c;\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n c := c + ColumnWidths[I];\r\n ColumnPositions[I + 1] := c;\r\n end;\r\n\r\n TotalColumnWidth := c;\r\n\r\n if AUpdateTotalRowHeight then\r\n begin\r\n lm := 0;\r\n tm := 0;\r\n rm := 0;\r\n bm := 0;\r\n GetNodeMargins(lm, tm, rm, bm);\r\n r := RowCount * DefaultRowHeight;\r\n TotalRowHeight := r + 1 + tm + bm;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateDisplay;\r\nbegin\r\n inherited;\r\n UpdateNodesCache(False);\r\n UpdateGroupsDisplay;\r\n UpdateColumnsDisplay;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateNodesCache(AUpdateNodes: Boolean = True; AResetNodes: Boolean = False);\r\nbegin\r\n if BlockUpdateNode then\r\n Exit;\r\n\r\n UpdateScrollBars(True, False);\r\n UpdateVisualRange;\r\n UpdateNodeCache;\r\n UpdateScrollBars(True, False);\r\n\r\n {$IFDEF FMXLIB}\r\n FScrollBarTimer.Enabled := True;\r\n {$ENDIF}\r\n\r\n if AUpdateNodes then\r\n begin\r\n if AResetNodes then\r\n ResetNodes(False);\r\n\r\n UpdateAutoSizing;\r\n UpdateColumnRowCalculations(False);\r\n UpdateNodesCache(False);\r\n UpdateVisualRange;\r\n end\r\n else\r\n begin\r\n UpdateNodeDisplay;\r\n UpdateInplaceEditorPosition;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateTreeViewCache;\r\nbegin\r\n if (UpdateCount > 0) then\r\n Exit;\r\n\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateColumnsCache;\r\nbegin\r\n UpdateColumnCache(FColumnsTopCache);\r\n UpdateColumnCache(FColumnsBottomCache);\r\n UpdateColumnsDisplay;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateColumnCache(ACache: TTMSFNCTreeViewCache);\r\nvar\r\n w, h, bmpw, bmph, bw, bh: Double;\r\n rt: TRectF;\r\n c: Integer;\r\n dx: Double;\r\n offsetx, extrax: Double;\r\n ac: Integer;\r\n rc: TRectF;\r\n cnt: Integer;\r\nbegin\r\n inherited;\r\n if (UpdateCount > 0) or (csDestroying in ComponentState) or not Assigned(ACache) then\r\n Exit;\r\n\r\n ACache.Clear;\r\n\r\n if (ACache is TTMSFNCTreeViewColumnsTopCache) and (not (tclTop in ColumnsAppearance.Layouts) or (ColumnsAppearance.TopSize <= 0)) then\r\n Exit;\r\n\r\n if (ACache is TTMSFNCTreeViewColumnsBottomCache) and (not (tclBottom in ColumnsAppearance.Layouts) or (ColumnsAppearance.BottomSize <= 0)) then\r\n Exit;\r\n\r\n w := GetTotalColumnWidth;\r\n if ACache is TTMSFNCTreeViewColumnsTopCache then\r\n h := GetColumnsTopSize + 1\r\n else\r\n h := GetColumnsBottomSize + 1;\r\n\r\n extrax := GetColumnsExtraSize;\r\n offsetx := 0;\r\n bmpw := 0;\r\n bmph := 0;\r\n ac := 0;\r\n c := 0;\r\n dx := 0;\r\n\r\n cnt := ColumnCount - 1;\r\n\r\n while bmpw < w do\r\n begin\r\n bw := w;\r\n\r\n while bmph < h do\r\n begin\r\n bh := h;\r\n\r\n rt := RectF(0, 0, bw, bh);\r\n\r\n dx := rt.Left + offsetx;\r\n\r\n for c := ac to cnt do\r\n begin\r\n {$IFDEF FMXWEBLIB}\r\n rc.Top := int(rt.Top) + 0.5;\r\n rc.Bottom := int(rt.Bottom) - 0.5;\r\n rc.Left := int(dx) + 0.5;\r\n dx := dx + ColumnWidths[c] + extrax;\r\n rc.Right := int(dx) + 0.5;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n rc.Top := rt.Top;\r\n rc.Bottom := rt.Bottom;\r\n rc.Left := dx;\r\n dx := dx + ColumnWidths[c] + extrax;\r\n rc.Right := dx + 1;\r\n {$ENDIF}\r\n\r\n OffsetRectEx(rc, bmpw, bmph);\r\n if ACache is TTMSFNCTreeViewColumnsTopCache then\r\n ACache.Add(TTMSFNCTreeViewCacheItem.CreateColumnTop(rc, c))\r\n else\r\n ACache.Add(TTMSFNCTreeViewCacheItem.CreateColumnBottom(rc, c));\r\n\r\n if dx > rt.Right - rt.Left then\r\n Break;\r\n end;\r\n\r\n bmph := bmph + bh;\r\n end;\r\n bmpw := bmpw + bw;\r\n bmph := 0;\r\n ac := c;\r\n offsetx := -ColumnWidths[c] - (bw - dx);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateColumnsDisplay;\r\nbegin\r\n BuildDisplay(FColumnsTopCache, FColumnsTopDisplay);\r\n BuildDisplay(FColumnsBottomCache, FColumnsBottomDisplay);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n if Assigned(Adapter) then\r\n Adapter.UpdateBounds;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.VerticalScrollPositionChanged;\r\nbegin\r\n BlockScrollingUpdate := True;\r\n UpdateDisplay;\r\n BlockScrollingUpdate := False;\r\n DoVScroll(GetVScrollValue);\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToCacheItem(X,\r\n Y: Double; OffsetX: Single = 0): TTMSFNCTreeViewCacheItem;\r\nvar\r\n I: Integer;\r\n dsp: TTMSFNCTreeViewCacheItem;\r\n r: TRectF;\r\nbegin\r\n Result := nil;\r\n if not Assigned(FNodeDisplay) then\r\n Exit;\r\n\r\n if not PtInRectEx(GetContentClipRect, PointF(X, Y)) then\r\n Exit;\r\n\r\n for I := 0 to FNodeDisplay.Count - 1 do\r\n begin\r\n dsp := FNodeDisplay[I];\r\n r := dsp.DrawRect;\r\n r.Left := r.Left + OffsetX;\r\n r.Right := r.Right + OffsetX;\r\n if PtInRectEx(r, PointF(X, Y)) then\r\n begin\r\n Result := dsp;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToColumn(X, Y: Single): Integer;\r\nvar\r\n I: Integer;\r\n topr: TRectF;\r\n r: TRectF;\r\n colw, colp: Double;\r\nbegin\r\n Result := -1;\r\n topr := GetColumnsTopRect;\r\n topr.Left := topr.Left - GetHorizontalScrollPosition;\r\n for I := ColumnCount - 1 downto 0 do\r\n begin\r\n if (I >= 0) and (I <= Columns.Count - 1) and Columns[I].Visible then\r\n begin\r\n colw := ColumnWidths[I] + GetColumnsExtraSize;\r\n if colw >= 0 then\r\n begin\r\n colp := ColumnPositions[I];\r\n r := RectF(topr.Left + colp, topr.Top, topr.Left + colp + colw, topr.Bottom);\r\n if PtInRectEx(r, PointF(X, Y)) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToColumnExpand(X, Y: Single): Integer;\r\nvar\r\n I: Integer;\r\n topr: TRectF;\r\n r, dr, sr: TRectF;\r\n szd: Single;\r\n colw, colp, f: Double;\r\nbegin\r\n Result := -1;\r\n topr := GetColumnsTopRect;\r\n topr.Left := topr.Left - GetHorizontalScrollPosition;\r\n for I := ColumnCount - 1 downto 0 do\r\n begin\r\n if (I >= 0) and (I <= Columns.Count - 1) and Columns[I].Expandable and Columns[I].Visible then\r\n begin\r\n colw := ColumnWidths[I] + GetColumnsExtraSize;\r\n if colw >= 0 then\r\n begin\r\n colp := ColumnPositions[I];\r\n r := RectF(topr.Left + colp, topr.Top, topr.Left + colp + colw, topr.Bottom);\r\n szd := Columns[I].ExpandingButtonSize;\r\n\r\n if Columns[I].Filtering.Enabled then\r\n begin\r\n f := Columns[I].Filtering.ButtonSize;\r\n dr := RectF(Round(r.Right - f - 4), Round(r.Top + ((r.Bottom - r.Top) - f) / 2), Round(r.Right - 4), Round(r.Top + ((r.Bottom - r.Top) - f) / 2 + f));\r\n sr.Right := dr.Left;\r\n end\r\n else\r\n sr := r;\r\n\r\n dr := RectF(Round(sr.Right - szd - 6), Round(sr.Top + ((sr.Bottom - sr.Top) - szd) / 2), Round(sr.Right - 6), Round(sr.Top + ((sr.Bottom - sr.Top) - szd) / 2 + szd));\r\n if PtInRectEx(dr, PointF(X, Y)) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToColumnFilter(X, Y: Single): Integer;\r\nvar\r\n I: Integer;\r\n topr: TRectF;\r\n r, dr: TRectF;\r\n szd: Single;\r\n colw, colp: Double;\r\nbegin\r\n Result := -1;\r\n topr := GetColumnsTopRect;\r\n topr.Left := topr.Left - GetHorizontalScrollPosition;\r\n for I := ColumnCount - 1 downto 0 do\r\n begin\r\n if (I >= 0) and (I <= Columns.Count - 1) and Columns[I].Filtering.Enabled and Columns[I].Visible then\r\n begin\r\n colw := ColumnWidths[I] + GetColumnsExtraSize;\r\n if colw >= 0 then\r\n begin\r\n colp := ColumnPositions[I];\r\n r := RectF(topr.Left + colp, topr.Top, topr.Left + colp + colw, topr.Bottom);\r\n szd := Columns[I].Filtering.ButtonSize;\r\n dr := RectF(Round(r.Right - szd - 4), Round(r.Top + ((r.Bottom - r.Top) - szd) / 2), Round(r.Right - 4), Round(r.Top + ((r.Bottom - r.Top) - szd) / 2 + szd));\r\n if PtInRectEx(dr, PointF(X, Y)) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToColumnSize(X,\r\n Y: Single): Integer;\r\nvar\r\n I: Integer;\r\n topr: TRectF;\r\n r: TRectF;\r\n colw, colp: Double;\r\nbegin\r\n Result := -1;\r\n topr := GetColumnsTopRect;\r\n topr.Left := topr.Left - GetHorizontalScrollPosition;\r\n for I := ColumnCount - 1 downto 0 do\r\n begin\r\n if (I >= 0) and (I <= Columns.Count - 1) and Columns[I].Visible then\r\n begin\r\n colw := ColumnWidths[I];\r\n if (colw >= 0) and (I >= 0) and (I <= Columns.Count - 1) and (Columns[I].Visible) then\r\n begin\r\n colp := ColumnPositions[I];\r\n r := RectF(topr.Left + colp + colw - 4, topr.Top, topr.Left + colp + colw + 4, topr.Bottom);\r\n if PtInRectEx(r, PointF(X, Y)) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNodeAnchor(ANode: TTMSFNCTreeViewVirtualNode; X,\r\n Y: Single): TTMSFNCTreeViewNodeAnchor;\r\nvar\r\n I: Integer;\r\n txtr: TRectF;\r\n a: String;\r\n str: String;\r\n g: TTMSFNCGraphics;\r\n c: TTMSFNCTreeViewColumn;\r\n ha, va: TTMSFNCGraphicsTextAlign;\r\n ww: Boolean;\r\n trim: TTMSFNCGraphicsTextTrimming;\r\nbegin\r\n Result.AAnchor := '';\r\n Result.AColumn := -1;\r\n if Assigned(ANode) then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Length(ANode.TextRects) - 1) then\r\n begin\r\n txtr := ANode.TextRects[I];\r\n InflateRectEx(txtr, -2, -2);\r\n if PtInRectEx(txtr, PointF(X, Y)) then\r\n begin\r\n c := nil;\r\n if (I <= Columns.Count - 1) then\r\n c := Columns[I];\r\n\r\n ha := gtaLeading;\r\n va := gtaCenter;\r\n ww := False;\r\n trim := gttNone;\r\n if Assigned(c) then\r\n begin\r\n ha := c.HorizontalTextAlign;\r\n va := c.VerticalTextAlign;\r\n ww := c.WordWrapping;\r\n trim := c.Trimming;\r\n end;\r\n\r\n DoGetNodeTrimming(ANode, I, trim);\r\n DoGetNodeWordWrapping(ANode, I, ww);\r\n DoGetNodeHorizontalTextAlign(ANode, I, ha);\r\n DoGetNodeVerticalTextAlign(ANode, I,va);\r\n\r\n str := '';\r\n DoGetNodeText(ANode, I, tntmDrawing, str);\r\n\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.BitmapContainer := BitmapContainer;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n try\r\n a := g.DrawText(txtr, str, ww, ha, va, trim, 0, -1, -1, True, True, X, Y);\r\n finally\r\n g.Free;\r\n end;\r\n\r\n if a <> '' then\r\n begin\r\n Result.AAnchor := a;\r\n Result.AColumn := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNodeCheck(ANode: TTMSFNCTreeViewVirtualNode; X,\r\n Y: Single): TTMSFNCTreeViewNodeCheck;\r\nvar\r\n nrt: TRectF;\r\n en: Boolean;\r\n I: Integer;\r\nbegin\r\n Result.AColumn := -1;\r\n Result.ANode := nil;\r\n en := True;\r\n DoIsNodeEnabled(ANode, en);\r\n if Assigned(ANode) and en then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Length(ANode.CheckRects) - 1) then\r\n begin\r\n nrt := ANode.CheckRects[I];\r\n if PtInRectEx(nrt, PointF(X, Y)) then\r\n begin\r\n Result.ANode := ANode;\r\n Result.AColumn := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNodeExpand(ANode: TTMSFNCTreeViewVirtualNode; X,\r\n Y: Single): Boolean;\r\nvar\r\n nrt: TRectF;\r\n en: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(ANode) and (ANode.Children > 0) then\r\n begin\r\n en := True;\r\n DoIsNodeEnabled(ANode, en);\r\n if en then\r\n begin\r\n if (NodesAppearance.ExpandColumn >= 0) and (NodesAppearance.ExpandColumn <= Length(ANode.ExpandRects) - 1) then\r\n begin\r\n nrt := ANode.ExpandRects[NodesAppearance.ExpandColumn];\r\n Result := PtInRectEx(nrt, PointF(X, Y));\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNodeExtra(ANode: TTMSFNCTreeViewVirtualNode;\r\n X, Y: Single): Boolean;\r\nvar\r\n nrt: TRectF;\r\n en: Boolean;\r\n I: Integer;\r\nbegin\r\n Result := False;\r\n en := True;\r\n DoIsNodeEnabled(ANode, en);\r\n if Assigned(ANode) and en then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Length(ANode.ExtraRects) - 1) then\r\n begin\r\n nrt := ANode.ExtraRects[I];\r\n if PtInRectEx(nrt, PointF(X, Y)) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNodeTextColumn(ANode: TTMSFNCTreeViewVirtualNode;\r\n X, Y: Single): Integer;\r\nvar\r\n nrt: TRectF;\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ANode) then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Length(ANode.TextRects) - 1) then\r\n begin\r\n nrt := ANode.TextRects[I];\r\n if PtInRectEx(nrt, PointF(X, Y)) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNodeTitleAnchor(\r\n ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): TTMSFNCTreeViewNodeAnchor;\r\nvar\r\n I: Integer;\r\n titr: TRectF;\r\n a: String;\r\n str: String;\r\n g: TTMSFNCGraphics;\r\n c: TTMSFNCTreeViewColumn;\r\n ha, va: TTMSFNCGraphicsTextAlign;\r\n ww: Boolean;\r\n trim: TTMSFNCGraphicsTextTrimming;\r\nbegin\r\n Result.AAnchor := '';\r\n Result.AColumn := -1;\r\n if Assigned(ANode) then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Length(ANode.TitleRects) - 1) then\r\n begin\r\n titr := ANode.TitleRects[I];\r\n InflateRectEx(titr, -2, -2);\r\n if PtInRectEx(titr, PointF(X, Y)) then\r\n begin\r\n c := nil;\r\n if (I <= Columns.Count - 1) then\r\n c := Columns[I];\r\n\r\n ha := gtaLeading;\r\n va := gtaCenter;\r\n ww := False;\r\n trim := gttNone;\r\n if Assigned(c) then\r\n begin\r\n ha := c.TitleHorizontalTextAlign;\r\n va := c.TitleVerticalTextAlign;\r\n ww := c.TitleWordWrapping;\r\n trim := c.TitleTrimming;\r\n end;\r\n\r\n DoGetNodeTitleTrimming(ANode, I, trim);\r\n DoGetNodeTitleWordWrapping(ANode, I, ww);\r\n DoGetNodeTitleHorizontalTextAlign(ANode, I, ha);\r\n DoGetNodeTitleVerticalTextAlign(ANode, I,va);\r\n\r\n str := '';\r\n DoGetNodeTitle(ANode, I, tntmDrawing, str);\r\n\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.BitmapContainer := BitmapContainer;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n try\r\n a := g.DrawText(titr, str, ww, ha, va, trim, 0, -1, -1, True, True, X, Y);\r\n finally\r\n g.Free;\r\n end;\r\n\r\n if a <> '' then\r\n begin\r\n Result.AAnchor := a;\r\n Result.AColumn := I;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNodeTitleExtra(\r\n ANode: TTMSFNCTreeViewVirtualNode; X, Y: Single): Boolean;\r\nvar\r\n nrt: TRectF;\r\n en: Boolean;\r\n I: Integer;\r\nbegin\r\n Result := False;\r\n en := True;\r\n DoIsNodeEnabled(ANode, en);\r\n if Assigned(ANode) and en then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Length(ANode.TitleExtraRects) - 1) then\r\n begin\r\n nrt := ANode.TitleExtraRects[I];\r\n if PtInRectEx(nrt, PointF(X, Y)) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTreeView.XYToNode(X, Y: Double; OffsetX: Single = 0): TTMSFNCTreeViewVirtualNode;\r\nvar\r\n dsp: TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := nil;\r\n dsp := XYToCacheItem(X, Y, OffsetX);\r\n if Assigned(dsp) then\r\n Result := dsp.Node;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleNodeEditing(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer);\r\nvar\r\n c: TTMSFNCTreeViewColumn;\r\n ins: Boolean;\r\n {$IFNDEF LCLWEBLIB}\r\n AContext: TRttiContext;\r\n rt: TRttiType;\r\n propt: TRttiProperty;\r\n {$ENDIF}\r\n n: String;\r\n r: TRectF;\r\n {$IFDEF FMXLIB}\r\n trans: Boolean;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n rtr: TRect;\r\n {$ENDIF}\r\n\r\n function CreateCaretPos(ALine, APos: Integer): TTMSFNCTreeViewCaretPosition;\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result.Line := ALine;\r\n Result.Pos := APos;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result.X := ALine;\r\n Result.Y := APos;\r\n {$ENDIF}\r\n end;\r\nbegin\r\n if Assigned(ANode) and (AColumn >= 0) and (AColumn <= Columns.Count - 1) then\r\n begin\r\n c := Columns[AColumn];\r\n FInplaceEditorClass := nil;\r\n if not c.CustomEditor then\r\n begin\r\n case c.EditorType of\r\n tcetEdit: FInplaceEditorClass := TTMSFNCTreeViewEdit;\r\n tcetComboBox: FInplaceEditorClass := TTMSFNCTreeViewComboBox;\r\n tcetMemo: FInplaceEditorClass := TTMSFNCTreeViewMemo;\r\n tcetNone: Exit;\r\n end;\r\n end;\r\n\r\n ins := True;\r\n DoBeforeOpenInplaceEditor(ANode, AColumn, ins);\r\n if ins then\r\n begin\r\n {$IFDEF FMXLIB}\r\n trans := True;\r\n DoGetInplaceEditor(ANode, AColumn, trans, FInplaceEditorClass);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n DoGetInplaceEditor(ANode, AColumn, FInplaceEditorClass);\r\n {$ENDIF}\r\n\r\n if Assigned(FInplaceEditor) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n FInplaceEditor.DisposeOf;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FInplaceEditor.Free;\r\n {$ENDIF}\r\n FInplaceEditor := nil;\r\n end;\r\n\r\n if Assigned(FInplaceEditorClass) then\r\n FInplaceEditor := FInplaceEditorClass.Create(Self)\r\n else\r\n FInplaceEditor := TEdit.Create(Self);\r\n\r\n r := GetInplaceEditorRect(ANode, AColumn);\r\n if Assigned(FInplaceEditor) then\r\n begin\r\n FUpdateNode := ANode;\r\n FUpdateNodeColumn := AColumn;\r\n {$IFDEF FMXLIB}\r\n if trans then\r\n begin\r\n FInplaceEditor.DisableFocusEffect := True;\r\n FInplaceEditor.OnApplyStyleLookup := ApplyInplaceEditorStyleLookup;\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n FInplaceEditor.ShowFocus := False;\r\n {$ENDIF}\r\n\r\n FInplaceEditor.Parent := Self;\r\n FInplaceEditor.Visible := False;\r\n {$IFDEF FMXLIB}\r\n FInplaceEditor.BoundsRect := r;\r\n FInplaceEditor.BoundsRect := RectF(r.Left, r.Top + (r.Bottom - r.Top - FInplaceEditor.Height) / 2, r.Right, r.Top + (r.Bottom - r.Top - FInplaceEditor.Height) / 2 + FInplaceEditor.Height);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n rtr := Rect(Round(r.Left), Round(r.Top), Round(r.Right), Round(r.Bottom));\r\n FInplaceEditor.BoundsRect := rtr;\r\n FInplaceEditor.BoundsRect := Rect(rtr.Left, rtr.Top + (rtr.Bottom - rtr.Top - FInplaceEditor.Height) div 2, rtr.Right, rtr.Top + (rtr.Bottom - rtr.Top - FInplaceEditor.Height) div 2 + FInplaceEditor.Height);\r\n {$ENDIF}\r\n FInplaceEditor.Visible := True;\r\n\r\n if (c.EditorType = tcetComboBox) and not c.CustomEditor and (FInplaceEditor is TComboBox) then\r\n begin\r\n (FInplaceEditor as TComboBox).Items.Assign(c.EditorItems);\r\n \t {$IFDEF CMNWEBLIB}\r\n (FInplaceEditor as TComboBox).Style := csDropDownList;\r\n \t {$ENDIF}\r\n \tend;\r\n\r\n CustomizeInplaceEditor(FInplaceEditor, ANode, c);\r\n\r\n {$IFNDEF LCLWEBLIB}\r\n AContext := TRttiContext.Create;\r\n {$ENDIF}\r\n try\r\n {$IFNDEF LCLWEBLIB}\r\n rt := AContext.GetType(FInplaceEditor.ClassInfo);\r\n {$ENDIF}\r\n n := '';\r\n DoGetNodeText(ANode, AColumn, tntmEditing, n);\r\n if (FInplaceEditor is TComboBox) then\r\n (FInplaceEditor as TComboBox).ItemIndex := (FInplaceEditor as TComboBox).Items.IndexOf(n)\r\n {$IFDEF LCLWEBLIB}\r\n ;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n else\r\n begin\r\n propt := rt.GetProperty('Text');\r\n if Assigned(propt) then\r\n propt.SetValue(FInplaceEditor, n)\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF LCLWEBLIB}\r\n if FInplaceEditor is TEdit then\r\n (FInplaceEditor as TEdit).Text := n;\r\n\r\n if FInplaceEditor is TMemo then\r\n (FInplaceEditor as TMemo).Text := n;\r\n {$ENDIF}\r\n finally\r\n {$IFNDEF LCLWEBLIB}\r\n AContext.Free;\r\n {$ENDIF}\r\n end;\r\n\r\n if FInplaceEditor.CanFocus then\r\n FInplaceEditor.SetFocus;\r\n\r\n if FInplaceEditor is TEdit then\r\n (FInplaceEditor as TEdit).SelStart := Length((FInplaceEditor as TEdit).Text);\r\n\r\n if FInplaceEditor is TMemo then\r\n begin\r\n (FInplaceEditor as TMemo).SelLength := 0;\r\n if (FInplaceEditor as TMemo).Lines.Count > 0 then\r\n (FInplaceEditor as TMemo).CaretPosition := CreateCaretPos((FInplaceEditor as TMemo).Lines.Count - 1, Length((FInplaceEditor as TMemo).Lines[(FInplaceEditor as TMemo).Lines.Count - 1]))\r\n else\r\n (FInplaceEditor as TMemo).CaretPosition := CreateCaretPos(0, 0);\r\n end;\r\n\r\n FInplaceEditorActive := True;\r\n Invalidate;\r\n end;\r\n\r\n DoAfterOpenInplaceEditor(ANode, AColumn, FInplaceEditor, r);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleNodeExpand(ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n e: Boolean;\r\nbegin\r\n if Assigned(ANode) then\r\n begin\r\n if not ANode.Expanded and (ANode.Children > 0) then\r\n begin\r\n e := True;\r\n BlockUpdateNode := True;\r\n DoBeforeExpandNode(ANode, e);\r\n BlockUpdateNode := False;\r\n if e then\r\n begin\r\n ToggleNodeInternal(ANode);\r\n DoAfterExpandNode(ANode);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleNodeExtra(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleNodeCollapse(ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n e: Boolean;\r\nbegin\r\n if Assigned(ANode) then\r\n begin\r\n if ANode.Expanded and (ANode.Children > 0) then\r\n begin\r\n e := True;\r\n BlockUpdateNode := True;\r\n DoBeforeCollapseNode(ANode, e);\r\n BlockUpdateNode := False;\r\n if e then\r\n begin\r\n ToggleNodeInternal(ANode);\r\n DoAfterCollapseNode(ANode);\r\n end;\r\n end\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleNodeTitleExtra(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleNodeToggle(ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n e: Boolean;\r\nbegin\r\n if Assigned(ANode) and (ANode.Children > 0) then\r\n begin\r\n if ANode.Expanded then\r\n begin\r\n e := True;\r\n BlockUpdateNode := True;\r\n DoBeforeCollapseNode(ANode, e);\r\n BlockUpdateNode := False;\r\n if e then\r\n begin\r\n ToggleNodeInternal(ANode);\r\n DoAfterCollapseNode(ANode);\r\n end;\r\n end\r\n else\r\n begin\r\n e := True;\r\n BlockUpdateNode := True;\r\n DoBeforeExpandNode(ANode, e);\r\n BlockUpdateNode := False;\r\n if e then\r\n begin\r\n ToggleNodeInternal(ANode);\r\n DoAfterExpandNode(ANode);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleNodeToggleCheck(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer);\r\nvar\r\n chk, e: Boolean;\r\n chkt: TTMSFNCTreeViewNodeCheckType;\r\nbegin\r\n if Assigned(ANode) then\r\n begin\r\n if (AColumn >= 0) and (AColumn <= Length(ANode.CheckStates) - 1) then\r\n begin\r\n chk := ANode.CheckStates[AColumn];\r\n if chk then\r\n begin\r\n chkt := tvntNone;\r\n DoGetNodeCheckType(ANode, AColumn, chkt);\r\n if chkt = tvntCheckBox then\r\n begin\r\n e := True;\r\n DoBeforeUnCheckNode(ANode, AColumn, e);\r\n if e then\r\n begin\r\n ToggleCheckNodeInternal(ANode, AColumn);\r\n DoAfterUnCheckNode(ANode, AColumn);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n e := True;\r\n DoBeforeCheckNode(ANode, AColumn, e);\r\n if e then\r\n begin\r\n ToggleCheckNodeInternal(ANode, AColumn);\r\n DoAfterCheckNode(ANode, AColumn);\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTreeView.HandleSelectNode(ANode: TTMSFNCTreeViewVirtualNode;\r\n ATriggerEvents: Boolean; AKeyBoard: Boolean; AMultiSelect: Boolean);\r\nvar\r\n I: Integer;\r\n it: TTMSFNCTreeViewVirtualNode;\r\n en: Boolean;\r\nbegin\r\n if not AMultiSelect then\r\n begin\r\n for I := FSelectedNodes.Count - 1 downto 0 do\r\n begin\r\n it := FSelectedNodes[I];\r\n if it <> ANode then\r\n begin\r\n en := True;\r\n if ATriggerEvents then\r\n DoBeforeUnSelectNode(it, en);\r\n\r\n if en then\r\n begin\r\n if FSelectedNodes.IndexOf(it) > -1 then\r\n FSelectedNodes.Remove(it);\r\n if ATriggerEvents then\r\n DoAfterUnSelectNode(it);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n if Assigned(ANode) then\r\n begin\r\n if FSelectedNodes.IndexOf(ANode) > -1 then\r\n begin\r\n en := True;\r\n if ATriggerEvents then\r\n DoBeforeUnSelectNode(ANode, en);\r\n if en then\r\n begin\r\n if FSelectedNodes.IndexOf(ANode) > -1 then\r\n FSelectedNodes.Remove(ANode);\r\n if ATriggerEvents then\r\n DoAfterUnSelectNode(ANode);\r\n end;\r\n end\r\n else\r\n begin\r\n en := True;\r\n if ATriggerEvents then\r\n DoBeforeSelectNode(ANode, en);\r\n\r\n if en then\r\n begin\r\n FSelectedNodes.Add(ANode);\r\n if ATriggerEvents then\r\n begin\r\n DoAfterSelectNode(ANode);\r\n if not AKeyBoard then\r\n DoNodeClick(ANode);\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTreeViewNodesAppearance }\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewNodesAppearance then\r\n begin\r\n FFill.Assign((Source as TTMSFNCTreeViewNodesAppearance).Fill);\r\n FStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).Stroke);\r\n FFont.Assign((Source as TTMSFNCTreeViewNodesAppearance).Font);\r\n FTitleFont.Assign((Source as TTMSFNCTreeViewNodesAppearance).TitleFont);\r\n FSelectedFill.Assign((Source as TTMSFNCTreeViewNodesAppearance).SelectedFill);\r\n FSelectedStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).SelectedStroke);\r\n FDisabledFill.Assign((Source as TTMSFNCTreeViewNodesAppearance).DisabledFill);\r\n FDisabledStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).DisabledStroke);\r\n FExtendedFill.Assign((Source as TTMSFNCTreeViewNodesAppearance).ExtendedFill);\r\n FExtendedStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).ExtendedStroke);\r\n FExtendedFont.Assign((Source as TTMSFNCTreeViewNodesAppearance).ExtendedFont);\r\n FExtendedSelectedFill.Assign((Source as TTMSFNCTreeViewNodesAppearance).ExtendedSelectedFill);\r\n FExtendedSelectedStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).ExtendedSelectedStroke);\r\n FExtendedDisabledFill.Assign((Source as TTMSFNCTreeViewNodesAppearance).ExtendedDisabledFill);\r\n FExtendedDisabledStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).ExtendedDisabledStroke);\r\n FExpandColumn := (Source as TTMSFNCTreeViewNodesAppearance).ExpandColumn;\r\n FExpandWidth := (Source as TTMSFNCTreeViewNodesAppearance).ExpandWidth;\r\n FExpandHeight := (Source as TTMSFNCTreeViewNodesAppearance).ExpandHeight;\r\n FFixedHeight := (Source as TTMSFNCTreeViewNodesAppearance).FixedHeight;\r\n FVariableMinimumHeight := (Source as TTMSFNCTreeViewNodesAppearance).VariableMinimumHeight;\r\n FSelectedFontColor := (Source as TTMSFNCTreeViewNodesAppearance).SelectedFontColor;\r\n FDisabledFontColor := (Source as TTMSFNCTreeViewNodesAppearance).DisabledFontColor;\r\n FSelectedTitleFontColor := (Source as TTMSFNCTreeViewNodesAppearance).SelectedTitleFontColor;\r\n FDisabledTitleFontColor := (Source as TTMSFNCTreeViewNodesAppearance).DisabledTitleFontColor;\r\n FExtendedFontColor := (Source as TTMSFNCTreeViewNodesAppearance).ExtendedFontColor;\r\n FExtendedSelectedFontColor := (Source as TTMSFNCTreeViewNodesAppearance).ExtendedSelectedFontColor;\r\n FExtendedDisabledFontColor := (Source as TTMSFNCTreeViewNodesAppearance).ExtendedDisabledFontColor;\r\n FLevelIndent := (Source as TTMSFNCTreeViewNodesAppearance).LevelIndent;\r\n FSpacing := (Source as TTMSFNCTreeViewNodesAppearance).Spacing;\r\n FHeightMode := (Source as TTMSFNCTreeViewNodesAppearance).HeightMode;\r\n FShowLines := (Source as TTMSFNCTreeViewNodesAppearance).ShowLines;\r\n FShowFocus := (Source as TTMSFNCTreeViewNodesAppearance).ShowFocus;\r\n FColumnStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).ColumnStroke);\r\n FLineStroke.Assign((Source as TTMSFNCTreeViewNodesAppearance).LineStroke);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.Changed(Sender: TObject);\r\nbegin\r\n FTreeView.UpdateTreeViewCache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.BitmapChanged(Sender: TObject);\r\nbegin\r\n FTreeView.UpdateTreeViewCache;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewNodesAppearance.Create(ATreeView: TTMSFNCCustomTreeView);\r\nbegin\r\n FTreeView := ATreeView;\r\n FShowFocus := True;\r\n FSelectionArea := tsaFromText;\r\n FExpandColumn := 0;\r\n FExpandWidth := 15;\r\n FExpandHeight := 15;\r\n FFixedHeight := 25;\r\n FVariableMinimumHeight := 25;\r\n FShowLines := True;\r\n FHeightMode := tnhmFixed;\r\n FLevelIndent := 20;\r\n FSpacing := 0;\r\n FSelectedFontColor := gcWhite;\r\n FDisabledFontColor := gcSilver;\r\n\r\n FSelectedTitleFontColor := gcWhite;\r\n FDisabledTitleFontColor := gcSilver;\r\n\r\n FExtendedFontColor := gcBlack;\r\n FExtendedSelectedFontColor := gcWhite;\r\n FExtendedDisabledFontColor := gcSilver;\r\n\r\n FColumnStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcNull);\r\n FLineStroke := TTMSFNCGraphicsStroke.Create(gskDot, gcDarkGray);\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcNull);\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskNone, gcDarkGray);\r\n FSelectedFill := TTMSFNCGraphicsFill.Create(gfkSolid, TTMSFNCTreeViewColorSelection);\r\n FSelectedStroke := TTMSFNCGraphicsStroke.Create(gskSolid, TTMSFNCTreeViewColorSelection);\r\n FDisabledFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcDarkGray);\r\n FDisabledStroke := TTMSFNCGraphicsStroke.Create(gskNone, gcDarkGray);\r\n\r\n FExtendedFill := TTMSFNCGraphicsFill.Create(gfkSolid, TTMSFNCTreeViewColorExtended);\r\n FExtendedStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FExtendedSelectedFill := TTMSFNCGraphicsFill.Create(gfkSolid, TTMSFNCTreeViewColorSelection);\r\n FExtendedSelectedStroke := TTMSFNCGraphicsStroke.Create(gskNone, gcDarkGray);\r\n FExtendedDisabledFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcDarkGray);\r\n FExtendedDisabledStroke := TTMSFNCGraphicsStroke.Create(gskNone, gcDarkGray);\r\n\r\n FExpandNodeIcon := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWEXPAND, HInstance));\r\n FExpandNodeIcon.OnChange := @BitmapChanged;\r\n FCollapseNodeIcon := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWCOLLAPSE, HInstance));\r\n FExpandNodeIcon.OnChange := @BitmapChanged;\r\n FExpandNodeIconLarge := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWEXPANDLARGE, HInstance));\r\n FExpandNodeIconLarge.OnChange := @BitmapChanged;\r\n FCollapseNodeIconLarge := TTMSFNCBitmap(TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWCOLLAPSELARGE, HInstance));\r\n FCollapseNodeIconLarge.OnChange := @BitmapChanged;\r\n\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n if Assigned(FTreeView) and FTreeView.IsDesignTime then\r\n FFont.Color := gcBlack;\r\n\r\n FTitleFont := TTMSFNCGraphicsFont.Create;\r\n if Assigned(FTreeView) and FTreeView.IsDesignTime then\r\n FTitleFont.Color := gcBlack;\r\n\r\n FFill.OnChanged := @Changed;\r\n FStroke.OnChanged := @Changed;\r\n\r\n FSelectedFill.OnChanged := @Changed;\r\n FSelectedStroke.OnChanged := @Changed;\r\n\r\n FDisabledFill.OnChanged := @Changed;\r\n FDisabledStroke.OnChanged := @Changed;\r\n\r\n FExtendedFont := TTMSFNCGraphicsFont.Create;\r\n\r\n FExtendedFill.OnChanged := @Changed;\r\n FExtendedStroke.OnChanged := @Changed;\r\n\r\n FExtendedSelectedFill.OnChanged := @Changed;\r\n FExtendedSelectedStroke.OnChanged := @Changed;\r\n\r\n FExtendedDisabledFill.OnChanged := @Changed;\r\n FExtendedDisabledStroke.OnChanged := @Changed;\r\n\r\n FFont.OnChanged := @Changed;\r\n FExtendedFont.OnChanged := @Changed;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewNodesAppearance.Destroy;\r\nbegin\r\n FLineStroke.Free;\r\n FColumnStroke.Free;\r\n\r\n FExpandNodeIconLarge.Free;\r\n FCollapseNodeIconLarge.Free;\r\n FExpandNodeIcon.Free;\r\n FCollapseNodeIcon.Free;\r\n\r\n FFill.Free;\r\n FStroke.Free;\r\n FFont.Free;\r\n FTitleFont.Free;\r\n\r\n FSelectedFill.Free;\r\n FSelectedStroke.Free;\r\n\r\n FDisabledFill.Free;\r\n FDisabledStroke.Free;\r\n\r\n FExtendedFill.Free;\r\n FExtendedStroke.Free;\r\n FExtendedFont.Free;\r\n\r\n FExtendedSelectedFill.Free;\r\n FExtendedSelectedStroke.Free;\r\n\r\n FExtendedDisabledFill.Free;\r\n FExtendedDisabledStroke.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewNodesAppearance.IsSpacingStored: Boolean;\r\nbegin\r\n Result := Spacing <> 0;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetSelectedFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FSelectedFill <> Value then\r\n FSelectedFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetSelectedStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FSelectedStroke <> Value then\r\n FSelectedStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetSelectedTitleFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedTitleFontColor <> Value then\r\n begin\r\n FSelectedTitleFontColor := Value;\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetSelectionArea(const Value: TTMSFNCTreeViewSelectionArea);\r\nbegin\r\n if FSelectionArea <> Value then\r\n begin\r\n FSelectionArea := Value;\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetShowFocus(const Value: Boolean);\r\nbegin\r\n if FShowFocus <> Value then\r\n begin\r\n FShowFocus := Value;\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetShowLines(const Value: Boolean);\r\nbegin\r\n if FShowLines <> Value then\r\n begin\r\n FShowLines := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetSpacing(const Value: Double);\r\nbegin\r\n if FSpacing <> Value then\r\n begin\r\n FSpacing := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FFill <> Value then\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedFontColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FExtendedFontColor <> Value then\r\n begin\r\n FExtendedFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedSelectedFontColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FExtendedSelectedFontColor <> Value then\r\n begin\r\n FExtendedSelectedFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedDisabledFontColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FExtendedDisabledFontColor <> Value then\r\n begin\r\n FExtendedDisabledFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetSelectedFontColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedFontColor <> Value then\r\n begin\r\n FSelectedFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetDisabledFontColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledFontColor <> Value then\r\n begin\r\n FDisabledFontColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetFixedHeight(const Value: Double);\r\nbegin\r\n if FFixedHeight <> Value then\r\n begin\r\n FFixedHeight := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetVariableMinimumHeight(const Value: Double);\r\nbegin\r\n if FVariableMinimumHeight <> Value then\r\n begin\r\n FVariableMinimumHeight := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FFont <> Value then\r\n FFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedDisabledFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FExtendedDisabledFill <> Value then\r\n FExtendedDisabledFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedDisabledStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FExtendedDisabledStroke <> Value then\r\n FExtendedDisabledStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedSelectedFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FExtendedSelectedFill <> Value then\r\n FExtendedSelectedFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedSelectedStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FExtendedSelectedStroke <> Value then\r\n FExtendedSelectedStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FExtendedFill <> Value then\r\n FExtendedFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FExtendedFont <> Value then\r\n FExtendedFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExtendedStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FExtendedStroke <> Value then\r\n FExtendedStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetHeightMode(\r\n const Value: TTMSFNCTreeViewNodeHeightMode);\r\nbegin\r\n if FHeightMode <> Value then\r\n begin\r\n FHeightMode := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetLevelIndent(const Value: Double);\r\nbegin\r\n if FLevelIndent <> Value then\r\n begin\r\n FLevelIndent := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExpandNodeIcon(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FExpandNodeIcon <> Value then\r\n begin\r\n FExpandNodeIcon.Assign(Value);\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExpandNodeIconLarge(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FExpandNodeIconLarge <> Value then\r\n begin\r\n FExpandNodeIconLarge.Assign(Value);\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetCollapseNodeIconLarge(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FCollapseNodeIconLarge <> Value then\r\n begin\r\n FCollapseNodeIconLarge.Assign(Value);\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetColumnStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FColumnStroke <> Value then\r\n FColumnStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetLineStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FLineStroke <> Value then\r\n FLineStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExpandColumn(const Value: Integer);\r\nbegin\r\n if FExpandColumn <> Value then\r\n begin\r\n FExpandColumn := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExpandWidth(const Value: Double);\r\nbegin\r\n if FExpandWidth <> Value then\r\n begin\r\n FExpandWidth := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetExpandHeight(const Value: Double);\r\nbegin\r\n if FExpandHeight <> Value then\r\n begin\r\n FExpandHeight := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FStroke <> Value then\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetTitleFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FTitleFont <> Value then\r\n FTitleFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetCollapseNodeIcon(\r\n const Value: TTMSFNCBitmap);\r\nbegin\r\n if FCollapseNodeIcon <> Value then\r\n begin\r\n FCollapseNodeIcon.Assign(Value);\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetDisabledFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FDisabledFill <> Value then\r\n FDisabledFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetDisabledStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FDisabledStroke <> Value then\r\n FDisabledStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewNodesAppearance.SetDisabledTitleFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledTitleFontColor <> Value then\r\n begin\r\n FDisabledTitleFontColor := Value;\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTreeViewColumnsAppearance }\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewColumnsAppearance then\r\n begin\r\n FSortIndicatorColor := (Source as TTMSFNCTreeViewColumnsAppearance).SortIndicatorColor;\r\n FLayouts := (Source as TTMSFNCTreeViewColumnsAppearance).Layouts;\r\n FTopSize := (Source as TTMSFNCTreeViewColumnsAppearance).TopSize;\r\n FBottomSize := (Source as TTMSFNCTreeViewColumnsAppearance).BottomSize;\r\n FBottomFill.Assign((Source as TTMSFNCTreeViewColumnsAppearance).BottomFill);\r\n FBottomFont.Assign((Source as TTMSFNCTreeViewColumnsAppearance).BottomFont);\r\n FBottomStroke.Assign((Source as TTMSFNCTreeViewColumnsAppearance).BottomStroke);\r\n FTopFill.Assign((Source as TTMSFNCTreeViewColumnsAppearance).TopFill);\r\n FTopStroke.Assign((Source as TTMSFNCTreeViewColumnsAppearance).TopStroke);\r\n FTopFont.Assign((Source as TTMSFNCTreeViewColumnsAppearance).TopFont);\r\n FStretch := (Source as TTMSFNCTreeViewColumnsAppearance).Stretch;\r\n FStretchColumn := (Source as TTMSFNCTreeViewColumnsAppearance).StretchColumn;\r\n FStretchAll := (Source as TTMSFNCTreeViewColumnsAppearance).StretchAll;\r\n FTopVerticalText := (Source as TTMSFNCTreeViewColumnsAppearance).TopVerticalText;\r\n FBottomVerticalText := (Source as TTMSFNCTreeViewColumnsAppearance).BottomVerticalText;\r\n FFillEmptySpaces := (Source as TTMSFNCTreeViewColumnsAppearance).FillEmptySpaces;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewColumnsAppearance.Create(\r\n ATreeView: TTMSFNCCustomTreeView);\r\nbegin\r\n FTreeView := ATreeView;\r\n FSortIndicatorColor := gcSteelblue;\r\n FLayouts := [tclTop];\r\n FFillEmptySpaces := True;\r\n FStretch := True;\r\n FStretchAll := True;\r\n FStretchColumn := -1;\r\n FBottomSize := 25;\r\n FTopVerticalText := False;\r\n FStretchAll := True;\r\n FBottomVerticalText := False;\r\n FTopSize := 25;\r\n FTopHorizontalTextAlign := gtaCenter;\r\n FTopVerticalTextAlign := gtaCenter;\r\n FBottomHorizontalTextAlign := gtaCenter;\r\n FBottomVerticalTextAlign := gtaCenter;\r\n FBottomFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FBottomStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FTopFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FTopStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FTopFont := TTMSFNCGraphicsFont.Create;\r\n FTopFont.Color := gcBlack;\r\n FBottomFont := TTMSFNCGraphicsFont.Create;\r\n FBottomFont.Color := gcBlack;\r\n\r\n FBottomFill.OnChanged := @Changed;\r\n FTopFill.OnChanged := @Changed;\r\n FBottomStroke.OnChanged := @Changed;\r\n FTopStroke.OnChanged := @Changed;\r\n\r\n FTopFont.OnChanged := @Changed;\r\n FBottomFont.OnChanged := @Changed;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewColumnsAppearance.Destroy;\r\nbegin\r\n FTopFont.Free;\r\n FBottomFont.Free;\r\n FBottomFill.Free;\r\n FTopFill.Free;\r\n FBottomStroke.Free;\r\n FTopStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.Changed(Sender: TObject);\r\nbegin\r\n FTreeView.UpdateTreeViewCache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FBottomFill <> Value then\r\n FBottomFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FBottomFont <> Value then\r\n FBottomFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetBottomSize(const Value: Double);\r\nbegin\r\n if FBottomSize <> Value then\r\n begin\r\n FBottomSize := Value;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetBottomStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FBottomStroke <> Value then\r\n FBottomStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetBottomVerticalText(\r\n const Value: Boolean);\r\nbegin\r\n if FBottomVerticalText <> Value then\r\n begin\r\n FBottomVerticalText := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetFillEmptySpaces(\r\n const Value: Boolean);\r\nbegin\r\n if FFillEmptySpaces <> Value then\r\n begin\r\n FFillEmptySpaces := Value;\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetLayouts(\r\n const Value: TTMSFNCTreeViewColumnsLayouts);\r\nbegin\r\n if FLayouts <> Value then\r\n begin\r\n FLayouts := Value;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetSortIndicatorColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSortIndicatorColor <> Value then\r\n begin\r\n FSortIndicatorColor := Value;\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetStretch(const Value: Boolean);\r\nbegin\r\n if FStretch <> Value then\r\n begin\r\n FStretch := Value;\r\n FTreeView.UpdateColumns;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetStretchColumn(const Value: Integer);\r\nbegin\r\n if FStretchColumn <> Value then\r\n begin\r\n FStretchColumn := Value;\r\n FTreeView.UpdateColumns;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetStretchAll(const Value: Boolean);\r\nbegin\r\n if FStretchAll <> Value then\r\n begin\r\n FStretchAll := Value;\r\n FTreeView.UpdateColumns;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetTopFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FTopFill <> Value then\r\n FTopFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetTopFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FTopFont <> Value then\r\n FTopFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetTopSize(const Value: Double);\r\nbegin\r\n if FTopSize <> Value then\r\n begin\r\n FTopSize := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetTopStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FTopStroke <> Value then\r\n FTopStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewColumnsAppearance.SetTopVerticalText(\r\n const Value: Boolean);\r\nbegin\r\n if FTopVerticalText <> Value then\r\n begin\r\n FTopVerticalText := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTreeViewGroupsAppearance }\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewGroupsAppearance then\r\n begin\r\n FLayouts := (Source as TTMSFNCTreeViewGroupsAppearance).Layouts;\r\n FTopSize := (Source as TTMSFNCTreeViewGroupsAppearance).TopSize;\r\n FBottomSize := (Source as TTMSFNCTreeViewGroupsAppearance).BottomSize;\r\n FBottomFill.Assign((Source as TTMSFNCTreeViewGroupsAppearance).BottomFill);\r\n FBottomFont.Assign((Source as TTMSFNCTreeViewGroupsAppearance).BottomFont);\r\n FBottomStroke.Assign((Source as TTMSFNCTreeViewGroupsAppearance).BottomStroke);\r\n FTopFill.Assign((Source as TTMSFNCTreeViewGroupsAppearance).TopFill);\r\n FTopStroke.Assign((Source as TTMSFNCTreeViewGroupsAppearance).TopStroke);\r\n FTopFont.Assign((Source as TTMSFNCTreeViewGroupsAppearance).TopFont);\r\n FTopHorizontalTextAlign := (Source as TTMSFNCTreeViewGroupsAppearance).TopHorizontalTextAlign;\r\n FTopVerticalTextAlign := (Source as TTMSFNCTreeViewGroupsAppearance).TopVerticalTextAlign;\r\n FBottomHorizontalTextAlign := (Source as TTMSFNCTreeViewGroupsAppearance).BottomHorizontalTextAlign;\r\n FBottomVerticalTextAlign := (Source as TTMSFNCTreeViewGroupsAppearance).BottomVerticalTextAlign;\r\n FTopVerticalText := (Source as TTMSFNCTreeViewGroupsAppearance).TopVerticalText;\r\n FBottomVerticalText := (Source as TTMSFNCTreeViewGroupsAppearance).BottomVerticalText;\r\n FFillEmptySpaces := (Source as TTMSFNCTreeViewGroupsAppearance).FillEmptySpaces;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewGroupsAppearance.Create(\r\n ATreeView: TTMSFNCCustomTreeView);\r\nbegin\r\n FTreeView := ATreeView;\r\n FLayouts := [tglTop];\r\n FFillEmptySpaces := True;\r\n FTopSize := 50;\r\n FBottomSize := 50;\r\n FTopVerticalText := False;\r\n FBottomVerticalText := False;\r\n FTopHorizontalTextAlign := gtaCenter;\r\n FTopVerticalTextAlign := gtaCenter;\r\n FBottomHorizontalTextAlign := gtaCenter;\r\n FBottomVerticalTextAlign := gtaCenter;\r\n FBottomFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FBottomStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FTopFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FTopStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FTopFont := TTMSFNCGraphicsFont.Create;\r\n FTopFont.Color := gcBlack;\r\n FBottomFont := TTMSFNCGraphicsFont.Create;\r\n FBottomFont.Color := gcBlack;\r\n\r\n FBottomFill.OnChanged := @Changed;\r\n FTopFill.OnChanged := @Changed;\r\n FBottomStroke.OnChanged := @Changed;\r\n FTopStroke.OnChanged := @Changed;\r\n\r\n FTopFont.OnChanged := @Changed;\r\n FBottomFont.OnChanged := @Changed;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewGroupsAppearance.Destroy;\r\nbegin\r\n FBottomFont.Free;\r\n FTopFont.Free;\r\n FBottomFill.Free;\r\n FBottomStroke.Free;\r\n FTopFill.Free;\r\n FTopStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.Changed(Sender: TObject);\r\nbegin\r\n FTreeView.UpdateTreeViewCache;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetBottomFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FBottomFill <> Value then\r\n FBottomFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetBottomHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FBottomHorizontalTextAlign <> Value then\r\n begin\r\n FBottomHorizontalTextAlign := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetBottomFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FBottomFont <> Value then\r\n FBottomFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetBottomSize(const Value: Double);\r\nbegin\r\n if FBottomSize <> Value then\r\n begin\r\n FBottomSize := Value;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetBottomStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FBottomStroke <> Value then\r\n FBottomStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetBottomVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FBottomVerticalTextAlign <> Value then\r\n begin\r\n FBottomVerticalTextAlign := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetBottomVerticalText(\r\n const Value: Boolean);\r\nbegin\r\n if FBottomVerticalText <> Value then\r\n begin\r\n FBottomVerticalText := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetFillEmptySpaces(\r\n const Value: Boolean);\r\nbegin\r\n if FFillEmptySpaces <> Value then\r\n begin\r\n FFillEmptySpaces := Value;\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetLayouts(\r\n const Value: TTMSFNCTreeViewGroupsLayouts);\r\nbegin\r\n if FLayouts <> Value then\r\n begin\r\n FLayouts := Value;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetTopFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FTopFill <> Value then\r\n FTopFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetTopFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FTopFont <> Value then\r\n FTopFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetTopHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTopHorizontalTextAlign <> Value then\r\n begin\r\n FTopHorizontalTextAlign := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetTopSize(const Value: Double);\r\nbegin\r\n if FTopSize <> Value then\r\n begin\r\n FTopSize := Value;\r\n FTreeView.UpdateTreeViewCache;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetTopStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FTopStroke <> Value then\r\n FTopStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetTopVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTopVerticalTextAlign <> Value then\r\n begin\r\n FTopVerticalTextAlign := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewGroupsAppearance.SetTopVerticalText(const Value: Boolean);\r\nbegin\r\n if FTopVerticalText <> Value then\r\n begin\r\n FTopVerticalText := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTreeViewInteraction }\r\n\r\nprocedure TTMSFNCTreeViewInteraction.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCTreeViewInteraction) then\r\n begin\r\n FMultiSelect := (Source as TTMSFNCTreeViewInteraction).MultiSelect;\r\n FTouchScrolling := (Source as TTMSFNCTreeViewInteraction).TouchScrolling;\r\n FReadOnly := (Source as TTMSFNCTreeViewInteraction).ReadOnly;\r\n FColumnSizing := (Source as TTMSFNCTreeViewInteraction).ColumnSizing;\r\n FColumnAutoSizeOnDblClick := (Source as TTMSFNCTreeViewInteraction).ColumnAutoSizeOnDblClick;\r\n FExtendedSelectable := (Source as TTMSFNCTreeViewInteraction).ExtendedSelectable;\r\n FSelectionFollowsFocus := (Source as TTMSFNCTreeViewInteraction).SelectionFollowsFocus;\r\n FKeyboardEdit := (Source as TTMSFNCTreeViewInteraction).KeyboardEdit;\r\n FMouseEditMode := (Source as TTMSFNCTreeViewInteraction).MouseEditMode;\r\n FExtendedEditable := (Source as TTMSFNCTreeViewInteraction).ExtendedEditable;\r\n FClipboardMode := (Source as TTMSFNCTreeViewInteraction).ClipboardMode;\r\n FReorder := (Source as TTMSFNCTreeViewInteraction).Reorder;\r\n FDragDropMode := (Source as TTMSFNCTreeViewInteraction).DragDropMode;\r\n FLookup.Assign((Source as TTMSFNCTreeViewInteraction).Lookup);\r\n FExpandCollapseOnDblClick := (Source as TTMSFNCTreeViewInteraction).ExpandCollapseOnDblClick;\r\n FAutoOpenURL := (Source as TTMSFNCTreeViewInteraction).AutoOpenURL;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewInteraction.Create(ATreeView: TTMSFNCCustomTreeView);\r\nbegin\r\n FTreeView := ATreeView;\r\n FAutoOpenURL := True;\r\n FClipboardMode := tcmNone;\r\n FExpandCollapseOnDblClick := True;\r\n FReorder := False;\r\n FDragDropMode := tdmNone;\r\n FReadOnly := False;\r\n FSelectionFollowsFocus := True;\r\n FTouchScrolling := True;\r\n FKeyboardEdit := True;\r\n FExtendedSelectable := False;\r\n FMultiSelect := False;\r\n FColumnSizing := False;\r\n FExtendedEditable := False;\r\n FColumnAutoSizeOnDblClick := False;\r\n FMouseEditMode := tmemSingleClickOnSelectedNode;\r\n FLookup := TTMSFNCTreeViewLookup.Create(Self);\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewInteraction.Destroy;\r\nbegin\r\n FLookup.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetColumnAutoSizeOnDblClick(\r\n const Value: Boolean);\r\nbegin\r\n if FColumnAutoSizeOnDblClick <> Value then\r\n FColumnAutoSizeOnDblClick := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetColumnSizing(const Value: Boolean);\r\nbegin\r\n if FColumnSizing <> Value then\r\n begin\r\n FColumnSizing := Value;\r\n if Assigned(FTreeView) and FColumnSizing then\r\n FTreeView.ColumnsAppearance.StretchAll := False;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetDragDropMode(const Value: TTMSFNCTreeViewDragDropMode);\r\nbegin\r\n if FDragDropMode <> Value then\r\n FDragDropMode := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetExpandCollapseOnDblClick(\r\n const Value: Boolean);\r\nbegin\r\n if FExpandCollapseOnDblClick <> Value then\r\n FExpandCollapseOnDblClick := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetExtendedEditable(const Value: Boolean);\r\nbegin\r\n if FExtendedEditable <> Value then\r\n FExtendedEditable := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetExtendedSelectable(\r\n const Value: Boolean);\r\nbegin\r\n if FExtendedSelectable <> Value then\r\n FExtendedSelectable := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetLookup(\r\n const Value: TTMSFNCTreeViewLookup);\r\nbegin\r\n if FLookup <> Value then\r\n FLookup.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetMouseEditMode(\r\n const Value: TTMSFNCTreeViewMouseEditMode);\r\nbegin\r\n if FMouseEditMode <> Value then\r\n FMouseEditMode := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetMultiSelect(const Value: Boolean);\r\nbegin\r\n if FMultiSelect <> Value then\r\n FMultiSelect := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetReadOnly(const Value: Boolean);\r\nbegin\r\n if FReadOnly <> Value then\r\n FReadOnly := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetReorder(const Value: Boolean);\r\nbegin\r\n if FReorder <> Value then\r\n FReorder := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetSelectionFollowsFocus(\r\n const Value: Boolean);\r\nbegin\r\n if FSelectionFollowsFocus <> Value then\r\n FSelectionFollowsFocus := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewInteraction.SetTouchScrolling(const Value: Boolean);\r\nbegin\r\n if FTouchScrolling <> Value then\r\n FTouchScrolling := Value;\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nconstructor TTMSFNCTreeViewEdit.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n if AOwner is TTMSFNCCustomTreeView then\r\n FTreeView := AOwner as TTMSFNCCustomTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewEdit.DoExit;\r\nbegin\r\n inherited;\r\n if Assigned(FTreeView) and FTreeView.FInplaceEditorActive then\r\n FTreeView.CloseInplaceEditor(False);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewEdit.KeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if Assigned(FTreeView) and FTreeView.FInplaceEditorActive then\r\n begin\r\n case Key of\r\n KEY_ESCAPE:\r\n begin\r\n FTreeView.CloseInplaceEditor(True);\r\n FTreeView.FInplaceEditorClosed := True;\r\n Key := 0;\r\n end;\r\n KEY_F2, KEY_RETURN:\r\n begin\r\n FTreeView.CloseInplaceEditor(False);\r\n FTreeView.FInplaceEditorClosed := True;\r\n Key := 0;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewMemo.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n if AOwner is TTMSFNCCustomTreeView then\r\n FTreeView := AOwner as TTMSFNCCustomTreeView;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewMemo.DoExit;\r\nbegin\r\n inherited;\r\n if Assigned(FTreeView) and FTreeView.FInplaceEditorActive then\r\n FTreeView.CloseInplaceEditor(False);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewMemo.KeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if Assigned(FTreeView) and FTreeView.FInplaceEditorActive then\r\n begin\r\n case Key of\r\n KEY_ESCAPE:\r\n begin\r\n FTreeView.CloseInplaceEditor(True);\r\n FTreeView.FInplaceEditorClosed := True;\r\n Key := 0;\r\n end;\r\n KEY_F2:\r\n begin\r\n FTreeView.CloseInplaceEditor(False);\r\n FTreeView.FInplaceEditorClosed := True;\r\n Key := 0;\r\n end;\r\n end;\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nfunction TTMSFNCTreeViewEdit.GetDefaultStyleLookupName: string;\r\nbegin\r\n Result := 'editstyle';\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCTreeViewLookup }\r\n\r\nprocedure TTMSFNCTreeViewLookup.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTreeViewLookup then\r\n begin\r\n FEnabled := (Source as TTMSFNCTreeViewLookup).Enabled;\r\n FCaseSensitive := (Source as TTMSFNCTreeViewLookup).CaseSensitive;\r\n FIncremental := (Source as TTMSFNCTreeViewLookup).Incremental;\r\n FColumn := (Source as TTMSFNCTreeViewLookup).Column;\r\n FAutoSelect := (Source as TTMSFNCTreeViewLookup).AutoSelect;\r\n FAutoExpand := (Source as TTMSFNCTreeViewLookup).AutoExpand;\r\n FRootNodesOnly := (Source as TTMSFNCTreeViewLookup).RootNodesOnly;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewLookup.Create(AOwner: TTMSFNCTreeViewInteraction);\r\nbegin\r\n FOwner := AOwner;\r\n FEnabled := True;\r\n FCaseSensitive := False;\r\n FIncremental := True;\r\n FColumn := -1;\r\n FAutoSelect := True;\r\n FAutoExpand := False;\r\n FRootNodesOnly := False;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewLookup.Destroy;\r\nbegin\r\n\r\n inherited;\r\nend;\r\n\r\n{ TTMSFNCTreeViewAdapter }\r\n\r\nprocedure TTMSFNCTreeViewAdapter.ExportNotification(AState: TTMSFNCTreeViewExportState; ARow: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewAdapter.Create(AOwner: TComponent);\r\nvar\r\n I: Integer;\r\nbegin\r\n inherited;\r\n FActive := False;\r\n if Assigned(AOwner) and (AOwner is TCustomForm) then\r\n begin\r\n for I := 0 to AOwner.ComponentCount - 1 do\r\n begin\r\n if (AOwner.Components[i] is TTMSFNCCustomTreeView) then\r\n begin\r\n TreeView := AOwner.Components[i] as TTMSFNCCustomTreeView;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FTreeView) then\r\n FTreeView := nil;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.ScrollTreeView(ADelta: Integer);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.SelectNode(ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.SetActive(const Value: boolean);\r\nbegin\r\n FActive := Value;\r\n if not Assigned(TreeView) then\r\n Exit;\r\n Initialize;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.SetTreeView(const Value: TTMSFNCCustomTreeView);\r\nbegin\r\n if FTreeView <> Value then\r\n begin\r\n FTreeView := Value;\r\n if FBlockAdd then\r\n Exit;\r\n\r\n FBlockAdd := True;\r\n if Assigned(FTreeView) then\r\n begin\r\n FTreeView.Adapter := Self;\r\n Initialize;\r\n end;\r\n FBlockAdd := False;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.UpdateBounds;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.GetNodeText(ACol: Integer; ANode: TTMSFNCTreeViewVirtualNode;\r\n var AText: String);\r\nbegin\r\n\r\nend;\r\n\r\nfunction TTMSFNCTreeViewAdapter.GetColumnDisplayName(ACol: Integer): String;\r\nbegin\r\n Result := '';\r\nend;\r\n\r\nfunction TTMSFNCTreeViewAdapter.GetInstance: NativeUInt;\r\nbegin\r\n Result := HInstance;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.GetNumberOfNodes(ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewAdapter.Initialize;\r\nbegin\r\nend;\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCTreeViewCache.GetItem(Index: Integer): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewCache.SetItem(Index: Integer; const Value: TTMSFNCTreeViewCacheItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewDisplayList.GetItem(Index: Integer): TTMSFNCTreeViewCacheItem;\r\nbegin\r\n Result := TTMSFNCTreeViewCacheItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewDisplayList.SetItem(Index: Integer; const Value: TTMSFNCTreeViewCacheItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewSelectedNodes.GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := TTMSFNCTreeViewVirtualNode(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewSelectedNodes.SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\ninitialization\r\nbegin\r\n TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWEXPAND);\r\n TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWEXPANDLARGE);\r\n TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWCOLLAPSE);\r\n TTMSFNCBitmap.CreateFromResource(TTMSFNCTREEVIEWCOLLAPSELARGE);\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCTreeView;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomTreeView, WEBLib.TMSFNCGraphics,\r\n WEBLib.TMSFNCTreeViewData, WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphicsTypes\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n ,UITypes, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.Layouts\r\n {$ENDIF}\r\n ;\r\n\r\ntype\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCTreeView = class(TTMSFNCTreeViewPublished)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n {$IFDEF FMXLIB}\r\n procedure DoAbsoluteChanged; override;\r\n {$ENDIF}\r\n procedure DrawBorders(AGraphics: TTMSFNCGraphics); override;\r\n procedure DrawEmptySpaces(AGraphics: TTMSFNCGraphics); override;\r\n procedure DrawNodeColumns(AGraphics: TTMSFNCGraphics); override;\r\n\r\n procedure DrawNode(AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode; ACaching: Boolean = False; AOffsetX: Single = 0; AOffsetY: Single = 0); override;\r\n procedure DrawGroup(AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup: Integer; AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind); override;\r\n procedure DrawColumn(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind); override;\r\n procedure DrawSortIndicator(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColor: TTMSFNCGraphicsColor; AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind); virtual;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math, SysUtils, WEBLib.TMSFNCUtils, WEBLib.Graphics;\r\n\r\ntype\r\n TTMSFNCTreeViewColumnOpen = class(TTMSFNCTreeViewColumn);\r\n\r\n{ TTMSFNCTreeView }\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCTreeView.DoAbsoluteChanged;\r\nbegin\r\n inherited;\r\n if Parent is TScaledLayout then\r\n UpdateTreeViewCache;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCTreeView.DrawBorders(AGraphics: TTMSFNCGraphics);\r\nvar\r\n rrt, rrb, trl, grt, grb: TRectF;\r\n nr: TRectF;\r\nbegin\r\n inherited;\r\n grt := GetGroupsTopRect;\r\n grb := GetGroupsBottomRect;\r\n rrt := GetColumnsTopRect;\r\n rrb := GetColumnsBottomRect;\r\n nr := GetContentClipRect;\r\n\r\n {$IFDEF CMNLIB}\r\n grt.Right := grt.Right - 1;\r\n grb.Right := grb.Right - 1;\r\n rrt.Right := rrt.Right - 1;\r\n rrb.Right := rrb.Right - 1;\r\n {$ENDIF}\r\n\r\n trl := RectF(nr.Right + 1, rrt.Bottom, nr.Right + 1, rrb.Top);\r\n\r\n AGraphics.Stroke.Assign(ColumnsAppearance.TopStroke);\r\n\r\n if (trl.Right - trl.Left > 0) and (trl.Bottom - trl.Top > 0) then\r\n begin\r\n if HorizontalScrollBar.Visible or ColumnsAppearance.Stretch then\r\n AGraphics.DrawLine(PointF(trl.Right, trl.Top), PointF(trl.Right, trl.Bottom), gcpmLeftDown, gcpmLeftUp)\r\n else\r\n AGraphics.DrawLine(PointF(trl.Right, trl.Top), PointF(trl.Right, trl.Bottom), gcpmRightDown, gcpmRightUp);\r\n end;\r\n\r\n if HorizontalScrollBar.Visible or ColumnsAppearance.Stretch then\r\n begin\r\n AGraphics.Stroke.Assign(ColumnsAppearance.TopStroke);\r\n if (tclTop in ColumnsAppearance.Layouts) and (ColumnsAppearance.TopSize > 0) then\r\n begin\r\n AGraphics.DrawLine(PointF(rrt.Left, rrt.Top), PointF(rrt.Left, rrt.Bottom), gcpmRightDown, gcpmRightUp);\r\n AGraphics.DrawLine(PointF(rrt.Right, rrt.Top), PointF(rrt.Right, rrt.Bottom), gcpmLeftDown, gcpmLeftUp);\r\n end\r\n else if not ((tglTop in GroupsAppearance.Layouts) or (GroupsAppearance.TopSize <= 0) or (DisplayGroups.Count = 0)) and (Stroke.Kind <> gskNone) then\r\n AGraphics.DrawLine(PointF(rrt.Left, rrt.Bottom), PointF(rrt.Right, rrt.Bottom), gcpmRightDown, gcpmLeftDown);\r\n\r\n AGraphics.Stroke.Assign(ColumnsAppearance.BottomStroke);\r\n if (tclBottom in ColumnsAppearance.Layouts) and (ColumnsAppearance.Bottomsize > 0) then\r\n begin\r\n AGraphics.DrawLine(PointF(rrb.Left, rrb.Top), PointF(rrb.Left, rrb.Bottom), gcpmRightDown, gcpmRightUp);\r\n AGraphics.DrawLine(PointF(rrb.Right, rrb.Top), PointF(rrb.Right, rrb.Bottom), gcpmLeftDown, gcpmLeftUp);\r\n end\r\n else if (not (tglBottom in GroupsAppearance.Layouts) or (GroupsAppearance.BottomSize <= 0) or (DisplayGroups.Count = 0)) and (Stroke.Kind <> gskNone) then\r\n AGraphics.DrawLine(PointF(rrb.Left, rrb.Top), PointF(rrb.Right, rrb.Top), gcpmRightUp, gcpmLeftUp);\r\n\r\n AGraphics.Stroke.Assign(GroupsAppearance.TopStroke);\r\n if (tglTop in GroupsAppearance.Layouts) and (DisplayGroups.Count > 0) and (GroupsAppearance.TopSize > 0) then\r\n begin\r\n AGraphics.DrawLine(PointF(grt.Left, grt.Top), PointF(grt.Left, grt.Bottom), gcpmRightDown, gcpmRightUp);\r\n AGraphics.DrawLine(PointF(grt.Right, grt.Top), PointF(grt.Right, grt.Bottom), gcpmLeftDown, gcpmLeftUp);\r\n end;\r\n\r\n if (not (tclTop in ColumnsAppearance.Layouts) or (ColumnsAppearance.TopSize <= 0)) and (Stroke.Kind <> gskNone) then\r\n AGraphics.DrawLine(PointF(grt.Left, grt.Bottom), PointF(grt.Right, grt.Bottom), gcpmRightDown, gcpmLeftDown);\r\n\r\n AGraphics.Stroke.Assign(GroupsAppearance.BottomStroke);\r\n if (tglBottom in GroupsAppearance.Layouts) and (DisplayGroups.Count > 0) and (GroupsAppearance.BottomSize > 0) then\r\n begin\r\n AGraphics.DrawLine(PointF(grb.Left, grb.Top), PointF(grb.Left, grb.Bottom), gcpmRightDown, gcpmRightUp);\r\n AGraphics.DrawLine(PointF(grb.Right, grb.Top), PointF(grb.Right, grb.Bottom), gcpmLeftDown, gcpmLeftUp);\r\n end;\r\n\r\n if (not (tclBottom in ColumnsAppearance.Layouts) or (ColumnsAppearance.BottomSize <= 0)) and (Stroke.Kind <> gskNone) then\r\n AGraphics.DrawLine(PointF(grb.Left, grb.Top), PointF(grb.Right, grb.Top), gcpmRightUp, gcpmLeftUp);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeView.DrawColumn(AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind);\r\nvar\r\n b: Boolean;\r\n str: String;\r\n df: Boolean;\r\n txtr: TRectF;\r\n def: Boolean;\r\n col: TTMSFNCTreeViewColumn;\r\n trim: TTMSFNCGraphicsTextTrimming;\r\n ha, va: TTMSFNCGraphicsTextAlign;\r\n ww: Boolean;\r\n r: TRectF;\r\n sr, dr: TRectF;\r\n szd: Single;\r\n szr: Single;\r\n szt: Single;\r\nbegin\r\n inherited;\r\n r := ARect;\r\n def := True;\r\n col := nil;\r\n if (AColumn >= 0) and (AColumn <= Columns.Count - 1) then\r\n begin\r\n col := Columns[AColumn];\r\n if not col.UseDefaultAppearance then\r\n begin\r\n def := False;\r\n case AKind of\r\n ikColumnTop:\r\n begin\r\n AGraphics.Stroke.Assign(col.TopStroke);\r\n AGraphics.Fill.Assign(col.TopFill);\r\n end;\r\n ikColumnBottom:\r\n begin\r\n AGraphics.Stroke.Assign(col.BottomStroke);\r\n AGraphics.Fill.Assign(col.BottomFill);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n if def then\r\n begin\r\n case AKind of\r\n ikColumnTop:\r\n begin\r\n AGraphics.Stroke.Assign(ColumnsAppearance.TopStroke);\r\n AGraphics.Fill.Assign(ColumnsAppearance.TopFill);\r\n end;\r\n ikColumnBottom:\r\n begin\r\n AGraphics.Stroke.Assign(ColumnsAppearance.BottomStroke);\r\n AGraphics.Fill.Assign(ColumnsAppearance.BottomFill);\r\n end;\r\n end;\r\n end;\r\n\r\n b := True;\r\n df := True;\r\n DoBeforeDrawColumnHeader(AGraphics, r, AColumn, AKind, b, df);\r\n\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(r, gcrmNone);\r\n\r\n sr := r;\r\n szt := 0;\r\n\r\n if Assigned(col) then\r\n begin\r\n if col.Filtering.Enabled then\r\n begin\r\n szd := col.Filtering.ButtonSize;\r\n dr := RectF(Round(r.Right - szd - 4), Round(r.Top + ((r.Bottom - r.Top) - szd) / 2), Round(r.Right - 4), Round(r.Top + ((r.Bottom - r.Top) - szd) / 2 + szd));\r\n AGraphics.DrawDropDownButton(dr, False, False, True, False, AdaptToStyle);\r\n sr.Right := dr.Left;\r\n szt := szt + szd + 4;\r\n end;\r\n\r\n if col.Expandable then\r\n begin\r\n szr := col.ExpandingButtonSize;\r\n sr := RectF(Round(sr.Right - szr - 6), Round(sr.Top + ((sr.Bottom - sr.Top) - szr) / 2), Round(sr.Right - 6), Round(sr.Top + ((sr.Bottom - sr.Top) - szr) / 2 + szr));\r\n if col.Expanded then\r\n AGraphics.DrawCompactButton(sr, gcsExpanded, False, False, True, False)\r\n else\r\n AGraphics.DrawCompactButton(sr, gcsCollapsed, False, False, True, False);\r\n sr.Right := sr.Left;\r\n szt := szt + szr + 6;\r\n end;\r\n\r\n if (TTMSFNCTreeViewColumnOpen(col).SortKind <> nskNone) and (SortColumn = AColumn) then\r\n begin\r\n szr := 8;\r\n sr := RectF(Round(sr.Right - szr - 6), Round(sr.Top + ((sr.Bottom - sr.Top) - szr) / 2), Round(sr.Right - 6), Round(sr.Top + ((sr.Bottom - sr.Top) - szr) / 2 + szr));\r\n DrawSortIndicator(AGraphics, sr, ColumnsAppearance.SortIndicatorColor, AColumn, TTMSFNCTreeViewColumnOpen(col).SortIndex, TTMSFNCTreeViewColumnOpen(col).SortKind);\r\n szt := szt + szr + 6;\r\n end;\r\n end;\r\n\r\n if def then\r\n begin\r\n case AKind of\r\n ikColumnTop: AGraphics.Font.Assign(ColumnsAppearance.TopFont);\r\n ikColumnBottom: AGraphics.Font.Assign(ColumnsAppearance.BottomFont);\r\n end;\r\n end\r\n else if Assigned(col) then\r\n begin\r\n case AKind of\r\n ikColumnTop: AGraphics.Font.Assign(col.TopFont);\r\n ikColumnBottom: AGraphics.Font.Assign(col.BottomFont);\r\n end;\r\n end;\r\n\r\n str := GetColumnText(AColumn);\r\n DoGetColumnText(AColumn, AKind, str);\r\n\r\n ha := gtaLeading;\r\n va := gtaCenter;\r\n ww := False;\r\n trim := gttNone;\r\n if Assigned(col) then\r\n begin\r\n ha := col.HorizontalTextAlign;\r\n va := col.VerticalTextAlign;\r\n ww := col.WordWrapping;\r\n trim := col.Trimming;\r\n end;\r\n\r\n DoGetColumnTrimming(AColumn, AKind, trim);\r\n DoGetColumnWordWrapping(AColumn, AKind, ww);\r\n DoGetColumnHorizontalTextAlign(AColumn, AKind, ha);\r\n DoGetColumnVerticalTextAlign(AColumn, AKind, va);\r\n\r\n b := True;\r\n txtr := r;\r\n InflateRectEx(txtr, -2, -2);\r\n txtr.Right := Max(txtr.Left, txtr.Right - szt);\r\n DoBeforeDrawColumnText(AGraphics, txtr, AColumn, AKind, str, b);\r\n if b then\r\n begin\r\n case AKind of\r\n ikColumnTop:\r\n begin\r\n if ColumnsAppearance.TopVerticalText then\r\n AGraphics.DrawText(txtr, str, ww, ha, va, trim, -90)\r\n else\r\n AGraphics.DrawText(txtr, str, ww, ha, va, trim)\r\n end;\r\n ikColumnBottom:\r\n begin\r\n if ColumnsAppearance.BottomVerticalText then\r\n AGraphics.DrawText(txtr, str, ww, ha, va, trim, 90)\r\n else\r\n AGraphics.DrawText(txtr, str, ww, ha, va, trim)\r\n end;\r\n end;\r\n DoAfterDrawColumnText(AGraphics, txtr, AColumn, AKind, str);\r\n end;\r\n DoAfterDrawColumnHeader(AGraphics, ARect, AColumn, AKind);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeView.DrawEmptySpaces(AGraphics: TTMSFNCGraphics);\r\nvar\r\n r: TRectF;\r\n b, df: Boolean;\r\nbegin\r\n inherited;\r\n if ColumnsAppearance.FillEmptySpaces and not StretchScrollBars then\r\n begin\r\n if (tclTop in ColumnsAppearance.Layouts) and (ColumnsAppearance.TopSize > 0) then\r\n begin\r\n //Column top right\r\n r := GetColumnTopRightEmptyRect;\r\n {$IFDEF CMNLIB}\r\n r.Left := r.Left - 1;\r\n r.Right := r.Right + 1;\r\n r.Bottom := r.Bottom + 1;\r\n {$ENDIF}\r\n b := True;\r\n df := True;\r\n\r\n AGraphics.Fill.Assign(ColumnsAppearance.TopFill);\r\n AGraphics.Stroke.Assign(ColumnsAppearance.TopStroke);\r\n\r\n DoBeforeDrawColumnEmptySpace(AGraphics, r, tcesTopRight, b, df);\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(r, gcrmShiftDownAndExpandWidth);\r\n\r\n DoAfterDrawColumnEmptySpace(AGraphics, r, tcesTopRight);\r\n end;\r\n end;\r\n\r\n if (tclBottom in ColumnsAppearance.Layouts) and (ColumnsAppearance.BottomSize > 0) then\r\n begin\r\n //Column bottom right\r\n r := GetColumnBottomRightEmptyRect;\r\n {$IFDEF CMNLIB}\r\n r.Left := r.Left - 1;\r\n r.Right := r.Right + 1;\r\n r.Top := r.Top - 1;\r\n {$ENDIF}\r\n b := True;\r\n df := True;\r\n\r\n AGraphics.Fill.Assign(ColumnsAppearance.BottomFill);\r\n AGraphics.Stroke.Assign(ColumnsAppearance.BottomStroke);\r\n\r\n DoBeforeDrawColumnEmptySpace(AGraphics, r, tcesBottomRight, b, df);\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(r, gcrmShiftUpAndExpandWidth);\r\n\r\n DoAfterDrawColumnEmptySpace(AGraphics, r, tcesBottomRight);\r\n end;\r\n end;\r\n end;\r\n\r\n if GroupsAppearance.FillEmptySpaces and not StretchScrollBars then\r\n begin\r\n if (tglTop in GroupsAppearance.Layouts) and (GroupsAppearance.TopSize > 0) then\r\n begin\r\n //Group top right\r\n r := GetGroupTopRightEmptyRect;\r\n {$IFDEF CMNLIB}\r\n r.Left := r.Left - 1;\r\n r.Bottom := r.Bottom + 1;\r\n {$ENDIF}\r\n b := True;\r\n df := True;\r\n\r\n AGraphics.Fill.Assign(GroupsAppearance.TopFill);\r\n AGraphics.Stroke.Assign(GroupsAppearance.TopStroke);\r\n\r\n DoBeforeDrawGroupEmptySpace(AGraphics, r, tgesTopRight, b, df);\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(r, gcrmShiftLeftDown);\r\n\r\n DoAfterDrawGroupEmptySpace(AGraphics, r, tgesTopRight);\r\n end;\r\n end;\r\n\r\n if (tglBottom in GroupsAppearance.Layouts) and (GroupsAppearance.BottomSize > 0) then\r\n begin\r\n //Group bottom right\r\n r := GetGroupBottomRightEmptyRect;\r\n {$IFDEF CMNLIB}\r\n r.Left := r.Left - 1;\r\n r.Right := r.Right + 1;\r\n r.Top := r.Top - 1;\r\n {$ENDIF}\r\n b := True;\r\n df := True;\r\n\r\n AGraphics.Fill.Assign(GroupsAppearance.BottomFill);\r\n AGraphics.Stroke.Assign(GroupsAppearance.BottomStroke);\r\n\r\n DoBeforeDrawGroupEmptySpace(AGraphics, r, tgesBottomRight, b, df);\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(r, gcrmShiftLeftUp);\r\n\r\n DoAfterDrawGroupEmptySpace(AGraphics, r, tgesBottomRight);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeView.DrawGroup(AGraphics: TTMSFNCGraphics; ARect: TRectF; AGroup,\r\n AStartColumn, AEndColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind);\r\nvar\r\n b, df: Boolean;\r\n str: String;\r\n txtr: TRectF;\r\n grp: TTMSFNCTreeViewGroup;\r\n def: Boolean;\r\nbegin\r\n grp := nil;\r\n def := True;\r\n if (AGroup >= 0) and (AGroup <= Groups.Count - 1) then\r\n begin\r\n grp := Groups[AGroup];\r\n if not grp.UseDefaultAppearance then\r\n begin\r\n def := False;\r\n case AKind of\r\n ikGroupTop:\r\n begin\r\n AGraphics.Stroke.Assign(grp.TopStroke);\r\n AGraphics.Fill.Assign(grp.TopFill);\r\n end;\r\n ikGroupBottom:\r\n begin\r\n AGraphics.Stroke.Assign(grp.BottomStroke);\r\n AGraphics.Fill.Assign(grp.BottomFill);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n if def then\r\n begin\r\n case AKind of\r\n ikGroupTop:\r\n begin\r\n AGraphics.Stroke.Assign(GroupsAppearance.TopStroke);\r\n AGraphics.Fill.Assign(GroupsAppearance.TopFill);\r\n end;\r\n ikGroupBottom:\r\n begin\r\n AGraphics.Stroke.Assign(GroupsAppearance.BottomStroke);\r\n AGraphics.Fill.Assign(GroupsAppearance.BottomFill);\r\n end;\r\n end;\r\n end;\r\n\r\n b := True;\r\n df := True;\r\n DoBeforeDrawGroup(AGraphics, ARect, AGroup, AStartColumn, AEndColumn, AKind, b, df);\r\n\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(ARect, gcrmNone);\r\n\r\n if def then\r\n begin\r\n case AKind of\r\n ikGroupTop: AGraphics.Font.Assign(GroupsAppearance.TopFont);\r\n ikGroupBottom: AGraphics.Font.Assign(GroupsAppearance.BottomFont);\r\n end;\r\n end\r\n else if Assigned(grp) then\r\n begin\r\n case AKind of\r\n ikGroupTop: AGraphics.Font.Assign(grp.TopFont);\r\n ikGroupBottom: AGraphics.Font.Assign(grp.BottomFont);\r\n end;\r\n end;\r\n\r\n txtr := ARect;\r\n InflateRectEx(txtr, -2, -2);\r\n\r\n str := GetGroupText(AGroup);\r\n DoGetGroupText(AGroup, AKind, str);\r\n b := True;\r\n DoBeforeDrawGroupText(AGraphics, txtr, AGroup, AStartColumn, AEndColumn, AKind, str, b);\r\n if b then\r\n begin\r\n case AKind of\r\n ikGroupTop:\r\n begin\r\n if GroupsAppearance.TopVerticalText then\r\n AGraphics.DrawText(txtr, str, False, GroupsAppearance.TopHorizontalTextAlign, GroupsAppearance.TopVerticalTextAlign, gttNone, -90)\r\n else\r\n AGraphics.DrawText(txtr, str, False, GroupsAppearance.TopHorizontalTextAlign, GroupsAppearance.TopVerticalTextAlign, gttNone)\r\n end;\r\n ikGroupBottom:\r\n begin\r\n if GroupsAppearance.BottomVerticalText then\r\n AGraphics.DrawText(txtr, str, False, GroupsAppearance.BottomHorizontalTextAlign, GroupsAppearance.BottomVerticalTextAlign, gttNone, 90)\r\n else\r\n AGraphics.DrawText(txtr, str, False, GroupsAppearance.BottomHorizontalTextAlign, GroupsAppearance.BottomVerticalTextAlign, gttNone)\r\n end;\r\n end;\r\n DoAfterDrawGroupText(AGraphics, txtr, AGroup, AStartColumn, AEndColumn, AKind, str);\r\n end;\r\n DoAfterDrawGroup(AGraphics, ARect, AGroup, AStartColumn, AEndColumn, AKind);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeView.DrawNode(AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n ANode: TTMSFNCTreeViewVirtualNode; ACaching: Boolean = False; AOffsetX: Single = 0; AOffsetY: Single = 0);\r\nvar\r\n str: String;\r\n b, df: Boolean;\r\n txtr, titr: TRectF;\r\n I: Integer;\r\n bmp: TTMSFNCBitmap;\r\n bmpnr, extr: TRectF;\r\n AColor: TTMSFNCGraphicsColor;\r\n sts, stp: Integer;\r\n bmpn: TTMSFNCBitmap;\r\n ha, va: TTMSFNCGraphicsTextAlign;\r\n c: TTMSFNCTreeViewColumn;\r\n ww: Boolean;\r\n trim: TTMSFNCGraphicsTextTrimming;\r\n en: Boolean;\r\n colw: Double;\r\n chk: TTMSFNCTreeViewNodeCheckType;\r\n chkr: TRectF;\r\n chkbmp: TTMSFNCBitmap;\r\n ck, ext: Boolean;\r\n lr, dr: TRectF;\r\n bmpexr, dexr: TRectF;\r\n sel: Boolean;\r\n cl: TTMSFNCTreeViewColumn;\r\n rfoc: TRectF;\r\n p, lp, n: TTMSFNCTreeViewVirtualNode;\r\n rsel, r: TRectF;\r\n ns: Double;\r\n dpi: Boolean;\r\n g: TTMSFNCGraphics;\r\n bmpa: TBitmap;\r\n s: TTMSFNCGraphicsSides;\r\nbegin\r\n inherited;\r\n if not Assigned(ANode) or ((DragNode = ANode) and DragModeStarted) then\r\n Exit;\r\n\r\n dpi := TTMSFNCUtils.IsHighDPIScale;\r\n\r\n en := True;\r\n DoIsNodeEnabled(ANode, en);\r\n ext := False;\r\n DoIsNodeExtended(ANode, ext);\r\n sel := IsVirtualNodeSelected(ANode);\r\n\r\n if en then\r\n begin\r\n if sel then\r\n begin\r\n if ext then\r\n begin\r\n AGraphics.Fill.Assign(NodesAppearance.ExtendedSelectedFill);\r\n AGraphics.Stroke.Assign(NodesAppearance.ExtendedSelectedStroke);\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(NodesAppearance.SelectedFill);\r\n AGraphics.Stroke.Assign(NodesAppearance.SelectedStroke);\r\n end;\r\n\r\n AColor := AGraphics.Fill.Color;\r\n DoGetNodeSelectedColor(ANode, AColor);\r\n AGraphics.Fill.Color := AColor;\r\n end\r\n else\r\n begin\r\n if ext then\r\n begin\r\n AGraphics.Fill.Assign(NodesAppearance.ExtendedFill);\r\n AGraphics.Stroke.Assign(NodesAppearance.ExtendedStroke);\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(NodesAppearance.Fill);\r\n AGraphics.Stroke.Assign(NodesAppearance.Stroke);\r\n end;\r\n\r\n AColor := AGraphics.Fill.Color;\r\n DoGetNodeColor(ANode, AColor);\r\n AGraphics.Fill.Color := AColor;\r\n end;\r\n end\r\n else\r\n begin\r\n if ext then\r\n begin\r\n AGraphics.Fill.Assign(NodesAppearance.ExtendedDisabledFill);\r\n AGraphics.Stroke.Assign(NodesAppearance.ExtendedDisabledStroke);\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(NodesAppearance.DisabledFill);\r\n AGraphics.Stroke.Assign(NodesAppearance.DisabledStroke);\r\n end;\r\n\r\n AColor := AGraphics.Fill.Color;\r\n DoGetNodeDisabledColor(ANode, AColor);\r\n AGraphics.Fill.Color := AColor;\r\n end;\r\n\r\n df := True;\r\n b := True;\r\n DoBeforeDrawNode(AGraphics, ARect, ANode, b, df);\r\n\r\n if b then\r\n begin\r\n if df then\r\n begin\r\n rsel := ARect;\r\n if sel and not ext then\r\n begin\r\n case NodesAppearance.SelectionArea of\r\n tsaFull: rsel.Left := rsel.Left + 1.5;\r\n tsaFromText:\r\n begin\r\n if Length(ANode.TextRects) > 0 then\r\n rsel.Left := ANode.TextRects[0].Left;\r\n end;\r\n end;\r\n end;\r\n\r\n s := AllSides;\r\n DoGetNodeSides(ANode, s);\r\n AGraphics.DrawRectangle(rsel, s, gcrmNone);\r\n\r\n if (ANode = FocusedVirtualNode) and IsFocused and NodesAppearance.ShowFocus then\r\n begin\r\n rfoc := rsel;\r\n InflateRectEx(rfoc, -2, -2);\r\n AGraphics.DrawFocusRectangle(rfoc);\r\n end;\r\n end;\r\n\r\n if not CompactMode then\r\n begin\r\n sts := 0;\r\n stp := ColumnCount - 1;\r\n if ext then\r\n stp := Min(0, ColumnCount - 1);\r\n\r\n for I := sts to stp do\r\n begin\r\n cl := nil;\r\n if (I >= 0) and (I <= Columns.Count - 1) then\r\n cl := Columns[I];\r\n\r\n if (I >= 0) and (I <= Length(ANode.ExpandRects) - 1) and NodesAppearance.ShowLines and (I = NodesAppearance.ExpandColumn) and (NodesAppearance.ExpandWidth > 0) then\r\n begin\r\n r := ANode.ExpandRects[I];\r\n OffsetRectEx(r, AOffsetX, AOffsetY);\r\n AGraphics.Stroke.Assign(NodesAppearance.LineStroke);\r\n\r\n AGraphics.StartSpecialPen;\r\n\r\n ns := NodesAppearance.LevelIndent;\r\n lr := RectF(r.Left + NodesAppearance.ExpandWidth / 2, ARect.Top, r.Left + NodesAppearance.ExpandWidth / 2 + ns / 2, ARect.Bottom);\r\n\r\n AGraphics.DrawLine(PointF(lr.Left, lr.Top + (lr.Bottom - lr.Top) / 2), PointF(lr.Right, lr.Top + (lr.Bottom - lr.Top) / 2));\r\n\r\n if VisibleNodes.Count > 1 then\r\n begin\r\n n := ANode;\r\n p := n.GetParent;\r\n\r\n dr := lr;\r\n while Assigned(p) do\r\n begin\r\n if (((n = ANode) and (n.Index <= p.Children - 1)) or ((n <> ANode) and (n.Index < p.Children - 1))) then\r\n begin\r\n if n.Index < p.Children - 1 then\r\n AGraphics.DrawLine(PointF(dr.Left, dr.Top), PointF(dr.Left, dr.Bottom), gcpmRightDown, gcpmRightUp)\r\n else\r\n AGraphics.DrawLine(PointF(dr.Left, dr.Top), PointF(dr.Left, dr.Top + (dr.Bottom - dr.Top) / 2), gcpmRightDown, gcpmRightUp);\r\n end;\r\n\r\n n := p;\r\n p := n.GetParent;\r\n OffsetRectEx(dr, -ns, 0);\r\n end;\r\n\r\n if NodeStructure.Count - ANode.TotalChildren - 1 > 0 then\r\n begin\r\n p := ANode.GetParent;\r\n if not Assigned(p) then\r\n begin\r\n if (ANode.Row = NodeStructure.Count - ANode.TotalChildren - 1) then\r\n begin\r\n AGraphics.DrawLine(PointF(dr.Left, dr.Top), PointF(dr.Left, dr.Top + (dr.Bottom - dr.Top) / 2), gcpmRightDown, gcpmRightUp)\r\n end\r\n else if ANode.Row = 0 then\r\n begin\r\n AGraphics.DrawLine(PointF(dr.Left, dr.Top + (dr.Bottom - dr.Top) / 2), PointF(dr.Left, Int(dr.Bottom) - 0.5), gcpmRightDown, gcpmRightUp)\r\n end\r\n else\r\n AGraphics.DrawLine(PointF(dr.Left, dr.Top), PointF(dr.Left, dr.Bottom), gcpmRightDown, gcpmRightUp)\r\n end\r\n else if Assigned(p) then\r\n begin\r\n lp := p;\r\n p := p.GetParent;\r\n dr := lr;\r\n OffsetRectEx(dr, -ns, 0);\r\n while Assigned(p) do\r\n begin\r\n lp := p;\r\n p := p.GetParent;\r\n OffsetRectEx(dr, -ns, 0);\r\n end;\r\n\r\n if Assigned(lp) and (lp.Row < NodeStructure.Count - lp.TotalChildren - 1) then\r\n AGraphics.DrawLine(PointF(dr.Left, dr.Top), PointF(dr.Left, dr.Bottom), gcpmRightDown, gcpmRightUp);\r\n end;\r\n end;\r\n end;\r\n\r\n AGraphics.StopSpecialPen;\r\n end;\r\n\r\n if Assigned(cl) and not cl.UseDefaultAppearance and not ext then\r\n AGraphics.Font.Assign(cl.Font)\r\n else\r\n begin\r\n if ext then\r\n AGraphics.Font.Assign(NodesAppearance.ExtendedFont)\r\n else\r\n AGraphics.Font.Assign(NodesAppearance.Font);\r\n end;\r\n\r\n colw := ColumnWidths[I];\r\n if (colw > 0) or ext then\r\n begin\r\n if en then\r\n begin\r\n if sel then\r\n begin\r\n if ext then\r\n AColor := NodesAppearance.ExtendedSelectedFontColor\r\n else\r\n AColor := NodesAppearance.SelectedFontColor;\r\n\r\n DoGetNodeSelectedTextColor(ANode, I, AColor);\r\n AGraphics.Font.Color := AColor;\r\n end\r\n else\r\n begin\r\n if Assigned(cl) and not cl.UseDefaultAppearance and not ext then\r\n AColor := cl.Font.Color\r\n else\r\n begin\r\n if ext then\r\n AColor := NodesAppearance.ExtendedFontColor\r\n else\r\n AColor := NodesAppearance.Font.Color;\r\n end;\r\n\r\n DoGetNodeTextColor(ANode, I, AColor);\r\n AGraphics.Font.Color := AColor;\r\n end;\r\n end\r\n else\r\n begin\r\n if ext then\r\n AColor := NodesAppearance.ExtendedDisabledFontColor\r\n else\r\n AColor := NodesAppearance.DisabledFontColor;\r\n\r\n DoGetNodeDisabledTextColor(ANode, I, AColor);\r\n AGraphics.Font.Color := AColor;\r\n end;\r\n\r\n if (I >= 0) and (I <= Length(ANode.CheckRects) - 1) and (I <= Length(ANode.CheckStates) - 1) then\r\n begin\r\n chk := tvntNone;\r\n DoGetNodeCheckType(ANode, I, chk);\r\n if chk <> tvntNone then\r\n begin\r\n chkbmp := nil;\r\n ck := ANode.CheckStates[I];\r\n DoIsNodeChecked(ANode, I, ck);\r\n\r\n case chk of\r\n tvntCheckBox: chkbmp := GetCheckBoxBitmap(ck, False);\r\n tvntRadioButton: chkbmp := GetRadioButtonBitmap(ck, False);\r\n end;\r\n\r\n if Assigned(chkbmp) then\r\n begin\r\n chkr := ANode.CheckRects[I];\r\n OffsetRectEx(chkr, AOffsetX, AOffsetY);\r\n\r\n b := True;\r\n DoBeforeDrawNodeCheck(AGraphics, chkr, I, ANode, chkbmp, b);\r\n if b then\r\n begin\r\n AGraphics.DrawBitmap(chkr, BitmapToDrawBitmap(chkbmp));\r\n DoAfterDrawNodeCheck(AGraphics, chkr, I, ANode, chkbmp);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n if (I >= 0) and (I <= Length(ANode.BitmapRects) - 1) then\r\n begin\r\n bmpn := nil;\r\n DoGetNodeIcon(ANode, I, False, bmpn);\r\n if not Assigned(bmpn) and dpi then\r\n DoGetNodeIcon(ANode, I, True, bmpn);\r\n\r\n if Assigned(bmpn) and not IsBitmapEmpty(bmpn) then\r\n begin\r\n bmpnr := ANode.BitmapRects[I];\r\n OffsetRectEx(bmpnr, AOffsetX, AOffsetY);\r\n\r\n b := True;\r\n DoBeforeDrawNodeIcon(AGraphics, bmpnr, I, ANode, bmpn, b);\r\n if b then\r\n begin\r\n AGraphics.DrawBitmap(bmpnr, BitmapToDrawBitmap(bmpn));\r\n DoAfterDrawNodeIcon(AGraphics, bmpnr, I, ANode, bmpn);\r\n end;\r\n end;\r\n end;\r\n\r\n if (I >= 0) and (I <= Length(ANode.ExpandRects) - 1) and (ANode.Children > 0) and (I = NodesAppearance.ExpandColumn) and (NodesAppearance.ExpandWidth > 0) then\r\n begin\r\n if dpi then\r\n begin\r\n if ANode.Expanded then\r\n bmp := NodesAppearance.CollapseNodeIconLarge\r\n else\r\n bmp := NodesAppearance.ExpandNodeIconLarge;\r\n end\r\n else\r\n begin\r\n if ANode.Expanded then\r\n bmp := NodesAppearance.CollapseNodeIcon\r\n else\r\n bmp := NodesAppearance.ExpandNodeIcon;\r\n end;\r\n\r\n bmpa := nil;\r\n if AdaptToStyle then\r\n begin\r\n bmpa := TBitmap.Create;\r\n bmpa.SetSize(bmp.Width, bmp.Height);\r\n g := TTMSFNCGraphics.Create(bmpa.Canvas);\r\n try\r\n g.BeginScene;\r\n g.Fill.Color := TTMSFNCGraphics.DefaultSelectionFillColor;\r\n g.Fill.Kind := gfkSolid;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := TTMSFNCGraphics.DefaultTextFontColor;\r\n g.DrawRectangle(RectF(0, 0, bmp.Width, bmp.Height));\r\n if dpi then\r\n g.Stroke.Width := 2;\r\n\r\n if not ANode.Expanded then\r\n g.DrawLine(PointF(bmp.Width div 2, 0), PointF(bmp.Width div 2, bmp.Height), gcpmRightDown);\r\n\r\n g.DrawLine(PointF(0, bmp.Height div 2), PointF(bmp.Width, bmp.Height div 2), gcpmRightDown);\r\n finally\r\n g.EndScene;\r\n g.Free;\r\n end;\r\n end;\r\n\r\n bmpexr := ANode.ExpandRects[I];\r\n OffsetRectEx(bmpexr, AOffsetX, AOffsetY);\r\n\r\n b := True;\r\n DoBeforeDrawNodeExpand(AGraphics, bmpexr, I, ANode, bmp, b);\r\n if b then\r\n begin\r\n if dpi then\r\n begin\r\n dexr := RectF(Int(bmpexr.Left + ((bmpexr.Right - bmpexr.Left) - bmp.Width / 2) / 2), Int(bmpexr.Top + ((bmpexr.Bottom - bmpexr.Top) - bmp.Height / 2) / 2),\r\n Int(bmpexr.Left + ((bmpexr.Right - bmpexr.Left) - bmp.Width / 2) / 2) + bmp.Width / 2, Int(bmpexr.Top + ((bmpexr.Bottom - bmpexr.Top) - bmp.Height / 2) / 2) + bmp.Height / 2);\r\n end\r\n else\r\n begin\r\n dexr := RectF(Int(bmpexr.Left + ((bmpexr.Right - bmpexr.Left) - bmp.Width) / 2), Int(bmpexr.Top + ((bmpexr.Bottom - bmpexr.Top) - bmp.Height) / 2),\r\n Int(bmpexr.Left + ((bmpexr.Right - bmpexr.Left) - bmp.Width) / 2) + bmp.Width, Int(bmpexr.Top + ((bmpexr.Bottom - bmpexr.Top) - bmp.Height) / 2) + bmp.Height);\r\n end;\r\n\r\n if AdaptToStyle and Assigned(bmpa) then\r\n begin\r\n {$IFDEF WEBLIB}\r\n AGraphics.DrawBitmap(dexr, TTMSFNCBitmap(bmpa));\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n AGraphics.DrawBitmap(dexr, bmpa);\r\n {$ENDIF}\r\n bmpa.Free;\r\n end\r\n else\r\n AGraphics.DrawBitmap(dexr, BitmapToDrawBitmap(bmp));\r\n\r\n DoAfterDrawNodeExpand(AGraphics, bmpexr, I, ANode, bmp);\r\n end;\r\n end;\r\n\r\n if (I >= 0) and (I <= Length(ANode.TextRects) - 1) and ANode.TitleExpanded[I] then\r\n begin\r\n txtr := ANode.TextRects[I];\r\n OffsetRectEx(txtr, AOffsetX, AOffsetY);\r\n\r\n InflateRectEx(txtr, -2, 0);\r\n\r\n c := nil;\r\n if (I >= 0) and (I <= Columns.Count - 1) then\r\n c := Columns[I];\r\n\r\n ha := gtaLeading;\r\n va := gtaCenter;\r\n ww := False;\r\n trim := gttNone;\r\n if Assigned(c) then\r\n begin\r\n ha := c.HorizontalTextAlign;\r\n va := c.VerticalTextAlign;\r\n ww := c.WordWrapping;\r\n trim := c.Trimming;\r\n end;\r\n\r\n DoGetNodeTrimming(ANode, I, trim);\r\n DoGetNodeWordWrapping(ANode, I, ww);\r\n DoGetNodeHorizontalTextAlign(ANode, I, ha);\r\n DoGetNodeVerticalTextAlign(ANode, I,va);\r\n\r\n str := '';\r\n DoGetNodeText(ANode, I, tntmDrawing, str);\r\n b := True;\r\n DoBeforeDrawNodeText(AGraphics, txtr, I, ANode, str, b);\r\n if b then\r\n begin\r\n if InplaceEditorActive and ((UpdateNodeColumn <> I) or (FocusedVirtualNode <> ANode)) or not InplaceEditorActive then\r\n AGraphics.DrawText(txtr, str, ww, ha, va, trim);\r\n\r\n DoAfterDrawNodeText(AGraphics, txtr, I, ANode, str);\r\n end;\r\n end;\r\n\r\n if Assigned(cl) and not cl.UseDefaultAppearance then\r\n AGraphics.Font.Assign(cl.TitleFont)\r\n else\r\n AGraphics.Font.Assign(NodesAppearance.TitleFont);\r\n\r\n if en then\r\n begin\r\n if sel then\r\n begin\r\n AColor := NodesAppearance.SelectedTitleFontColor;\r\n DoGetNodeSelectedTitleColor(ANode, I, AColor);\r\n AGraphics.Font.Color := AColor;\r\n end\r\n else\r\n begin\r\n if Assigned(cl) and not cl.UseDefaultAppearance then\r\n AColor := cl.TitleFont.Color\r\n else\r\n AColor := NodesAppearance.TitleFont.Color;\r\n\r\n DoGetNodeTitleColor(ANode, I, AColor);\r\n AGraphics.Font.Color := AColor;\r\n end;\r\n end\r\n else\r\n begin\r\n AColor := NodesAppearance.DisabledTitleFontColor;\r\n DoGetNodeDisabledTitleColor(ANode, I, AColor);\r\n AGraphics.Font.Color := AColor;\r\n end;\r\n\r\n if (I >= 0) and (I <= Length(ANode.TitleRects) - 1) then\r\n begin\r\n titr := ANode.TitleRects[I];\r\n OffsetRectEx(titr, AOffsetX, AOffsetY);\r\n\r\n InflateRectEx(titr, -2, 0);\r\n\r\n c := nil;\r\n if (I >= 0) and (I <= Columns.Count - 1) then\r\n c := Columns[I];\r\n\r\n ha := gtaLeading;\r\n va := gtaCenter;\r\n ww := False;\r\n trim := gttNone;\r\n if Assigned(c) then\r\n begin\r\n ha := c.TitleHorizontalTextAlign;\r\n va := c.TitleVerticalTextAlign;\r\n ww := c.TitleWordWrapping;\r\n trim := c.TitleTrimming;\r\n end;\r\n\r\n DoGetNodeTitleTrimming(ANode, I, trim);\r\n DoGetNodeTitleWordWrapping(ANode, I, ww);\r\n DoGetNodeTitleHorizontalTextAlign(ANode, I, ha);\r\n DoGetNodeTitleVerticalTextAlign(ANode, I,va);\r\n\r\n str := '';\r\n DoGetNodeTitle(ANode, I, tntmDrawing, str);\r\n b := True;\r\n DoBeforeDrawNodeTitle(AGraphics, titr, I, ANode, str, b);\r\n if b then\r\n begin\r\n // if InplaceEditorActive and ((UpdateNodeColumn <> I) or (FocusedVirtualNode <> ANode)) or not InplaceEditorActive then\r\n AGraphics.DrawText(titr, str, ww, ha, va, trim);\r\n\r\n DoAfterDrawNodeTitle(AGraphics, titr, I, ANode, str);\r\n end;\r\n end;\r\n\r\n if (I >= 0) and (I <= Length(ANode.ExtraRects) - 1) then\r\n begin\r\n extr := ANode.ExtraRects[I];\r\n OffsetRectEx(extr, AOffsetX, AOffsetY);\r\n b := True;\r\n DoBeforeDrawNodeExtra(AGraphics, extr, I, ANode, b);\r\n if b then\r\n begin\r\n DoDrawNodeExtra(AGraphics, extr, I, ANode);\r\n DoAfterDrawNodeExtra(AGraphics, extr, I, ANode);\r\n end;\r\n end;\r\n\r\n if (I >= 0) and (I <= Length(ANode.TitleExtraRects) - 1) then\r\n begin\r\n extr := ANode.TitleExtraRects[I];\r\n OffsetRectEx(extr, AOffsetX, AOffsetY);\r\n b := True;\r\n DoBeforeDrawNodeTitleExtra(AGraphics, extr, I, ANode, b);\r\n if b then\r\n begin\r\n DoDrawNodeTitleExtra(AGraphics, extr, I, ANode);\r\n DoAfterDrawNodeTitleExtra(AGraphics, extr, I, ANode);\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n DoAfterDrawNode(AGraphics, ARect, ANode);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeView.DrawNodeColumns(AGraphics: TTMSFNCGraphics);\r\nvar\r\n b, df: Boolean;\r\n I: Integer;\r\n r: TRectF;\r\n x, w: Double;\r\n cr: TRectF;\r\n crcl: TRectF;\r\n hs: Double;\r\n c: TTMSFNCTreeViewColumn;\r\nbegin\r\n inherited;\r\n cr := GetContentRect;\r\n crcl := GetContentClipRect;\r\n hs := GetHorizontalScrollPosition;\r\n for I := 1 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I < Columns.Count - 1) then\r\n begin\r\n x := Int(ColumnPositions[I]) - Int(hs);\r\n w := Int(ColumnWidths[I]);\r\n\r\n if (ColumnStroke.Color <> gcNull) and (ColumnStroke.Kind <> gskNone) then\r\n begin\r\n AGraphics.Stroke.Assign(ColumnStroke);\r\n b := True;\r\n df := True;\r\n r := RectF(x, cr.Top, x + w, cr.Bottom);\r\n\r\n DoBeforeDrawColumn(AGraphics, r, I, b, df);\r\n\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(r, gcrmShiftRightAndShrinkHeight);\r\n\r\n DoAfterDrawColumn(AGraphics, r, I);\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n if NodeStructure.Count > 0 then\r\n begin\r\n for I := 0 to ColumnCount - 1 do\r\n begin\r\n if (I >= 0) and (I <= Columns.Count - 1) then\r\n begin\r\n c := Columns[I];\r\n x := Int(ColumnPositions[I]) - Int(hs);\r\n w := Int(ColumnWidths[I]);\r\n\r\n b := True;\r\n df := True;\r\n\r\n AGraphics.Fill.Kind := gfkNone;\r\n AGraphics.Stroke.Assign(NodesAppearance.ColumnStroke);\r\n if not c.UseDefaultAppearance then\r\n begin\r\n AGraphics.Stroke.Assign(c.Stroke);\r\n AGraphics.Fill.Assign(c.Fill);\r\n end;\r\n\r\n r := RectF(x, crcl.Top, x + w, crcl.Bottom);\r\n\r\n DoBeforeDrawNodeColumn(AGraphics, r, I, b, df);\r\n\r\n if b then\r\n begin\r\n if df then\r\n AGraphics.DrawRectangle(r, [gsTop, gsRight, gsBottom], gcrmShiftRightAndShrinkHeight);\r\n\r\n DoAfterDrawNodeColumn(AGraphics, r, I);\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeView.DrawSortIndicator(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColor: TTMSFNCGraphicsColor; AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind);\r\nvar\r\n pth: TTMSFNCGraphicsPath;\r\n vertt: TTMSFNCGraphicsTextAlign;\r\n c: TTMSFNCGraphicsColor;\r\n txtr: TRectF;\r\n b: Boolean;\r\nbegin\r\n inherited;\r\n c := AColor;\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.Fill.Color := c;\r\n AGraphics.Stroke.Kind := gskSolid;\r\n AGraphics.Stroke.Color := c;\r\n\r\n b := True;\r\n DoBeforeDrawSortIndicator(AGraphics, ARect, AColumn, ASortIndex, ASortKind, b);\r\n if b then\r\n begin\r\n vertt := gtaCenter;\r\n txtr := ARect;\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n case ASortKind of\r\n nskAscending:\r\n begin\r\n vertt := gtaTrailing;\r\n pth.MoveTo(PointF(ARect.Left + (ARect.Right - ARect.Left) / 2, ARect.Top));\r\n pth.LineTo(PointF(ARect.Right, ARect.Bottom));\r\n pth.LineTo(PointF(ARect.Left, ARect.Bottom));\r\n txtr := RectF(ARect.Left, ARect.Top + 2, ARect.Right, ARect.Bottom + 2);\r\n end;\r\n nskDescending:\r\n begin\r\n vertt := gtaLeading;\r\n pth.MoveTo(PointF(ARect.Left, ARect.Top));\r\n pth.LineTo(PointF(ARect.Right, ARect.Top));\r\n pth.LineTo(PointF(ARect.Left + (ARect.Right - ARect.Left) / 2, ARect.Bottom));\r\n txtr := RectF(ARect.Left, ARect.Top - 2, ARect.Right, ARect.Bottom - 2);\r\n end;\r\n end;\r\n pth.ClosePath;\r\n AGraphics.DrawPath(pth);\r\n\r\n if ASortIndex <> -1 then\r\n begin\r\n AGraphics.Font.Color := gcWhite;\r\n TTMSFNCUtils.SetFontSize(AGraphics.Font, 9);\r\n AGraphics.DrawText(txtr, IntToStr(ASortIndex), False, gtaCenter, vertt);\r\n end;\r\n finally\r\n pth.Free;\r\n end;\r\n DoAfterDrawSortIndicator(AGraphics, ARect, AColumn, ASortIndex, ASortKind);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeView.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n {$IFNDEF WEBLIB}\r\n RegisterClasses([TTMSFNCTreeView, TTMSFNCTreeViewColumn, TTMSFNCTreeViewNode, TTMSFNCTreeViewNodeValue]);\r\n {$ENDIF}\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCCustomSelector;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCGraphicsTypes,\r\n WEBLib.TMSFNCCustomControl, WEBLib.Controls\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n ,UITypes, Generics.Collections, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr. \r\n\r\ntype\r\n TTMSFNCCustomSelector = class;\r\n\r\n TTMSFNCCustomSelectorItemState = (isNormal, isHover, isDown, isSelected, isDisabled);\r\n\r\n TTMSFNCCustomSelectorItem = class(TCollectionItem)\r\n private\r\n FOwner: TTMSFNCCustomSelector;\r\n FRowSpan: Integer;\r\n FColumnSpan: Integer;\r\n FVisible: Boolean;\r\n FText: String;\r\n FEnabled: Boolean;\r\n FSeparator: Boolean;\r\n FSeparatorHeight: Single;\r\n FMargins: TTMSFNCMargins;\r\n FCanDeselect: Boolean;\r\n FCanSelect: Boolean;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FHint: string;\r\n FDataBoolean: Boolean;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FDataPointer: Pointer;\r\n procedure SetColumnSpan(const Value: Integer);\r\n procedure SetRowSpan(const Value: Integer);\r\n procedure SetVisible(const Value: Boolean);\r\n procedure SetText(const Value: String);\r\n procedure SetEnabled(const Value: Boolean);\r\n procedure SetSeparator(const Value: Boolean);\r\n procedure SetSeparatorHeight(const Value: Single);\r\n procedure SetMargins(const Value: TTMSFNCMargins);\r\n procedure SetCanDeselect(const Value: Boolean);\r\n procedure SetCanSelect(const Value: Boolean);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n function IsSeparatorHeightStored: Boolean;\r\n protected\r\n procedure MarginsChanged(Sender: TObject);\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n procedure Assign(Source: TPersistent); override;\r\n function State: TTMSFNCCustomSelectorItemState;\r\n destructor Destroy; override;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n published\r\n property CanSelect: Boolean read FCanSelect write SetCanSelect default True;\r\n property CanDeselect: Boolean read FCanDeselect write SetCanDeselect default True;\r\n property ColumnSpan: Integer read FColumnSpan write SetColumnSpan default 1;\r\n property RowSpan: Integer read FRowSpan write SetRowSpan default 1;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property Enabled: Boolean read FEnabled write SetEnabled default True;\r\n property Separator: Boolean read FSeparator write SetSeparator default False;\r\n property SeparatorHeight: Single read FSeparatorHeight write SetSeparatorHeight stored IsSeparatorHeightStored nodefault;\r\n property Margins: TTMSFNCMargins read FMargins write SetMargins;\r\n property Text: String read FText write SetText;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaCenter;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaCenter;\r\n property Hint: string read FHint write FHint;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCCustomSelectorItems = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCCustomSelectorItems = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FOwner: TTMSFNCCustomSelector;\r\n function GetItem(Index: Integer): TTMSFNCCustomSelectorItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCCustomSelectorItem);\r\n protected\r\n function CreateItemClass: TCollectionItemClass; virtual;\r\n function GetOwner: TPersistent; override;\r\n public\r\n constructor Create(AOwner: TTMSFNCCustomSelector); virtual;\r\n property Items[Index: Integer]: TTMSFNCCustomSelectorItem read GetItem write SetItem; default;\r\n function Add: TTMSFNCCustomSelectorItem;\r\n function Insert(Index: Integer): TTMSFNCCustomSelectorItem;\r\n end;\r\n\r\n TTMSFNCCustomSelectorAppearance = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCCustomSelector;\r\n FStrokeHover: TTMSFNCGraphicsStroke;\r\n FFillDown: TTMSFNCGraphicsFill;\r\n FVerticalSpacing: Single;\r\n FStrokeDown: TTMSFNCGraphicsStroke;\r\n FFillSelected: TTMSFNCGraphicsFill;\r\n FHorizontalSpacing: Single;\r\n FStrokeSelected: TTMSFNCGraphicsStroke;\r\n FFill: TTMSFNCGraphicsFill;\r\n FFillHover: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FFillDisabled: TTMSFNCGraphicsFill;\r\n FStrokeDisabled: TTMSFNCGraphicsStroke;\r\n FSeparatorStroke: TTMSFNCGraphicsStroke;\r\n FFont: TTMSFNCGraphicsFont;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFillDown(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFillHover(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFillSelected(const Value: TTMSFNCGraphicsFill);\r\n procedure SetHorizontalSpacing(const Value: Single);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetStrokeDown(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetStrokeHover(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetStrokeSelected(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetVerticalSpacing(const Value: Single);\r\n procedure SetFillDisabled(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStrokeDisabled(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetSeparatorStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n function IsHorizontalSpacingStored: Boolean;\r\n function IsVerticalSpacingStored: Boolean;\r\n protected\r\n procedure Changed;\r\n procedure FontChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n public\r\n constructor Create(AOwner: TTMSFNCCustomSelector);\r\n procedure Assign(Source: TPersistent); override;\r\n destructor Destroy; override;\r\n published\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property StrokeHover: TTMSFNCGraphicsStroke read FStrokeHover write SetStrokeHover;\r\n property FillHover: TTMSFNCGraphicsFill read FFillHover write SetFillHover;\r\n property StrokeDown: TTMSFNCGraphicsStroke read FStrokeDown write SetStrokeDown;\r\n property FillDown: TTMSFNCGraphicsFill read FFillDown write SetFillDown;\r\n property StrokeSelected: TTMSFNCGraphicsStroke read FStrokeSelected write SetStrokeSelected;\r\n property FillSelected: TTMSFNCGraphicsFill read FFillSelected write SetFillSelected;\r\n property StrokeDisabled: TTMSFNCGraphicsStroke read FStrokeDisabled write SetStrokeDisabled;\r\n property FillDisabled: TTMSFNCGraphicsFill read FFillDisabled write SetFillDisabled;\r\n property VerticalSpacing: Single read FVerticalSpacing write SetVerticalSpacing stored IsVerticalSpacingStored nodefault;\r\n property HorizontalSpacing: Single read FHorizontalSpacing write SetHorizontalSpacing stored IsHorizontalSpacingStored nodefault;\r\n property SeparatorStroke: TTMSFNCGraphicsStroke read FSeparatorStroke write SetSeparatorStroke;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n end;\r\n\r\n TTMSFNCCustomSelectorPositionItem = record\r\n TileSet: Boolean;\r\n {$IFDEF LCLLIB}\r\n class operator = (z1, z2 : TTMSFNCCustomSelectorPositionItem) b : Boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n TTMSFNCCustomSelectorDisplayItem = record\r\n Rect: TRectF;\r\n Item: TTMSFNCCustomSelectorItem;\r\n PageIndex: Integer;\r\n Column, Row, ColumnSpan, RowSpan: Integer;\r\n {$IFDEF LCLLIB}\r\n class operator = (z1, z2 : TTMSFNCCustomSelectorDisplayItem) b : Boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n TTMSFNCCustomSelectorItemPosArray = array of array of TTMSFNCCustomSelectorPositionItem;\r\n\r\n TTMSFNCCustomSelectorItemSelected = procedure(Sender: TObject; AItemIndex: Integer) of object;\r\n TTMSFNCCustomSelectorItemDeselected = procedure(Sender: TObject; AItemIndex: Integer) of object;\r\n TTMSFNCCustomSelectorItemClick = procedure(Sender: TObject; AItemIndex: Integer) of object;\r\n TTMSFNCCustomSelectorItemBeforeDrawBackground = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCCustomSelectorItemAfterDrawBackground = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer) of object;\r\n TTMSFNCCustomSelectorItemBeforeDrawContent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCCustomSelectorItemAfterDrawContent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer) of object;\r\n TTMSFNCCustomSelectorItemBeforeDrawText = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var AText: String; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCCustomSelectorItemAfterDrawText = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; AText: String) of object;\r\n TTMSFNCCustomSelectorBeforeDraw = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCCustomSelectorAfterDraw = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF) of object;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCCustomSelectorDisplayList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCCustomSelectorDisplayItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCCustomSelectorDisplayItem);\r\n public\r\n property Items[Index: Integer]: TTMSFNCCustomSelectorDisplayItem read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCCustomSelectorDisplayList = class(TList);\r\n {$ENDIF}\r\n\r\n TTMSFNCCustomSelector = class(TTMSFNCCustomControl)\r\n private\r\n FDisplayList: TTMSFNCCustomSelectorDisplayList;\r\n FUpdateCount: Integer;\r\n FItems: TTMSFNCCustomSelectorItems;\r\n FRows: Integer;\r\n FColumns: Integer;\r\n FPageCount: Integer;\r\n FAppearance: TTMSFNCCustomSelectorAppearance;\r\n FSelectedItemIndex, FFocusedItemIndex, FHoveredItemIndex, FDownItemIndex: Integer;\r\n FOnItemBeforeDrawText: TTMSFNCCustomSelectorItemBeforeDrawText;\r\n FOnAfterDraw: TTMSFNCCustomSelectorAfterDraw;\r\n FOnItemAfterDrawBackground: TTMSFNCCustomSelectorItemAfterDrawBackground;\r\n FOnItemSelected: TTMSFNCCustomSelectorItemSelected;\r\n FOnItemAfterDrawText: TTMSFNCCustomSelectorItemAfterDrawText;\r\n FOnBeforeDraw: TTMSFNCCustomSelectorBeforeDraw;\r\n FOnItemBeforeDrawBackground: TTMSFNCCustomSelectorItemBeforeDrawBackground;\r\n FOnItemDeselected: TTMSFNCCustomSelectorItemDeselected;\r\n FOnItemClick: TTMSFNCCustomSelectorItemClick;\r\n FOnItemBeforeDrawContent: TTMSFNCCustomSelectorItemBeforeDrawContent;\r\n FOnItemAfterDrawContent: TTMSFNCCustomSelectorItemAfterDrawContent;\r\n FBlockChange: Boolean;\r\n procedure SetItems(const Value: TTMSFNCCustomSelectorItems);\r\n procedure SetColumns(const Value: Integer);\r\n procedure SetRows(const Value: Integer);\r\n procedure SetAppearance(const Value: TTMSFNCCustomSelectorAppearance);\r\n procedure SetSelectedItemIndex(const Value: Integer);\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n function GetHintString: string; override;\r\n function HasHint: Boolean; override;\r\n function GetVersion: String; override;\r\n function GetDisplayItem(AItemIndex: Integer): TTMSFNCCustomSelectorDisplayItem; virtual;\r\n function GetNextSelectableItem: Integer; virtual;\r\n function GetPreviousSelectableItem: Integer; virtual;\r\n function GetNextSelectableRowItem: Integer; virtual;\r\n function GetPreviousSelectableRowItem: Integer; virtual;\r\n function GetFirstSelectableItem: Integer; virtual;\r\n function GetLastSelectableItem: Integer; virtual;\r\n function CreateItemsCollection: TTMSFNCCustomSelectorItems; virtual;\r\n procedure CalculateItems; virtual;\r\n procedure UpdateCalculations; virtual;\r\n procedure ApplyStyle; override;\r\n procedure ResetToDefaultStyle; override;\r\n function GetTopOffset: Single; virtual;\r\n function GetCalculationWidth: Single; virtual;\r\n function GetCalculationHeight: Single; virtual;\r\n function GetTotalSeparatorHeight: Single;\r\n function GetTotalSeparatorCount: Integer;\r\n procedure DoItemSelected(AItemIndex: Integer); virtual;\r\n procedure DoItemClick(AItemIndex: Integer); virtual;\r\n procedure DoItemDeselected(AItemIndex: Integer); virtual;\r\n procedure DoItemBeforeDrawBackground(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean); virtual;\r\n procedure DoItemAfterDrawBackground(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer); virtual;\r\n procedure DoItemBeforeDrawContent(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean); virtual;\r\n procedure DoItemAfterDrawContent(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer); virtual;\r\n procedure DoItemBeforeDrawText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var AText: String; var ADefaultDraw: Boolean); virtual;\r\n procedure DoItemAfterDrawText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; AText: String); virtual;\r\n procedure DoBeforeDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF; var ADefaultDraw: Boolean); reintroduce; virtual;\r\n procedure DoAfterDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF); reintroduce; virtual;\r\n procedure DrawItems(AGraphics: TTMSFNCGraphics); virtual;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n\r\n procedure DrawItem(AGraphics: TTMSFNCGraphics; ADisplayItem: TTMSFNCCustomSelectorDisplayItem); virtual;\r\n procedure DrawItemBackGround(AGraphics: TTMSFNCGraphics; ADisplayItem: TTMSFNCCustomSelectorDisplayItem); virtual;\r\n procedure DrawItemContent(AGraphics: TTMSFNCGraphics; ADisplayItem: TTMSFNCCustomSelectorDisplayItem); virtual;\r\n procedure DrawItemText(AGraphics: TTMSFNCGraphics; ADisplayItem: TTMSFNCCustomSelectorDisplayItem); virtual;\r\n\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X: Single; Y: Single); override;\r\n procedure HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X: Single; Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X: Single; Y: Single); override;\r\n procedure HandleKeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleKeyUp(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleMouseLeave; override;\r\n procedure ProcessSelection(AItemIndex: Integer);\r\n property SelectedItemIndex: Integer read FSelectedItemIndex write SetSelectedItemIndex default -1;\r\n property Rows: Integer read FRows write SetRows default 4;\r\n property Columns: Integer read FColumns write SetColumns default 4;\r\n property Version: String read GetVersion;\r\n property Items: TTMSFNCCustomSelectorItems read FItems write SetItems;\r\n property Appearance: TTMSFNCCustomSelectorAppearance read FAppearance write SetAppearance;\r\n property OnItemSelected: TTMSFNCCustomSelectorItemSelected read FOnItemSelected write FOnItemSelected;\r\n property OnItemDeselected: TTMSFNCCustomSelectorItemDeselected read FOnItemDeselected write FOnItemDeselected;\r\n property OnItemClick: TTMSFNCCustomSelectorItemClick read FOnItemClick write FOnItemClick;\r\n property OnItemBeforeDrawBackground: TTMSFNCCustomSelectorItemBeforeDrawBackground read FOnItemBeforeDrawBackground write FOnItemBeforeDrawBackground;\r\n property OnItemAfterDrawBackground: TTMSFNCCustomSelectorItemAfterDrawBackground read FOnItemAfterDrawBackground write FOnItemAfterDrawBackground;\r\n property OnItemBeforeDrawContent: TTMSFNCCustomSelectorItemBeforeDrawContent read FOnItemBeforeDrawContent write FOnItemBeforeDrawContent;\r\n property OnItemAfterDrawContent: TTMSFNCCustomSelectorItemAfterDrawContent read FOnItemAfterDrawContent write FOnItemAfterDrawContent;\r\n property OnBeforeDraw: TTMSFNCCustomSelectorBeforeDraw read FOnBeforeDraw write FOnBeforeDraw;\r\n property OnAfterDraw: TTMSFNCCustomSelectorAfterDraw read FOnAfterDraw write FOnAfterDraw;\r\n property OnItemBeforeDrawText: TTMSFNCCustomSelectorItemBeforeDrawText read FOnItemBeforeDrawText write FOnItemBeforeDrawText;\r\n property OnItemAfterDrawText: TTMSFNCCustomSelectorItemAfterDrawText read FOnItemAfterDrawText write FOnItemAfterDrawText;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n procedure InvalidateItems;\r\n property BlockChange: Boolean read FBlockChange write FBlockChange;\r\n procedure UpdateControlAfterResize; override;\r\n procedure InitializeDefault; virtual;\r\n function XYToItem(X, Y: Single): Integer;\r\n end;\r\n\r\n TTMSFNCDefaultSelector = class(TTMSFNCCustomSelector)\r\n published\r\n property Fill;\r\n property Stroke;\r\n property Version;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math, WEBLib.TMSFNCUtils, WEBLib.TMSFNCStyles;\r\n\r\n{ TTMSFNCCustomSelector }\r\n\r\nprocedure TTMSFNCCustomSelector.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n Fill.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundStrokeColor(c) then\r\n Stroke.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleDefaultButtonFillColor(c) then\r\n Appearance.Fill.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleSelectionFillColor(c) then\r\n begin\r\n Appearance.FillSelected.Color := c;\r\n Appearance.FillDown.Color := c;\r\n Appearance.FillHover.Color := Blend(c, Appearance.Fill.Color, 25);\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleDefaultButtonStrokeColor(c) then\r\n begin\r\n Appearance.Stroke.Color := c;\r\n Appearance.StrokeSelected.Color := c;\r\n Appearance.StrokeDown.Color := c;\r\n Appearance.StrokeHover.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleTextFontColor(c) then\r\n Appearance.Font.Color := c;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCCustomSelector then\r\n begin\r\n FItems.Assign((Source as TTMSFNCCustomSelector).Items);\r\n FAppearance.Assign((Source as TTMSFNCCustomSelector).Appearance);\r\n FRows := (Source as TTMSFNCCustomSelector).Rows;\r\n FColumns := (Source as TTMSFNCCustomSelector).Columns;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.BeginUpdate;\r\nbegin\r\n inherited;\r\n Inc(FUpdateCount);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.CalculateItems;\r\nvar\r\n itposarr: TTMSFNCCustomSelectorItemPosArray;\r\n r, newr, c, newc: Integer;\r\n AItemIndex: Integer;\r\n AItem: TTMSFNCCustomSelectorItem;\r\n cspan, rspan, newcspan, newrspan: Integer;\r\n I: Integer;\r\n K: Integer;\r\n sepc: Integer;\r\n f: Boolean;\r\n APageIndex: Integer;\r\n hs, vs: Single;\r\n iw, ih: Single;\r\n w, h: Single;\r\n exw, exh: Single;\r\n tx, ty: Single;\r\n pw, ph: Single;\r\n offs: Single;\r\n itd: TTMSFNCCustomSelectorDisplayItem;\r\n\r\n procedure FindNewPos(AItem: TTMSFNCCustomSelectorItem; var ANewR: Integer; var ANewC: Integer; var AFound: Boolean; ARows , {%H-}ACurRow, AColumns, {%H-}ACurCol: Integer; PosArr: TTMSFNCCustomSelectorItemPosArray);\r\n var\r\n i, k: integer;\r\n cspan, rspan: Integer;\r\n J, L: Integer;\r\n begin\r\n AFound := False;\r\n for I := ANewr to ARows - 1 do\r\n begin\r\n for K := ANewC to AColumns - 1 do\r\n begin\r\n cspan := AItem.ColumnSpan;\r\n cspan := Min(cspan, Columns - ANewC);\r\n rspan := AItem.RowSpan;\r\n rspan := Min(rspan, Rows - ANewR);\r\n\r\n AFound := true;\r\n for J := 0 to rspan - 1 do\r\n begin\r\n for L := 0 to cspan - 1 do\r\n begin\r\n if PosArr[I + J, K + L].TileSet then\r\n AFound := False;\r\n end;\r\n end;\r\n\r\n if AFound then\r\n Break;\r\n Inc(ANewC);\r\n end;\r\n if AFound then\r\n Break;\r\n\r\n ANewC := 0;\r\n Inc(ANewr);\r\n end;\r\n end;\r\nbegin\r\n if (csDestroying in ComponentState) or (FUpdateCount > 0) then\r\n Exit;\r\n\r\n FDisplayList.Clear;\r\n\r\n if Items.Count = 0 then\r\n Exit;\r\n\r\n pw := GetCalculationWidth;\r\n ph := GetCalculationHeight;\r\n hs := Appearance.HorizontalSpacing;\r\n vs := Appearance.VerticalSpacing;\r\n w := pw - vs;\r\n iw := w;\r\n if Columns > 0 then\r\n iw := (w - (Columns * hs)) / Columns;\r\n\r\n h := ph - vs - GetTotalSeparatorHeight;\r\n sepc := GetTotalSeparatorCount;\r\n ih := h;\r\n if (Rows - sepc) > 0 then\r\n ih := (h - ((Rows - sepc) * vs)) / (Rows - sepc);\r\n\r\n AItemIndex := 0;\r\n APageIndex := 0;\r\n offs := 0;\r\n while AItemIndex <= Items.Count - 1 do\r\n begin\r\n c := 0;\r\n r := 0;\r\n SetLength(itposarr, 0, 0);\r\n SetLength(itposarr, Rows, Columns);\r\n\r\n while r < Rows do\r\n begin\r\n while (c < Columns) do\r\n begin\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) and (APageIndex = 0) then\r\n begin\r\n AItem := Items[AItemIndex];\r\n if not AItem.Visible then\r\n begin\r\n Inc(AItemIndex);\r\n Continue;\r\n end;\r\n\r\n if AItem.Separator then\r\n begin\r\n cspan := Columns;\r\n rspan := 1;\r\n end\r\n else\r\n begin\r\n cspan := AItem.ColumnSpan;\r\n rspan := AItem.RowSpan;\r\n end;\r\n\r\n cspan := Min(cspan, Columns - c);\r\n rspan := Min(rspan, Rows - r);\r\n\r\n exw := iw * cspan + (hs * (cspan - 1));\r\n if AItem.Separator then\r\n exh := AItem.SeparatorHeight\r\n else\r\n exh := ih * rspan + (vs * (rspan - 1));\r\n\r\n tx := (pw * APageIndex) + hs + iw * c + (hs * c);\r\n ty := offs + vs + ih * r + (vs * r) + GetTopOffset;\r\n\r\n itd.Rect := RectF(tx + AItem.Margins.Left, ty + AItem.Margins.Top,\r\n tx + exw - AItem.Margins.Right, ty + exh - AItem.Margins.Bottom);\r\n itd.Item := AItem;\r\n itd.PageIndex := APageIndex;\r\n itd.Column := c;\r\n itd.Row := r;\r\n itd.ColumnSpan := cspan;\r\n itd.RowSpan := rspan;\r\n FDisplayList.Add(itd);\r\n\r\n newcspan := c;\r\n newrspan := r;\r\n newcspan := newcspan + cspan - 1;\r\n newrspan := newrspan + rspan - 1;\r\n\r\n for I := r to newrspan do\r\n for K := c to newcspan do\r\n itposarr[I, K].TileSet := True;\r\n\r\n if AItem.Separator then\r\n offs := offs + AItem.SeparatorHeight - ih * rspan + (vs * (rspan - 1));\r\n end;\r\n Inc(AItemIndex);\r\n Inc(c);\r\n newc := c;\r\n newr := r;\r\n f := False;\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) then\r\n FindNewPos(Items[AItemIndex], newr, newc, f, Rows, newr, Columns, newc, itposarr);\r\n c := newc;\r\n r := newr;\r\n\r\n if (c >= Columns) or (r >= Rows) then\r\n Break;\r\n end;\r\n c := 0;\r\n Inc(r);\r\n newc := c;\r\n newr := r;\r\n f := False;\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) then\r\n FindNewPos(Items[AItemIndex], newr, newc, f, Rows, newr, Columns, newc, itposarr);\r\n c := newc;\r\n r := newr;\r\n if r >= Rows then\r\n Break;\r\n end;\r\n Inc(APageIndex);\r\n end;\r\n\r\n FPageCount := APageIndex;\r\n InvalidateItems;\r\nend;\r\n\r\nconstructor TTMSFNCCustomSelector.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FColumns := 4;\r\n FRows := 4;\r\n FItems := CreateItemsCollection;\r\n FDisplayList := TTMSFNCCustomSelectorDisplayList.Create;\r\n FAppearance := TTMSFNCCustomSelectorAppearance.Create(Self);\r\n FSelectedItemIndex := -1;\r\n FFocusedItemIndex := -1;\r\n FHoveredItemIndex := -1;\r\n FDownItemIndex := -1;\r\n\r\n if IsDesignTime then\r\n InitializeDefault;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.InitializeDefault;\r\nbegin\r\n\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.CreateItemsCollection: TTMSFNCCustomSelectorItems;\r\nbegin\r\n Result := TTMSFNCCustomSelectorItems.Create(Self);\r\nend;\r\n\r\ndestructor TTMSFNCCustomSelector.Destroy;\r\nbegin\r\n FAppearance.Free;\r\n FDisplayList.Free;\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoAfterDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n if Assigned(OnAfterDraw) then\r\n OnAfterDraw(Self, AGraphics, ARect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoBeforeDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDraw) then\r\n OnBeforeDraw(Self, AGraphics, ARect, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemAfterDrawBackground(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemAfterDrawBackground) then\r\n OnItemAfterDrawBackground(Self, AGraphics, ARect, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemAfterDrawContent(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemAfterDrawContent) then\r\n OnItemAfterDrawContent(Self, AGraphics, ARect, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemAfterDrawText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; AText: String);\r\nbegin\r\n if Assigned(OnItemAfterDrawText) then\r\n OnItemAfterDrawText(Self, AGraphics, ARect, AItemIndex, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemBeforeDrawBackground(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnItemBeforeDrawBackground) then\r\n OnItemBeforeDrawBackground(Self, AGraphics, ARect, AItemIndex, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemBeforeDrawContent(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnItemBeforeDrawContent) then\r\n OnItemBeforeDrawContent(Self, AGraphics, ARect, AItemIndex, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemBeforeDrawText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; var AText: String;\r\n var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnItemBeforeDrawText) then\r\n OnItemBeforeDrawText(Self, AGraphics, ARect, AItemIndex, AText, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemSelected(AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemSelected) then\r\n OnItemSelected(Self, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemClick(AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemClick) then\r\n OnItemClick(Self, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DoItemDeselected(AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemDeselected) then\r\n OnItemDeselected(Self, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.HandleMouseLeave;\r\nbegin\r\n inherited;\r\n FHoveredItemIndex := -1;\r\n InvalidateItems;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DrawItem(AGraphics: TTMSFNCGraphics;\r\n ADisplayItem: TTMSFNCCustomSelectorDisplayItem);\r\nbegin\r\n DrawItemBackGround(AGraphics, ADisplayItem);\r\n DrawItemContent(AGraphics, ADisplayItem);\r\n DrawItemText(AGraphics, ADisplayItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DrawItemBackGround(AGraphics: TTMSFNCGraphics; ADisplayItem: TTMSFNCCustomSelectorDisplayItem);\r\nvar\r\n r: TRectF;\r\n it: TTMSFNCCustomSelectorItem;\r\n a: Boolean;\r\n fr: TRectF;\r\nbegin\r\n it := ADisplayItem.Item;\r\n if Assigned(it) then\r\n begin\r\n if not it.Separator then\r\n begin\r\n AGraphics.Fill.Assign(Appearance.Fill);\r\n AGraphics.Stroke.Assign(Appearance.Stroke);\r\n if it.Enabled then\r\n begin\r\n if it.Index = FDownItemIndex then\r\n begin\r\n AGraphics.Fill.Assign(Appearance.FillDown);\r\n AGraphics.Stroke.Assign(Appearance.StrokeDown);\r\n end\r\n else if it.Index = FHoveredItemIndex then\r\n begin\r\n AGraphics.Fill.Assign(Appearance.FillHover);\r\n AGraphics.Stroke.Assign(Appearance.StrokeHover);\r\n end\r\n else if it.Index = FSelectedItemIndex then\r\n begin\r\n AGraphics.Fill.Assign(Appearance.FillSelected);\r\n AGraphics.Stroke.Assign(Appearance.StrokeSelected);\r\n end;\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(Appearance.FillDisabled);\r\n AGraphics.Stroke.Assign(Appearance.StrokeDisabled);\r\n end;\r\n end\r\n else\r\n AGraphics.Stroke.Assign(Appearance.SeparatorStroke);\r\n\r\n r := ADisplayItem.Rect;\r\n a := True;\r\n DoItemBeforeDrawBackground(AGraphics, ADisplayItem.Rect, it.Index, a);\r\n if a then\r\n begin\r\n if it.Separator then\r\n AGraphics.DrawLine(PointF(r.Left, CenterPointEx(r).Y), PointF(r.Right, CenterPointEx(r).Y))\r\n else\r\n begin\r\n AGraphics.DrawRectangle(r);\r\n if IsFocused and (FFocusedItemIndex = it.Index) then\r\n begin\r\n fr := r;\r\n InflateRectEx(fr, -2, -2);\r\n AGraphics.DrawFocusRectangle(fr);\r\n end;\r\n end;\r\n\r\n DoItemAfterDrawBackground(AGraphics, ADisplayItem.Rect, it.Index);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DrawItemContent(AGraphics: TTMSFNCGraphics;\r\n ADisplayItem: TTMSFNCCustomSelectorDisplayItem);\r\nvar\r\n it: TTMSFNCCustomSelectorItem;\r\n a: Boolean;\r\nbegin\r\n it := ADisplayItem.Item;\r\n if Assigned(it) then\r\n begin\r\n a := True;\r\n DoItemBeforeDrawContent(AGraphics, ADisplayItem.Rect, it.Index, a);\r\n if a then\r\n DoItemAfterDrawContent(AGraphics, ADisplayItem.Rect, it.Index);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DrawItems(AGraphics: TTMSFNCGraphics);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to FDisplayList.Count - 1 do\r\n DrawItem(AGraphics, FDisplayList[I]);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.DrawItemText(AGraphics: TTMSFNCGraphics;\r\n ADisplayItem: TTMSFNCCustomSelectorDisplayItem);\r\nvar\r\n r: TRectF;\r\n it: TTMSFNCCustomSelectorItem;\r\n str: String;\r\n a: Boolean;\r\nbegin\r\n it := ADisplayItem.Item;\r\n if Assigned(it) and (it.Text <> '') then\r\n begin\r\n r := ADisplayItem.Rect;\r\n str := it.Text;\r\n a := True;\r\n InflateRectEx(r, -2, -2);\r\n AGraphics.Font.AssignSource(Appearance.Font);\r\n DoItemBeforeDrawText(AGraphics, ADisplayItem.Rect, it.Index, str, a);\r\n if a then\r\n begin\r\n AGraphics.DrawText(r, str, False, it.HorizontalTextAlign, it.VerticalTextAlign);\r\n DoItemAfterDrawText(AGraphics, ADisplayItem.Rect, it.Index, str);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.EndUpdate;\r\nbegin\r\n inherited;\r\n Dec(FUpdateCount);\r\n if FUpdateCount = 0 then\r\n CalculateItems;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetFirstSelectableItem: Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := FFocusedItemIndex;\r\n for I := 0 to FDisplayList.Count - 1 do\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and it.Enabled and not it.Separator then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetCalculationHeight: Single;\r\nbegin\r\n Result := Height - GetTopOffset;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetHintString: string;\r\nvar\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := inherited GetHintString;\r\n if (FHoveredItemIndex >= 0) and (FHoveredItemIndex <= FItems.Count - 1) then\r\n begin\r\n it := FItems[FHoveredItemIndex];\r\n Result := it.Hint;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetLastSelectableItem: Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := FFocusedItemIndex;\r\n for I := FDisplayList.Count - 1 downto 0 do\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and it.Enabled and not it.Separator then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetNextSelectableItem: Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := FFocusedItemIndex;\r\n for I := 0 to FDisplayList.Count - 1 do\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and it.Enabled and not it.Separator and (it.Index > FFocusedItemIndex) then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetNextSelectableRowItem: Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\n disp: TTMSFNCCustomSelectorDisplayItem;\r\nbegin\r\n Result := FFocusedItemIndex;\r\n if Result = -1 then\r\n begin\r\n Result := GetNextSelectableItem;\r\n Exit;\r\n end;\r\n\r\n disp := GetDisplayItem(FFocusedItemIndex);\r\n for I := 0 to FDisplayList.Count - 1 do\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and it.Enabled and not it.Separator and (it.Index > FFocusedItemIndex) and (disp.Column >= FDisplayList[I].Column) and\r\n (disp.Column <= FDisplayList[I].Column + (FDisplayList[I].ColumnSpan - 1))\r\n and (FDisplayList[I].Row > disp.Row) then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetPreviousSelectableItem: Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := FFocusedItemIndex;\r\n for I := FDisplayList.Count - 1 downto 0 do\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and it.Enabled and not it.Separator and (it.Index < FFocusedItemIndex) then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetPreviousSelectableRowItem: Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\n disp: TTMSFNCCustomSelectorDisplayItem;\r\nbegin\r\n Result := FFocusedItemIndex;\r\n if Result = -1 then\r\n begin\r\n Result := GetPreviousSelectableItem;\r\n Exit;\r\n end;\r\n\r\n disp := GetDisplayItem(FFocusedItemIndex);\r\n for I := FDisplayList.Count - 1 downto 0 do\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and it.Enabled and not (it.Separator) and (it.Index < FFocusedItemIndex) and (disp.Column >= FDisplayList[I].Column) and\r\n (disp.Column <= FDisplayList[I].Column + (FDisplayList[I].ColumnSpan - 1)) and (FDisplayList[I].Row < disp.Row) then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetTopOffset: Single;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetTotalSeparatorCount: Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := 0;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if Items[I].Separator then\r\n Inc(Result);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetTotalSeparatorHeight: Single;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := 0;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if Items[I].Separator then\r\n Result := Result + Items[I].SeparatorHeight + Appearance.VerticalSpacing;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetCalculationWidth: Single;\r\nbegin\r\n Result := Width;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.HandleKeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n case Key of\r\n KEY_UP:\r\n begin\r\n FFocusedItemIndex := GetPreviousSelectableRowItem;\r\n InvalidateItems;\r\n end;\r\n KEY_LEFT:\r\n begin\r\n FFocusedItemIndex := GetPreviousSelectableItem;\r\n InvalidateItems;\r\n end;\r\n KEY_DOWN:\r\n begin\r\n FFocusedItemIndex := GetNextSelectableRowItem;\r\n InvalidateItems;\r\n end;\r\n KEY_RIGHT:\r\n begin\r\n FFocusedItemIndex := GetNextSelectableItem;\r\n InvalidateItems;\r\n end;\r\n KEY_HOME:\r\n begin\r\n FFocusedItemIndex := GetFirstSelectableItem;\r\n InvalidateItems;\r\n end;\r\n KEY_END:\r\n begin\r\n FFocusedItemIndex := GetLastSelectableItem;\r\n InvalidateItems;\r\n end;\r\n end;\r\n\r\n if (Key = KEY_RETURN) then\r\n begin\r\n FDownItemIndex := FFocusedItemIndex;\r\n InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.HandleKeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if (Key = KEY_RETURN) then\r\n begin\r\n FDownItemIndex := -1;\r\n ProcessSelection(FFocusedItemIndex);\r\n InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n CaptureEx;\r\n FDownItemIndex := XYToItem(X, Y);\r\n InvalidateItems;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.HandleMouseMove(Shift: TShiftState; X, Y: Single);\r\nvar\r\n h: Integer;\r\nbegin\r\n inherited;\r\n if FDownItemIndex > -1 then\r\n Exit;\r\n\r\n h := XYToItem(X, Y);\r\n if h <> FHoveredItemIndex then\r\n begin\r\n FHoveredItemIndex := h;\r\n CancelHint;\r\n InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState;\r\n X, Y: Single);\r\nvar\r\n s: Integer;\r\nbegin\r\n inherited;\r\n ReleaseCaptureEx;\r\n s := XYToItem(X, Y);\r\n if (s = FDownItemIndex) and (FDownItemIndex <> -1) then\r\n begin\r\n ProcessSelection(s);\r\n if s <> -1 then\r\n DoItemClick(s);\r\n end;\r\n FDownItemIndex := -1;\r\n FHoveredItemIndex := -1;\r\n InvalidateItems;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.HasHint: Boolean;\r\nvar\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := False;\r\n if (FHoveredItemIndex >= 0) and (FHoveredItemIndex <= FItems.Count - 1) then\r\n begin\r\n it := FItems[FHoveredItemIndex];\r\n Result := it.Hint <> '';\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n a: Boolean;\r\nbegin\r\n inherited;\r\n a := True;\r\n DoBeforeDraw(AGraphics, ARect, a);\r\n if a then\r\n begin\r\n DrawItems(AGraphics);\r\n DoAfterDraw(AGraphics, ARect);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.ProcessSelection(AItemIndex: Integer);\r\nvar\r\n it: TTMSFNCCustomSelectorItem;\r\n prev: Integer;\r\nbegin\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) then\r\n begin\r\n it := FItems[AItemIndex];\r\n if it.CanSelect then\r\n begin\r\n prev := FSelectedItemIndex;\r\n if it.CanDeselect and (it.Index = FSelectedItemIndex) then\r\n FSelectedItemIndex := -1\r\n else\r\n FSelectedItemIndex := it.Index;\r\n\r\n if FSelectedItemIndex <> -1 then\r\n FFocusedItemIndex := FSelectedItemIndex;\r\n\r\n if it.CanDeselect and (prev <> -1) then\r\n DoItemDeSelected(prev);\r\n\r\n if FSelectedItemIndex <> -1 then\r\n DoItemSelected(FSelectedItemIndex);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCCustomSelector);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.InvalidateItems;\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.ResetToDefaultStyle;\r\nbegin\r\n inherited;\r\n Fill.Kind := gfkSolid;\r\n Stroke.Kind := gskSolid;\r\n Fill.Color := gcWhite;\r\n Stroke.Color := gcSilver;\r\n\r\n Appearance.Fill.Color := Lighter(gcLightgray, 50);\r\n Appearance.FillHover.Color := Lighter(gcLightslategray, 50);\r\n Appearance.FillDown.Color := Lighter(gcSlategray, 50);\r\n Appearance.FillSelected.Color := Lighter(gcSlategray, 50);\r\n Appearance.FillDisabled.Color := Lighter(gcGray, 50);\r\n\r\n Appearance.Stroke.Color := gcDarkgray;\r\n Appearance.StrokeHover.Color := gcLightslategray;\r\n Appearance.StrokeDown.Color := gcSlategray;\r\n Appearance.StrokeSelected.Color := gcDarkslategray;\r\n Appearance.StrokeDisabled.Color := gcDarkgray;\r\n\r\n Appearance.Font.Color := gcBlack;\r\n\r\n Appearance.Fill.Kind := gfkSolid;\r\n Appearance.FillHover.Kind := gfkSolid;\r\n Appearance.FillDown.Kind := gfkSolid;\r\n Appearance.FillSelected.Kind := gfkSolid;\r\n Appearance.FillDisabled.Kind := gfkSolid;\r\n\r\n Appearance.Stroke.Kind := gskSolid;\r\n Appearance.StrokeHover.Kind := gskSolid;\r\n Appearance.StrokeDown.Kind := gskSolid;\r\n Appearance.StrokeSelected.Kind := gskSolid;\r\n Appearance.StrokeDisabled.Kind := gskSolid;\r\n\r\n Appearance.SeparatorStroke.Kind := gskSolid;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.UpdateCalculations;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n CalculateItems;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.GetDisplayItem(AItemIndex: Integer): TTMSFNCCustomSelectorDisplayItem;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result.Rect := RectF(0, 0, 0, 0);\r\n Result.Item := nil;\r\n Result.PageIndex := -1;\r\n Result.Row := -1;\r\n Result.Column := -1;\r\n Result.ColumnSpan := -1;\r\n Result.RowSpan := -1;\r\n for I := 0 to FDisplayList.Count - 1 do\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and (it.Index = AItemIndex) then\r\n begin\r\n Result := FDisplayList[I];\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.SetAppearance(\r\n const Value: TTMSFNCCustomSelectorAppearance);\r\nbegin\r\n FAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.SetColumns(const Value: Integer);\r\nbegin\r\n if FColumns <> Value then\r\n begin\r\n FColumns := Value;\r\n UpdateCalculations;\r\n CalculateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.SetItems(const Value: TTMSFNCCustomSelectorItems);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.SetRows(const Value: Integer);\r\nbegin\r\n if FRows <> Value then\r\n begin\r\n FRows := Value;\r\n UpdateCalculations;\r\n CalculateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelector.SetSelectedItemIndex(const Value: Integer);\r\nbegin\r\n if FSelectedItemIndex <> Value then\r\n begin\r\n FSelectedItemIndex := Value;\r\n FFocusedItemIndex := Value;\r\n InvalidateItems;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelector.XYToItem(X, Y: Single): Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := -1;\r\n for I := 0 to FDisplayList.Count - 1 do\r\n begin\r\n if PtInRectEx(FDisplayList[I].Rect, PointF(X, Y)) then\r\n begin\r\n it := FDisplayList[I].Item;\r\n if Assigned(it) and it.Enabled and not it.Separator then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCCustomSelectorItem }\r\n\r\nprocedure TTMSFNCCustomSelectorItem.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomSelectorItem then\r\n begin\r\n FRowSpan := (Source as TTMSFNCCustomSelectorItem).RowSpan;\r\n FColumnSpan := (Source as TTMSFNCCustomSelectorItem).ColumnSpan;\r\n FVisible := (Source as TTMSFNCCustomSelectorItem).Visible;\r\n FText := (Source as TTMSFNCCustomSelectorItem).Text;\r\n FEnabled := (Source as TTMSFNCCustomSelectorItem).Enabled;\r\n FSeparator := (Source as TTMSFNCCustomSelectorItem).Separator;\r\n FSeparatorHeight := (Source as TTMSFNCCustomSelectorItem).SeparatorHeight;\r\n FMargins.Assign((Source as TTMSFNCCustomSelectorItem).Margins);\r\n FCanDeselect := (Source as TTMSFNCCustomSelectorItem).CanDeselect;\r\n FCanSelect := (Source as TTMSFNCCustomSelectorItem).CanSelect;\r\n FHint := (Source as TTMSFNCCustomSelectorItem).Hint;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCCustomSelectorItem.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FOwner := (Collection as TTMSFNCCustomSelectorItems).FOwner;\r\n FSeparator := False;\r\n FColumnSpan := 1;\r\n FCanDeselect := True;\r\n FCanSelect := True;\r\n FRowSpan := 1;\r\n FMargins := TTMSFNCMargins.Create;\r\n FMargins.OnChange := @MarginsChanged;\r\n FEnabled := True;\r\n FSeparatorHeight := 5;\r\n FVisible := True;\r\n if Assigned(FOwner) then\r\n FOwner.CalculateItems;\r\nend;\r\n\r\ndestructor TTMSFNCCustomSelectorItem.Destroy;\r\nbegin\r\n FMargins.Free;\r\n inherited;\r\n if Assigned(FOwner) then\r\n FOwner.CalculateItems;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorItem.IsSeparatorHeightStored: Boolean;\r\nbegin\r\n Result := SeparatorHeight <> 5;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.MarginsChanged(Sender: TObject);\r\nbegin\r\n FOwner.CalculateItems;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetCanDeselect(const Value: Boolean);\r\nbegin\r\n FCanDeselect := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetCanSelect(const Value: Boolean);\r\nbegin\r\n FCanSelect := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetColumnSpan(const Value: Integer);\r\nbegin\r\n if FColumnSpan <> Value then\r\n begin\r\n FColumnSpan := Value;\r\n FOwner.CalculateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetEnabled(const Value: Boolean);\r\nbegin\r\n if FEnabled <> Value then\r\n begin\r\n FEnabled := Value;\r\n FOwner.InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n FOwner.InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetMargins(const Value: TTMSFNCMargins);\r\nbegin\r\n FMargins.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetRowSpan(const Value: Integer);\r\nbegin\r\n if FRowSpan <> Value then\r\n begin\r\n FRowSpan := Value;\r\n FOwner.CalculateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetSeparator(const Value: Boolean);\r\nbegin\r\n if FSeparator <> Value then\r\n begin\r\n FSeparator := Value;\r\n FOwner.CalculateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetSeparatorHeight(const Value: Single);\r\nbegin\r\n if FSeparatorHeight <> Value then\r\n begin\r\n FSeparatorHeight := Value;\r\n FOwner.InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n FOwner.InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n FOwner.InvalidateItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItem.SetVisible(const Value: Boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n FOwner.CalculateItems;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorItem.State: TTMSFNCCustomSelectorItemState;\r\nbegin\r\n Result := isNormal;\r\n if not Separator then\r\n begin\r\n if Enabled then\r\n begin\r\n if Index = FOwner.FDownItemIndex then\r\n Result := isDown\r\n else if Index = FOwner.FHoveredItemIndex then\r\n Result := isHover\r\n else if Index = FOwner.FSelectedItemIndex then\r\n Result := isSelected\r\n end\r\n else\r\n Result := isDisabled;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCCustomSelectorItems }\r\n\r\nfunction TTMSFNCCustomSelectorItems.Add: TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := TTMSFNCCustomSelectorItem(inherited Add);\r\nend;\r\n\r\nconstructor TTMSFNCCustomSelectorItems.Create(AOwner: TTMSFNCCustomSelector);\r\nbegin\r\n inherited Create(AOwner, CreateItemClass);\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorItems.CreateItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCCustomSelectorItem;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorItems.GetItem(\r\n Index: Integer): TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := TTMSFNCCustomSelectorItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorItems.GetOwner: TPersistent;\r\nbegin\r\n Result := FOwner;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorItems.Insert(\r\n Index: Integer): TTMSFNCCustomSelectorItem;\r\nbegin\r\n Result := TTMSFNCCustomSelectorItem(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorItems.SetItem(Index: Integer;\r\n const Value: TTMSFNCCustomSelectorItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TTMSFNCCustomSelectorAppearance }\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomSelectorAppearance then\r\n begin\r\n FFill.Assign((Source as TTMSFNCCustomSelectorAppearance).Fill);\r\n FFillHover.Assign((Source as TTMSFNCCustomSelectorAppearance).FillHover);\r\n FFillSelected.Assign((Source as TTMSFNCCustomSelectorAppearance).FillSelected);\r\n FFillDisabled.Assign((Source as TTMSFNCCustomSelectorAppearance).FillDisabled);\r\n FFillDown.Assign((Source as TTMSFNCCustomSelectorAppearance).FillDown);\r\n FStroke.Assign((Source as TTMSFNCCustomSelectorAppearance).Stroke);\r\n FStrokeHover.Assign((Source as TTMSFNCCustomSelectorAppearance).StrokeHover);\r\n FStrokeSelected.Assign((Source as TTMSFNCCustomSelectorAppearance).StrokeSelected);\r\n FStrokeDown.Assign((Source as TTMSFNCCustomSelectorAppearance).StrokeDown);\r\n FStrokeDisabled.Assign((Source as TTMSFNCCustomSelectorAppearance).StrokeDisabled);\r\n FVerticalSpacing := (Source as TTMSFNCCustomSelectorAppearance).VerticalSpacing;\r\n FHorizontalSpacing := (Source as TTMSFNCCustomSelectorAppearance).HorizontalSpacing;\r\n FSeparatorStroke.Assign((Source as TTMSFNCCustomSelectorAppearance).SeparatorStroke);\r\n FFont.AssignSource((Source as TTMSFNCCustomSelectorAppearance).Font);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.Changed;\r\nbegin\r\n FOwner.CalculateItems;\r\nend;\r\n\r\nconstructor TTMSFNCCustomSelectorAppearance.Create(AOwner: TTMSFNCCustomSelector);\r\nbegin\r\n FOwner := AOwner;\r\n FFill := TTMSFNCGraphicsFill.Create;\r\n FFill.Color := Lighter(gcLightgray, 50);\r\n FFillHover := TTMSFNCGraphicsFill.Create;\r\n FFillHover.Color := Lighter(gcLightslategray, 50);\r\n FFillDown := TTMSFNCGraphicsFill.Create;\r\n FFillDown.Color := Lighter(gcSlategray, 50);\r\n FFillSelected := TTMSFNCGraphicsFill.Create;\r\n FFillSelected.Color := Lighter(gcSlategray, 50);\r\n FFillDisabled := TTMSFNCGraphicsFill.Create;\r\n FFillDisabled.Color := Lighter(gcGray, 50);\r\n\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FStroke.Color := gcDarkgray;\r\n FStrokeHover := TTMSFNCGraphicsStroke.Create;\r\n FStrokeHover.Color := gcLightslategray;\r\n FStrokeDown := TTMSFNCGraphicsStroke.Create;\r\n FStrokeDown.Color := gcSlategray;\r\n FStrokeSelected := TTMSFNCGraphicsStroke.Create;\r\n FStrokeSelected.Color := gcDarkslategray;\r\n FStrokeDisabled := TTMSFNCGraphicsStroke.Create;\r\n FStrokeDisabled.Color := gcDarkgray;\r\n\r\n FSeparatorStroke := TTMSFNCGraphicsStroke.Create;\r\n FSeparatorStroke.Color := gcDarkGray;\r\n\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @FontChanged;\r\n\r\n FSeparatorStroke.OnChanged := @StrokeChanged;\r\n FFont.OnChanged := @FontChanged;\r\n\r\n FFill.OnChanged := @FillChanged;\r\n FFillDown.OnChanged := @FillChanged;\r\n FFillHover.OnChanged := @FillChanged;\r\n FFillSelected.OnChanged := @FillChanged;\r\n FFillDisabled.OnChanged := @FillChanged;\r\n\r\n FStroke.OnChanged := @StrokeChanged;\r\n FStrokeHover.OnChanged := @StrokeChanged;\r\n FStrokeDown.OnChanged := @StrokeChanged;\r\n FStrokeDisabled.OnChanged := @StrokeChanged;\r\n FStrokeSelected.OnChanged := @StrokeChanged;\r\n\r\n FHorizontalSpacing := 4;\r\n FVerticalSpacing := 4;\r\nend;\r\n\r\ndestructor TTMSFNCCustomSelectorAppearance.Destroy;\r\nbegin\r\n FFont.Free;\r\n FFill.Free;\r\n FFillDown.Free;\r\n FFillSelected.Free;\r\n FFillHover.Free;\r\n FFillDisabled.Free;\r\n FSeparatorStroke.Free;\r\n FStroke.Free;\r\n FStrokeDown.Free;\r\n FStrokeSelected.Free;\r\n FStrokeHover.Free;\r\n FStrokeDisabled.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n FOwner.InvalidateItems;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.FontChanged(Sender: TObject);\r\nbegin\r\n FOwner.InvalidateItems;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorAppearance.IsHorizontalSpacingStored: Boolean;\r\nbegin\r\n Result := HorizontalSpacing <> 4;\r\nend;\r\n\r\nfunction TTMSFNCCustomSelectorAppearance.IsVerticalSpacingStored: Boolean;\r\nbegin\r\n Result := VerticalSpacing <> 4;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetFillDisabled(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFillDisabled.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetFillDown(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFillDown.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetFillHover(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFillHover.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetFillSelected(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFillSelected.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.AssignSource(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetHorizontalSpacing(\r\n const Value: Single);\r\nbegin\r\n if FHorizontalSpacing <> Value then\r\n begin\r\n FHorizontalSpacing := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetSeparatorStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FSeparatorStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetStrokeDisabled(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStrokeDisabled.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetStrokeDown(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStrokeDown.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetStrokeHover(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStrokeHover.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetStrokeSelected(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStrokeSelected.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.SetVerticalSpacing(const Value: Single);\r\nbegin\r\n if FVerticalSpacing <> Value then\r\n begin\r\n FVerticalSpacing := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n FOwner.InvalidateItems;\r\nend;\r\n\r\n{ TTMSFNCGraphicsPathPoint }\r\n\r\n{$IFDEF LCLLIB}\r\nclass operator TTMSFNCCustomSelectorDisplayItem.=(z1, z2: TTMSFNCCustomSelectorDisplayItem)b: boolean;\r\nbegin\r\n Result := z1 = z2;\r\nend;\r\n\r\nclass operator TTMSFNCCustomSelectorPositionItem.=(z1, z2: TTMSFNCCustomSelectorPositionItem)b: boolean;\r\nbegin\r\n Result := z1 = z2;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCCustomSelectorDisplayList.GetItem(Index: Integer): TTMSFNCCustomSelectorDisplayItem;\r\nbegin\r\n Result := TTMSFNCCustomSelectorDisplayItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCCustomSelectorDisplayList.SetItem(Index: Integer; const Value: TTMSFNCCustomSelectorDisplayItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n{$ENDIF}\r\n\r\ninitialization\r\n RegisterClass(TTMSFNCCustomSelector);\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCColorSelector;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCCustomSelector, WEBLib.Controls,\r\n WEBLib.TMSFNCTypes, WEBLib.ExtCtrls, WEBLib.TMSFNCGraphicsTypes\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types, FMX.Colors\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n ,Types, WEBLib.StdCtrls\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr.\r\n\r\n //v1.0.0.0: First release\r\n\r\nconst\r\n TMSFNCColorSelectorColorSetCount = 15;\r\n TMSFNCColorSelectorColorSet: array[0..TMSFNCColorSelectorColorSetCount] of TTMSFNCGraphicsColor = (gcBlack, gcMaroon, gcGreen, gcOlive,\r\n gcNavy, gcPurple, gcTeal, gcSilver, gcGray, gcRed,\r\n gcLime, gcYellow, gcBlue, gcFuchsia, gcAqua, gcWhite);\r\n\r\n {$IFDEF FMXLIB}\r\n TMSFNCColorSelectorExtendedColorSetCount = 39;\r\n TMSFNCColorSelectorExtendedColorSet: array[0..TMSFNCColorSelectorExtendedColorSetCount] of TTMSFNCGraphicsColor = (gcBlack, $FF003399, $FF003333, $FF003300, $FF663300, gcNavy,\r\n $FF353333, $FF333333, $FF800000, $FFFF6600, $FF808000, $FF008000, $FF008080, $FF0000FF,\r\n $FF666699, $FF808080, $FFFF0000, $FFFF9900, $FF99CC00, $FF339966, $FF33CCCC,\r\n $FF3366FF, $FF800080, $FF999999, $FFFF00FF, $FFFFCC00, $FFFFFF00, $FF00FF00,\r\n $FF00FFFF, $FF00CCFF, $FF993366, $FFC0C0C0, $FFFF99CC, $FFFFCC99, $FFFFFF99,\r\n $FFCCFFCC, $FFCCFFFF, $FF99CCFF, $FFCC99FF, $FFFFFFFF);\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n TMSFNCColorSelectorExtendedColorSetCount = 39;\r\n TMSFNCColorSelectorExtendedColorSet: array[0..TMSFNCColorSelectorExtendedColorSetCount] of TTMSFNCGraphicsColor = (gcBlack, $993300, $333300, $003300, $003366, gcNavy,\r\n $333335, $333333, $000080, $0066FF, $008080, $008000, $808000, $FF0000,\r\n $996666, $808080, $0000FF, $0099FF, $00CC99, $669933, $CCCC33,\r\n $FF6633, $800080, $999999, $FF00FF, $00CCFF, $00FFFF, $00FF00,\r\n $FFFF00, $FFCC00, $663399, $C0C0C0, $CC99FF, $99CCFF, $99FFFF,\r\n $CCFFCC, $FFFFCC, $FFCC99, $FF99CC, $FFFFFF);\r\n {$ENDIF}\r\n\r\n\r\ntype\r\n TTMSFNCCustomColorSelector = class;\r\n\r\n TTMSFNCColorSelectorItem = class(TTMSFNCCustomSelectorItem)\r\n private\r\n FOwner: TTMSFNCCustomColorSelector;\r\n FColor: TTMSFNCGraphicsColor;\r\n procedure SetColor(const Value: TTMSFNCGraphicsColor);\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Color: TTMSFNCGraphicsColor read FColor write SetColor default gcNull;\r\n end;\r\n\r\n TTMSFNCColorSelectorItems = class(TTMSFNCCustomSelectorItems)\r\n private\r\n FOwner: TTMSFNCCustomColorSelector;\r\n function GetItem(Index: integer): TTMSFNCColorSelectorItem;\r\n procedure SetItem(Index: integer; const Value: TTMSFNCColorSelectorItem);\r\n protected\r\n function CreateItemClass: TCollectionItemClass; override;\r\n public\r\n constructor Create(AOwner: TTMSFNCCustomSelector); override;\r\n property Items[Index: integer]:TTMSFNCColorSelectorItem read GetItem write SetItem; default;\r\n function Add: TTMSFNCColorSelectorItem;\r\n function Insert(Index: integer): TTMSFNCColorSelectorItem;\r\n end;\r\n\r\n TTMSFNCCustomSelectorColorSelected = procedure(Sender: TObject; AColor: TTMSFNCGraphicsColor) of object;\r\n TTMSFNCCustomSelectorColorDeselected = procedure(Sender: TObject; AColor: TTMSFNCGraphicsColor) of object;\r\n TTMSFNCCustomSelectorColorClick = procedure(Sender: TObject; AColor: TTMSFNCGraphicsColor) of object;\r\n\r\n TTMSFNCCustomColorSelectorMode = (csmSimple, csmExtended{$IFDEF FMXLIB}, csmExtendedMore{$ENDIF});\r\n\r\n TTMSFNCCustomColorSelector = class(TTMSFNCDefaultSelector)\r\n private\r\n {$IFDEF FMXLIB}\r\n FPanel: TPanel;\r\n FBackButton: TButton;\r\n FColorPanel: TColorPanel;\r\n {$ENDIF}\r\n FOnColorSelected: TTMSFNCCustomSelectorColorSelected;\r\n FOnColorDeselected: TTMSFNCCustomSelectorColorDeselected;\r\n FMode: TTMSFNCCustomColorSelectorMode;\r\n procedure SetSelectedColor(const Value: TTMSFNCGraphicsColor);\r\n function GetSelectedColor: TTMSFNCGraphicsColor;\r\n function GetItems: TTMSFNCColorSelectorItems;\r\n procedure SetItems(const Value: TTMSFNCColorSelectorItems);\r\n procedure SetMode(const Value: TTMSFNCCustomColorSelectorMode);\r\n protected\r\n function GetVersion: String; override;\r\n {$IFDEF FMXLIB}\r\n procedure BackButtonClicked(Sender: TObject);\r\n procedure ColorPanelChange(Sender: TObject);\r\n {$ENDIF}\r\n procedure DoItemClick(AItemIndex: Integer); override;\r\n procedure DoItemSelected(AItemIndex: Integer); override;\r\n procedure DoItemDeselected(AItemIndex: Integer); override;\r\n function CreateItemsCollection: TTMSFNCCustomSelectorItems; override;\r\n procedure DoItemBeforeDrawContent(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean); override;\r\n procedure DrawItemContent(AGraphics: TTMSFNCGraphics; ADisplayItem: TTMSFNCCustomSelectorDisplayItem); override;\r\n property OnColorSelected: TTMSFNCCustomSelectorColorSelected read FOnColorSelected write FOnColorSelected;\r\n property OnColorDeselected: TTMSFNCCustomSelectorColorDeselected read FOnColorDeselected write FOnColorDeselected;\r\n property SelectedColor: TTMSFNCGraphicsColor read GetSelectedColor write SetSelectedColor default gcNull;\r\n property Items: TTMSFNCColorSelectorItems read GetItems write SetItems;\r\n property Mode: TTMSFNCCustomColorSelectorMode read FMode write SetMode default csmSimple;\r\n procedure AddColors;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n function FindItemByColor(AColor: TTMSFNCGraphicsColor): Integer;\r\n function FindColorByItem(AItem: Integer): TTMSFNCGraphicsColor;\r\n procedure InitializeDefault; override;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCColorSelector = class(TTMSFNCCustomColorSelector)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n published\r\n property Appearance;\r\n property Rows;\r\n property Columns;\r\n property Items;\r\n property Mode;\r\n property OnColorSelected;\r\n property OnColorDeselected;\r\n property SelectedColor;\r\n property OnItemSelected;\r\n property OnItemDeselected;\r\n property OnItemClick;\r\n property SelectedItemIndex;\r\n property OnItemBeforeDrawBackground;\r\n property OnItemAfterDrawBackground;\r\n property OnItemBeforeDrawContent;\r\n property OnItemAfterDrawContent;\r\n property OnBeforeDraw;\r\n property OnAfterDraw;\r\n property OnItemBeforeDrawText;\r\n property OnItemAfterDrawText;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, WEBLib.TMSFNCUtils;\r\n\r\n{ TTMSFNCCustomColorSelector }\r\n\r\nprocedure TTMSFNCCustomColorSelector.AddColors;\r\nvar\r\n I: Integer;\r\n {$IFDEF FMXLIB}\r\n it: TTMSFNCCustomSelectorItem;\r\n {$ENDIF}\r\nbegin\r\n BeginUpdate;\r\n Items.Clear;\r\n case Mode of\r\n csmSimple:\r\n begin\r\n Columns := 4;\r\n Rows := 4;\r\n for I := 0 to TMSFNCColorSelectorColorSetCount do\r\n TTMSFNCColorSelectorItem(Items.Add).Color := TMSFNCColorSelectorColorSet[I];\r\n end;\r\n csmExtended:\r\n begin\r\n Columns := 8;\r\n Rows := 5;\r\n for I := 0 to TMSFNCColorSelectorExtendedColorSetCount do\r\n TTMSFNCColorSelectorItem(Items.Add).Color := TMSFNCColorSelectorExtendedColorSet[I];\r\n end;\r\n {$IFDEF FMXLIB}\r\n csmExtendedMore:\r\n begin\r\n Columns := 8;\r\n Rows := 7;\r\n for I := 0 to TMSFNCColorSelectorExtendedColorSetCount do\r\n TTMSFNCColorSelectorItem(Items.Add).Color := TMSFNCColorSelectorExtendedColorSet[I];\r\n\r\n it := Items.Insert(0);\r\n TTMSFNCColorSelectorItem(it).Color := gcBlack;\r\n it.ColumnSpan := 8;\r\n it.Text := 'Automatic';\r\n\r\n it := Items.Add;\r\n it.ColumnSpan := 8;\r\n it.Text := 'More Colors...';\r\n it.CanSelect := False;\r\n\r\n Items.Add.Visible := False;\r\n end;\r\n {$ENDIF}\r\n end;\r\n EndUpdate;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomColorSelector.BackButtonClicked(Sender: TObject);\r\nbegin\r\n if Assigned(FPanel) then\r\n FPanel.Visible := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.ColorPanelChange(Sender: TObject);\r\nbegin\r\n if BlockChange then\r\n Exit;\r\n\r\n BlockChange := True;\r\n SelectedItemIndex := -1;\r\n Items[Items.Count - 1].Color := FColorPanel.Color;\r\n SelectedColor := FColorPanel.Color;\r\n DoItemSelected(SelectedItemIndex);\r\n Invalidate;\r\n BlockChange := False;\r\nend;\r\n{$ENDIF}\r\n\r\nconstructor TTMSFNCCustomColorSelector.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n Width := 135;\r\n Height := 135;\r\n FMode := csmSimple;\r\n\r\n {$IFDEF FMXLIB}\r\n FPanel := TPanel.Create(Self);\r\n FPanel.Visible := False;\r\n FPanel.Stored := False;\r\n FPanel.Parent := Self;\r\n FPanel.Align := TAlignLayout.Client;\r\n FBackButton := TButton.Create(FPanel);\r\n FBackButton.Margins.Top := 3;\r\n FBackButton.Margins.Left := 3;\r\n FBackButton.Margins.Bottom := 3;\r\n FBackButton.Margins.Right := 3;\r\n FBackButton.Text := 'Back';\r\n FBackButton.Align := TAlignLayout.Top;\r\n FBackButton.Parent := FPanel;\r\n FBackButton.OnClick := BackButtonClicked;\r\n\r\n FColorPanel := TColorPanel.Create(FPanel);\r\n FColorPanel.Align := TAlignLayout.Client;\r\n FColorPanel.Margins.Top := 0;\r\n FColorPanel.Margins.Left := 3;\r\n FColorPanel.Margins.Bottom := 3;\r\n FColorPanel.Margins.Right := 3;\r\n FColorPanel.Parent := FPanel;\r\n FColorPanel.OnChange := @ColorPanelChange;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCCustomColorSelector.CreateItemsCollection: TTMSFNCCustomSelectorItems;\r\nbegin\r\n Result := TTMSFNCColorSelectorItems.Create(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.DoItemBeforeDrawContent(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; var ADefaultDraw: Boolean);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if Mode = csmExtendedMore then\r\n ADefaultDraw := AItemIndex <> 0;\r\n {$ENDIF}\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.DoItemClick(AItemIndex: Integer);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if (Mode = csmExtendedMore) and Assigned(FPanel) and (AItemIndex = Items.Count - 2) then\r\n begin\r\n BlockChange := True;\r\n FColorPanel.Color := FindColorByItem(AItemIndex + 1);\r\n BlockChange := False;\r\n FPanel.Visible := True;\r\n end;\r\n {$ENDIF}\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.DoItemDeselected(AItemIndex: Integer);\r\nbegin\r\n inherited;\r\n if Assigned(OnColorDeselected) then\r\n OnColorDeselected(Self, FindColorByItem(AItemIndex));\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.DoItemSelected(AItemIndex: Integer);\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := FindColorByItem(AItemIndex);\r\n {$IFDEF FMXLIB}\r\n if Assigned(FColorPanel) and not BlockChange then\r\n begin\r\n BlockChange := True;\r\n FColorPanel.Color := c;\r\n if (Mode = csmExtendedMore) and (Items.Count > 0) then\r\n Items[Items.Count - 1].Color := c;\r\n BlockChange := False;\r\n end;\r\n {$ENDIF}\r\n\r\n if Assigned(OnColorSelected) then\r\n OnColorSelected(Self, c);\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.DrawItemContent(AGraphics: TTMSFNCGraphics;\r\n ADisplayItem: TTMSFNCCustomSelectorDisplayItem);\r\nvar\r\n r: TRectF;\r\n it: TTMSFNCCustomSelectorItem;\r\n a: Boolean;\r\nbegin\r\n it := ADisplayItem.Item;\r\n if Assigned(it) and (it is TTMSFNCColorSelectorItem) then\r\n begin\r\n r := ADisplayItem.Rect;\r\n a := True;\r\n DoItemBeforeDrawContent(AGraphics, ADisplayItem.Rect, it.Index, a);\r\n if a then\r\n begin\r\n case Mode of\r\n csmSimple: InflateRectEx(r, -5, -5);\r\n csmExtended{$IFDEF FMXLIB}, csmExtendedMore{$ENDIF}: InflateRectEx(r, -3, -3);\r\n end;\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.Fill.Color := (it as TTMSFNCColorSelectorItem).Color;\r\n AGraphics.Stroke.Color := AGraphics.Fill.Color;\r\n// if it.Enabled then\r\n AGraphics.DrawRectangle(r);\r\n// else\r\n// AGraphics.DrawRectangle(r, 0, 0, AllCorners, 0.25);\r\n\r\n DoItemAfterDrawContent(AGraphics, ADisplayItem.Rect, it.Index);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorSelector.FindColorByItem(\r\n AItem: Integer): TTMSFNCGraphicsColor;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCColorSelectorItem;\r\nbegin\r\n Result := gcNull;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n it := Items[I] as TTMSFNCColorSelectorItem;\r\n if it.Index = AItem then\r\n begin\r\n Result := it.Color;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorSelector.FindItemByColor(\r\n AColor: TTMSFNCGraphicsColor): Integer;\r\nvar\r\n I: Integer;\r\n it: TTMSFNCColorSelectorItem;\r\nbegin\r\n Result := -1;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n it := Items[I] as TTMSFNCColorSelectorItem;\r\n if (it.Color = AColor) and it.CanSelect then\r\n begin\r\n Result := it.Index;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorSelector.GetItems: TTMSFNCColorSelectorItems;\r\nbegin\r\n Result := TTMSFNCColorSelectorItems(inherited Items);\r\nend;\r\n\r\nfunction TTMSFNCCustomColorSelector.GetSelectedColor: TTMSFNCGraphicsColor;\r\nbegin\r\n Result := FindColorByItem(SelectedItemIndex);\r\nend;\r\n\r\nfunction TTMSFNCCustomColorSelector.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.InitializeDefault;\r\nbegin\r\n inherited;\r\n AddColors;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.SetItems(\r\n const Value: TTMSFNCColorSelectorItems);\r\nbegin\r\n Items.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.SetMode(\r\n const Value: TTMSFNCCustomColorSelectorMode);\r\nbegin\r\n if FMode <> Value then\r\n begin\r\n FMode := Value;\r\n AddColors;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorSelector.SetSelectedColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n case Mode of\r\n csmExtendedMore:\r\n begin\r\n if Items.Count > 0 then\r\n Items[Items.Count - 1].Color := Value;\r\n end;\r\n end;\r\n {$ENDIF}\r\n SelectedItemIndex := FindItemByColor(Value);\r\nend;\r\n\r\n{ TTMSFNCColorSelectorItems }\r\n\r\nconstructor TTMSFNCColorSelectorItems.Create(AOwner: TTMSFNCCustomSelector);\r\nbegin\r\n inherited;\r\n FOwner := AOwner as TTMSFNCCustomColorSelector;\r\nend;\r\n\r\nfunction TTMSFNCColorSelectorItems.Add: TTMSFNCColorSelectorItem;\r\nbegin\r\n Result := TTMSFNCColorSelectorItem(inherited Add);\r\nend;\r\n\r\nfunction TTMSFNCColorSelectorItems.Insert(\r\n Index: integer): TTMSFNCColorSelectorItem;\r\nbegin\r\n Result := TTMSFNCColorSelectorItem(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCColorSelectorItems.CreateItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCColorSelectorItem;\r\nend;\r\n\r\nfunction TTMSFNCColorSelectorItems.GetItem(\r\n Index: integer): TTMSFNCColorSelectorItem;\r\nbegin\r\n Result := TTMSFNCColorSelectorItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCColorSelectorItems.SetItem(Index: integer;\r\n const Value: TTMSFNCColorSelectorItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TTMSFNCColorSelectorItem }\r\n\r\nprocedure TTMSFNCColorSelectorItem.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCColorSelectorItem then\r\n FColor := (Source as TTMSFNCColorSelectorItem).Color;\r\nend;\r\n\r\nconstructor TTMSFNCColorSelectorItem.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FOwner := (Collection as TTMSFNCColorSelectorItems).FOwner;\r\nend;\r\n\r\nprocedure TTMSFNCColorSelectorItem.SetColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColor <> Value then\r\n begin\r\n FColor := Value;\r\n if Assigned(FOwner) then\r\n FOwner.InvalidateItems;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCColorSelector }\r\n\r\nprocedure TTMSFNCColorSelector.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n {$IFNDEF WEBLIB}\r\n RegisterClasses([TTMSFNCColorSelector, TTMSFNCColorSelectorItem]);\r\n {$ENDIF}\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCToolBarRes;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\n{$IFDEF WEBLIB}\r\nconst\r\n TMSFNCTOOLBAREXPAND = 'data:image/PNG;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOvwAADr8B'+\r\n 'OAVTJAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4zjOaXUAAAACVJREFUGFdj+P//P07MEBYW9h8Xxi8J'+\r\n 'AjglYACnBAzglMAEDAwARZ1DA4NRF38AAAAASUVORK5CYII=';\r\n TMSFNCTOOLBAREXPANDLARGE = TMSFNCTOOLBAREXPAND;\r\n\r\n TMSFNCTOOLBAREXPAND2 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOvgAADr4'+\r\n 'B6kKxwAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNkRpr/UAAAA3SURBVBhXY3j69KktLgyS/I8LE5RsQxeE4jaQpCKIgSQIlgBi'+\r\n 'RQYQADGgAqgSMABVkI2QYGAAANnukE/t/B6ZAAAAAElFTkSuQmCC';\r\n TMSFNCTOOLBAREXPAND2LARGE = TMSFNCTOOLBAREXPAND;\r\n\r\n TMSFNCTOOLBAROPTIONSMENU = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAJCAYAAAD+WDajAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOvwA'+\r\n 'ADr8BOAVTJAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4zjOaXUAAAACpJREFUKFNjwAvCwsL+48IM///jxvh1YhOEYZz2giVg'+\r\n 'AKcEDOCUwAQMDAAqj1EKDJG5XAAAAABJRU5ErkJggg==';\r\n TMSFNCTOOLBAROPTIONSMENULARGE = TMSFNCTOOLBAROPTIONSMENU;\r\n\r\n TMSFNCTOOLBARQUICKMENU = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADs'+\r\n 'IBFShKgAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNkRpr/UAAAAlSURBVBhXYwCC/9gwEAApKAMbJl4SnY0igCQIw3gkcUowMP'+\r\n 'wHALBNZJw15C+yAAAAAElFTkSuQmCC';\r\n TMSFNCTOOLBARQUICKMENU2 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA'+\r\n 'AAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAL0lEQVQYV2P4jxswwCRBNAYGESCA'+\r\n 'IQHCIAIEYAIgAGejC8D4YEBQEqvE/////wMA7H6pV7j5gXMAAAAASUVORK5CYII=';\r\n{$ENDIF}\r\n\r\n{$R TMSFNCToolBar.res}\r\n\r\nimplementation\r\n\r\n{$IFDEF WEBLIB}\r\nuses\r\n WEBLib.TMSFNCTypes;\r\n\r\ninitialization\r\nbegin\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCTOOLBAREXPAND);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCTOOLBAREXPAND2);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCTOOLBAROPTIONSMENU);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCTOOLBARQUICKMENU);\r\n TTMSFNCBitmap.CreateFromResource(TMSFNCTOOLBARQUICKMENU2);\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCToolBar;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$DEFINE VCLWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF VCLLIB}\r\n{$DEFINE VCLWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCCustomControl, WEBLib.Controls, Types, WEBLib.TMSFNCBitmapSelector,\r\n WEBLib.TMSFNCPopup, WEBLib.TMSFNCTypes, WEBLib.TMSFNCBitmapContainer, WEBLib.StdCtrls, WEBLib.TMSFNCColorSelector,\r\n {%H-}WEBLib.TMSFNCToolBarRes, WEBLib.TMSFNCGraphicsTypes\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,UITypes, Generics.Collections, Generics.Defaults\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n ,FMX.ListBox, FMX.Menus, FMX.Types, FMX.Edit\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFNDEF WEBLIB}\r\n ,Menus\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ,Contnrs\r\n {$ENDIF}\r\n ,WEBLib.ExtCtrls\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 1; // Release nr.\r\n BLD_VER = 3; // Build nr.\r\n\r\n // version history\r\n // v1.0.0.0 : first release\r\n // v1.0.1.0 : New : DisabledBitmaps property\r\n // v1.0.1.1 : Fixed : Issue with DropDownButton on VCL\r\n // v1.0.1.2 : Fixed : Issue with bounds loop on LCL\r\n // v1.0.1.3 : Fixed : Issue with Tag property being overriden\r\n\r\ntype\r\n TTMSFNCCustomToolBar = class;\r\n TTMSFNCCustomDockPanel = class;\r\n TTMSFNCCustomToolBarSeparator = class;\r\n TTMSFNCDefaultToolBarButton = class;\r\n TTMSFNCToolBarButton = class;\r\n TTMSFNCToolBarDropDownButton = class;\r\n\r\n TTMSFNCToolBarCustomButtonAppearance = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCDefaultToolBarButton;\r\n FHoverStroke: TTMSFNCGraphicsStroke;\r\n FDownFill: TTMSFNCGraphicsFill;\r\n FNormalFill: TTMSFNCGraphicsFill;\r\n FDownStroke: TTMSFNCGraphicsStroke;\r\n FDisabledFill: TTMSFNCGraphicsFill;\r\n FNormalStroke: TTMSFNCGraphicsStroke;\r\n FDisabledStroke: TTMSFNCGraphicsStroke;\r\n FHoverFill: TTMSFNCGraphicsFill;\r\n FCorners: TTMSFNCGraphicsCorners;\r\n FRounding: Single;\r\n FTransparent: Boolean;\r\n FShowInnerStroke: Boolean;\r\n FInnerStroke: TTMSFNCGraphicsStroke;\r\n FFlatStyle: Boolean;\r\n FOnChange: TNotifyEvent;\r\n procedure SetDisabledFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetDisabledStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetDownFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetDownStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetHoverFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetHoverStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetNormalFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetNormalStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetCorners(const Value: TTMSFNCGraphicsCorners); virtual;\r\n procedure SetRounding(const Value: Single); virtual;\r\n procedure SetInnerStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetShowInnerStroke(const Value: Boolean);\r\n procedure SetTransparent(const Value: Boolean);\r\n function IsRoundingStored: Boolean;\r\n procedure SetFlatStyle(const Value: Boolean);\r\n protected\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure Changed; virtual;\r\n property Transparent: Boolean read FTransparent write SetTransparent default False;\r\n property ShowInnerStroke: Boolean read FShowInnerStroke write SetShowInnerStroke default True;\r\n property Rounding: Single read FRounding write SetRounding stored IsRoundingStored nodefault;\r\n property Corners: TTMSFNCGraphicsCorners read FCorners write SetCorners default [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight];\r\n property InnerStroke: TTMSFNCGraphicsStroke read FInnerStroke write SetInnerStroke;\r\n property NormalFill: TTMSFNCGraphicsFill read FNormalFill write SetNormalFill;\r\n property NormalStroke: TTMSFNCGraphicsStroke read FNormalStroke write SetNormalStroke;\r\n property HoverFill: TTMSFNCGraphicsFill read FHoverFill write SetHoverFill;\r\n property HoverStroke: TTMSFNCGraphicsStroke read FHoverStroke write SetHoverStroke;\r\n property DownFill: TTMSFNCGraphicsFill read FDownFill write SetDownFill;\r\n property DownStroke: TTMSFNCGraphicsStroke read FDownStroke write SetDownStroke;\r\n property DisabledFill: TTMSFNCGraphicsFill read FDisabledFill write SetDisabledFill;\r\n property DisabledStroke: TTMSFNCGraphicsStroke read FDisabledStroke write SetDisabledStroke;\r\n property FlatStyle: Boolean read FFlatStyle write SetFlatStyle default False;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TTMSFNCDefaultToolBarButton);\r\n destructor Destroy; override;\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n end;\r\n\r\n TTMSFNCToolBarButtonAppearance = class(TTMSFNCToolBarCustomButtonAppearance)\r\n published\r\n property Transparent;\r\n property ShowInnerStroke;\r\n property Rounding;\r\n property Corners;\r\n property InnerStroke;\r\n property NormalFill;\r\n property NormalStroke;\r\n property HoverFill;\r\n property HoverStroke;\r\n property DownFill;\r\n property DownStroke;\r\n property DisabledFill;\r\n property DisabledStroke;\r\n property FlatStyle;\r\n end;\r\n\r\n TTMSFNCToolBarCompactAppearance = class(TTMSFNCToolBarCustomButtonAppearance)\r\n published\r\n property NormalFill;\r\n property NormalStroke;\r\n property HoverFill;\r\n property HoverStroke;\r\n property DownFill;\r\n property DownStroke;\r\n property DisabledFill;\r\n property DisabledStroke;\r\n property FlatStyle;\r\n end;\r\n\r\n TTMSFNCToolBarQuickMenuButtonAppearance = class(TTMSFNCToolBarCustomButtonAppearance)\r\n published\r\n property NormalFill;\r\n property NormalStroke;\r\n property HoverFill;\r\n property HoverStroke;\r\n property DownFill;\r\n property DownStroke;\r\n property DisabledFill;\r\n property DisabledStroke;\r\n property FlatStyle;\r\n end;\r\n\r\n TTMSFNCToolBarElementState = (esNormal, esLarge);\r\n\r\n TTMSFNCCustomToolBarElement = class(TTMSFNCCustomControl)\r\n private\r\n FBlockUpdate: Boolean;\r\n FOnUpdateToolBar: TNotifyEvent;\r\n FOnUpdateToolBarControl: TNotifyEvent;\r\n FCanCopy: Boolean;\r\n FState: TTMSFNCToolBarElementState;\r\n FLastElement: Boolean;\r\n FControlIndex: Integer;\r\n procedure SetState(const Value: TTMSFNCToolBarElementState);\r\n procedure SetLastElement(const Value: Boolean);\r\n protected\r\n procedure UpdateState; virtual;\r\n procedure UpdateToolBar; virtual;\r\n procedure UpdateToolBarControl; virtual;\r\n {$IFDEF FMXLIB}\r\n procedure SetVisible(const Value: Boolean); override;\r\n procedure DoMatrixChanged(Sender: TObject); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure VisibleChanging; override;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n procedure DefineProperties(Filer : TFiler); override;\r\n procedure ReadControlIndex(Reader: TReader);\r\n procedure WriteControlIndex(Writer: TWriter);\r\n {$ENDIF}\r\n procedure UpdateControlAfterResize; override;\r\n property OnUpdateToolBar: TNotifyEvent read FOnUpdateToolBar write FOnUpdateToolBar;\r\n property OnUpdateToolBarControl: TNotifyEvent read FOnUpdateToolBarControl write FOnUpdateToolBarControl;\r\n property State: TTMSFNCToolBarElementState read FState write SetState default esNormal;\r\n property LastElement: Boolean read FLastElement write SetLastElement default False;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n property CanCopy: Boolean read FCanCopy write FCanCopy default True;\r\n property ControlIndex: Integer read FControlIndex write FControlIndex default -1;\r\n end;\r\n\r\n TTMSFNCToolBarButtonBitmapPosition = (bbpLeft, bbpTop);\r\n\r\n TTMSFNCToolBarButtonLayout = (bblNone, bblBitmap, bblLabel, bblLarge);\r\n\r\n {$IFDEF FNCLIB}\r\n TTMSFNCDefaultToolBarButton = class(TTMSFNCCustomToolBarElement, ITMSFNCBitmapContainer)\r\n {$ENDIF}\r\n {$IFNDEF FNCLIB}\r\n TTMSFNCDefaultToolBarButton = class(TTMSFNCCustomToolBarElement)\r\n {$ENDIF}\r\n private\r\n FOldHeight: Single;\r\n FBitmapVisible: Boolean;\r\n FText: String;\r\n FPopup: TTMSFNCPopup;\r\n FPopupPlacement: TTMSFNCPopupPlacement;\r\n FDropDownHeight: Single;\r\n FDropDownWidth: Single;\r\n FDown, FHover, FPrevHover: Boolean;\r\n FAppearance: TTMSFNCToolBarButtonAppearance;\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n FBitmaps: TTMSFNCScaledBitmaps;\r\n FApplyName: Boolean;\r\n FDropDownControl: TControl;\r\n FFont: TTMSFNCGraphicsFont;\r\n FOnBeforeDropDown: TNotifyEvent;\r\n FCloseOnSelection: Boolean;\r\n FDownState: Boolean;\r\n FTextVisible: Boolean;\r\n FOnCloseDropDown: TNotifyEvent;\r\n FOnDropDown: TNotifyEvent;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FWordWrapping: Boolean;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n FBitmapSize: Single;\r\n FStretchText: Boolean;\r\n FDisabledBitmaps: TTMSFNCScaledBitmaps;\r\n FHoverBitmaps: TTMSFNCScaledBitmaps;\r\n FShowFocus: Boolean;\r\n FDropDownAutoWidth: Boolean;\r\n FHoverFontColor: TTMSFNCGraphicsColor;\r\n FDownFontColor: TTMSFNCGraphicsColor;\r\n FDisabledFontColor: TTMSFNCGraphicsColor;\r\n FStretchBitmapIfNoText: Boolean;\r\n FBitmapPosition: TTMSFNCToolBarButtonBitmapPosition;\r\n FMaximumLayout: TTMSFNCToolBarButtonLayout;\r\n FMinimumLayout: TTMSFNCToolBarButtonLayout;\r\n FLayout: TTMSFNCToolBarButtonLayout;\r\n FCompactLayout: TTMSFNCToolBarButtonLayout;\r\n FLargeLayoutBitmapSize: Single;\r\n FLargeLayoutBitmaps: TTMSFNCScaledBitmaps;\r\n FLargeLayoutHoverBitmaps: TTMSFNCScaledBitmaps;\r\n FLargeLayoutDisabledBitmaps: TTMSFNCScaledBitmaps;\r\n FAutoBitmapSize: Boolean;\r\n FLargeLayoutAutoBitmapSize: Boolean;\r\n procedure SetAppearance(const Value: TTMSFNCToolBarButtonAppearance);\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n procedure SetBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetText(const Value: String);\r\n procedure SetDropDownHeight(const Value: Single);\r\n procedure SetDropDownWidth(const Value: Single);\r\n procedure SetBitmapVisible(const Value: Boolean);\r\n procedure SetTextVisible(const Value: Boolean);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetDropDownControl(const Value: TControl);\r\n procedure SetCloseOnSelection(const Value: Boolean);\r\n procedure SetDownState(const Value: Boolean);\r\n function IsDropDownHeightStored: Boolean;\r\n function IsDropDownWidthStored: Boolean;\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n function IsBitmapSizeStored: Boolean;\r\n procedure SetBitmapSize(const Value: Single);\r\n procedure SetStretchText(const Value: Boolean);\r\n procedure SetDisabledBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetHoverBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetShowFocus(const Value: Boolean);\r\n procedure SetDropDownAutoWidth(const Value: Boolean);\r\n procedure SetDisabledFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetDownFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetHoverFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetStretchBitmapIfNoText(const Value: Boolean);\r\n procedure SetBitmapPosition(const Value: TTMSFNCToolBarButtonBitmapPosition);\r\n procedure SetMaximumLayout(const Value: TTMSFNCToolBarButtonLayout);\r\n procedure SetMinimumLayout(const Value: TTMSFNCToolBarButtonLayout);\r\n procedure SetLayout(const Value: TTMSFNCToolBarButtonLayout);\r\n procedure SetCompactLayout(const Value: TTMSFNCToolBarButtonLayout);\r\n function IsLargeLayoutBitmapSizeStored: Boolean;\r\n procedure SetLargeLayoutBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetLargeLayoutBitmapSize(const Value: Single);\r\n procedure SetLargeLayoutDisabledBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetLargeLayoutHoverBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetAutoBitmapSize(const Value: Boolean);\r\n procedure SetLargeLayoutAutoBitmapSize(const Value: Boolean);\r\n protected\r\n function CanDrawDesignTime: Boolean; virtual;\r\n function HasHint: Boolean; override;\r\n function GetHintString: String; override;\r\n function GetText: String; virtual;\r\n function GetTextSize: TSizeF; virtual;\r\n procedure UpdateControlAfterResize; override;\r\n procedure ApplyStyle; override;\r\n procedure ResetToDefaultStyle; override;\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure BitmapsChanged(Sender: TObject);\r\n procedure DoFontChanged(Sender: TObject);\r\n procedure UpdateLayout; virtual;\r\n procedure DoClosePopup(Sender: TObject);\r\n procedure DoPopup(Sender: TObject);\r\n procedure InitializePopup; virtual;\r\n procedure UpdateState; override;\r\n procedure ChangeDPIScale(M, D: Integer); override;\r\n procedure AppearanceChanged; virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure SetName(const Value: TComponentName); override;\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleKeyUp(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleKeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleKeyPress(var Key: Char); override;\r\n procedure HandleMouseEnter; override;\r\n procedure HandleMouseLeave; override;\r\n procedure SelectFirstValue; virtual;\r\n procedure SelectValueWithCharacter({%H-}ACharacter: Char); virtual;\r\n procedure SelectLastValue; virtual;\r\n procedure SelectNextValue; virtual;\r\n procedure SelectPreviousValue; virtual;\r\n procedure DrawText(AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawBitmap(AGraphics: TTMSFNCGraphics; ARect: TRectF); virtual;\r\n procedure DrawButton({%H-}AGraphics: TTMSFNCGraphics); virtual;\r\n function CanDropDown: Boolean; virtual;\r\n function CanChangeText: Boolean; virtual;\r\n function GetTextRect: TRectF; virtual;\r\n function GetDropDownRect: TRectF; virtual;\r\n function GetBitmapRect: TRectF; overload; virtual;\r\n function GetBitmapRect(ARect: TRectF): TRectF; overload; virtual;\r\n function GetBitmapSize: Single; virtual;\r\n function GetLargeLayoutBitmapSize: Single; virtual;\r\n property Appearance: TTMSFNCToolBarButtonAppearance read FAppearance write SetAppearance;\r\n property BitmapVisible: Boolean read FBitmapVisible write SetBitmapVisible default False;\r\n property Bitmaps: TTMSFNCScaledBitmaps read FBitmaps write SetBitmaps;\r\n property DisabledBitmaps: TTMSFNCScaledBitmaps read FDisabledBitmaps write SetDisabledBitmaps;\r\n property HoverBitmaps: TTMSFNCScaledBitmaps read FHoverBitmaps write SetHoverBitmaps;\r\n property LargeLayoutBitmaps: TTMSFNCScaledBitmaps read FLargeLayoutBitmaps write SetLargeLayoutBitmaps;\r\n property LargeLayoutDisabledBitmaps: TTMSFNCScaledBitmaps read FLargeLayoutDisabledBitmaps write SetLargeLayoutDisabledBitmaps;\r\n property LargeLayoutHoverBitmaps: TTMSFNCScaledBitmaps read FLargeLayoutHoverBitmaps write SetLargeLayoutHoverBitmaps;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n property BitmapSize: Single read FBitmapSize write SetBitmapSize stored IsBitmapSizeStored nodefault;\r\n property AutoBitmapSize: Boolean read FAutoBitmapSize write SetAutoBitmapSize default false;\r\n property LargeLayoutBitmapSize: Single read FLargeLayoutBitmapSize write SetLargeLayoutBitmapSize stored IsLargeLayoutBitmapSizeStored nodefault;\r\n property LargeLayoutAutoBitmapSize: Boolean read FLargeLayoutAutoBitmapSize write SetLargeLayoutAutoBitmapSize default False;\r\n property StretchBitmapIfNoText: Boolean read FStretchBitmapIfNoText write SetStretchBitmapIfNoText default True;\r\n property Text: String read GetText write SetText;\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming default gttCharacter;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaCenter;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaCenter;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property HoverFontColor: TTMSFNCGraphicsColor read FHoverFontColor write SetHoverFontColor default gcNull;\r\n property DownFontColor: TTMSFNCGraphicsColor read FDownFontColor write SetDownFontColor default gcNull;\r\n property DisabledFontColor: TTMSFNCGraphicsColor read FDisabledFontColor write SetDisabledFontColor default gcNull;\r\n property TextVisible: Boolean read FTextVisible write SetTextVisible default True;\r\n property StretchText: Boolean read FStretchText write SetStretchText default False;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping default False;\r\n property DropDownAutoWidth: Boolean read FDropDownAutoWidth write SetDropDownAutoWidth default False;\r\n property DropDownHeight: Single read FDropDownHeight write SetDropDownHeight stored IsDropDownHeightStored nodefault;\r\n property DropDownWidth: Single read FDropDownWidth write SetDropDownWidth stored IsDropDownWidthStored nodefault;\r\n property DropDownControl: TControl read FDropDownControl write SetDropDownControl;\r\n property CloseOnSelection: Boolean read FCloseOnSelection write SetCloseOnSelection default True;\r\n property OnBeforeDropDown: TNotifyEvent read FOnBeforeDropDown write FOnBeforeDropDown;\r\n property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;\r\n property OnCloseDropDown: TNotifyEvent read FOnCloseDropDown write FOnCloseDropDown;\r\n property ApplyName: Boolean read FApplyName write FApplyName default True;\r\n property ShowFocus: Boolean read FShowFocus write SetShowFocus default False;\r\n property BitmapPosition: TTMSFNCToolBarButtonBitmapPosition read FBitmapPosition write SetBitmapPosition default bbpLeft;\r\n property CompactLayout: TTMSFNCToolBarButtonLayout read FCompactLayout write SetCompactLayout default bblNone;\r\n property Layout: TTMSFNCToolBarButtonLayout read FLayout write SetLayout default bblNone;\r\n property MinimumLayout: TTMSFNCToolBarButtonLayout read FMinimumLayout write SetMinimumLayout default bblBitmap;\r\n property MaximumLayout: TTMSFNCToolBarButtonLayout read FMaximumLayout write SetMaximumLayout default bblLarge;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n procedure DropDown; virtual;\r\n procedure CloseDropDown; virtual;\r\n function GetPopupControl: TTMSFNCPopup;\r\n function GetBitmap: TTMSFNCBitmap; virtual;\r\n property DownState: Boolean read FDownState write SetDownState;\r\n property PopupPlacement: TTMSFNCPopupPlacement read FPopupPlacement write FPopupPlacement default ppBottom;\r\n end;\r\n\r\n TTMSFNCToolBarButtonDropDownKind = (ddkNormal, ddkDropDown, ddkDropDownButton);\r\n TTMSFNCToolBarButtonDropDownPosition = (ddpRight, ddpBottom);\r\n\r\n TTMSFNCToolBarDropDownButton = class(TTMSFNCDefaultToolBarButton)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n function GetBitmapRect(ARect: TRectF): TRectF; override;\r\n published\r\n property Font;\r\n property Text;\r\n property ShowFocus;\r\n property TextVisible;\r\n property StretchText;\r\n property WordWrapping;\r\n property HorizontalTextAlign;\r\n property VerticalTextAlign;\r\n property Trimming;\r\n property Bitmaps;\r\n property DisabledBitmaps;\r\n property HoverBitmaps;\r\n property BitmapVisible;\r\n property BitmapContainer;\r\n property State;\r\n property LastElement;\r\n property Appearance;\r\n end;\r\n\r\n TTMSFNCToolBarDropDownButtonClass = class of TTMSFNCToolBarDropDownButton;\r\n\r\n\r\n TTMSFNCCustomToolBarButton = class(TTMSFNCDefaultToolBarButton)\r\n private\r\n FDropDownButton: TTMSFNCToolBarDropDownButton;\r\n FDropDownKind: TTMSFNCToolBarButtonDropDownKind;\r\n FDropDownPosition: TTMSFNCToolBarButtonDropDownPosition;\r\n FHidden: Boolean;\r\n FAutoOptionsMenuText: String;\r\n procedure SetDropDownKind(const Value: TTMSFNCToolBarButtonDropDownKind);\r\n procedure SetDropDownPosition(\r\n const Value: TTMSFNCToolBarButtonDropDownPosition);\r\n procedure SetHidden(const Value: Boolean);\r\n protected\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure DoFontChanged(Sender: TObject);\r\n procedure AppearanceChanged; override;\r\n procedure UpdateDropDownButton; virtual;\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure DropDownButtonClick(Sender: TObject);\r\n procedure DrawButton(AGraphics: TTMSFNCGraphics); override;\r\n {$IFDEF FMXLIB}\r\n procedure SetEnabled(const Value: Boolean); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure SetEnabled(Value: Boolean); override;\r\n {$ENDIF}\r\n function GetDropDownButtonClass: TTMSFNCToolBarDropDownButtonClass; virtual;\r\n function GetDropDownRect: TRectF; override;\r\n function GetTextRect: TRectF; override;\r\n function GetBitmapRect(ARect: TRectF): TRectF; overload; override;\r\n function GetBitmapRect: TRectF; overload; override;\r\n function CanDropDown: Boolean; override;\r\n property DropDownKind: TTMSFNCToolBarButtonDropDownKind read FDropDownKind write SetDropDownKind default ddkNormal;\r\n property DropDownPosition: TTMSFNCToolBarButtonDropDownPosition read FDropDownPosition write SetDropDownPosition default ddpRight;\r\n property AutoOptionsMenuText: String read FAutoOptionsMenuText write FAutoOptionsMenuText;\r\n property Hidden: Boolean read FHidden write SetHidden default False;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetDropDownButtonControl: TTMSFNCToolBarDropDownButton;\r\n end;\r\n\r\n TTMSFNCCustomToolBarSeparatorAppearance = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCCustomToolBarSeparator;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FInnerStroke: TTMSFNCGraphicsStroke;\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetInnerStroke(const Value: TTMSFNCGraphicsStroke);\r\n protected\r\n procedure StrokeChanged(Sender: TObject);\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property InnerStroke: TTMSFNCGraphicsStroke read FInnerStroke write SetInnerStroke;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TTMSFNCCustomToolBarSeparator);\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTMSFNCToolBarSeparatorAppearance = class(TTMSFNCCustomToolBarSeparatorAppearance)\r\n published\r\n property Stroke;\r\n property InnerStroke;\r\n end;\r\n\r\n TTMSFNCCustomToolBarSeparator = class(TTMSFNCCustomToolBarElement)\r\n private\r\n FAppearance: TTMSFNCToolBarSeparatorAppearance;\r\n procedure SetAppearance(const Value: TTMSFNCToolBarSeparatorAppearance);\r\n protected\r\n procedure UpdateState; override;\r\n property Appearance: TTMSFNCToolBarSeparatorAppearance read FAppearance write SetAppearance;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBarButton = class(TTMSFNCCustomToolBarButton)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n public\r\n property Hidden;\r\n published\r\n property Font;\r\n property AutoOptionsMenuText;\r\n property DropDownAutoWidth;\r\n property DropDownKind;\r\n property DropDownPosition;\r\n property DropDownHeight;\r\n property DropDownWidth;\r\n property DropDownControl;\r\n property OnBeforeDropDown;\r\n property OnDropDown;\r\n property OnCloseDropDown;\r\n property Text;\r\n property ShowFocus;\r\n property TextVisible;\r\n property StretchText;\r\n property StretchBitmapIfNoText;\r\n property HorizontalTextAlign;\r\n property VerticalTextAlign;\r\n property Trimming;\r\n property Bitmaps;\r\n property LargeLayoutBitmaps;\r\n property Layout;\r\n property CompactLayout;\r\n property MinimumLayout;\r\n property MaximumLayout;\r\n property BitmapPosition;\r\n property DisabledBitmaps;\r\n property HoverBitmaps;\r\n property LargeLayoutDisabledBitmaps;\r\n property LargeLayoutHoverBitmaps;\r\n property BitmapVisible;\r\n property BitmapContainer;\r\n property BitmapSize;\r\n property AutoBitmapSize;\r\n property LargeLayoutBitmapSize;\r\n property LargeLayoutAutoBitmapSize;\r\n property State;\r\n property LastElement;\r\n property Appearance;\r\n property WordWrapping;\r\n end;\r\n\r\n TTMSFNCToolBarButtonClass = class of TTMSFNCToolBarButton;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBarSeparator = class(TTMSFNCCustomToolBarSeparator)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n published\r\n property State;\r\n property LastElement;\r\n property Appearance;\r\n end;\r\n\r\n TTMSFNCToolBarSeparatorClass = class of TTMSFNCToolBarSeparator;\r\n\r\n TTMSFNCToolBarItemPickerItemSelected = procedure(Sender: TObject; AItemIndex: Integer) of object;\r\n\r\n TTMSFNCToolBarCustomItemPicker = class(TTMSFNCToolBarButton)\r\n private\r\n FEdit: TEdit;\r\n FTimer: TTimer;\r\n FItemIndex: Integer;\r\n FItems: TStringList;\r\n FKeyboardUsed: Boolean;\r\n FItemSelector: TListBox;\r\n FOnItemSelected: TTMSFNCToolBarItemPickerItemSelected;\r\n FEditable: Boolean;\r\n FOnEditChange: TNotifyEvent;\r\n function GetSelectedItemIndex: Integer;\r\n procedure SetSelectedItemIndex(const Value: Integer);\r\n function GetSelectedItem: String;\r\n procedure SetSelectedItem(const Value: String);\r\n procedure SetItems(const Value: TStringList);\r\n procedure SetEditable(const Value: Boolean);\r\n protected\r\n function CanChangeText: Boolean; override;\r\n function GetText: String; override;\r\n procedure EnterTimerChanged(Sender: TObject);\r\n procedure EditChange(Sender: TObject);\r\n procedure HandleDialogKey(var Key: Word; Shift: TShiftState); override;\r\n procedure InitializePopup; override;\r\n procedure SelectValueWithString(AValue: string); virtual;\r\n procedure SelectValueWithCharacter(ACharacter: Char); override;\r\n procedure SelectFirstValue; override;\r\n procedure SelectLastValue; override;\r\n procedure SelectNextValue; override;\r\n procedure SelectPreviousValue; override;\r\n {$IFDEF FMXLIB}\r\n procedure ItemKeyUp(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n procedure ItemKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n procedure ItemSelected(const Sender: TCustomListBox; const Item: TListBoxItem);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure ItemKeyUp(Sender: TObject; var {%H-}Key: Word; {%H-}Shift: TShiftState);\r\n procedure ItemKeyDown(Sender: TObject; var {%H-}Key: Word; {%H-}Shift: TShiftState);\r\n procedure ItemSelected(Sender: TObject);\r\n {$ENDIF}\r\n procedure DoItemSelected; virtual;\r\n procedure DoEnter; override;\r\n property CloseOnSelection;\r\n property Items: TStringList read FItems write SetItems;\r\n property OnItemSelected: TTMSFNCToolBarItemPickerItemSelected read FOnItemSelected write FOnItemSelected;\r\n property ListBox: TListBox read FItemSelector;\r\n property SelectedItemIndex: Integer read GetSelectedItemIndex write SetSelectedItemIndex default -1;\r\n property SelectedItem: String read GetSelectedItem write SetSelectedItem;\r\n property Editable: Boolean read FEditable write SetEditable default False;\r\n property OnEditChange: TNotifyEvent read FOnEditChange write FOnEditChange;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n destructor Destroy; override;\r\n procedure DropDown; override;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBarItemPicker = class(TTMSFNCToolBarCustomItemPicker)\r\n published\r\n property OnItemSelected;\r\n property SelectedItemIndex;\r\n property Items;\r\n property Editable;\r\n property OnEditChange;\r\n end;\r\n\r\n TTMSFNCToolBarFontNamePickerFontNameSelected = procedure(Sender: TObject; AFontName: String) of object;\r\n\r\n TTMSFNCToolBarItemPickerClass = class of TTMSFNCToolBarItemPicker;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBarFontNamePicker = class(TTMSFNCToolBarCustomItemPicker)\r\n private\r\n FOnFontNameSelected: TTMSFNCToolBarFontNamePickerFontNameSelected;\r\n function GetSelectedFontName: String;\r\n procedure SetSelectedFontName(const Value: String);\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n procedure DoItemSelected; override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n property SelectedFontName: String read GetSelectedFontName write SetSelectedFontName;\r\n property SelectedItemIndex;\r\n property Items;\r\n published\r\n property OnFontNameSelected: TTMSFNCToolBarFontNamePickerFontNameSelected read FOnFontNameSelected write FOnFontNameSelected;\r\n property CloseOnSelection;\r\n property Editable;\r\n property OnEditChange;\r\n end;\r\n\r\n TTMSFNCToolBarFontSizePickerFontSizeSelected = procedure(Sender: TObject; AFontSize: Single) of object;\r\n\r\n TTMSFNCToolBarFontNamePickerClass = class of TTMSFNCToolBarFontNamePicker;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBarFontSizePicker = class(TTMSFNCToolBarCustomItemPicker)\r\n private\r\n FOnFontSizeSelected: TTMSFNCToolBarFontSizePickerFontSizeSelected;\r\n function GetSelectedFontSize: Single;\r\n procedure SetSelectedFontSize(const Value: Single);\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n procedure DoItemSelected; override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n property SelectedFontSize: Single read GetSelectedFontSize write SetSelectedFontSize;\r\n property SelectedItemIndex;\r\n property Items;\r\n published\r\n property OnFontSizeSelected: TTMSFNCToolBarFontSizePickerFontSizeSelected read FOnFontSizeSelected write FOnFontSizeSelected;\r\n property CloseOnSelection;\r\n property Editable;\r\n property OnEditChange;\r\n end;\r\n\r\n TTMSFNCToolBarColorPickerColorSelected = procedure(Sender: TObject; AColor: TTMSFNCGraphicsColor) of object;\r\n\r\n TTMSFNCToolBarFontSizePickerClass = class of TTMSFNCToolBarFontSizePicker;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBarColorPicker = class(TTMSFNCToolBarButton)\r\n private\r\n FColorSelector: TTMSFNCColorSelector;\r\n FOnColorSelected: TTMSFNCToolBarColorPickerColorSelected;\r\n function GetSelectedColor: TTMSFNCGraphicsColor;\r\n procedure SetSelectedColor(const Value: TTMSFNCGraphicsColor);\r\n function GetSelectedItemIndex: Integer;\r\n procedure SetSelectedItemIndex(const Value: Integer);\r\n function GetItems: TTMSFNCColorSelectorItems;\r\n procedure SetItems(const Value: TTMSFNCColorSelectorItems);\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure DrawColor(AColor: TTMSFNCGraphicsColor; ARect: TRectF; AGraphics: TTMSFNCGraphics);\r\n procedure ColorSelected(Sender: TObject; AColor: TTMSFNCGraphicsColor);\r\n procedure DoColorSelected(AColor: TTMSFNCGraphicsColor); virtual;\r\n function CanChangeText: Boolean; override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n function BlockChange: Boolean;\r\n function ColorSelector: TTMSFNCColorSelector;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n procedure DrawSelectedColor(AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n published\r\n property OnColorSelected: TTMSFNCToolBarColorPickerColorSelected read FOnColorSelected write FOnColorSelected;\r\n property SelectedColor: TTMSFNCGraphicsColor read GetSelectedColor write SetSelectedColor default gcNull;\r\n property SelectedItemIndex: Integer read GetSelectedItemIndex write SetSelectedItemIndex;\r\n property Items: TTMSFNCColorSelectorItems read GetItems write SetItems;\r\n property CloseOnSelection;\r\n end;\r\n\r\n TTMSFNCToolBarBitmapPickerBitmapSelected = procedure(Sender: TObject; ABitmap: TTMSFNCBitmap) of object;\r\n\r\n TTMSFNCToolBarColorPickerClass = class of TTMSFNCToolBarColorPicker;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBarBitmapPicker = class(TTMSFNCToolBarButton)\r\n private\r\n FBitmapSelector: TTMSFNCBitmapSelector;\r\n FOnBitmapSelected: TTMSFNCToolBarBitmapPickerBitmapSelected;\r\n function GetSelectedBitmap: TTMSFNCBitmap;\r\n function GetSelectedItemIndex: Integer;\r\n procedure SetSelectedItemIndex(const Value: Integer);\r\n function GetItems: TTMSFNCBitmapSelectorItems;\r\n procedure SetItems(const Value: TTMSFNCBitmapSelectorItems);\r\n protected\r\n function GetBitmapRect(ARect: TRectF): TRectF; override;\r\n function CanChangeText: Boolean; override;\r\n procedure RegisterRuntimeClasses; override;\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure BitmapSelected(Sender: TObject; ABitmap: TTMSFNCBitmap);\r\n procedure DoBitmapSelected(ABitmap: TTMSFNCBitmap); virtual;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n function BlockChange: Boolean;\r\n function BitmapSelector: TTMSFNCBitmapSelector;\r\n property SelectedBitmap: TTMSFNCBitmap read GetSelectedBitmap;\r\n published\r\n property OnBitmapSelected: TTMSFNCToolBarBitmapPickerBitmapSelected read FOnBitmapSelected write FOnBitmapSelected;\r\n property SelectedItemIndex: Integer read GetSelectedItemIndex write SetSelectedItemIndex;\r\n property Items: TTMSFNCBitmapSelectorItems read GetItems write SetItems;\r\n property CloseOnSelection;\r\n end;\r\n\r\n TTMSFNCToolBarBitmapPickerClass = class of TTMSFNCToolBarBitmapPicker;\r\n\r\n TTMSFNCCustomToolBarAppearance = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCCustomToolBar;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FVerticalSpacing: Single;\r\n FHorizontalSpacing: Single;\r\n FDragGripColor: TTMSFNCGraphicsColor;\r\n FDragGrip: Boolean;\r\n FFlatStyle: Boolean;\r\n FFont: TTMSFNCGraphicsFont;\r\n FSeparatorStroke: TTMSFNCGraphicsStroke;\r\n FSeparator: Boolean;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetHorizontalSpacing(const Value: Single);\r\n procedure SetVerticalSpacing(const Value: Single);\r\n procedure SetDragGrip(const Value: Boolean);\r\n procedure SetDragGripColor(const Value: TTMSFNCGraphicsColor);\r\n function IsHorizontalSpacingStored: Boolean;\r\n function IsVerticalSpacingStored: Boolean;\r\n procedure SetFlatStyle(const Value: Boolean);\r\n procedure SetSeparator(const Value: Boolean);\r\n procedure SetSeparatorStroke(const Value: TTMSFNCGraphicsStroke);\r\n protected\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property HorizontalSpacing: Single read FHorizontalSpacing write SetHorizontalSpacing stored IsHorizontalSpacingStored nodefault;\r\n property VerticalSpacing: Single read FVerticalSpacing write SetVerticalSpacing stored IsVerticalSpacingStored nodefault;\r\n property DragGrip: Boolean read FDragGrip write SetDragGrip default True;\r\n property DragGripColor: TTMSFNCGraphicsColor read FDragGripColor write SetDragGripColor default gcLightgray;\r\n property FlatStyle: Boolean read FFlatStyle write SetFlatStyle default False;\r\n property Separator: Boolean read FSeparator write SetSeparator default False;\r\n property SeparatorStroke: TTMSFNCGraphicsStroke read FSeparatorStroke write SetSeparatorStroke;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TTMSFNCCustomToolBar);\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTMSFNCToolBarAppearance = class(TTMSFNCCustomToolBarAppearance)\r\n published\r\n property FlatStyle;\r\n property Fill;\r\n property Stroke;\r\n property Separator;\r\n property SeparatorStroke;\r\n property HorizontalSpacing;\r\n property VerticalSpacing;\r\n property DragGrip;\r\n property DragGripColor;\r\n end;\r\n\r\n TTMSFNCToolBarOptionMenuItem = class(TMenuItem)\r\n private\r\n FControl: TControl;\r\n FGlyphWidth: Single;\r\n FCalculate: Boolean;\r\n protected\r\n property Calculate: Boolean read FCalculate write FCalculate;\r\n property GlyphWidth: Single read FGlyphWidth write FGlyphWidth;\r\n public\r\n property Control: TControl read FControl write FControl;\r\n end;\r\n\r\n TTMSFNCToolBarControl = class(TPersistent)\r\n private\r\n FControlIndex: Integer;\r\n FControl: TControl;\r\n FLayout: TTMSFNCToolBarButtonLayout;\r\n FBitmap: TTMSFNCBitmap;\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n end;\r\n\r\n TControlClass = class of TControl;\r\n\r\n TTMSFNCToolBarCustomizeOptionsMenu = procedure(Sender: TObject; APopupMenu: TPopupMenu) of object;\r\n TTMSFNCToolBarCustomizeOptionsMenuItem = procedure(Sender: TObject; AControl: TControl; AMenuItem: TMenuItem) of object;\r\n TTMSFNCToolBarCanShowOptionsMenuItem = procedure(Sender: TObject; AControl: TControl; var ACanShowItem: Boolean) of object;\r\n TTMSFNCToolBarOptionsMenuItemClick = procedure(Sender: TObject; AControl: TControl; AMenuItem: TMenuItem; var AExecuteDefaultAction: Boolean) of object;\r\n TTMSFNCToolBarIsLastElement = procedure(Sender: TObject; AControl: TControl; var AIsLastElement: Boolean) of object;\r\n\r\n TTMSFNCCustomToolBarOptionsMenu = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCCustomToolBar;\r\n FShowItemText: Boolean;\r\n FShowItemBitmap: Boolean;\r\n FShowButton: Boolean;\r\n FItemBitmapWidth: Single;\r\n FAutoItemBitmapWidth: Boolean;\r\n procedure SetShowButton(const Value: Boolean);\r\n procedure SetShowItemBitmap(const Value: Boolean);\r\n procedure SetShowItemText(const Value: Boolean);\r\n procedure SetAutoItemBitmapWidth(const Value: Boolean);\r\n procedure SetItemBitmapWidth(const Value: Single);\r\n function IsItemBitmapWidthStored: Boolean;\r\n protected\r\n property ShowButton: Boolean read FShowButton write SetShowButton default True;\r\n property ShowItemBitmap: Boolean read FShowItemBitmap write SetShowItemBitmap default True;\r\n property ShowItemText: Boolean read FShowItemText write SetShowItemText default True;\r\n property AutoItemBitmapWidth: Boolean read FAutoItemBitmapWidth write SetAutoItemBitmapWidth default True;\r\n property ItemBitmapWidth: Single read FItemBitmapWidth write SetItemBitmapWidth stored IsItemBitmapWidthStored nodefault;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TTMSFNCCustomToolBar);\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTMSFNCToolBarOptionsMenu = class(TTMSFNCCustomToolBarOptionsMenu)\r\n published\r\n property ShowButton;\r\n property ShowItemBitmap;\r\n property ShowItemText;\r\n property AutoItemBitmapWidth;\r\n property ItemBitmapWidth;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCToolBarControlObjectList = class(TObjectList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCToolBarControl;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCToolBarControl);\r\n public\r\n property Items[Index: Integer]: TTMSFNCToolBarControl read GetItem write SetItem; default;\r\n end;\r\n TTMSFNCToolBarControlList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCToolBarControl;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCToolBarControl);\r\n public\r\n property Items[Index: Integer]: TTMSFNCToolBarControl read GetItem write SetItem; default;\r\n end;\r\n TTMSFNCControlList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TControl;\r\n procedure SetItem(Index: Integer; const Value: TControl);\r\n public\r\n property Items[Index: Integer]: TControl read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCToolBarControlObjectList = TObjectList;\r\n TTMSFNCToolBarControlList = TList;\r\n TTMSFNCControlList = TList;\r\n {$ENDIF}\r\n\r\n TTMSFNCToolBarDragGripMovingEvent = procedure(Sender: TObject; DeltaX: Double; DeltaY: Double) of object;\r\n\r\n TTMSFNCToolBarPopup = class(TTMSFNCNonFocusablePopup)\r\n public\r\n property OnClosePopup;\r\n end;\r\n\r\n {$IFDEF FNCLIB}\r\n TTMSFNCCustomToolBar = class(TTMSFNCCustomControl, ITMSFNCBitmapContainer)\r\n {$ENDIF}\r\n {$IFNDEF FNCLIB}\r\n TTMSFNCCustomToolBar = class(TTMSFNCCustomControl)\r\n {$ENDIF}\r\n private\r\n FCompactToolbar: TTMSFNCCustomToolBar;\r\n FCompactPopup: TTMSFNCToolBarPopup;\r\n FHover, FHoverP, FQuickMenuButtonHover, FQuickMenuButtonHoverP: Boolean;\r\n FDown, FQuickMenuButtonDown: Boolean;\r\n FOldWidth: Single;\r\n FOldMenuButtonState: Boolean;\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n FInsideDrag, FDragGripMoving, FDragGripDown: Boolean;\r\n FDragGripDownPt: TPointF;\r\n FTotalOptionsMenuWidth: Single;\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n FCompareControls: IComparer;\r\n FCompareHiddenControls: IComparer;\r\n {$ENDIF}\r\n {$ENDIF}\r\n FHiddenControls: TTMSFNCToolBarControlObjectList;\r\n FCompactControls: TTMSFNCToolBarControlObjectList;\r\n FBlockUpdate, FBlockResize: Boolean;\r\n FAutoSize: Boolean;\r\n FAppearance: TTMSFNCToolBarAppearance;\r\n FAutoAlign: Boolean;\r\n FOptionsMenuButton: TTMSFNCToolBarDropDownButton;\r\n FAutoOptionsMenu: TPopupMenu;\r\n FOnOptionsMenuCustomize: TTMSFNCToolBarCustomizeOptionsMenu;\r\n FOnOptionsMenuItemCustomize: TTMSFNCToolBarCustomizeOptionsMenuItem;\r\n FOnOptionsMenuButtonClick: TNotifyEvent;\r\n FOptionsMenu: TTMSFNCToolBarOptionsMenu;\r\n FCustomOptionsMenu: TPopupMenu;\r\n FOnOptionsMenuItemCanShow: TTMSFNCToolBarCanShowOptionsMenuItem;\r\n FState: TTMSFNCToolBarElementState;\r\n FOnOptionsMenuItemClick: TTMSFNCToolBarOptionsMenuItemClick;\r\n FOnOptionsMenuItemApplyStyle: TTMSFNCToolBarCustomizeOptionsMenuItem;\r\n FOnUpdateDockPanel: TNotifyEvent;\r\n FOnUpdateControls: TNotifyEvent;\r\n FOnIsLastElement: TTMSFNCToolBarIsLastElement;\r\n FOnDragGripMoving: TTMSFNCToolBarDragGripMovingEvent;\r\n FAutoMoveToolBar: Boolean;\r\n FOnInternalDblClick: TNotifyEvent;\r\n FOnInternalMouseDown: TNotifyEvent;\r\n FOnInternalMouseMove: TNotifyEvent;\r\n FOnInternalMouseUp: TNotifyEvent;\r\n FAutoHeight: Boolean;\r\n FAutoWidth: Boolean;\r\n FOnInternalInsertControl: TNotifyEvent;\r\n FAutoStretchHeight: Boolean;\r\n FText: string;\r\n FFont: TTMSFNCGraphicsFont;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FWordWrapping: Boolean;\r\n FTextVisible: Boolean;\r\n FMinimumWidth: Single;\r\n FCompact: Boolean;\r\n FCanCompact: Boolean;\r\n FCompactWidth: Single;\r\n FCompactAppearance: TTMSFNCToolBarCompactAppearance;\r\n FCompactBitmaps: TTMSFNCScaledBitmaps;\r\n FOnCompactClick: TNotifyEvent;\r\n FCompactBitmapSize: Single;\r\n FCompactBitmapVisible: Boolean;\r\n FCompactExpanderBitmaps: TTMSFNCScaledBitmaps;\r\n FQuickMenuButton: Boolean;\r\n FQuickMenuButtonAppearance: TTMSFNCToolBarQuickMenuButtonAppearance;\r\n FOnQuickMenuButtonClick: TNotifyEvent;\r\n FQuickMenuButtonBitmaps: TTMSFNCScaledBitmaps;\r\n FQuickMenuButtonHint: string;\r\n FCompactAutoBitmapSize: Boolean;\r\n procedure SetAppearance(const Value: TTMSFNCToolBarAppearance);\r\n procedure SetAS(const Value: Boolean);\r\n procedure SetAutoAlign(const Value: Boolean);\r\n procedure SetOptionsMenu(const Value: TTMSFNCToolBarOptionsMenu);\r\n procedure SetState(const Value: TTMSFNCToolBarElementState);\r\n procedure SetAutoHeight(const Value: Boolean);\r\n procedure SetAutoWidth(const Value: Boolean);\r\n procedure SetAutoStretchHeight(const Value: Boolean);\r\n procedure SetText(const Value: string);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n procedure SetTextVisible(const Value: Boolean);\r\n function IsMinimumWidthStored: Boolean;\r\n procedure SetMinimumWidth(const Value: Single);\r\n procedure SetCompact(const Value: Boolean);\r\n procedure SetCanCompact(const Value: Boolean);\r\n function IsCompactWidthStored: Boolean;\r\n procedure SetCompactWidth(const Value: Single);\r\n procedure SetCompactAppearance(const Value: TTMSFNCToolBarCompactAppearance);\r\n procedure SetCompactBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n function IsCompactBitmapSizeStored: Boolean;\r\n procedure SetCompactBitmapSize(const Value: Single);\r\n procedure SetCompactBitmapVisible(const Value: Boolean);\r\n procedure SetCompactExpanderBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetQuickMenuButton(const Value: Boolean);\r\n procedure SetQuickMenuButtonAppearance(\r\n const Value: TTMSFNCToolBarQuickMenuButtonAppearance);\r\n procedure SetQuickMenuButtonBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\n procedure SetCompactAutoBitmapSize(const Value: Boolean);\r\n protected\r\n function GetVersion: String; override;\r\n function CanDrawDesignTime: Boolean; virtual;\r\n function CanBuildControls: Boolean; virtual;\r\n function GetOptionsMenuButtonClass: TTMSFNCToolBarDropDownButtonClass; virtual;\r\n function GetBitmapPickerClass: TTMSFNCToolBarBitmapPickerClass; virtual;\r\n function GetToolBarButtonClass: TTMSFNCToolBarButtonClass; virtual;\r\n function GetColorPickerClass: TTMSFNCToolBarColorPickerClass; virtual;\r\n function GetItemPickerClass: TTMSFNCToolBarItemPickerClass; virtual;\r\n function GetFontNamePickerClass: TTMSFNCToolBarFontNamePickerClass; virtual;\r\n function GetFontSizePickerClass: TTMSFNCToolBarFontSizePickerClass; virtual;\r\n function GetToolBarSeparatorClass: TTMSFNCToolBarSeparatorClass; virtual;\r\n function GetTextSize: TSizeF; virtual;\r\n function GetHiddenControl(AControl: TControl): TTMSFNCToolBarControl; virtual;\r\n function GetCompactControl(AControl: TControl): TTMSFNCToolBarControl; virtual;\r\n function GetHiddenControlCount(AControl: TControl): Integer; virtual;\r\n function GetCompactControlCount: Integer; virtual;\r\n function GetCompactTextRect: TRectF; virtual;\r\n function GetCompactBitmapRect(ARect: TRectF): TRectF; virtual;\r\n function GetCompactBitmapSize: Single; virtual;\r\n function GetQuickMenuButtonRect: TRectF; virtual;\r\n function HasHint: Boolean; override;\r\n function GetHintString: String; override;\r\n procedure ChangeDPIScale(M, D: Integer); override;\r\n procedure HandleQuickMenuButton; virtual;\r\n procedure CompactAppearanceChanged(Sender: TObject);\r\n procedure QuickMenuButtonAppearanceChanged(Sender: TObject);\r\n procedure CompactBitmapsChanged(Sender: TObject);\r\n procedure CompactExpanderBitmapsChanged(Sender: TObject);\r\n procedure QuickMenuButtonBitmapsChanged(Sender: TObject); \r\n procedure ApplyFlatStyle; virtual;\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure ApplyStyle; override;\r\n procedure ResetToDefaultStyle; override;\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseLeave; override;\r\n procedure HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleCompact; virtual;\r\n procedure DeactivateAllPopups; virtual;\r\n procedure DoCompactClick; virtual;\r\n procedure HandleDblClick({%H-}X, {%H-}Y: Single); override;\r\n procedure UpdateDockPanel; virtual;\r\n procedure InsertToolBarControl(AControl: TControl; {%H-}AIndex: Integer);\r\n procedure DoDragGripMoving(ADeltaX, ADeltaY: Double); virtual;\r\n {$IFDEF FMXLIB}\r\n procedure SetVisible(const Value: Boolean); override;\r\n procedure DoMatrixChanged(Sender: TObject); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure VisibleChanging; override;\r\n {$ENDIF}\r\n function GetDragGripRect(AInteraction: Boolean = False): TRectF;\r\n procedure CompactControls; virtual;\r\n procedure UncompactControls; virtual;\r\n procedure DoCustomizeOptionsMenu; virtual;\r\n procedure DoCustomizeOptionsMenuItem(AControl: TControl; AMenuItem: TMenuItem); virtual;\r\n procedure DoCanShowOptionsMenuItem(AControl: TControl; var ACanShowItem: Boolean); virtual;\r\n procedure UpdateToolBar(Sender: TObject);\r\n procedure DoIsLastElement(AControl: TControl; var ALastElement: Boolean);\r\n procedure UpdateToolBarControl(Sender: TObject);\r\n procedure OptionMenuItemClick(Sender: TObject);\r\n {$IFDEF FMXLIB}\r\n procedure OptionMenuItemApplyStyleLookup(Sender: TObject);\r\n {$ENDIF}\r\n procedure OptionsButtonClick(Sender: TObject);\r\n procedure DoCloseCompactPopup(Sender: TObject);\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n\r\n {$IFDEF FMXLIB}\r\n procedure DoRealign; override;\r\n procedure DoAddObject(const AObject: TFmxObject); override;\r\n procedure DoInsertObject(Index: Integer; const AObject: TFmxObject); override;\r\n procedure DoRemoveObject(const AObject: TFmxObject); override;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n procedure AlignControls(AControl: TControl; var Rect: TRect); override;\r\n {$ENDIF}\r\n procedure UpdateControlAfterResize; override;\r\n procedure UpdateControls; virtual;\r\n procedure InitializeOptionsMenu; virtual;\r\n procedure DrawDragGrip(AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawText(AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawCompactBitmap(AGraphics: TTMSFNCGraphics; ARect: TRectF); virtual;\r\n procedure DrawCompactText(AGraphics: TTMSFNCGraphics); virtual;\r\n procedure DrawCompactExpander(AGraphics: TTMSFNCGraphics); virtual;\r\n procedure ShowOptionsMenu(X, Y: Single); virtual;\r\n property BlockUpdate: Boolean read FBlockUpdate write FBlockUpdate;\r\n property OnCompactClick: TNotifyEvent read FOnCompactClick write FOnCompactClick;\r\n property OnUpdateControls: TNotifyEvent read FOnUpdateControls write FOnUpdateControls;\r\n property OnUpdateDockPanel: TNotifyEvent read FOnUpdateDockPanel write FOnUpdateDockPanel;\r\n property OnInternalMouseDown: TNotifyEvent read FOnInternalMouseDown write FOnInternalMouseDown;\r\n property OnInternalInsertControl: TNotifyEvent read FOnInternalInsertControl write FOnInternalInsertControl;\r\n property OnInternalMouseUp: TNotifyEvent read FOnInternalMouseUp write FOnInternalMouseUp;\r\n property OnInternalMouseMove: TNotifyEvent read FOnInternalMouseMove write FOnInternalMouseMove;\r\n property OnInternalDblClick: TNotifyEvent read FOnInternalDblClick write FOnInternalDblClick;\r\n property Version: String read GetVersion;\r\n property AutoSize: Boolean read FAutoSize write SetAS default True;\r\n property AutoHeight: Boolean read FAutoHeight write SetAutoHeight default True;\r\n property AutoWidth: Boolean read FAutoWidth write SetAutoWidth default True;\r\n property AutoAlign: Boolean read FAutoAlign write SetAutoAlign default True;\r\n property AutoStretchHeight: Boolean read FAutoStretchHeight write SetAutoStretchHeight default False;\r\n property AutoMoveToolBar: Boolean read FAutoMoveToolBar write FAutoMoveToolBar default True;\r\n property Appearance: TTMSFNCToolBarAppearance read FAppearance write SetAppearance;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping default False;\r\n property Text: string read FText write SetText;\r\n property TextVisible: Boolean read FTextVisible write SetTextVisible default True;\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming default gttCharacter;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaCenter;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaCenter;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property OptionsMenu: TTMSFNCToolBarOptionsMenu read FOptionsMenu write SetOptionsMenu;\r\n property OnOptionsMenuItemCanShow: TTMSFNCToolBarCanShowOptionsMenuItem read FOnOptionsMenuItemCanShow write FOnOptionsMenuItemCanShow;\r\n property OnOptionsMenuCustomize: TTMSFNCToolBarCustomizeOptionsMenu read FOnOptionsMenuCustomize write FOnOptionsMenuCustomize;\r\n property OnOptionsMenuItemCustomize: TTMSFNCToolBarCustomizeOptionsMenuItem read FOnOptionsMenuItemCustomize write FOnOptionsMenuItemCustomize;\r\n property OnOptionsMenuItemApplyStyle: TTMSFNCToolBarCustomizeOptionsMenuItem read FOnOptionsMenuItemApplyStyle write FOnOptionsMenuItemApplyStyle;\r\n property OnOptionsMenuButtonClick: TNotifyEvent read FOnOptionsMenuButtonClick write FOnOptionsMenuButtonClick;\r\n property OnOptionsMenuItemClick: TTMSFNCToolBarOptionsMenuItemClick read FOnOptionsMenuItemClick write FOnOptionsMenuItemClick;\r\n property CustomOptionsMenu: TPopupMenu read FCustomOptionsMenu write FCustomOptionsMenu;\r\n property State: TTMSFNCToolBarElementState read FState write SetState default esNormal;\r\n property OnIsLastElement: TTMSFNCToolBarIsLastElement read FOnIsLastElement write FOnIsLastElement;\r\n property OnDragGripMoving: TTMSFNCToolBarDragGripMovingEvent read FOnDragGripMoving write FOnDragGripMoving;\r\n property AutoOptionsMenu: TPopupMenu read FAutoOptionsMenu;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n property MinimumWidth: Single read FMinimumWidth write SetMinimumWidth stored IsMinimumWidthStored nodefault;\r\n property CompactBitmapVisible: Boolean read FCompactBitmapVisible write SetCompactBitmapVisible default False;\r\n property CompactAutoBitmapSize: Boolean read FCompactAutoBitmapSize write SetCompactAutoBitmapSize default False;\r\n property CompactBitmaps: TTMSFNCScaledBitmaps read FCompactBitmaps write SetCompactBitmaps;\r\n property Compact: Boolean read FCompact write SetCompact default False;\r\n property QuickMenuButton: Boolean read FQuickMenuButton write SetQuickMenuButton default False;\r\n property QuickMenuButtonHint: string read FQuickMenuButtonHint write FQuickMenuButtonHint;\r\n property CompactWidth: Single read FCompactWidth write SetCompactWidth stored IsCompactWidthStored nodefault;\r\n property CanCompact: Boolean read FCanCompact write SetCanCompact default True;\r\n property CompactAppearance: TTMSFNCToolBarCompactAppearance read FCompactAppearance write SetCompactAppearance;\r\n property QuickMenuButtonAppearance: TTMSFNCToolBarQuickMenuButtonAppearance read FQuickMenuButtonAppearance write SetQuickMenuButtonAppearance;\r\n property CompactBitmapSize: Single read FCompactBitmapSize write SetCompactBitmapSize stored IsCompactBitmapSizeStored nodefault;\r\n property CompactExpanderBitmaps: TTMSFNCScaledBitmaps read FCompactExpanderBitmaps write SetCompactExpanderBitmaps;\r\n property QuickMenuButtonBitmaps: TTMSFNCScaledBitmaps read FQuickMenuButtonBitmaps write SetQuickMenuButtonBitmaps; \r\n property OnQuickMenuButtonClick: TNotifyEvent read FOnQuickMenuButtonClick write FOnQuickMenuButtonClick;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n function CanExpand: Boolean; virtual;\r\n function CanShrink: Boolean; virtual;\r\n function DropDownActive: Boolean; virtual;\r\n procedure CloseCompactPopup; virtual;\r\n procedure AddCustomControl(AControl: TControl; AIndex: Integer = -1); virtual;\r\n function AddCustomControlClass(AControlClass: TControlClass; AIndex: Integer = -1): TControl; virtual;\r\n function AddButton(AWidth: Single = -1; AHeight: Single = -1; AResource: String = ''; AResourceLarge: String = ''; AText: String = '';\r\n AIndex: Integer = -1): TTMSFNCToolBarButton; overload; virtual;\r\n function AddSeparator(AIndex: Integer = -1): TTMSFNCToolBarSeparator; virtual;\r\n function AddFontNamePicker(AIndex: Integer = -1): TTMSFNCToolBarFontNamePicker; virtual;\r\n function AddFontSizePicker(AIndex: Integer = -1): TTMSFNCToolBarFontSizePicker; virtual;\r\n function AddColorPicker(AIndex: Integer = -1): TTMSFNCToolBarColorPicker; virtual;\r\n function AddItemPicker(AIndex: Integer = -1): TTMSFNCToolBarItemPicker; virtual;\r\n function AddBitmapPicker(AIndex: Integer = -1): TTMSFNCToolBarBitmapPicker; virtual;\r\n function GetOptionsMenuButtonControl: TTMSFNCToolBarDropDownButton; virtual;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCToolBar = class(TTMSFNCCustomToolBar)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n published\r\n property OnOptionsMenuButtonClick;\r\n property OnOptionsMenuItemCanShow;\r\n property OnOptionsMenuCustomize;\r\n property OnOptionsMenuItemCustomize;\r\n property OnOptionsMenuItemApplyStyle;\r\n property OnOptionsMenuItemClick;\r\n property OnIsLastElement;\r\n property OnDragGripMoving;\r\n property OnQuickMenuButtonClick;\r\n //\r\n property Version;\r\n property AutoHeight;\r\n property AutoWidth;\r\n property AutoSize;\r\n property AutoAlign;\r\n property AutoStretchHeight;\r\n property AutoMoveToolBar;\r\n property Appearance;\r\n property CanCompact;\r\n property OnCompactClick;\r\n property CompactBitmapVisible;\r\n property CompactBitmaps;\r\n property Compact;\r\n property CompactWidth;\r\n property CompactAppearance;\r\n property CompactBitmapSize;\r\n property CompactAutoBitmapSize;\r\n property QuickMenuButtonHint;\r\n property QuickMenuButton;\r\n property QuickMenuButtonAppearance;\r\n property MinimumWidth;\r\n property WordWrapping;\r\n property Text;\r\n property Trimming;\r\n property HorizontalTextAlign;\r\n property VerticalTextAlign;\r\n property Font;\r\n property OptionsMenu;\r\n property CustomOptionsMenu;\r\n property State;\r\n end;\r\n\r\n TTMSFNCCustomDockPanelAppearance = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCCustomDockPanel;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FMargins: TTMSFNCMargins;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetMargins(const Value: TTMSFNCMargins);\r\n protected\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure MarginsChanged(Sender: TObject);\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property Margins: TTMSFNCMargins read FMargins write SetMargins;\r\n public\r\n constructor Create(AOwner: TTMSFNCCustomDockPanel);\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTMSFNCDockPanelAppearance = class(TTMSFNCCustomDockPanelAppearance)\r\n published\r\n property Fill;\r\n property Stroke;\r\n end;\r\n\r\n TTMSFNCCustomDockPanel = class(TTMSFNCCustomControl)\r\n private\r\n FBlockUpdate: Boolean;\r\n FAppearance: TTMSFNCDockPanelAppearance;\r\n FAutoSize: Boolean;\r\n FAutoAlign: Boolean;\r\n FState: TTMSFNCToolBarElementState;\r\n procedure SetAppearance(const Value: TTMSFNCDockPanelAppearance);\r\n procedure SetAutoAlign(const Value: Boolean);\r\n procedure SetAS(const Value: Boolean);\r\n procedure SetState(const Value: TTMSFNCToolBarElementState);\r\n protected\r\n function GetVersion: String; override;\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure UpdateControls; virtual;\r\n procedure InitializeControls; virtual;\r\n procedure RearrangeControls; virtual;\r\n procedure UpdateDockPanel(Sender: TObject);\r\n procedure ApplyStyle; override;\r\n procedure ResetToDefaultStyle; override;\r\n\r\n {$IFDEF FMXLIB}\r\n procedure DoRealign; override;\r\n procedure DoAddObject(const AObject: TFmxObject); override;\r\n procedure DoInsertObject(Index: Integer; const AObject: TFmxObject); override;\r\n procedure DoRemoveObject(const AObject: TFmxObject); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure AlignControls(AControl: TControl; var Rect: TRect); override;\r\n {$ENDIF}\r\n\r\n property Version: String read GetVersion;\r\n property Appearance: TTMSFNCDockPanelAppearance read FAppearance write SetAppearance;\r\n property AutoSize: Boolean read FAutoSize write SetAS default True;\r\n property AutoAlign: Boolean read FAutoAlign write SetAutoAlign default True;\r\n property State: TTMSFNCToolBarElementState read FState write SetState default esNormal;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n function AddToolBar({%H-}AIndex: Integer = -1): TTMSFNCToolBar;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCDockPanel = class(TTMSFNCCustomDockPanel)\r\n published\r\n property Version;\r\n property Appearance;\r\n property AutoSize;\r\n property AutoAlign;\r\n property State;\r\n end;\r\n\r\n {$IFDEF CMNLIB}\r\n TTMSFNCToolBarParent = TWinControl;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n TTMSFNCToolBarParent = TControl;\r\n {$ENDIF}\r\n\r\nimplementation\r\n\r\nuses\r\n Math, SysUtils, WEBLib.TMSFNCUtils, WEBLib.Graphics, {%H-}StrUtils, WEBLib.TMSFNCStyles;\r\n\r\nfunction TTMSFNCCustomToolBar.AddBitmapPicker(\r\n AIndex: Integer): TTMSFNCToolBarBitmapPicker;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := GetBitmapPickerClass.Create(Self);\r\n Result.Appearance.FlatStyle := Appearance.FlatStyle;\r\n InsertToolBarControl(Result, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.AddButton(AWidth: Single = -1; AHeight: Single = -1;\r\n AResource: String = ''; AResourceLarge: String = ''; AText: String = ''; AIndex: Integer = -1): TTMSFNCToolBarButton;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := GetToolBarButtonClass.Create(Self);\r\n Result.Appearance.FlatStyle := Appearance.FlatStyle;\r\n Result.Text := AText;\r\n if AWidth <> -1 then\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result.Width := AWidth;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result.Width := Round(AWidth);\r\n {$ENDIF}\r\n end;\r\n\r\n if AHeight <> -1 then\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result.Height := AHeight;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result.Height := Round(AHeight);\r\n {$ENDIF}\r\n end;\r\n\r\n if AResource <> '' then\r\n begin\r\n Result.Bitmaps.AddBitmapFromResource(AResource, HInstance, 1.0);\r\n Result.DisabledBitmaps.AddBitmapFromResource(AResource, HInstance, 1.0);\r\n Result.HoverBitmaps.AddBitmapFromResource(AResource, HInstance, 1.0);\r\n end;\r\n\r\n if AResourceLarge <> '' then\r\n begin\r\n Result.Bitmaps.AddBitmapFromResource(AResourceLarge, HInstance, 1.5);\r\n Result.DisabledBitmaps.AddBitmapFromResource(AResourceLarge, HInstance, 1.5);\r\n Result.HoverBitmaps.AddBitmapFromResource(AResourceLarge, HInstance, 1.5);\r\n end;\r\n\r\n InsertToolBarControl(Result, AIndex);\r\n\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.AddColorPicker(\r\n AIndex: Integer): TTMSFNCToolBarColorPicker;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := GetColorPickerClass.Create(Self);\r\n Result.Appearance.FlatStyle := Appearance.FlatStyle;\r\n InsertToolBarControl(Result, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.AddCustomControl(AControl: TControl; AIndex: Integer = -1);\r\nbegin\r\n FBlockUpdate := True;\r\n InsertToolBarControl(AControl, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.AddCustomControlClass(AControlClass: TControlClass;\r\n AIndex: Integer = -1): TControl;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := AControlClass.Create(Self);\r\n InsertToolBarControl(Result, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.AddFontNamePicker(\r\n AIndex: Integer): TTMSFNCToolBarFontNamePicker;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := GetFontNamePickerClass.Create(Self);\r\n Result.Appearance.FlatStyle := Appearance.FlatStyle;\r\n InsertToolBarControl(Result, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.AddFontSizePicker(\r\n AIndex: Integer): TTMSFNCToolBarFontSizePicker;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := GetFontSizePickerClass.Create(Self);\r\n Result.Appearance.FlatStyle := Appearance.FlatStyle;\r\n InsertToolBarControl(Result, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.AddItemPicker(\r\n AIndex: Integer): TTMSFNCToolBarItemPicker;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := GetItemPickerClass.Create(Self);\r\n Result.Appearance.FlatStyle := Appearance.FlatStyle;\r\n InsertToolBarControl(Result, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.AddSeparator(AIndex: Integer = -1): TTMSFNCToolBarSeparator;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := GetToolBarSeparatorClass.Create(Self);\r\n InsertToolBarControl(Result, AIndex);\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.ApplyFlatStyle;\r\nvar\r\n I: Integer;\r\n c: TControl;\r\nbegin\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if c is TTMSFNCDefaultToolBarButton then\r\n (c as TTMSFNCDefaultToolBarButton).Appearance.FlatStyle := Appearance.FlatStyle;\r\n\r\n if c is TTMSFNCCustomToolBar then\r\n (c as TTMSFNCCustomToolBar).Appearance.FlatStyle := Appearance.FlatStyle;\r\n end;\r\n\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleHeaderFillColor(c) then\r\n begin\r\n Appearance.Fill.Kind := gfkSolid;\r\n Appearance.Fill.Color := c;\r\n end;\r\n\r\n if TTMSFNCStyles.GetStyleHeaderFillColorTo(c) then\r\n begin\r\n Appearance.Fill.Kind := gfkGradient;\r\n Appearance.Fill.ColorTo := c;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.Assign(Source: TPersistent);\r\nvar\r\n c, cc: TControl;\r\n I: Integer;\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCCustomToolBar then\r\n begin\r\n FCompactAppearance.Assign((Source as TTMSFNCCustomToolBar).CompactAppearance);\r\n FQuickMenuButtonAppearance.Assign((Source as TTMSFNCCustomToolBar).QuickMenuButtonAppearance);\r\n FQuickMenuButton := (Source as TTMSFNCCustomToolBar).QuickMenuButton;\r\n FCompactBitmaps.Assign((Source as TTMSFNCCustomToolBar).CompactBitmaps);\r\n FCompact := (Source as TTMSFNCCustomToolBar).Compact;\r\n FCanCompact := (Source as TTMSFNCCustomToolBar).CanCompact;\r\n FMinimumWidth := (Source as TTMSFNCCustomToolBar).MinimumWidth;\r\n FCompactWidth := (Source as TTMSFNCCustomToolBar).CompactWidth;\r\n FCompactBitmapSize := (Source as TTMSFNCCustomToolBar).CompactBitmapSize;\r\n FCompactAutoBitmapSize := (Source as TTMSFNCCustomToolBar).CompactAutoBitmapSize;\r\n FCompactExpanderBitmaps.Assign((Source as TTMSFNCCustomToolBar).CompactExpanderBitmaps);\r\n FQuickMenuButtonBitmaps.Assign((Source as TTMSFNCCustomToolBar).QuickMenuButtonBitmaps); \r\n FCompactBitmapVisible := (Source as TTMSFNCCustomToolBar).CompactBitmapVisible;\r\n FText := (Source as TTMSFNCCustomToolBar).Text;\r\n FTextVisible := (Source as TTMSFNCCustomToolBar).TextVisible;\r\n FWordWrapping := (Source as TTMSFNCCustomToolBar).WordWrapping;\r\n FHorizontalTextAlign := (Source as TTMSFNCCustomToolBar).HorizontalTextAlign;\r\n FVerticalTextAlign := (Source as TTMSFNCCustomToolBar).VerticalTextAlign;\r\n FTrimming := (Source as TTMSFNCCustomToolBar).Trimming;\r\n FFont.Assign((Source as TTMSFNCCustomToolBar).Font);\r\n FAutoSize := (Source as TTMSFNCCustomToolBar).AutoSize;\r\n FAutoHeight := (Source as TTMSFNCCustomToolBar).AutoHeight;\r\n FAutoWidth := (Source as TTMSFNCCustomToolBar).AutoWidth;\r\n FAutoAlign := (Source as TTMSFNCCustomToolBar).AutoAlign;\r\n FAutoStretchHeight := (Source as TTMSFNCCustomToolBar).AutoStretchHeight;\r\n FAutoMoveToolBar := (Source as TTMSFNCCustomToolBar).AutoMoveToolBar;\r\n FAppearance.Assign((Source as TTMSFNCCustomToolBar).Appearance);\r\n for I := 0 to (Source as TTMSFNCCustomToolBar).ControlCount - 1 do\r\n begin\r\n cc := (Source as TTMSFNCCustomToolBar).Controls[I];\r\n if ((cc is TTMSFNCDefaultToolBarButton) and (cc as TTMSFNCDefaultToolBarButton).CanCopy) or not ((cc is TTMSFNCDefaultToolBarButton) and (cc is TControl)) then\r\n begin\r\n if cc is TTMSFNCDefaultToolBarButton then\r\n (cc as TTMSFNCDefaultToolBarButton).ApplyName := False;\r\n\r\n c := (TTMSFNCUtils.Clone(cc) as TControl);\r\n if cc is TTMSFNCDefaultToolBarButton then\r\n (cc as TTMSFNCDefaultToolBarButton).ApplyName := True;\r\n\r\n AddCustomControl(c);\r\n end;\r\n end;\r\n Invalidate;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.ChangeDPIScale(M, D: Integer);\r\nbegin\r\n inherited;\r\n Font.Height := TTMSFNCUtils.MulDivInt(Font.Height, M, D);\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.CanShrink: Boolean;\r\nvar\r\n I: Integer;\r\n c: TControl;\r\n btn: TTMSFNCDefaultToolBarButton;\r\nbegin\r\n Result := False;\r\n\r\n if not Compact and CanCompact then\r\n begin\r\n Result := True;\r\n Exit;\r\n end;\r\n\r\n for I := Self.ControlCount - 1 downto 0 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if c <> FOptionsMenuButton then\r\n begin\r\n if c is TTMSFNCDefaultToolBarButton then\r\n begin\r\n btn := c as TTMSFNCDefaultToolBarButton;\r\n if (Integer(btn.Layout) > Integer(btn.MinimumLayout)) and (btn.Layout <> bblNone) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.CloseCompactPopup;\r\nbegin\r\n if Assigned(FCompactPopup) then\r\n FCompactPopup.Deactivate;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.CanBuildControls: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.CanDrawDesignTime: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.CanExpand: Boolean;\r\nvar\r\n I: Integer;\r\n c: TControl;\r\n btn: TTMSFNCDefaultToolBarButton;\r\nbegin\r\n Result := False;\r\n\r\n if Compact then\r\n begin\r\n Result := True;\r\n Exit;\r\n end;\r\n\r\n for I := Self.ControlCount - 1 downto 0 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if c <> FOptionsMenuButton then\r\n begin\r\n if c is TTMSFNCDefaultToolBarButton then\r\n begin\r\n btn := c as TTMSFNCDefaultToolBarButton;\r\n if (Integer(btn.Layout) < Integer(btn.MaximumLayout)) and (btn.Layout <> bblNone) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.CompactAppearanceChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.CompactBitmapsChanged(Sender: TObject);\r\nvar\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n bmp := TTMSFNCGraphics.GetScaledBitmap(CompactBitmaps, 0, BitmapContainer);\r\n CompactBitmapVisible := Assigned(bmp) and not IsBitmapEmpty(bmp);\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.CompactControls;\r\nvar\r\n I: Integer;\r\n cc: TTMSFNCToolBarControl;\r\n c: TControl;\r\nbegin\r\n FBlockUpdate := True;\r\n FCompactControls.Clear;\r\n for I := Self.ControlCount - 1 downto 0 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if c <> FOptionsMenuButton then\r\n begin\r\n cc := TTMSFNCToolBarControl.Create;\r\n cc.FControl := c;\r\n if c is TTMSFNCDefaultToolBarButton then\r\n begin\r\n cc.FLayout := (c as TTMSFNCDefaultToolBarButton).Layout;\r\n if ((c as TTMSFNCDefaultToolBarButton).CompactLayout = bblNone) and ((c as TTMSFNCDefaultToolBarButton).Layout <> bblNone) then\r\n (c as TTMSFNCDefaultToolBarButton).CompactLayout := (c as TTMSFNCDefaultToolBarButton).MaximumLayout;\r\n end;\r\n\r\n if c is TTMSFNCCustomToolBarElement then\r\n cc.FControlIndex := (c as TTMSFNCCustomToolBarElement).ControlIndex\r\n else\r\n cc.FControlIndex := c.Tag;\r\n\r\n c.Parent := nil;\r\n c.Visible := False;\r\n FCompactControls.Add(cc);\r\n end;\r\n end;\r\n FBlockUpdate := True;\r\n UpdateControls;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.CompactExpanderBitmapsChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nconstructor TTMSFNCCustomToolBar.Create(AOwner: TComponent);\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n FHiddenControls := TTMSFNCToolBarControlObjectList.Create;\r\n FCompactControls := TTMSFNCToolBarControlObjectList.Create;\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n FCompareControls := TDelegatedComparer.Create(\r\n function(const Item1, Item2: TControl): Integer\r\n var\r\n c1, c2: Integer;\r\n begin\r\n if Item1 is TTMSFNCCustomToolBarElement then\r\n c1 := (Item1 as TTMSFNCCustomToolBarElement).ControlIndex\r\n else\r\n c1 := Item1.Tag;\r\n\r\n if Item2 is TTMSFNCCustomToolBarElement then\r\n c2 := (Item2 as TTMSFNCCustomToolBarElement).ControlIndex\r\n else\r\n c2 := Item2.Tag;\r\n\r\n Result := CompareValue(c1, c2);\r\n end);\r\n FCompareHiddenControls := TDelegatedComparer.Create(\r\n function(const Item1, Item2: TTMSFNCToolBarControl): Integer\r\n begin\r\n Result := CompareValue(Item1.FControlIndex, Item2.FControlIndex);\r\n end);\r\n {$ENDIF}\r\n {$ENDIF}\r\n FState := esNormal;\r\n FAppearance := TTMSFNCToolBarAppearance.Create(Self);\r\n FCompactAppearance := TTMSFNCToolBarCompactAppearance.Create(nil);\r\n FCompactAppearance.OnChange := @CompactAppearanceChanged;\r\n FQuickMenuButtonAppearance := TTMSFNCToolBarQuickMenuButtonAppearance.Create(nil);\r\n FQuickMenuButtonAppearance.OnChange := @QuickMenuButtonAppearanceChanged;\r\n FCompactBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FCompactBitmaps.OnChange := @CompactBitmapsChanged;\r\n FOptionsMenu := TTMSFNCToolBarOptionsMenu.Create(Self);\r\n FMinimumWidth := 30;\r\n FCompactWidth := 50;\r\n FCompactBitmapSize := 24;\r\n FCompactAutoBitmapSize := False;\r\n FCompactBitmapVisible := False;\r\n FCompactExpanderBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FCompactExpanderBitmaps.OnChange := @CompactExpanderBitmapsChanged;\r\n FQuickMenuButtonBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FQuickMenuButtonBitmaps.OnChange := @QuickMenuButtonBitmapsChanged; \r\n FCanCompact := True;\r\n FQuickMenuButton := False;\r\n FCompact := False;\r\n FAutoSize := True;\r\n FAutoWidth := True;\r\n FAutoHeight := True;\r\n FAutoAlign := True;\r\n FAutoStretchHeight := False;\r\n FAutoMoveToolBar := True;\r\n FOptionsMenuButton := GetOptionsMenuButtonClass.Create(Self);\r\n FOptionsMenuButton.Appearance.NormalFill.Kind := gfkSolid;\r\n c := gcLightgray;\r\n FOptionsMenuButton.Appearance.NormalFill.Color := c;\r\n FOptionsMenuButton.Appearance.ShowInnerStroke := False;\r\n FOptionsMenuButton.Appearance.Rounding := 0;\r\n\r\n FOptionsMenuButton.Appearance.HoverFill.Assign(FOptionsMenuButton.Appearance.NormalFill);\r\n FOptionsMenuButton.Appearance.DisabledFill.Assign(FOptionsMenuButton.Appearance.NormalFill);\r\n FOptionsMenuButton.Appearance.DownFill.Assign(FOptionsMenuButton.Appearance.NormalFill);\r\n\r\n FOptionsMenuButton.Appearance.HoverFill.Color := gcLightblue;\r\n FOptionsMenuButton.Appearance.DownFill.Color := gcLightsteelblue;\r\n FOptionsMenuButton.Appearance.DisabledFill.Color := gcLightgray;\r\n\r\n {$IFDEF VCLWEBLIB}\r\n FOptionsMenuButton.AlignWithMargins := True;\r\n {$ENDIF}\r\n \r\n {$IFNDEF LCLLIB}\r\n FOptionsMenuButton.Margins.Top := 3;\r\n FOptionsMenuButton.Margins.Bottom := 3;\r\n FOptionsMenuButton.Margins.Right := 3;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n FOptionsMenuButton.BorderSpacing.Top := 3;\r\n FOptionsMenuButton.BorderSpacing.Bottom := 3;\r\n FOptionsMenuButton.BorderSpacing.Right := 3;\r\n {$ENDIF}\r\n\r\n FOptionsMenuButton.CanCopy := False;\r\n FAutoOptionsMenu := TPopupMenu.Create(Self);\r\n {$IFDEF FMXLIB}\r\n FAutoOptionsMenu.Parent := Self;\r\n FAutoOptionsMenu.Stored := False;\r\n {$ENDIF}\r\n FOptionsMenuButton.OnClick := OptionsButtonClick;\r\n FOptionsMenuButton.Width := 17;\r\n FOptionsMenuButton.Text := '';\r\n FOptionsMenuButton.Stored := False;\r\n\r\n FOptionsMenuButton.Bitmaps.AddBitmapFromResource(TMSFNCTOOLBAROPTIONSMENU, HInstance, 1.0);\r\n FOptionsMenuButton.Bitmaps.AddBitmapFromResource(TMSFNCTOOLBAROPTIONSMENULARGE, HInstance, 1.5);\r\n FOptionsMenuButton.DisabledBitmaps.AddBitmapFromResource(TMSFNCTOOLBAROPTIONSMENU, HInstance, 1.0);\r\n FOptionsMenuButton.DisabledBitmaps.AddBitmapFromResource(TMSFNCTOOLBAROPTIONSMENULARGE, HInstance,1.5);\r\n FOptionsMenuButton.HoverBitmaps.AddBitmapFromResource(TMSFNCTOOLBAROPTIONSMENU, HInstance, 1.0);\r\n FOptionsMenuButton.HoverBitmaps.AddBitmapFromResource(TMSFNCTOOLBAROPTIONSMENULARGE, HInstance,1.5);\r\n\r\n FHorizontalTextAlign := gtaCenter;\r\n FVerticalTextAlign := gtaCenter;\r\n FTrimming := gttCharacter;\r\n FWordWrapping := False;\r\n FTextVisible := True;\r\n\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n\r\n FCompactPopup := TTMSFNCToolBarPopup.Create(Self);\r\n FCompactPopup.OnClosePopup := DoCloseCompactPopup;\r\n FCompactPopup.PlacementControl := Self;\r\n\r\n FCompactExpanderBitmaps.AddBitmapFromResource(TMSFNCGRAPHICSDOWN, HInstance, 1.0);\r\n FQuickMenuButtonBitmaps.AddBitmapFromResource(TMSFNCTOOLBARQUICKMENU, HInstance, 1.0); \r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DeactivateAllPopups;\r\nvar\r\n I: Integer;\r\nbegin\r\n {$IFDEF WEBLIB}\r\n if Assigned(Parent) and (Parent is TWinControl) then\r\n for I := 0 to (Parent as TWinControl).ControlCount - 1 do\r\n if (Parent as TWinControl).Controls[I] is TTMSFNCCustomToolBar then\r\n ((Parent as TWinControl).Controls[I] as TTMSFNCCustomToolBar).CloseCompactPopup;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if Assigned(Parent) and (Parent is TTMSFNCToolBarParent) then\r\n for I := 0 to (Parent as TTMSFNCToolBarParent).ControlCount - 1 do\r\n if (Parent as TTMSFNCToolBarParent).Controls[I] is TTMSFNCCustomToolBar then\r\n ((Parent as TTMSFNCToolBarParent).Controls[I] as TTMSFNCCustomToolBar).CloseCompactPopup;\r\n {$ENDIF}\r\nend;\r\n\r\ndestructor TTMSFNCCustomToolBar.Destroy;\r\nbegin\r\n FQuickMenuButtonBitmaps.Free;\r\n FCompactExpanderBitmaps.Free;\r\n FCompactPopup.Free;\r\n FQuickMenuButtonAppearance.Free;\r\n FCompactAppearance.Free;\r\n FCompactBitmaps.Free;\r\n FFont.Free;\r\n FOptionsMenu.Free;\r\n FAppearance.Free;\r\n FHiddenControls.Free;\r\n FCompactControls.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoCanShowOptionsMenuItem(AControl: TControl;\r\n var ACanShowItem: Boolean);\r\nbegin\r\n if Assigned(OnOptionsMenuItemCanShow) then\r\n OnOptionsMenuItemCanShow(Self, AControl, ACanShowItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoCloseCompactPopup(Sender: TObject);\r\nvar\r\n I: Integer;\r\n cc: TTMSFNCToolBarControl;\r\nbegin\r\n FCompactPopup.ContentControl := nil;\r\n\r\n for I := 0 to FCompactControls.Count - 1 do\r\n begin\r\n cc := TTMSFNCToolBarControl(FCompactControls[I]);\r\n if Assigned(cc.FControl) then\r\n begin\r\n if cc.FControl is TTMSFNCDefaultToolBarButton then\r\n (cc.FControl as TTMSFNCDefaultToolBarButton).Layout := cc.FLayout;\r\n\r\n cc.FControl.Parent := nil;\r\n cc.FControl.Visible := False;\r\n end;\r\n end;\r\n\r\n if Assigned(FCompactToolbar) then\r\n begin\r\n FCompactToolbar.Free;\r\n FCompactToolbar := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoCompactClick;\r\nbegin\r\n if Assigned(OnCompactClick) then\r\n OnCompactClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoCustomizeOptionsMenu;\r\nbegin\r\n if Assigned(OnOptionsMenuCustomize) then\r\n OnOptionsMenuCustomize(Self, FAutoOptionsMenu);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoCustomizeOptionsMenuItem(AControl: TControl; AMenuItem: TMenuItem);\r\nbegin\r\n if Assigned(OnOptionsMenuItemCustomize) then\r\n OnOptionsMenuItemCustomize(Self, AControl, AMenuItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoDragGripMoving(ADeltaX, ADeltaY: Double);\r\nbegin\r\n if Assigned(OnDragGripMoving) then\r\n OnDragGripMoving(Self, ADeltaX, ADeltaY);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoIsLastElement(AControl: TControl; var ALastElement: Boolean);\r\nbegin\r\n if Assigned(OnIsLastElement) then\r\n OnIsLastElement(Self, AControl, ALastElement);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.HandleQuickMenuButton;\r\nbegin\r\n if Assigned(OnQuickMenuButtonClick) then\r\n OnQuickMenuButtonClick(Self);\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.HasHint: Boolean;\r\nbegin\r\n Result := inherited HasHint;\r\n if FQuickMenuButtonHover then\r\n Result := QuickMenuButtonHint <> '';\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomToolBar.DoMatrixChanged(Sender: TObject);\r\nbegin\r\n inherited;\r\n UpdateDockPanel;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomToolBar.HandleMouseLeave;\r\nbegin\r\n inherited;\r\n FHover := False;\r\n FQuickMenuButtonHover := False;\r\n Cursor := crDefault;\r\n FInsideDrag := False;\r\n Invalidate;\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomToolBar.AlignControls(AControl: TControl; var Rect: TRect);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomToolBar.DoAddObject(const AObject: TFmxObject);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoInsertObject(Index: Integer;\r\n const AObject: TFmxObject);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoRealign;\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DoRemoveObject(const AObject: TFmxObject);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomToolBar.DrawDragGrip(AGraphics: TTMSFNCGraphics);\r\nvar\r\n cnt: Integer;\r\n\r\n procedure DrawDots(ARect: TRectF);\r\n var\r\n i: integer;\r\n rdg: TRectF;\r\n sz: Integer;\r\n begin\r\n if State = esLarge then\r\n sz := 3\r\n else\r\n sz := 2;\r\n\r\n ARect.Left := ARect.Left;\r\n ARect.Top := ARect.Top;\r\n cnt := Round(ARect.Bottom) div (Round(sz) * 2);\r\n for i := 1 to cnt do\r\n begin\r\n rdg := RectF(ARect.Left + ((ARect.Right - ARect.Left) - sz) / 2, ARect.Top + 1, ARect.Left + sz + ((ARect.Right - ARect.Left) - sz) / 2, ARect.Top + 1 + sz);\r\n rdg := RectF(int(rdg.Left), int(rdg.Top), int(rdg.Right), int(rdg.Bottom));\r\n AGraphics.DrawRectangle(rdg);\r\n ARect.Top := ARect.Top + sz * 2;\r\n end;\r\n end;\r\nvar\r\n r: TRectF;\r\nbegin\r\n AGraphics.Fill.Color := Appearance.DragGripColor;\r\n AGraphics.Fill.Kind := gfkSolid;\r\n r := GetDragGripRect;\r\n DrawDots(r);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DrawText(AGraphics: TTMSFNCGraphics);\r\nvar\r\n sz, h: Single;\r\n r: TRectF;\r\nbegin\r\n if TextVisible and (Text <> '') then\r\n begin\r\n sz := 0;\r\n if Appearance.DragGrip then\r\n begin\r\n if State = esLarge then\r\n sz := 3\r\n else\r\n sz := 2;\r\n end;\r\n\r\n r := LocalRect;\r\n r := RectF(r.Left + sz, r.Top, r.Right, r.Bottom);\r\n InflateRectEx(r, -2, -2);\r\n\r\n AGraphics.Font.Assign(Font);\r\n\r\n h := GetTextSize.cy;\r\n\r\n r := RectF(r.Left, r.Bottom - h, r.Right, r.Bottom);\r\n AGraphics.DrawText(r, Text, WordWrapping, HorizontalTextAlign, VerticalTextAlign, Trimming);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.DropDownActive: Boolean;\r\nvar\r\n I: Integer;\r\n c: TControl;\r\nbegin\r\n Result := False;\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n if c is TTMSFNCDefaultToolBarButton then\r\n begin\r\n if Assigned((c as TTMSFNCDefaultToolBarButton).FPopup) then\r\n begin\r\n Result := (c as TTMSFNCDefaultToolBarButton).FPopup.IsOpen;\r\n if Result then\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := FBitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetBitmapPickerClass: TTMSFNCToolBarBitmapPickerClass;\r\nbegin\r\n Result := TTMSFNCToolBarBitmapPicker;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetCompactBitmapRect(ARect: TRectF): TRectF;\r\nvar\r\n r: TRectF;\r\n bs: Single;\r\nbegin\r\n r := ARect;\r\n Result := RectF(r.Left, r.Top, r.Right, r.Top);\r\n if CompactBitmapVisible then\r\n begin\r\n bs := GetCompactBitmapSize;\r\n if not TextVisible or (Text = '') then\r\n begin\r\n Result := RectF(r.Left + 3, r.Top + 3, r.Right - 3, r.Bottom - 3);\r\n if (bs <> -1) then\r\n begin\r\n Result.Left := Round(r.Left + ((r.Right - r.Left) - bs) / 2);\r\n Result.Top := Round(r.Top + ((r.Bottom - r.Top) - bs) / 2);\r\n Result.Right := Result.Left + bs;\r\n Result.Bottom := Result.Top + bs;\r\n end;\r\n end\r\n else if TextVisible and not (Text = '') then\r\n Result := RectF(r.Left + 3, r.Top + 3, r.Right - 3, r.Top + bs);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetCompactBitmapSize: Single;\r\nvar\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n Result := CompactBitmapSize;\r\n if CompactAutoBitmapSize then\r\n begin\r\n bmp := TTMSFNCGraphics.GetScaledBitmap(CompactBitmaps, 0, BitmapContainer);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n Result := Max(bmp.Height, bmp.Width);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetColorPickerClass: TTMSFNCToolBarColorPickerClass;\r\nbegin\r\n Result := TTMSFNCToolBarColorPicker;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetCompactControl(\r\n AControl: TControl): TTMSFNCToolBarControl;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to FCompactControls.Count - 1 do\r\n begin\r\n if TTMSFNCToolBarControl(FCompactControls[I]).FControl = AControl then\r\n begin\r\n Result := TTMSFNCToolBarControl(FCompactControls[I]);\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetCompactControlCount: Integer;\r\nbegin\r\n Result := FCompactControls.Count;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetDragGripRect(AInteraction: Boolean = False): TRectF;\r\nvar\r\n r: TRectF;\r\n f: Single;\r\nbegin\r\n r := LocalRect;\r\n f := 1;\r\n if State = esLarge then\r\n f := 1.75;\r\n\r\n if AInteraction then\r\n Result := RectF(r.Left, r.Top, r.Left + (8 * f), r.Bottom)\r\n else\r\n Result := RectF(r.Left + 3, r.Top + 3, r.Left + (6 * f), r.Bottom - 3);\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetFontNamePickerClass: TTMSFNCToolBarFontNamePickerClass;\r\nbegin\r\n Result := TTMSFNCToolBarFontNamePicker;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetFontSizePickerClass: TTMSFNCToolBarFontSizePickerClass;\r\nbegin\r\n Result := TTMSFNCToolBarFontSizePicker;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetHiddenControl(\r\n AControl: TControl): TTMSFNCToolBarControl;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to FHiddenControls.Count - 1 do\r\n begin\r\n if TTMSFNCToolBarControl(FHiddenControls[I]).FControl = AControl then\r\n begin\r\n Result := TTMSFNCToolBarControl(FHiddenControls[I]);\r\n Break;\r\n end;\r\n end; \r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetHiddenControlCount(\r\n AControl: TControl): Integer;\r\nvar\r\n I: Integer;\r\n lst: TTMSFNCToolBarControlList;\r\nbegin\r\n lst := TTMSFNCToolBarControlList.Create;\r\n for I := 0 to FHiddenControls.Count - 1 do\r\n lst.Add(FHiddenControls[I]);\r\n\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n lst.Sort(FCompareHiddenControls);\r\n {$ENDIF}\r\n {$ENDIF}\r\n Result := 0;\r\n for I := 0 to lst.Count - 1 do\r\n begin\r\n if TTMSFNCToolBarControl(lst[I]).FControl = AControl then\r\n Break\r\n else\r\n Inc(Result);\r\n end;\r\n lst.Free;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetHintString: String;\r\nbegin\r\n Result := inherited GetHintString;\r\n if FQuickMenuButtonHover then\r\n Result := QuickMenuButtonHint\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetItemPickerClass: TTMSFNCToolBarItemPickerClass;\r\nbegin\r\n Result := TTMSFNCToolBarItemPicker;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetOptionsMenuButtonClass: TTMSFNCToolBarDropDownButtonClass;\r\nbegin\r\n Result := TTMSFNCToolBarDropDownButton;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetOptionsMenuButtonControl: TTMSFNCToolBarDropDownButton;\r\nbegin\r\n Result := FOptionsMenuButton;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetQuickMenuButtonRect: TRectF;\r\nbegin\r\n Result := RectF(Width - 16, Height - 16, Width, Height);\r\n if Appearance.Separator then\r\n begin\r\n Result.Left := Result.Left - Appearance.SeparatorStroke.Width;\r\n Result.Right := Result.Right - Appearance.SeparatorStroke.Width;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetCompactTextRect: TRectF;\r\nvar\r\n bmpr: TRectF;\r\n r: TRectF;\r\nbegin\r\n r := LocalRect;\r\n bmpr := GetCompactBitmapRect(r);\r\n Result := RectF(r.Left + 3, bmpr.Bottom + 3, r.Right - 3, r.Bottom - 23)\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetTextSize: TSizeF;\r\nvar\r\n g: TTMSFNCGraphics;\r\n sz: Single;\r\n r: TRectF;\r\nbegin\r\n Result.cx := 0;\r\n Result.cy := 0;\r\n if TextVisible and (Text <> '') then\r\n begin\r\n g := TTMSFNCGraphics.CreateBitmapCanvas(1, 1, NativeCanvas);\r\n g.BitmapContainer := BitmapContainer;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n try\r\n sz := 0;\r\n if Appearance.DragGrip then\r\n begin\r\n if State = esLarge then\r\n sz := 3\r\n else\r\n sz := 2;\r\n end;\r\n\r\n r := LocalRect;\r\n r := RectF(r.Left + sz, r.Top, r.Right, r.Bottom);\r\n InflateRectEx(r, -2, -2);\r\n Result := g.CalculateTextSize(Text, r, WordWrapping);\r\n finally\r\n g.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetToolBarButtonClass: TTMSFNCToolBarButtonClass;\r\nbegin\r\n Result := TTMSFNCToolBarButton;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetToolBarSeparatorClass: TTMSFNCToolBarSeparatorClass;\r\nbegin\r\n Result := TTMSFNCToolBarSeparator;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.UpdateToolBar(Sender: TObject);\r\nbegin\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.UpdateToolBarControl(Sender: TObject);\r\nvar\r\n tb: TTMSFNCToolBarControl;\r\n bmp: TTMSFNCBitmap;\r\n c: TControl;\r\n tc: TControl;\r\n tci: Integer;\r\nbegin\r\n if not Assigned(Sender) then\r\n Exit;\r\n\r\n FBlockUpdate := True;\r\n\r\n c := Sender as TControl;\r\n\r\n tb := GetHiddenControl(c);\r\n if Assigned(tb) then\r\n begin\r\n tc := tb.FControl;\r\n tci := Max(0, Min(ControlCount, tb.FControlIndex - GetHiddenControlCount(tc)));\r\n FHiddenControls.Remove(tb);\r\n InsertToolBarControl(tc, tci);\r\n tc.Visible := True;\r\n end\r\n else\r\n begin\r\n tb := TTMSFNCToolBarControl.Create;\r\n\r\n if c is TTMSFNCCustomToolBarElement then\r\n tb.FControlIndex := (c as TTMSFNCCustomToolBarElement).ControlIndex\r\n else\r\n tb.FControlIndex := c.Tag;\r\n\r\n tb.FControl := c;\r\n FBlockUpdate := True;\r\n {$IFDEF WEBLIB}\r\n bmp := TTMSFNCBitmap(c.MakeScreenshot);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n bmp := c.MakeScreenshot;\r\n {$ENDIF}\r\n FBlockUpdate := False;\r\n tb.FBitmap.Assign(bmp);\r\n bmp.Free;\r\n FHiddenControls.Add(tb);\r\n c.Parent := nil;\r\n c.Visible := False;\r\n end;\r\n\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.InitializeOptionsMenu;\r\n{$IFDEF WEBLIB}\r\nbegin\r\n{$ENDIF}\r\n{$IFNDEF WEBLIB}\r\nvar\r\n mnu: TTMSFNCToolBarOptionMenuItem;\r\n bmp: TTMSFNCBitmap;\r\n I: Integer;\r\n c: TControl;\r\n lst: TTMSFNCControlList;\r\n tb: TTMSFNCToolBarControl;\r\n sh: Boolean;\r\n bmpw, bw, bh: Single;\r\n {$IFDEF FMXLIB}\r\n o: TFmxObject;\r\n {$ENDIF}\r\n maxh: Single;\r\nbegin\r\n lst := nil;\r\n try\r\n lst := TTMSFNCControlList.Create;\r\n for I := 0 to Self.ControlCount - 1 do\r\n lst.Add(Controls[I]);\r\n\r\n for I := 0 to FHiddenControls.Count - 1 do\r\n lst.Add(TTMSFNCToolBarControl(FHiddenControls[I]).FControl);\r\n\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n lst.Sort(FCompareControls);\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n FAutoOptionsMenu.Clear;\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n FAutoOptionsMenu.Items.Clear;\r\n {$ENDIF}\r\n\r\n FTotalOptionsMenuWidth := 0;\r\n\r\n for I := 0 to lst.Count - 1 do\r\n begin\r\n c := TControl(lst[I]);\r\n\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if not (c = FOptionsMenuButton) and not (c is TTMSFNCCustomToolBarSeparator) then\r\n begin\r\n sh := True;\r\n DoCanShowOptionsMenuItem(c, sh);\r\n if sh then\r\n begin\r\n mnu := TTMSFNCToolBarOptionMenuItem.Create(FAutoOptionsMenu);\r\n mnu.OnClick := OptionMenuItemClick;\r\n {$IFDEF FMXLIB}\r\n mnu.OnApplyStyleLookup := OptionMenuItemApplyStyleLookup;\r\n mnu.Calculate := True;\r\n mnu.ApplyStyleLookup;\r\n {$ENDIF}\r\n\r\n bmpw := 0;\r\n bw := 0;\r\n bh := 0;\r\n {$IFDEF FMXLIB}\r\n o := mnu.FindStyleResource('checkmark');\r\n if Assigned(o) and (o is TControl) then\r\n bmpw := (o as TControl).Width;\r\n {$ENDIF}\r\n\r\n maxh := 20;\r\n if OptionsMenu.ShowItemBitmap then\r\n begin\r\n tb := GetHiddenControl(c);\r\n if Assigned(tb) then\r\n begin\r\n bmp := tb.FBitmap;\r\n mnu.Bitmap.Assign(bmp);\r\n bw := bmp.Width;\r\n bh := bmp.Height;\r\n end\r\n else\r\n begin\r\n FBlockUpdate := True;\r\n bmp := c.MakeScreenshot;\r\n FBlockUpdate := False;\r\n mnu.Bitmap.Assign(bmp);\r\n bw := bmp.Width;\r\n bh := bmp.Height;\r\n bmp.Free;\r\n end;\r\n end;\r\n\r\n TTMSFNCGraphics.GetAspectSize(bw, bh, bw, bh, bw, maxh, True, False, False);\r\n bmpw := bmpw + int(bw);\r\n\r\n if OptionsMenu.ShowItemText then\r\n begin\r\n if c is TTMSFNCCustomToolBarButton then\r\n mnu.Text := (c as TTMSFNCCustomToolBarButton).AutoOptionsMenuText;\r\n\r\n if mnu.Text = '' then\r\n mnu.Text := c.Name;\r\n end;\r\n\r\n mnu.Control := c;\r\n mnu.IsChecked := Assigned(c.Parent);\r\n\r\n DoCustomizeOptionsMenuItem(c, mnu);\r\n\r\n {$IFDEF FMXLIB}\r\n FAutoOptionsMenu.AddObject(mnu);\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n FAutoOptionsMenu.Items.Add(mnu);\r\n {$ENDIF}\r\n FTotalOptionsMenuWidth := Max(FTotalOptionsMenuWidth, bmpw);\r\n end;\r\n end;\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n for I := 0 to FAutoOptionsMenu.ItemsCount - 1 do\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n for I := 0 to FAutoOptionsMenu.Items.Count - 1 do\r\n {$ENDIF}\r\n begin\r\n if FAutoOptionsMenu.Items[I] is TTMSFNCToolBarOptionMenuItem then\r\n begin\r\n mnu := (FAutoOptionsMenu.Items[I] as TTMSFNCToolBarOptionMenuItem);\r\n {$IFDEF FMXLIB}\r\n mnu.NeedStyleLookup;\r\n mnu.Calculate := False;\r\n {$ENDIF}\r\n if OptionsMenu.AutoItemBitmapWidth then\r\n mnu.GlyphWidth := FTotalOptionsMenuWidth\r\n else\r\n mnu.GlyphWidth := OptionsMenu.ItemBitmapWidth;\r\n end;\r\n end;\r\n\r\n finally\r\n if Assigned(lst) then\r\n lst.Free;\r\n end;\r\n{$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.InsertToolBarControl(AControl: TControl;\r\n AIndex: Integer);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if (AIndex >= 0) and (AIndex <= Self.ControlCount - 1) then\r\n InsertObject(AIndex, AControl)\r\n else\r\n AddObject(AControl);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n AControl.Parent := Self;\r\n if AIndex > -1 then\r\n SetChildOrder(AControl, AIndex);\r\n {$ENDIF}\r\n\r\n if Assigned(OnInternalInsertControl) then\r\n OnInternalInsertControl(AControl);\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.IsCompactBitmapSizeStored: Boolean;\r\nbegin\r\n Result := CompactBitmapSize <> 24;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.IsCompactWidthStored: Boolean;\r\nbegin\r\n Result := CompactWidth <> 50;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBar.IsMinimumWidthStored: Boolean;\r\nbegin\r\n Result := MinimumWidth <> 30;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.HandleCompact;\r\nvar\r\n I: Integer;\r\n cc: TTMSFNCToolBarControl;\r\nbegin\r\n inherited;\r\n\r\n DeactivateAllPopups;\r\n\r\n if Assigned(FCompactToolbar) then\r\n begin\r\n FCompactToolbar.Free;\r\n FCompactToolbar := nil;\r\n end;\r\n\r\n FCompactToolbar := TTMSFNCCustomToolBar.Create(FCompactPopup);\r\n FCompactToolbar.Assign(Self);\r\n FCompactToolbar.Compact := False;\r\n FCompactToolbar.AutoSize := True;\r\n FCompactToolbar.AutoHeight := False;\r\n FCompactToolbar.AutoWidth := True;\r\n FCompactToolbar.AutoStretchHeight := False;\r\n FCompactToolbar.Appearance.Separator := False;\r\n FCompactToolbar.SetControlMargins(1, 1, 1, 1);\r\n FCompactToolbar.Height := Height + 2;\r\n\r\n for I := FCompactControls.Count - 1 downto 0 do\r\n begin\r\n cc := TTMSFNCToolBarControl(FCompactControls[I]);\r\n if Assigned(cc.FControl) then\r\n begin\r\n if cc.FControl is TTMSFNCDefaultToolBarButton then\r\n (cc.FControl as TTMSFNCDefaultToolBarButton).Layout := (cc.FControl as TTMSFNCDefaultToolBarButton).CompactLayout;\r\n cc.FControl.Visible := True;\r\n cc.FControl.Parent := FCompactToolbar;\r\n end;\r\n end;\r\n\r\n FCompactToolbar.UpdateControls;\r\n FCompactPopup.ContentControl := FCompactToolbar;\r\n FCompactPopup.Activate;\r\n DoCompactClick;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.HandleDblClick(X, Y: Single);\r\nbegin\r\n inherited;\r\n if Assigned(OnInternalDblClick) then\r\n OnInternalDblClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n if Appearance.DragGrip and not FDragGripMoving then\r\n begin\r\n FDragGripDown := PtInRectEx(GetDragGripRect(True), PointF(X, Y));\r\n FDragGripDownPt := PointF(X, Y);\r\n end;\r\n\r\n if not FDragGripDown then\r\n begin\r\n if Compact then\r\n begin\r\n FDown := True;\r\n Invalidate;\r\n CaptureEx;\r\n end\r\n else if QuickMenuButton then\r\n begin\r\n FQuickMenuButtonDown := PtInRectEx(GetQuickMenuButtonRect, PointF(X, Y));\r\n if FQuickMenuButtonDown then\r\n begin\r\n Invalidate;\r\n CaptureEx;\r\n end; \r\n end;\r\n end;\r\n\r\n if Assigned(OnInternalMouseDown) and not (Button = TTMSFNCMouseButton.mbRight) then\r\n OnInternalMouseDown(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.HandleMouseMove(Shift: TShiftState; X, Y: Single);\r\nvar\r\n r: TRectF;\r\n absx, absy: Single;\r\n pt: TPointF;\r\n d: TTMSFNCCustomDockPanel;\r\nbegin\r\n inherited;\r\n\r\n if Compact then\r\n begin\r\n FHoverP := FHover;\r\n FHover := True;\r\n if FHover <> FHoverP then\r\n Invalidate;\r\n end\r\n else if QuickMenuButton then\r\n begin\r\n FQuickMenuButtonHoverP := FQuickMenuButtonHover;\r\n FQuickMenuButtonHover := PtInRectEx(GetQuickMenuButtonRect, PointF(X, Y));\r\n if FQuickMenuButtonHover <> FQuickMenuButtonHoverP then\r\n Invalidate;\r\n end;\r\n\r\n if Appearance.DragGrip then\r\n begin\r\n if FDragGripDown then\r\n begin\r\n if not FDragGripMoving then\r\n begin\r\n CaptureEx;\r\n FDragGripMoving := True;\r\n end;\r\n\r\n if FDragGripMoving then\r\n begin\r\n absx := (FDragGripDownPt.X - X);\r\n absy := (FDragGripDownPt.Y - Y);\r\n if AutoMoveToolBar then\r\n begin\r\n {$IFDEF FMXLIB}\r\n pt := PointF(Position.Point.X - absx, Position.Point.Y - absy);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n pt := PointF(Left - absx, Top - absy);\r\n {$ENDIF}\r\n\r\n if Parent is TTMSFNCCustomDockPanel then\r\n begin\r\n d := Parent as TTMSFNCCustomDockPanel;\r\n if d.AutoAlign then\r\n begin\r\n if pt.Y < d.Appearance.Margins.Top then\r\n pt.Y := Round(d.Appearance.Margins.Top);\r\n if pt.X < d.Appearance.Margins.Left then\r\n pt.X := Round(d.Appearance.Margins.Left)\r\n else if pt.X + Width > d.Width - d.Appearance.Margins.Right then\r\n pt.X := Round(d.Width - d.Appearance.Margins.Right - Width);\r\n\r\n SetBounds(Round(pt.X), Round(pt.Y), Width, Height);\r\n end;\r\n end;\r\n end;\r\n FDragGripDownPt := PointF(X + absx, Y + absy);\r\n DoDragGripMoving(absx, absy);\r\n end;\r\n end\r\n else\r\n begin\r\n r := GetDragGripRect(True);\r\n if PtInRectEx(r, PointF(X, Y)) then\r\n begin\r\n if not FInsideDrag then\r\n begin\r\n FInsideDrag := True;\r\n Cursor := crSize;\r\n end;\r\n end\r\n else if FInsideDrag then\r\n begin\r\n FInsideDrag := False;\r\n Cursor := crDefault;\r\n end;\r\n end;\r\n end;\r\n\r\n if Assigned(OnInternalMouseMove) then\r\n OnInternalMouseMove(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState;\r\n X, Y: Single);\r\nbegin\r\n inherited;\r\n if FDragGripDown then\r\n ReleaseCaptureEx\r\n else if FDown and Compact then\r\n begin\r\n Invalidate;\r\n ReleaseCaptureEx;\r\n HandleCompact;\r\n end\r\n else if FQuickMenuButtonDown and QuickMenuButton and not Compact then\r\n begin\r\n Invalidate;\r\n ReleaseCaptureEx;\r\n HandleQuickMenuButton;\r\n end; \r\n\r\n FDragGripDown := False;\r\n FDragGripMoving := False;\r\n FDown := False;\r\n FQuickMenuButtonDown := False;\r\n\r\n if Assigned(OnInternalMouseUp) and not (Button = TTMSFNCMouseButton.mbRight) then\r\n OnInternalMouseUp(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FBitmapContainer) then\r\n FBitmapContainer := nil;\r\n\r\n if (Operation = opRemove) and (AComponent = FCustomOptionsMenu) then\r\n FCustomOptionsMenu := nil;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomToolBar.OptionMenuItemApplyStyleLookup(Sender: TObject);\r\nvar\r\n c: TControl;\r\nbegin\r\n c := nil;\r\n if (Sender is TTMSFNCToolBarOptionMenuItem) then\r\n c := (Sender as TTMSFNCToolBarOptionMenuItem).FControl;\r\n\r\n if Assigned(OnOptionsMenuItemApplyStyle) and (Sender is TMenuItem) then\r\n OnOptionsMenuItemApplyStyle(Self, c, Sender as TMenuItem);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomToolBar.OptionMenuItemClick(Sender: TObject);\r\nvar\r\n a: Boolean;\r\n c: TControl;\r\nbegin\r\n a := True;\r\n c := nil;\r\n if (Sender is TTMSFNCToolBarOptionMenuItem) then\r\n c := (Sender as TTMSFNCToolBarOptionMenuItem).FControl;\r\n\r\n if Assigned(OnOptionsMenuItemClick) and (Sender is TMenuItem) then\r\n OnOptionsMenuItemClick(Self, c, Sender as TMenuItem, a);\r\n\r\n if a then\r\n UpdateToolBarControl(c);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.OptionsButtonClick(Sender: TObject);\r\nvar\r\n pt: TPointF;\r\nbegin\r\n if Assigned(OnOptionsMenuButtonClick) then\r\n OnOptionsMenuButtonClick(Self)\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n pt := FOptionsMenuButton.Position.Point;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n pt := PointF(FOptionsMenuButton.Left, FOptionsMenuButton.Top);\r\n {$ENDIF}\r\n pt := LocalToScreenEx(PointF(pt.X, pt.Y + FOptionsMenuButton.Height));\r\n ShowOptionsMenu(pt.X, pt.Y);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.QuickMenuButtonAppearanceChanged(\r\n Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.QuickMenuButtonBitmapsChanged(\r\n Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.ResetToDefaultStyle;\r\nbegin\r\n inherited;\r\n Appearance.DragGripColor := gcLightgray;\r\n Appearance.Fill.Color := gcWhite;\r\n Appearance.Stroke.Color := gcGray;\r\n Appearance.Fill.Kind := gfkGradient;\r\n Appearance.Stroke.Kind := gskSolid;\r\n Appearance.Fill.Color := gcWhite;\r\n Appearance.Fill.ColorTo := MakeGraphicsColor(230, 230, 230);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n qr, r: TRectF;\r\n w: Single; \r\nbegin\r\n inherited;\r\n\r\n r := LocalRect;\r\n\r\n if Compact then\r\n begin\r\n if FDown then\r\n begin\r\n AGraphics.Fill.Assign(CompactAppearance.DownFill);\r\n AGraphics.Stroke.Assign(CompactAppearance.DownStroke);\r\n end\r\n else if FHover then\r\n begin\r\n AGraphics.Fill.Assign(CompactAppearance.HoverFill);\r\n AGraphics.Stroke.Assign(CompactAppearance.HoverStroke);\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(CompactAppearance.NormalFill);\r\n AGraphics.Stroke.Assign(CompactAppearance.NormalStroke);\r\n end;\r\n\r\n if CompactAppearance.FlatStyle then\r\n AGraphics.Fill.Kind := gfkSolid;\r\n\r\n AGraphics.DrawRectangle(RectF(r.Left, r.Top + 2, r.Right - 3, r.Bottom - 2));\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(Appearance.Fill);\r\n AGraphics.Stroke.Assign(Appearance.Stroke);\r\n\r\n if Appearance.FlatStyle then\r\n AGraphics.Fill.Kind := gfkSolid;\r\n\r\n AGraphics.DrawRectangle(r);\r\n end;\r\n\r\n if Compact then\r\n begin\r\n DrawCompactBitmap(AGraphics, ARect);\r\n DrawCompactText(AGraphics);\r\n DrawCompactExpander(AGraphics);\r\n end\r\n else\r\n begin\r\n if Appearance.DragGrip then\r\n DrawDragGrip(AGraphics);\r\n\r\n DrawText(AGraphics);\r\n\r\n if QuickMenuButton then\r\n begin\r\n if FQuickMenuButtonDown then\r\n begin\r\n AGraphics.Fill.Assign(QuickMenuButtonAppearance.DownFill);\r\n AGraphics.Stroke.Assign(QuickMenuButtonAppearance.DownStroke);\r\n end\r\n else if FQuickMenuButtonHover then\r\n begin\r\n AGraphics.Fill.Assign(QuickMenuButtonAppearance.HoverFill);\r\n AGraphics.Stroke.Assign(QuickMenuButtonAppearance.HoverStroke);\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(QuickMenuButtonAppearance.NormalFill);\r\n AGraphics.Stroke.Assign(QuickMenuButtonAppearance.NormalStroke);\r\n end;\r\n\r\n if QuickMenuButtonAppearance.FlatStyle then\r\n AGraphics.Fill.Kind := gfkSolid;\r\n \r\n qr := GetQuickMenuButtonRect;\r\n AGraphics.DrawRectangle(qr);\r\n\r\n InflateRectEx(qr, -2, -2);\r\n AGraphics.DrawScaledBitmap(qr, QuickMenuButtonBitmaps); \r\n end;\r\n end;\r\n\r\n if Appearance.Separator then\r\n begin\r\n AGraphics.Stroke.Assign(Appearance.SeparatorStroke);\r\n w := Appearance.SeparatorStroke.Width;\r\n AGraphics.DrawLine(PointF(r.Right - w, r.Top + 4), PointF(r.Right - w, r.Bottom - 4));\r\n end;\r\n\r\n if IsDesignTime and CanDrawDesignTime then\r\n AGraphics.DrawFocusRectangle(ARect, gcBlack);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DrawCompactBitmap(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := GetCompactBitmapRect(ARect);\r\n AGraphics.BitmapContainer := BitmapContainer;\r\n AGraphics.DrawScaledBitmap(r, CompactBitmaps)\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DrawCompactExpander(AGraphics: TTMSFNCGraphics);\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := LocalRect;\r\n r := RectF(r.Left, r.Bottom - 20, r.Right, r.Bottom);\r\n InflateRectEx(r, -2, -2);\r\n AGraphics.DrawScaledBitmap(r, CompactExpanderBitmaps);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.DrawCompactText(AGraphics: TTMSFNCGraphics);\r\nvar\r\n tr: TRectF;\r\n st: TTMSFNCGraphicsSaveState;\r\nbegin\r\n if not TextVisible or (Text = '') then\r\n Exit;\r\n\r\n tr := GetCompactTextRect;\r\n st := AGraphics.SaveState;\r\n try\r\n AGraphics.ClipRect(tr);\r\n AGraphics.Font.Assign(Font);\r\n AGraphics.DrawText(tr, Text, WordWrapping, HorizontalTextAlign, VerticalTextAlign, Trimming);\r\n finally\r\n AGraphics.RestoreState(st);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.UncompactControls;\r\nvar\r\n I: Integer;\r\n cc: TTMSFNCToolBarControl;\r\n c: TControl;\r\nbegin\r\n FBlockUpdate := True;\r\n for I := FCompactControls.Count - 1 downto 0 do\r\n begin\r\n cc := TTMSFNCToolBarControl(FCompactControls[I]);\r\n c := cc.FControl;\r\n if Assigned(c) then\r\n begin\r\n if c is TTMSFNCCustomToolBarElement then\r\n (c as TTMSFNCCustomToolBarElement).FBlockUpdate := True;\r\n c.Parent := Self;\r\n c.Visible := True;\r\n if c is TTMSFNCCustomToolBarElement then\r\n (c as TTMSFNCCustomToolBarElement).FBlockUpdate := False;\r\n end;\r\n end;\r\n\r\n FBlockUpdate := False;\r\n UpdateControls;\r\n\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n UpdateDockPanel;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetAppearance(\r\n const Value: TTMSFNCToolBarAppearance);\r\nbegin\r\n FAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetOptionsMenu(\r\n const Value: TTMSFNCToolBarOptionsMenu);\r\nbegin\r\n FOptionsMenu.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetQuickMenuButton(const Value: Boolean);\r\nbegin\r\n if FQuickMenuButton <> Value then\r\n begin\r\n FQuickMenuButton := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetQuickMenuButtonAppearance(\r\n const Value: TTMSFNCToolBarQuickMenuButtonAppearance);\r\nbegin\r\n FQuickMenuButtonAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetQuickMenuButtonBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FQuickMenuButtonBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetState(const Value: TTMSFNCToolBarElementState);\r\nvar\r\n I: Integer;\r\n c: TControl;\r\nbegin\r\n if FState <> Value then\r\n begin\r\n FState := Value;\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n if c is TTMSFNCCustomToolBarElement then\r\n (c as TTMSFNCCustomToolBarElement).State := FState;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetText(const Value: string);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetTextVisible(const Value: Boolean);\r\nbegin\r\n if FTextVisible <> Value then\r\n begin\r\n FTextVisible := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetAutoAlign(const Value: Boolean);\r\nbegin\r\n if FAutoAlign <> Value then\r\n begin\r\n FAutoAlign := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetAutoHeight(const Value: Boolean);\r\nbegin\r\n if FAutoHeight <> Value then\r\n begin\r\n FAutoHeight := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetAutoStretchHeight(const Value: Boolean);\r\nbegin\r\n if FAutoStretchHeight <> Value then\r\n begin\r\n FAutoStretchHeight := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetAutoWidth(const Value: Boolean);\r\nbegin\r\n if FAutoWidth <> Value then\r\n begin\r\n FAutoWidth := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nvar\r\n I: Integer;\r\n {$IFDEF FNCLIB}\r\n c: TControl;\r\n b: ITMSFNCBitmapContainer;\r\n {$ENDIF}\r\nbegin\r\n FBitmapContainer := Value;\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n {$IFDEF FNCLIB}\r\n {$IFNDEF WEBLIB}\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF FNCLIB}\r\n if Supports(c, ITMSFNCBitmapContainer, b) then\r\n b.BitmapContainer := Value;\r\n {$ENDIF}\r\n end;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCanCompact(const Value: Boolean);\r\nbegin\r\n if FCanCompact <> Value then\r\n FCanCompact := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompact(const Value: Boolean);\r\nbegin\r\n if FCompact <> Value then\r\n begin\r\n if CanCompact then\r\n begin\r\n FCompact := Value;\r\n if Compact then\r\n begin\r\n FOldMenuButtonState := OptionsMenu.ShowButton;\r\n OptionsMenu.ShowButton := False;\r\n FOldWidth := Width;\r\n CompactControls;\r\n Width := Round(CompactWidth);\r\n end\r\n else\r\n begin\r\n Width := Round(FOldWidth);\r\n UncompactControls;\r\n OptionsMenu.ShowButton := FOldMenuButtonState;\r\n end;\r\n\r\n UpdateControls;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompactAppearance(\r\n const Value: TTMSFNCToolBarCompactAppearance);\r\nbegin\r\n FCompactAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompactAutoBitmapSize(const Value: Boolean);\r\nbegin\r\n if FCompactAutoBitmapSize <> Value then\r\n begin\r\n FCompactAutoBitmapSize := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompactBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FCompactBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompactBitmapSize(const Value: Single);\r\nbegin\r\n if FCompactBitmapSize <> Value then\r\n begin\r\n FCompactBitmapSize := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompactBitmapVisible(const Value: Boolean);\r\nbegin\r\n if FCompactBitmapVisible <> Value then\r\n begin\r\n FCompactBitmapVisible := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompactExpanderBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FCompactExpanderBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetCompactWidth(const Value: Single);\r\nbegin\r\n if FCompactWidth <> Value then\r\n begin\r\n FCompactWidth := Value;\r\n if Compact then\r\n Width := Round(CompactWidth);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetMinimumWidth(const Value: Single);\r\nbegin\r\n if FMinimumWidth <> Value then\r\n begin\r\n FMinimumWidth := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.SetAS(const Value: Boolean);\r\nbegin\r\n if FAutoSize <> Value then\r\n begin\r\n FAutoSize := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomToolBar.SetVisible(const Value: Boolean);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomToolBar.VisibleChanging;\r\n{$ENDIF}\r\nbegin\r\n inherited;\r\n UpdateDockPanel;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.ShowOptionsMenu(X, Y: Single);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if not Assigned(CustomOptionsMenu) then\r\n begin\r\n InitializeOptionsMenu;\r\n DoCustomizeOptionsMenu;\r\n if FAutoOptionsMenu.ItemsCount > 0 then\r\n FAutoOptionsMenu.Popup(X, Y);\r\n end\r\n else\r\n CustomOptionsMenu.Popup(X, Y);\r\n {$ENDIF}\r\n {$IFDEF CMNLIB}\r\n if not Assigned(CustomOptionsMenu) then\r\n begin\r\n InitializeOptionsMenu;\r\n DoCustomizeOptionsMenu;\r\n if FAutoOptionsMenu.Items.Count > 0 then\r\n FAutoOptionsMenu.Popup(Round(X), Round(Y));\r\n end\r\n else\r\n CustomOptionsMenu.Popup(Round(X), Round(Y));\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.UpdateControls;\r\nvar\r\n I: Integer;\r\n c: TControl;\r\n idx: Integer;\r\n fu: Boolean;\r\n hc: TTMSFNCToolBarControl;\r\n {$IFDEF FMXLIB}\r\n maxx, x, w, y, h, hs, hsm, vs, xs, ys, txth, txtw: Single;\r\n mgr: TBounds;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n maxx, x, w, y, h, hs, hsm, vs, xs, ys, txth, txtw: Integer;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n mgr: TControlBorderSpacing;\r\n {$ENDIF}\r\n {$IFDEF VCLWEBLIB}\r\n mgr: TMargins;\r\n {$ENDIF}\r\n l: Boolean;\r\n {$IFDEF FNCLIB}\r\n ia: ITMSFNCAdaptToStyle;\r\n {$ENDIF}\r\n sz: TSizeF;\r\n cn: TControl;\r\n lm, tm, rm, bm: Single;\r\n\r\n function GetControl(AIndex: Integer): TControl;\r\n begin\r\n Result := nil;\r\n\r\n if (AIndex >= 0) and (AIndex <= Self.ControlCount - 1) then\r\n begin\r\n if Self.Controls[AIndex].Visible then\r\n begin\r\n Result := Self.Controls[AIndex];\r\n Exit;\r\n end;\r\n end;\r\n\r\n while (AIndex >= 0) and (AIndex <= Self.ControlCount - 1) do\r\n begin\r\n Inc(AIndex);\r\n if (AIndex >= 0) and (AIndex <= Self.ControlCount - 1) then\r\n begin\r\n if Self.Controls[AIndex].Visible then\r\n begin\r\n Result := Self.Controls[AIndex];\r\n Exit;\r\n end;\r\n end;\r\n end;\r\n end;\r\nbegin\r\n if FBlockUpdate or FBlockResize or IsLoading or IsDestroying or not CanBuildControls then\r\n Exit;\r\n\r\n FBlockUpdate := True;\r\n {$IFDEF FMXLIB}\r\n hs := Appearance.HorizontalSpacing;\r\n vs := Appearance.VerticalSpacing;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n hs := Round(Appearance.HorizontalSpacing);\r\n vs := Round(Appearance.VerticalSpacing);\r\n {$ENDIF}\r\n\r\n x := hs;\r\n if Appearance.DragGrip then\r\n begin\r\n {$IFDEF FMXLIB}\r\n x := x + GetDragGripRect.Right;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n x := x + Round(GetDragGripRect.Right);\r\n {$ENDIF}\r\n if hs = 0 then\r\n x := x + 3;\r\n end;\r\n\r\n y := vs;\r\n\r\n xs := x;\r\n ys := y;\r\n\r\n hsm := 30;\r\n txth := 0;\r\n txtw := 0;\r\n sz := GetTextSize;\r\n if sz.cy > 0 then\r\n txth := Round(sz.cy + 4);\r\n\r\n if sz.cx > 0 then\r\n txtw := Round(sz.cx + 8);\r\n\r\n w := txtw;\r\n maxx := 0;\r\n h := 0;\r\n idx := 0;\r\n\r\n fu := False;\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n hc := GetHiddenControl(c);\r\n fu := not Assigned(hc);\r\n if fu then\r\n Break;\r\n end;\r\n\r\n l := False;\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n {$IFDEF FNCLIB}\r\n if Supports(c, ITMSFNCAdaptToStyle, ia) then\r\n ia.AdaptToStyle := AdaptToStyle;\r\n {$ENDIF}\r\n\r\n if l then\r\n begin\r\n x := xs;\r\n y := ys + h - vs;\r\n ys := y;\r\n end;\r\n\r\n l := False;\r\n if c is TTMSFNCCustomToolBarElement then\r\n begin\r\n l := (c as TTMSFNCCustomToolBarElement).LastElement;\r\n (c as TTMSFNCCustomToolBarElement).OnUpdateToolBar := UpdateToolBar;\r\n (c as TTMSFNCCustomToolBarElement).OnUpdateToolBarControl := UpdateToolBarControl;\r\n end;\r\n\r\n DoIsLastElement(c, l);\r\n\r\n if l then\r\n l := true;\r\n\r\n if not (c = FOptionsMenuButton) then\r\n begin\r\n if fu then\r\n begin\r\n if c is TTMSFNCCustomToolBarElement then\r\n (c as TTMSFNCCustomToolBarElement).ControlIndex := idx\r\n else\r\n c.Tag := idx;\r\n end;\r\n\r\n if c.Visible then\r\n begin\r\n {$IFDEF FMXLIB}\r\n if AutoAlign then\r\n begin\r\n c.Position.X := x + c.Margins.Left;\r\n c.Position.Y := y + c.Margins.Top;\r\n end;\r\n\r\n if AutoStretchHeight or ((c is TTMSFNCDefaultToolBarButton) and ((c as TTMSFNCDefaultToolBarButton).Layout = bblLarge)) then\r\n begin\r\n h := Height - c.Margins.Bottom - txth - y;\r\n c.Height := h;\r\n end\r\n else\r\n h := Max(h, c.Position.y + c.Height + vs + c.Margins.Bottom);\r\n\r\n cn := GetControl(I + 1);\r\n if Assigned(cn) and (cn is TTMSFNCDefaultToolBarButton) then\r\n begin\r\n case (cn as TTMSFNCDefaultToolBarButton).Layout of\r\n bblBitmap, bblLabel:\r\n begin\r\n y := Max(y, c.Position.Y + c.Height + vs + c.Margins.Bottom);\r\n if y + cn.Margins.Top + cn.Height > Height - cn.Margins.Bottom - txth then\r\n begin\r\n x := Max(x, Max(maxx, c.Position.x + c.Width + hs + c.Margins.Right));\r\n y := ys;\r\n end\r\n else\r\n begin\r\n c.Position.X := x + c.Margins.Left;\r\n maxx := Max(x, Max(maxx, c.Position.x + c.Width + hs + c.Margins.Right));\r\n end;\r\n end;\r\n bblNone, bblLarge:\r\n begin\r\n y := ys;\r\n x := Max(x, c.Position.x + c.Width + hs + c.Margins.Right);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n y := ys;\r\n x := Max(x, Max(maxx, c.Position.x + c.Width + hs + c.Margins.Right));\r\n end;\r\n\r\n {$ENDIF}\r\n {$IFDEF VCLWEBLIB}\r\n if c.AlignWithMargins then\r\n begin\r\n if AutoAlign then\r\n begin\r\n c.Left := x + c.Margins.Left;\r\n c.Top := y + c.Margins.Top;\r\n end;\r\n\r\n if AutoStretchHeight or ((c is TTMSFNCDefaultToolBarButton) and ((c as TTMSFNCDefaultToolBarButton).Layout = bblLarge)) then\r\n begin\r\n h := Height - c.Margins.Bottom - txth - y;\r\n c.Height := h;\r\n end\r\n else\r\n h := Max(h, c.Top + c.Height + vs + c.Margins.Bottom);\r\n\r\n cn := GetControl(I + 1);\r\n if Assigned(cn) and (cn is TTMSFNCDefaultToolBarButton) then\r\n begin\r\n case (cn as TTMSFNCDefaultToolBarButton).Layout of\r\n bblBitmap, bblLabel:\r\n begin\r\n y := Max(y, c.Top + c.Height + vs + c.Margins.Bottom);\r\n if y + cn.Margins.Top + cn.Height > Height - cn.Margins.Bottom - txth then\r\n begin\r\n x := Max(x, Max(maxx, c.Left + c.Width + hs + c.Margins.Right));\r\n y := ys;\r\n end\r\n else\r\n begin\r\n c.Left := x + c.Margins.Left;\r\n maxx := Max(x, Max(maxx, c.Left + c.Width + hs + c.Margins.Right));\r\n end;\r\n end;\r\n bblNone, bblLarge:\r\n begin\r\n x := Max(x, c.Left + c.Width + hs + c.Margins.Right);\r\n y := ys;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n x := Max(x, Max(maxx, c.Left + c.Width + hs + c.Margins.Right));\r\n y := ys;\r\n end;\r\n end\r\n else\r\n begin\r\n if AutoAlign then\r\n begin\r\n c.Left := x;\r\n c.Top := y;\r\n end;\r\n\r\n if AutoStretchHeight or ((c is TTMSFNCDefaultToolBarButton) and ((c as TTMSFNCDefaultToolBarButton).Layout = bblLarge)) then\r\n begin\r\n h := Height - txth - y;\r\n c.Height := h\r\n end\r\n else\r\n h := Max(h, c.Top + c.Height + vs);\r\n\r\n cn := GetControl(I + 1);\r\n if Assigned(cn) and (cn is TTMSFNCDefaultToolBarButton) then\r\n begin\r\n case (cn as TTMSFNCDefaultToolBarButton).Layout of\r\n bblBitmap, bblLabel:\r\n begin\r\n y := Max(y, c.Top + c.Height + vs);\r\n if y + cn.Height > Height - txth then\r\n begin\r\n x := Max(x, Max(maxx, c.Left + c.Width + hs));\r\n y := ys;\r\n end\r\n else\r\n begin\r\n c.Left := x;\r\n maxx := Max(x, Max(maxx, c.Left + c.Width + hs));\r\n end;\r\n end;\r\n bblNone, bblLarge:\r\n begin\r\n x := Max(x, c.Left + c.Width + hs);\r\n y := ys;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n x := Max(x, Max(maxx, c.Left + c.Width + hs));\r\n y := ys;\r\n end;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n if AutoAlign then\r\n begin\r\n c.Left := x + c.BorderSpacing.Left;\r\n c.Top := y + c.BorderSpacing.Top;\r\n end;\r\n\r\n if AutoStretchHeight or ((c is TTMSFNCDefaultToolBarButton) and ((c as TTMSFNCDefaultToolBarButton).Layout = bblLarge)) then\r\n begin\r\n h := Height - c.BorderSpacing.Bottom - txth - y;\r\n c.Height := h;\r\n end\r\n else\r\n h := Max(h, c.Top + c.Height + vs + c.BorderSpacing.Bottom);\r\n\r\n cn := GetControl(I + 1);\r\n if Assigned(cn) and (cn is TTMSFNCDefaultToolBarButton) then\r\n begin\r\n case (cn as TTMSFNCDefaultToolBarButton).Layout of\r\n bblBitmap, bblLabel:\r\n begin\r\n y := Max(y, c.Top + c.Height + vs + c.BorderSpacing.Bottom);\r\n if y + cn.BorderSpacing.Top + cn.Height > Height - cn.BorderSpacing.Bottom - txth then\r\n begin\r\n x := Max(x, Max(maxx, c.Left + c.Width + hs + c.BorderSpacing.Right));\r\n y := ys;\r\n end\r\n else\r\n begin\r\n c.Left := x + c.BorderSpacing.Left;\r\n maxx := Max(x, Max(maxx, c.Left + c.Width + hs + c.BorderSpacing.Right));\r\n end;\r\n end;\r\n bblNone, bblLarge:\r\n begin\r\n x := Max(x, c.Left + c.Width + hs + c.BorderSpacing.Right);\r\n y := ys;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n x := Max(x, Max(maxx, c.Left + c.Width + hs + c.BorderSpacing.Right));\r\n y := ys;\r\n end;\r\n\r\n {$ENDIF}\r\n w := Max(w, x);\r\n end;\r\n inc(idx);\r\n end;\r\n end;\r\n\r\n if h = 0 then\r\n h := hsm;\r\n\r\n FOptionsMenuButton.Visible := OptionsMenu.ShowButton;\r\n if OptionsMenu.ShowButton then\r\n FOptionsMenuButton.Parent := Self\r\n else\r\n FOptionsMenuButton.Parent := nil;\r\n\r\n {$IFDEF FMXLIB}\r\n if FOptionsMenuButton.Visible then\r\n begin\r\n FOptionsMenuButton.Index := Self.ControlCount;\r\n FOptionsMenuButton.ControlIndex := Self.ControlCount - 1;\r\n FOptionsMenuButton.Position.Y := FOptionsMenuButton.Margins.Top;\r\n mgr := FOptionsMenuButton.Margins;\r\n\r\n if AutoSize then\r\n begin\r\n FOptionsMenuButton.Position.X := w + mgr.Left;\r\n if AutoHeight then\r\n FOptionsMenuButton.Height := h - mgr.Bottom - mgr.Top - txth\r\n else if AutoStretchHeight then\r\n FOptionsMenuButton.Height := Height - mgr.Bottom - mgr.Top - txth;\r\n end\r\n else\r\n begin\r\n FOptionsMenuButton.Position.X := Width - FOptionsMenuButton.Width - mgr.Right;\r\n FOptionsMenuButton.Height := Height - mgr.Bottom - mgr.Top - txth;\r\n end;\r\n w := w + FOptionsMenuButton.Width + mgr.Right + mgr.Left;\r\n end;\r\n\r\n if AutoSize then\r\n begin\r\n if Appearance.Separator then\r\n w := w + Appearance.SeparatorStroke.Width;\r\n\r\n w := Round(Max(MinimumWidth, w));\r\n\r\n if ControlAlignment = caNone then\r\n begin\r\n lm := 0;\r\n rm := 0;\r\n tm := 0;\r\n bm := 0;\r\n GetControlMargins(lm, tm, rm, bm);\r\n w := w + lm + rm;\r\n end;\r\n\r\n h := h + txth;\r\n\r\n if AutoHeight and AutoWidth and (ControlAlignment = caNone) then\r\n SetBounds(Position.X, Position.Y, w, h)\r\n else if AutoHeight and not (ControlAlignment in [caLeft, caRight, caClient]) then\r\n SetBounds(Position.X, Position.Y, Width, h)\r\n else if AutoWidth and not (ControlAlignment in [caTop, caBottom, caClient]) then\r\n SetBounds(Position.X, Position.Y, w, Height);\r\n end;\r\n\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if FOptionsMenuButton.Visible then\r\n begin\r\n FOptionsMenuButton.ControlIndex := Self.ControlCount - 1;\r\n {$IFDEF LCLLIB}\r\n FOptionsMenuButton.Top := FOptionsMenuButton.BorderSpacing.Top;\r\n mgr := FOptionsMenuButton.BorderSpacing;\r\n {$ENDIF}\r\n {$IFDEF VCLWEBLIB}\r\n FOptionsMenuButton.Top := FOptionsMenuButton.Margins.Top;\r\n mgr := FOptionsMenuButton.Margins;\r\n if not FOptionsMenuButton.AlignWithMargins then\r\n begin\r\n mgr.Left := 0;\r\n mgr.Top := 0;\r\n mgr.Right := 0;\r\n mgr.Bottom := 0;\r\n end;\r\n {$ENDIF}\r\n\r\n if AutoSize then\r\n begin\r\n FOptionsMenuButton.Left := w + mgr.Left;\r\n if AutoHeight then\r\n FOptionsMenuButton.Height := h - mgr.Bottom - mgr.Top\r\n else if AutoStretchHeight then\r\n FOptionsMenuButton.Height := Height - mgr.Bottom - txth - mgr.Top;\r\n end\r\n else\r\n begin\r\n FOptionsMenuButton.Left := Width - FOptionsMenuButton.Width - mgr.Right;\r\n FOptionsMenuButton.Height := Height - mgr.Bottom - mgr.Top - txth;\r\n end;\r\n w := w + FOptionsMenuButton.Width + mgr.Right + mgr.Left;\r\n end;\r\n\r\n if AutoSize then\r\n begin\r\n if Appearance.Separator then\r\n w := w + Round(Appearance.SeparatorStroke.Width);\r\n\r\n w := Round(Max(MinimumWidth, w));\r\n\r\n if ControlAlignment = caNone then\r\n begin\r\n lm := 0;\r\n rm := 0;\r\n tm := 0;\r\n bm := 0;\r\n GetControlMargins(lm, tm, rm, bm);\r\n w := w + Round(lm + rm);\r\n end;\r\n\r\n h := h + txth;\r\n\r\n if AutoHeight and AutoWidth and (ControlAlignment = caNone) then\r\n SetBounds(Left, Top, w, h)\r\n else if AutoHeight and not (ControlAlignment in [caLeft, caRight, caClient]) then\r\n SetBounds(Left, Top, Width, h)\r\n else if AutoWidth and not (ControlAlignment in [caTop, caBottom, caClient]) then\r\n SetBounds(Left, Top, w, Height);\r\n end;\r\n {$ENDIF}\r\n\r\n if Assigned(OnUpdateControls) then\r\n OnUpdateControls(Self);\r\n\r\n FBlockUpdate := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBar.UpdateDockPanel;\r\nbegin\r\n if Assigned(OnUpdateDockPanel) then\r\n OnUpdateDockPanel(Self);\r\nend;\r\n\r\n{ TTMSFNCDefaultToolBarButton }\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.AppearanceChanged;\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n begin\r\n Appearance.NormalFill.Color := c;\r\n Appearance.NormalFill.Kind := gfkSolid;\r\n Appearance.DisabledFill.Color := Blend(c, gcDarkgray, 20);\r\n Appearance.DisabledFill.Kind := gfkSolid;\r\n Appearance.InnerStroke.Color := Blend(Appearance.NormalFill.Color, Appearance.NormalStroke.Color, 75);\r\n Appearance.InnerStroke.Kind := gskSolid;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleTextFontColor(c) then\r\n Font.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundStrokeColor(c) then\r\n begin\r\n Appearance.NormalStroke.Color := c;\r\n Appearance.DownStroke.Color := c;\r\n Appearance.DisabledStroke.Color := c;\r\n Appearance.NormalStroke.Color := c;\r\n Appearance.DownStroke.Color := c;\r\n Appearance.DisabledStroke.Color := c;\r\n Appearance.HoverStroke.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleSelectionFillColor(c) then\r\n begin\r\n Appearance.HoverFill.Color := c;\r\n Appearance.HoverFill.Kind := gfkSolid;\r\n Appearance.DownFill.Color := Blend(c, Fill.Color, 20);\r\n Appearance.DownFill.Kind := gfkSolid;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCDefaultToolBarButton then\r\n begin\r\n FLayout := (Source as TTMSFNCDefaultToolBarButton).Layout;\r\n FCompactLayout := (Source as TTMSFNCDefaultToolBarButton).CompactLayout;\r\n FMinimumLayout := (Source as TTMSFNCDefaultToolBarButton).MinimumLayout;\r\n FMaximumLayout := (Source as TTMSFNCDefaultToolBarButton).MaximumLayout;\r\n FBitmapPosition := (Source as TTMSFNCDefaultToolBarButton).BitmapPosition;\r\n FBitmapSize := (Source as TTMSFNCDefaultToolBarButton).BitmapSize;\r\n FLargeLayoutBitmapSize := (Source as TTMSFNCDefaultToolBarButton).LargeLayoutBitmapSize;\r\n FAutoBitmapSize := (Source as TTMSFNCDefaultToolBarButton).AutoBitmapSize;\r\n FLargeLayoutAutoBitmapSize := (Source as TTMSFNCDefaultToolBarButton).LargeLayoutAutoBitmapSize;\r\n FStretchBitmapIfNoText := (Source as TTMSFNCDefaultToolBarButton).StretchBitmapIfNoText;\r\n FAppearance.Assign((Source as TTMSFNCDefaultToolBarButton).Appearance);\r\n FBitmapContainer := (Source as TTMSFNCDefaultToolBarButton).BitmapContainer;\r\n FBitmaps.Assign((Source as TTMSFNCDefaultToolBarButton).Bitmaps);\r\n FDisabledBitmaps.Assign((Source as TTMSFNCDefaultToolBarButton).DisabledBitmaps);\r\n FLargeLayoutHoverBitmaps.Assign((Source as TTMSFNCDefaultToolBarButton).LargeLayoutHoverBitmaps);\r\n FLargeLayoutBitmaps.Assign((Source as TTMSFNCDefaultToolBarButton).LargeLayoutBitmaps);\r\n FLargeLayoutDisabledBitmaps.Assign((Source as TTMSFNCDefaultToolBarButton).LargeLayoutDisabledBitmaps);\r\n FHoverBitmaps.Assign((Source as TTMSFNCDefaultToolBarButton).HoverBitmaps);\r\n FBitmapVisible := (Source as TTMSFNCDefaultToolBarButton).BitmapVisible;\r\n FText := (Source as TTMSFNCDefaultToolBarButton).Text;\r\n FTextVisible := (Source as TTMSFNCDefaultToolBarButton).TextVisible;\r\n FDropDownHeight := (Source as TTMSFNCDefaultToolBarButton).DropDownHeight;\r\n FDropDownWidth := (Source as TTMSFNCDefaultToolBarButton).DropDownWidth;\r\n FDropDownAutoWidth := (Source as TTMSFNCDefaultToolBarButton).DropDownAutoWidth;\r\n FWordWrapping := (Source as TTMSFNCDefaultToolBarButton).WordWrapping;\r\n FHorizontalTextAlign := (Source as TTMSFNCDefaultToolBarButton).HorizontalTextAlign;\r\n FVerticalTextAlign := (Source as TTMSFNCDefaultToolBarButton).VerticalTextAlign;\r\n FTrimming := (Source as TTMSFNCDefaultToolBarButton).Trimming;\r\n FFont.Assign((Source as TTMSFNCDefaultToolBarButton).Font);\r\n FHoverFontColor := (Source as TTMSFNCDefaultToolBarButton).HoverFontColor;\r\n FDownFontColor := (Source as TTMSFNCDefaultToolBarButton).DownFontColor;\r\n FDisabledFontColor := (Source as TTMSFNCDefaultToolBarButton).DisabledFontColor;\r\n FStretchText := (Source as TTMSFNCDefaultToolBarButton).StretchText;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.BitmapsChanged(Sender: TObject);\r\nvar\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n bmp := TTMSFNCGraphics.GetScaledBitmap(Bitmaps, 0, BitmapContainer);\r\n BitmapVisible := Assigned(bmp) and not IsBitmapEmpty(bmp);\r\n\r\n if not BitmapVisible and (Layout = bblLarge) then\r\n begin\r\n bmp := TTMSFNCGraphics.GetScaledBitmap(LargeLayoutBitmaps, 0, BitmapContainer);\r\n BitmapVisible := Assigned(bmp) and not IsBitmapEmpty(bmp);\r\n end;\r\n\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.CanChangeText: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.CanDrawDesignTime: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.CanDropDown: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.ChangeDPIScale(M, D: Integer);\r\nbegin\r\n inherited;\r\n BitmapSize := TTMSFNCUtils.MulDivSingle(BitmapSize, M, D);\r\n LargeLayoutBitmapSize := TTMSFNCUtils.MulDivSingle(LargeLayoutBitmapSize, M, D);\r\n// Font.Height := TTMSFNCUtils.MulDivInt(Font.Height, M, D);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.CloseDropDown;\r\nbegin\r\n if not Assigned(FPopup) then\r\n Exit;\r\n\r\n if FPopup.IsOpen then\r\n FPopup.IsOpen := False;\r\nend;\r\n\r\nconstructor TTMSFNCDefaultToolBarButton.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FOldHeight := -1;\r\n FLayout := bblNone;\r\n FCompactLayout := bblNone;\r\n FMinimumLayout := bblBitmap;\r\n FMaximumLayout := bblLarge;\r\n\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @DoFontChanged;\r\n\r\n FHoverFontColor := gcNull;\r\n FDownFontColor := gcNull;\r\n FDisabledFontColor := gcNull;\r\n\r\n FDownState := False;\r\n FApplyName := True;\r\n FCloseOnSelection := True;\r\n FBitmapSize := 24;\r\n FLargeLayoutBitmapSize := 32;\r\n FAutoBitmapSize := False;\r\n FLargeLayoutAutoBitmapSize := False;\r\n FStretchBitmapIfNoText := True;\r\n FStretchText := False;\r\n\r\n FDropDownWidth := 135;\r\n FDropDownHeight := 135;\r\n FDropDownAutoWidth := False;\r\n FPopup := TTMSFNCPopup.Create(Self);\r\n FPopup.PlacementControl := Self;\r\n FPopup.DragWithParent := True;\r\n FPopup.DropDownWidth := FDropDownWidth;\r\n FPopup.DropDownHeight := FDropDownHeight;\r\n FPopup.OnPopup := DoPopup;\r\n FPopup.OnClosePopup := DoClosePopup;\r\n FPopupPlacement := ppBottom;\r\n\r\n FBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FBitmaps.OnChange := @BitmapsChanged;\r\n FDisabledBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FDisabledBitmaps.OnChange := @BitmapsChanged;\r\n FHoverBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FHoverBitmaps.OnChange := @BitmapsChanged;\r\n\r\n FLargeLayoutBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FLargeLayoutBitmaps.OnChange := @BitmapsChanged;\r\n FLargeLayoutDisabledBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FLargeLayoutDisabledBitmaps.OnChange := @BitmapsChanged;\r\n FLargeLayoutHoverBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FLargeLayoutHoverBitmaps.OnChange := @BitmapsChanged;\r\n\r\n FAppearance := TTMSFNCToolBarButtonAppearance.Create(Self);\r\n\r\n FTextVisible := True;\r\n FBitmapVisible := False;\r\n FWordWrapping := False;\r\n FHorizontalTextAlign := gtaCenter;\r\n FVerticalTextAlign := gtaCenter;\r\n FTrimming := gttCharacter;\r\n FBitmapPosition := bbpLeft;\r\n\r\n Width := 100;\r\n Height := 24;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDisabledBitmaps(const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FDisabledBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDisabledFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledFontColor <> Value then\r\n begin\r\n FDisabledFontColor := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetHoverBitmaps(const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FHoverBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDownFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDownFontColor <> Value then\r\n begin\r\n FDownFontColor := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetHoverFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FHoverFontColor <> Value then\r\n begin\r\n FHoverFontColor := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetMaximumLayout(\r\n const Value: TTMSFNCToolBarButtonLayout);\r\nbegin\r\n if FMaximumLayout <> Value then\r\n begin\r\n FMaximumLayout := Value;\r\n UpdateToolBar;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetMinimumLayout(\r\n const Value: TTMSFNCToolBarButtonLayout);\r\nbegin\r\n if FMinimumLayout <> Value then\r\n begin\r\n FMinimumLayout := Value;\r\n UpdateToolBar;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDownState(const Value: Boolean);\r\nbegin\r\n FDownState := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDropDownControl(const Value: TControl);\r\nbegin\r\n FDropDownControl := Value;\r\n if Assigned(FDropDownControl) then\r\n begin\r\n if not (csDesigning in ComponentState) then\r\n begin\r\n if Assigned(FPopup) then\r\n begin\r\n FPopup.ContentControl := FDropDownControl;\r\n FPopup.FocusedControl := FDropDownControl;\r\n end;\r\n end\r\n else if (csDesigning in ComponentState) then\r\n begin\r\n DropDownHeight := FDropDownControl.Height;\r\n DropDownWidth := FDropDownControl.Width;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDropDownAutoWidth(\r\n const Value: Boolean);\r\nbegin\r\n if FDropDownAutoWidth <> Value then\r\n begin\r\n FDropDownAutoWidth := Value;\r\n if Assigned(FPopup) then\r\n begin\r\n if FDropDownAutoWidth then\r\n FPopup.DropDownWidth := Width\r\n else\r\n FPopup.DropDownWidth := FDropDownWidth;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDropDownHeight(const Value: Single);\r\nbegin\r\n FDropDownHeight := Value;\r\n if Assigned(FPopup) and not DropDownAutoWidth then\r\n FPopup.DropDownHeight := FDropDownHeight;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetDropDownWidth(const Value: Single);\r\nbegin\r\n FDropDownWidth := Value;\r\n if Assigned(FPopup) then\r\n FPopup.DropDownWidth := FDropDownWidth;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(FDropDownButton) then\r\n FDropDownButton.AdaptToStyle := AdaptToStyle;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.SetDropDownKind(\r\n const Value: TTMSFNCToolBarButtonDropDownKind);\r\nbegin\r\n if FDropDownKind <> Value then\r\n begin\r\n FDropDownKind := Value;\r\n if Assigned(FDropDownButton) then\r\n begin\r\n case DropDownKind of\r\n ddkNormal:\r\n begin\r\n FDropDownButton.Visible := False;\r\n FDropDownButton.Parent := nil;\r\n {$IFDEF FMXLIB}\r\n FDropDownButton.HitTest := True;\r\n {$ENDIF}\r\n FDropDownButton.Appearance.Transparent := False;\r\n end;\r\n ddkDropDown:\r\n begin\r\n FDropDownButton.Visible := False;\r\n FDropDownButton.Parent := Self;\r\n {$IFDEF FMXLIB}\r\n FDropDownButton.HitTest := False;\r\n {$ENDIF}\r\n FDropDownButton.Appearance.Transparent := True;\r\n end;\r\n ddkDropDownButton:\r\n begin\r\n FDropDownButton.Visible := True;\r\n FDropDownButton.Parent := Self;\r\n {$IFDEF FMXLIB}\r\n FDropDownButton.HitTest := True;\r\n {$ENDIF}\r\n FDropDownButton.Appearance.Transparent := False;\r\n end;\r\n end;\r\n end;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.SetDropDownPosition(\r\n const Value: TTMSFNCToolBarButtonDropDownPosition);\r\nbegin\r\n if FDropDownPosition <> Value then\r\n begin\r\n FDropDownPosition := Value;\r\n if Assigned(FDropDownButton) then\r\n begin\r\n case Value of\r\n ddpRight:\r\n begin\r\n {$IFDEF FMXLIB}\r\n FDropDownButton.Align := TAlignLayout.Right;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FDropDownButton.Align := alRight;\r\n {$ENDIF}\r\n FDropDownButton.Width := 17;\r\n FDropDownButton.Appearance.Corners := [gcTopRight, gcBottomRight];\r\n end;\r\n ddpBottom:\r\n begin\r\n {$IFDEF FMXLIB}\r\n FDropDownButton.Align := TAlignLayout.Bottom;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FDropDownButton.Align := alBottom;\r\n {$ENDIF}\r\n FDropDownButton.Height := 10;\r\n FDropDownButton.Appearance.Corners := [gcBottomLeft, gcBottomRight];\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomToolBarButton.SetEnabled(const Value: Boolean);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomToolBarButton.SetEnabled(Value: Boolean);\r\n{$ENDIF}\r\nvar\r\n d: TTMSFNCToolBarDropDownButton;\r\nbegin\r\n inherited;\r\n d := GetDropDownButtonControl;\r\n if Assigned(d) then\r\n d.Enabled := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.SetHidden(const Value: Boolean);\r\nbegin\r\n if FHidden <> Value then\r\n begin\r\n FHidden := Value;\r\n UpdateToolBarControl;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.UpdateDropDownButton;\r\nbegin\r\n if Assigned(FDropDownButton) then\r\n FDropDownButton.Appearance.Rounding := Appearance.Rounding;\r\nend;\r\n\r\ndestructor TTMSFNCDefaultToolBarButton.Destroy;\r\nbegin\r\n FFont.Free;\r\n FPopup.Free;\r\n FBitmaps.Free;\r\n FDisabledBitmaps.Free;\r\n FHoverBitmaps.Free;\r\n FLargeLayoutBitmaps.Free;\r\n FLargeLayoutDisabledBitmaps.Free;\r\n FLargeLayoutHoverBitmaps.Free;\r\n FAppearance.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.DoPopup(Sender: TObject);\r\nbegin\r\n InitializePopup;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleMouseEnter;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleMouseLeave;\r\nbegin\r\n inherited;\r\n FDown := False;\r\n FHover := False;\r\n FPrevHover := False;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.DoFontChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.AppearanceChanged;\r\nbegin\r\n inherited;\r\n UpdateDropDownButton;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCCustomToolBarButton then\r\n begin\r\n FDropDownKind := (Source as TTMSFNCCustomToolBarButton).DropDownKind;\r\n FDropDownPosition := (Source as TTMSFNCCustomToolBarButton).DropDownPosition;\r\n FAutoOptionsMenuText := (Source as TTMSFNCCustomToolBarButton).AutoOptionsMenuText;\r\n FHidden := (Source as TTMSFNCCustomToolBarButton).Hidden;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarButton.CanDropDown: Boolean;\r\nbegin\r\n Result := DropDownKind <> ddkNormal;\r\nend;\r\n\r\nconstructor TTMSFNCCustomToolBarButton.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FHidden := False;\r\n FDropDownPosition := ddpRight;\r\n FDropDownButton := GetDropDownButtonClass.Create(Self);\r\n FDropDownButton.TabStop := False;\r\n FDropDownButton.Text := '';\r\n FDropDownButton.OnClick := DropDownButtonClick;\r\n FDropDownButton.Visible := False;\r\n FDropDownButton.Width := 17;\r\n FDropDownButton.Appearance.Corners := [gcTopRight, gcBottomRight];\r\n {$IFDEF FMXLIB}\r\n FDropDownButton.Align := TAlignLayout.Right;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FDropDownButton.Align := alRight;\r\n {$ENDIF}\r\n FDropDownButton.Stored := False;\r\n\r\n FDropDownButton.Bitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPAND, HInstance, 1.0);\r\n FDropDownButton.Bitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPANDLARGE, HInstance, 1.5);\r\n FDropDownButton.DisabledBitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPAND, HInstance, 1.0);\r\n FDropDownButton.DisabledBitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPANDLARGE, HInstance, 1.5);\r\n FDropDownButton.HoverBitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPAND, HInstance, 1.0);\r\n FDropDownButton.HoverBitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPANDLARGE, HInstance, 1.5);\r\nend;\r\n\r\ndestructor TTMSFNCCustomToolBarButton.Destroy;\r\nbegin\r\n FDropDownButton.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.DrawButton(AGraphics: TTMSFNCGraphics);\r\nvar\r\n r: TRectF;\r\nbegin\r\n inherited;\r\n if Assigned(FDropDownButton) and (DropDownKind = ddkDropDown) then\r\n begin\r\n case DropDownPosition of\r\n ddpRight: r := RectF(Width - FDropDownButton.Width, 0, Width, Height);\r\n ddpBottom: r := RectF(0, Height - FDropDownButton.Height, Width, Height);\r\n end;\r\n FDropDownButton.DrawBitmap(AGraphics, r);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.DropDownButtonClick(Sender: TObject);\r\nbegin\r\n DropDown;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.DrawBitmap(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n r: TRectF;\r\n bmpa: TBitmap;\r\n g: TTMSFNCGraphics;\r\nbegin\r\n if not BitmapVisible then\r\n Exit;\r\n\r\n r := GetBitmapRect(ARect);\r\n\r\n if (Self is TTMSFNCToolBarDropDownButton) and AdaptToStyle then\r\n begin\r\n bmpa := TBitmap.Create;\r\n bmpa.SetSize(7, 7);\r\n {$IFDEF CMNLIB}\r\n bmpa.TransparentMode := tmFixed;\r\n bmpa.Transparent := True;\r\n bmpa.TransparentColor := gcWhite;\r\n {$ENDIF}\r\n g := TTMSFNCGraphics.Create(bmpa.Canvas);\r\n try\r\n g.BeginScene;\r\n {$IFDEF CMNLIB}\r\n g.Fill.Color := gcWhite;\r\n g.Fill.Kind := gfkSolid;\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := gcWhite;\r\n g.DrawRectangle(0, 0, bmpa.Width, bmpa.Height);\r\n {$ENDIF}\r\n g.Stroke.Kind := gskSolid;\r\n g.Stroke.Color := TTMSFNCGraphics.DefaultSelectionFillColor;\r\n g.DrawLine(PointF(0, 1), PointF(6, 1), gcpmRightDown);\r\n g.DrawLine(PointF(0, 2), PointF(6, 2), gcpmRightDown);\r\n g.DrawLine(PointF(1, 3), PointF(5, 3), gcpmRightDown);\r\n g.DrawLine(PointF(2, 4), PointF(4, 4), gcpmRightDown);\r\n g.DrawLine(PointF(3, 5), PointF(3, 5), gcpmRightDown);\r\n finally\r\n g.EndScene;\r\n g.Free;\r\n end;\r\n\r\n try\r\n {$IFDEF WEBLIB}\r\n AGraphics.DrawBitmap(r, TTMSFNCBitmap(bmpa));\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n AGraphics.DrawBitmap(r, bmpa);\r\n {$ENDIF}\r\n finally\r\n bmpa.Free;\r\n end;\r\n end\r\n else\r\n begin\r\n AGraphics.BitmapContainer := BitmapContainer;\r\n\r\n case Layout of\r\n bblLarge:\r\n begin\r\n if Enabled then\r\n begin\r\n if FHover and (LargeLayoutHoverBitmaps.Count > 0) then\r\n AGraphics.DrawScaledBitmap(r, LargeLayoutHoverBitmaps)\r\n else if FHover and (HoverBitmaps.Count > 0) then\r\n AGraphics.DrawScaledBitmap(r, HoverBitmaps)\r\n else if LargeLayoutBitmaps.Count > 0 then\r\n AGraphics.DrawScaledBitmap(r, LargeLayoutBitmaps)\r\n else\r\n AGraphics.DrawScaledBitmap(r, Bitmaps)\r\n end\r\n else\r\n begin\r\n if LargeLayoutDisabledBitmaps.Count > 0 then\r\n AGraphics.DrawScaledBitmap(r, LargeLayoutDisabledBitmaps)\r\n else if DisabledBitmaps.Count > 0 then\r\n AGraphics.DrawScaledBitmap(r, DisabledBitmaps)\r\n else\r\n AGraphics.DrawScaledBitmap(r, Bitmaps)\r\n end;\r\n end\r\n else\r\n begin\r\n if Enabled then\r\n begin\r\n if FHover and (HoverBitmaps.Count > 0) then\r\n AGraphics.DrawScaledBitmap(r, HoverBitmaps)\r\n else\r\n AGraphics.DrawScaledBitmap(r, Bitmaps)\r\n end\r\n else if DisabledBitmaps.Count > 0 then\r\n AGraphics.DrawScaledBitmap(r, DisabledBitmaps)\r\n else\r\n AGraphics.DrawScaledBitmap(r, Bitmaps)\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.DrawButton(AGraphics: TTMSFNCGraphics);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.DrawText(AGraphics: TTMSFNCGraphics);\r\nvar\r\n tr: TRectF;\r\n st: TTMSFNCGraphicsSaveState;\r\nbegin\r\n if not TextVisible or (Text = '') then\r\n Exit;\r\n\r\n tr := GetTextRect;\r\n st := AGraphics.SaveState;\r\n try\r\n AGraphics.ClipRect(tr);\r\n AGraphics.Font.Assign(Font);\r\n\r\n if Enabled then\r\n begin\r\n if (FDown or FDownState) and (DownFontColor <> gcNull) then\r\n AGraphics.Font.Color := DownFontColor\r\n else if FHover and (HoverFontColor <> gcNull) then\r\n AGraphics.Font.Color := HoverFontColor\r\n end\r\n else if DisabledFontColor <> gcNull then\r\n AGraphics.Font.Color := DisabledFontColor;\r\n\r\n AGraphics.DrawText(tr, Text, WordWrapping, HorizontalTextAlign, VerticalTextAlign, Trimming);\r\n finally\r\n AGraphics.RestoreState(st);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.DropDown;\r\nbegin\r\n if not Assigned(FPopup) then\r\n Exit;\r\n\r\n if not FPopup.IsOpen then\r\n begin\r\n if Assigned(OnBeforeDropDown) then\r\n OnBeforeDropDown(Self);\r\n\r\n if DropDownAutoWidth then\r\n FPopup.DropDownWidth := Width;\r\n\r\n FPopup.Placement := FPopupPlacement;\r\n FPopup.IsOpen := True;\r\n if Assigned(OnDropDown) then\r\n OnDropDown(Self);\r\n end\r\n else\r\n FPopup.IsOpen := False;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.DoFontChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarButton.GetBitmapRect: TRectF;\r\nbegin\r\n Result := inherited GetBitmapRect;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarButton.GetBitmapRect(ARect: TRectF): TRectF;\r\nvar\r\n r: TRectF;\r\n dr: TRectf;\r\n bs: Single;\r\nbegin\r\n bs := GetBitmapSize;\r\n case Layout of\r\n bblLarge: bs := GetLargeLayoutBitmapSize;\r\n end;\r\n\r\n r := ARect;\r\n Result := RectF(r.Left, r.Top, r.Left, r.Bottom);\r\n if BitmapVisible then\r\n begin\r\n if DropDownKind <> ddkNormal then\r\n begin\r\n dr := GetDropDownRect;\r\n case BitmapPosition of\r\n bbpLeft:\r\n begin\r\n case DropDownPosition of\r\n ddpRight: Result := RectF(Result.Left + 3, Result.Top + 3, Result.Left + 3 + bs, Result.Bottom - 3);\r\n ddpBottom: Result := RectF(Result.Left + 3, Result.Top + 3, Result.Left + 3 + bs, dr.Top - 3);\r\n end;\r\n end;\r\n bbpTop:\r\n begin\r\n case DropDownPosition of\r\n ddpRight: Result := RectF(Result.Left + 3, Result.Top + 3, dr.Left - 3, Result.Top + 3 + bs);\r\n ddpBottom: Result := RectF(Result.Left + 3, Result.Top + 3, r.Right - 3, Result.Top + 3 + bs);\r\n end;\r\n end;\r\n end;\r\n end\r\n else if not TextVisible or (Text = '') then\r\n begin\r\n Result := RectF(r.Left + 3, r.Top + 3, r.Right - 3, r.Bottom - 3);\r\n if (bs <> -1) and not StretchBitmapIfNoText then\r\n begin\r\n Result.Left := Round(r.Left + ((r.Right - r.Left) - bs) / 2);\r\n Result.Top := Round(r.Top + ((r.Bottom - r.Top) - bs) / 2);\r\n Result.Right := Result.Left + bs;\r\n Result.Bottom := Result.Top + bs;\r\n end; \r\n end\r\n else if TextVisible and not (Text = '') then\r\n begin\r\n case BitmapPosition of\r\n bbpLeft: Result := RectF(r.Left + 3, r.Top + 3, r.Left + 3 + bs, r.Bottom - 3);\r\n bbpTop: Result := RectF(r.Left + 3, r.Top + 3, r.Right - 3, r.Top + 3 + bs);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarButton.GetDropDownButtonClass: TTMSFNCToolBarDropDownButtonClass;\r\nbegin\r\n Result := TTMSFNCToolBarDropDownButton;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarButton.GetDropDownButtonControl: TTMSFNCToolBarDropDownButton;\r\nbegin\r\n Result := FDropDownButton;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarButton.GetDropDownRect: TRectF;\r\nbegin\r\n Result := inherited GetDropDownRect;\r\n if Assigned(FDropDownButton) and (DropDownKind <> ddkNormal) then\r\n begin\r\n if DropDownKind = ddkDropDown then\r\n begin\r\n case DropDownPosition of\r\n ddpRight: Result := RectF(Width - FDropDownButton.Width, 0, Width, Height);\r\n ddpBottom: Result := RectF(0, Height - FDropDownButton.Height, Width, Height);\r\n end;\r\n end\r\n else\r\n begin\r\n {$IFDEF FMXLIB}\r\n Result := RectF(FDropDownButton.Position.X, FDropDownButton.Position.Y, FDropDownButton.Position.X + FDropDownButton.Width, FDropDownButton.Position.Y + FDropDownButton.Height);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := RectF(FDropDownButton.Left, FDropDownButton.Top, FDropDownButton.Left + FDropDownButton.Width, FDropDownButton.Top + FDropDownButton.Height);\r\n {$ENDIF}\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarButton.GetTextRect: TRectF;\r\nvar\r\n bmpr: TRectF;\r\n dr: TRectF;\r\n r: TRectF;\r\nbegin\r\n r := LocalRect;\r\n bmpr := GetBitmapRect(r);\r\n dr := GetDropDownRect;\r\n if DropDownKind <> ddkNormal then\r\n begin\r\n if not StretchText then\r\n begin\r\n case BitmapPosition of\r\n bbpLeft:\r\n begin\r\n case DropDownPosition of\r\n ddpRight: Result := RectF(bmpr.Right + 3, r.Top + 3, dr.Left - 3, r.Bottom - 3);\r\n ddpBottom: Result := RectF(bmpr.Right + 3, r.Top + 3, r.Right - 3, dr.Top - 3);\r\n end;\r\n end;\r\n bbpTop:\r\n begin\r\n case DropDownPosition of\r\n ddpRight: Result := RectF(r.Left + 3, bmpr.Bottom + 3, dr.Left - 3, r.Bottom - 3);\r\n ddpBottom: Result := RectF(r.Left + 3, bmpr.Bottom + 3, r.Right - 3, dr.Top - 3);\r\n end;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n case DropDownPosition of\r\n ddpRight: Result := RectF(r.Left + 3, r.Top + 3, dr.Left - 3, r.Bottom - 3);\r\n ddpBottom: Result := RectF(r.Left + 3, r.Top + 3, r.Right - 3, dr.Top - 3);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n if not StretchText then\r\n begin\r\n case BitmapPosition of\r\n bbpLeft: Result := RectF(bmpr.Right + 3, r.Top + 3, dr.Left - 3, r.Bottom - 3);\r\n bbpTop: Result := RectF(r.Left + 3, bmpr.Bottom + 3, dr.Left - 3, r.Bottom - 3)\r\n end;\r\n end\r\n else\r\n Result := RectF(r.Left + 3, r.Top + 3, dr.Left - 3, r.Bottom - 3);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarButton.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n if DropDownKind = ddkDropDown then\r\n DropDown;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetBitmap: TTMSFNCBitmap;\r\nbegin\r\n Result := TTMSFNCGraphics.GetScaledBitmap(Bitmaps, 0, FBitmapContainer);\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := FBitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetBitmapRect(ARect: TRectF): TRectF;\r\nvar\r\n r: TRectF;\r\n bs: Single;\r\nbegin\r\n bs := GetBitmapSize;\r\n case Layout of\r\n bblLarge: bs := GetLargeLayoutBitmapSize;\r\n end;\r\n\r\n r := ARect;\r\n Result := RectF(r.Left, r.Top, r.Left, r.Bottom);\r\n if BitmapVisible then\r\n begin\r\n case BitmapPosition of\r\n bbpLeft: Result := RectF(Result.Left + 3, Result.Top + 3, Result.Left + 3 + bs, Result.Bottom - 3);\r\n bbpTop: Result := RectF(Result.Left + 3, Result.Top + 3, Result.Right - 3, Result.Top + 3 + bs);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetBitmapSize: Single;\r\nvar\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n Result := BitmapSize;\r\n if AutoBitmapSize then\r\n begin\r\n bmp := TTMSFNCGraphics.GetScaledBitmap(Bitmaps, 0, BitmapContainer);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n Result := Max(bmp.Height, bmp.Width);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetBitmapRect: TRectF;\r\nbegin\r\n Result := GetBitmapRect(LocalRect);\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetDropDownRect: TRectF;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := LocalRect;\r\n Result := RectF(r.Right, r.Top, r.Right, r.Bottom);\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetHintString: String;\r\nbegin\r\n Result := Hint;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetLargeLayoutBitmapSize: Single;\r\nvar\r\n bmp: TTMSFNCBitmap;\r\nbegin\r\n Result := LargeLayoutBitmapSize;\r\n if LargeLayoutAutoBitmapSize then\r\n begin\r\n bmp := TTMSFNCGraphics.GetScaledBitmap(LargeLayoutBitmaps, 0, BitmapContainer);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n Result := Max(bmp.Height, bmp.Width);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetPopupControl: TTMSFNCPopup;\r\nbegin\r\n Result := FPopup;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetText: String;\r\nbegin\r\n Result := FText;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetTextRect: TRectF;\r\nvar\r\n bmpr: TRectF;\r\n dr: TRectF;\r\n r: TRectF;\r\nbegin\r\n r := LocalRect;\r\n bmpr := GetBitmapRect;\r\n dr := GetDropDownRect;\r\n if not StretchText then\r\n begin\r\n case BitmapPosition of\r\n bbpLeft: Result := RectF(bmpr.Right + 3, r.Top + 3, dr.Left - 3, r.Bottom - 3);\r\n bbpTop: Result := RectF(r.Left + 3, bmpr.Bottom + 3, dr.Left - 3, r.Bottom - 3);\r\n end;\r\n end\r\n else\r\n Result := RectF(r.Left + 3, r.Top + 3, dr.Left - 3, r.Bottom - 3);\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.GetTextSize: TSizeF;\r\nvar\r\n g: TTMSFNCGraphics;\r\n r: TRectF;\r\nbegin\r\n Result.cx := 0;\r\n Result.cy := 0;\r\n if TextVisible and (Text <> '') then\r\n begin\r\n g := TTMSFNCGraphics.CreateBitmapCanvas(1, 1, NativeCanvas);\r\n g.BitmapContainer := BitmapContainer;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n try\r\n r := LocalRect;\r\n InflateRectEx(r, -2, -2);\r\n Result := g.CalculateTextSize(Text, r, WordWrapping);\r\n finally\r\n g.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.InitializePopup;\r\nbegin\r\n\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.IsBitmapSizeStored: Boolean;\r\nbegin\r\n Result := BitmapSize <> 24;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.IsDropDownHeightStored: Boolean;\r\nbegin\r\n Result := DropDownHeight <> 135;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.IsDropDownWidthStored: Boolean;\r\nbegin\r\n Result := DropDownWidth <> 135;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.IsLargeLayoutBitmapSizeStored: Boolean;\r\nbegin\r\n Result := LargeLayoutBitmapSize <> 32;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleKeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n case Key of\r\n KEY_HOME: SelectFirstValue;\r\n KEY_END: SelectLastValue;\r\n KEY_UP, KEY_LEFT: SelectPreviousValue;\r\n KEY_DOWN, KEY_RIGHT: SelectNextValue;\r\n KEY_SPACE: Click;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleKeyPress(var Key: Char);\r\nbegin\r\n inherited;\r\n if (Key >= #32) and not (Ord(Key) in [KEY_F2, KEY_RETURN, KEY_SPACE, KEY_ESCAPE, KEY_HOME, KEY_END, KEY_UP, KEY_LEFT, KEY_DOWN, KEY_RIGHT]) then\r\n SelectValueWithCharacter(Key);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleKeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if Shift <> [] then\r\n Exit;\r\n\r\n case Key of\r\n KEY_RETURN, KEY_F4:\r\n begin\r\n if CanDropDown then\r\n DropDown;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n if CanFocus then\r\n SetFocus;\r\n\r\n FDown := True;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleMouseMove(Shift: TShiftState; X,\r\n Y: Single);\r\nbegin\r\n inherited;\r\n FHover := True;\r\n if FPrevHover <> FHover then\r\n Invalidate;\r\n\r\n FPrevHover := FHover;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.HandleMouseUp(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n FDown := False;\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCDefaultToolBarButton.HasHint: Boolean;\r\nbegin\r\n Result := Hint <> '';\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FBitmapContainer) then\r\n FBitmapContainer := nil;\r\n\r\n if (Operation = opRemove) and (AComponent = FDropDownControl) then\r\n FDropDownControl := nil;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n r: TRectF;\r\nbegin\r\n inherited;\r\n if not Appearance.Transparent then\r\n begin\r\n if Enabled then\r\n begin\r\n if FDown or FDownState then\r\n begin\r\n AGraphics.Fill.Assign(Appearance.DownFill);\r\n AGraphics.Stroke.Assign(Appearance.DownStroke);\r\n end\r\n else if FHover then\r\n begin\r\n AGraphics.Fill.Assign(Appearance.HoverFill);\r\n AGraphics.Stroke.Assign(Appearance.HoverStroke);\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(Appearance.NormalFill);\r\n AGraphics.Stroke.Assign(Appearance.NormalStroke);\r\n end;\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(Appearance.DisabledFill);\r\n AGraphics.Stroke.Assign(Appearance.DisabledStroke);\r\n end;\r\n\r\n r := LocalRect;\r\n\r\n if Appearance.FlatStyle then\r\n begin\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.DrawRectangle(r);\r\n end\r\n else\r\n AGraphics.DrawRoundRectangle(r, Appearance.Rounding, Appearance.Corners);\r\n\r\n if Appearance.ShowInnerStroke and not Appearance.FlatStyle then\r\n begin\r\n InflateRectEx(r, -1, -1);\r\n AGraphics.Stroke.Assign(Appearance.InnerStroke);\r\n AGraphics.Fill.Kind := gfkNone;\r\n AGraphics.DrawRoundRectangle(r, Appearance.Rounding, Appearance.Corners);\r\n end;\r\n end;\r\n\r\n DrawBitmap(AGraphics, ARect);\r\n DrawText(AGraphics);\r\n DrawButton(AGraphics);\r\n\r\n if ShowFocus and IsFocused then\r\n begin\r\n r := GetTextRect;\r\n AGraphics.DrawFocusRectangle(r);\r\n end;\r\n\r\n if IsDesignTime and CanDrawDesignTime then\r\n AGraphics.DrawFocusRectangle(ARect, gcBlack);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.DoClosePopup(Sender: TObject);\r\nbegin\r\n if Assigned(OnCloseDropDown) then\r\n OnCloseDropDown(Self);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.ResetToDefaultStyle;\r\nbegin\r\n inherited;\r\n Font.Color := gcBlack;\r\n Appearance.NormalFill.Color := gcWhite;\r\n Appearance.HoverFill.Color := gcWhite;\r\n Appearance.DownFill.Color := gcWhite;\r\n Appearance.DisabledFill.Color := gcLightgray;\r\n Appearance.NormalStroke.Color := gcGray;\r\n Appearance.InnerStroke.Color := gcWhite;\r\n Appearance.HoverStroke.Color := gcGray;\r\n Appearance.DownStroke.Color := gcGray;\r\n Appearance.DisabledStroke.Color := gcGray;\r\n\r\n Appearance.NormalFill.Kind := gfkGradient;\r\n Appearance.HoverFill.Kind := gfkGradient;\r\n Appearance.DownFill.Kind := gfkGradient;\r\n Appearance.DisabledFill.Kind := gfkSolid;\r\n Appearance.NormalStroke.Kind := gskSolid;\r\n Appearance.InnerStroke.Kind := gskSolid;\r\n Appearance.HoverStroke.Kind := gskSolid;\r\n Appearance.DownStroke.Kind := gskSolid;\r\n Appearance.DisabledStroke.Kind := gskSolid;\r\n\r\n Appearance.NormalFill.Color := MakeGraphicsColor(249, 251, 252);\r\n Appearance.NormalFill.ColorTo := MakeGraphicsColor(230, 235, 235);\r\n Appearance.NormalFill.ColorMirror := MakeGraphicsColor(220, 220, 236);\r\n Appearance.NormalFill.ColorMirrorTo := MakeGraphicsColor(220, 225, 236);\r\n\r\n Appearance.HoverFill.Color := MakeGraphicsColor(229, 231, 232);\r\n Appearance.HoverFill.ColorTo := MakeGraphicsColor(210, 215, 215);\r\n Appearance.HoverFill.ColorMirror := MakeGraphicsColor(200, 200, 216);\r\n Appearance.HoverFill.ColorMirrorTo := MakeGraphicsColor(200, 205, 216);\r\n\r\n Appearance.DownFill.Color := MakeGraphicsColor(219, 221, 222);\r\n Appearance.DownFill.ColorTo := MakeGraphicsColor(200, 205, 205);\r\n Appearance.DownFill.ColorMirror := MakeGraphicsColor(190, 190, 206);\r\n Appearance.DownFill.ColorMirrorTo := MakeGraphicsColor(190, 195, 206);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SelectFirstValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SelectLastValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SelectNextValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SelectPreviousValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SelectValueWithCharacter(\r\n ACharacter: Char);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(FPopup) then\r\n FPopup.AdaptToStyle := AdaptToStyle;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetAppearance(\r\n const Value: TTMSFNCToolBarButtonAppearance);\r\nbegin\r\n FAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetAutoBitmapSize(const Value: Boolean);\r\nbegin\r\n if FAutoBitmapSize <> Value then\r\n begin\r\n FAutoBitmapSize := Value;\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetBitmaps(const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetBitmapSize(const Value: Single);\r\nbegin\r\n if FBitmapSize <> Value then\r\n begin\r\n FBitmapSize := Value;\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nbegin\r\n FBitmapContainer := Value;\r\n UpdateLayout;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetBitmapPosition(\r\n const Value: TTMSFNCToolBarButtonBitmapPosition);\r\nbegin\r\n if FBitmapPosition <> Value then\r\n begin\r\n FBitmapPosition := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetBitmapVisible(const Value: Boolean);\r\nbegin\r\n FBitmapVisible := Value;\r\n UpdateLayout;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetLargeLayoutAutoBitmapSize(\r\n const Value: Boolean);\r\nbegin\r\n if FLargeLayoutAutoBitmapSize <> Value then\r\n begin\r\n FLargeLayoutAutoBitmapSize := Value;\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetLargeLayoutBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FLargeLayoutBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetLargeLayoutBitmapSize(\r\n const Value: Single);\r\nbegin\r\n if FLargeLayoutBitmapSize <> Value then\r\n begin\r\n FLargeLayoutBitmapSize := Value;\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetLargeLayoutDisabledBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FLargeLayoutDisabledBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetLargeLayoutHoverBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FLargeLayoutHoverBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetLayout(\r\n const Value: TTMSFNCToolBarButtonLayout);\r\nbegin\r\n if FLayout <> Value then\r\n begin\r\n FLayout := Value;\r\n UpdateLayout;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetCloseOnSelection(const Value: Boolean);\r\nbegin\r\n if FCloseOnSelection <> Value then\r\n begin\r\n FCloseOnSelection := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetCompactLayout(\r\n const Value: TTMSFNCToolBarButtonLayout);\r\nbegin\r\n if FCompactLayout <> Value then\r\n FCompactLayout := Value;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetName(const Value: TComponentName);\r\nvar\r\n ChangeText: Boolean;\r\nbegin\r\n ChangeText := not (csLoading in ComponentState) and (Name = Text) and\r\n ((not Assigned(Owner)) or not (Owner is TComponent) or not (csLoading in TComponent(Owner).ComponentState));\r\n inherited SetName(Value);\r\n if ChangeText and ApplyName and CanChangeText then\r\n Text := StringReplace(Text, 'TMSFNCToolBar', '', [rfReplaceAll]);\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetShowFocus(const Value: Boolean);\r\nbegin\r\n if FShowFocus <> Value then\r\n begin\r\n FShowFocus := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetStretchBitmapIfNoText(\r\n const Value: Boolean);\r\nbegin\r\n if FStretchBitmapIfNoText <> Value then\r\n begin\r\n FStretchBitmapIfNoText := Value;\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetStretchText(const Value: Boolean);\r\nbegin\r\n if FStretchText <> Value then\r\n begin\r\n FStretchText := Value;\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n FTextVisible := Value <> '';\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetTextVisible(const Value: Boolean);\r\nbegin\r\n if FTextVisible <> Value then\r\n begin\r\n FTextVisible := Value;\r\n UpdateLayout;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n if Layout = bblLarge then\r\n FOldHeight := Height;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.UpdateLayout;\r\nvar\r\n sz: TSizeF;\r\n w: Single;\r\nbegin\r\n if (Layout = bblNone) or FBlockUpdate then\r\n Exit;\r\n\r\n FBlockUpdate := True;\r\n case Layout of\r\n bblBitmap:\r\n begin\r\n TextVisible := False;\r\n BitmapPosition := bbpLeft;\r\n StretchText := False;\r\n Height := Round(GetBitmapSize + 6);\r\n Width := Round(GetBitmapSize + 6);\r\n end;\r\n bblLabel:\r\n begin\r\n TextVisible := True;\r\n BitmapPosition := bbpLeft;\r\n StretchText := False;\r\n sz := GetTextSize;\r\n if BitmapVisible then\r\n begin\r\n Height := Round(Max(GetBitmapSize, sz.cy) + 6);\r\n Width := Round(GetBitmapSize + sz.cx + 12);\r\n end\r\n else if TextVisible and (Text <> '') then\r\n begin\r\n Height := Round(sz.cy + 6);\r\n Width := Round(sz.cx + 6);\r\n end\r\n else\r\n begin\r\n Width := 75;\r\n Height := 24;\r\n end;\r\n end;\r\n bblLarge:\r\n begin\r\n TextVisible := True;\r\n BitmapPosition := bbpTop;\r\n StretchText := not BitmapVisible;\r\n\r\n sz := GetTextSize;\r\n w := 30;\r\n if BitmapVisible then\r\n w := Max(w, GetLargeLayoutBitmapSize + 6);\r\n\r\n if TextVisible and (Text <> '') then\r\n w := Max(w, sz.cx + 12);\r\n\r\n Width := Round(w);\r\n\r\n if FOldHeight <> -1 then\r\n Height := Round(FOldHeight);\r\n end;\r\n end;\r\n FBlockUpdate := False;\r\n\r\n UpdateToolBar;\r\nend;\r\n\r\nprocedure TTMSFNCDefaultToolBarButton.UpdateState;\r\nvar\r\n f: Single;\r\nbegin\r\n inherited;\r\n case FState of\r\n esNormal: f := 0.8;\r\n esLarge: f := 1.25;\r\n else\r\n f := 1;\r\n end;\r\n\r\n if not (csLoading in ComponentState) then\r\n begin\r\n DropDownWidth := DropDownWidth * f;\r\n DropDownHeight := DropDownHeight * f;\r\n {$IFDEF FMXLIB}\r\n Font.Size := Font.Size * f;\r\n SetBounds(Position.X, Position.Y, int(Width * f), int(Height * f));\r\n {$ENDIF}\r\n {$IFDEF VCLWEBLIB}\r\n Font.Size := Round(Font.Size * f);\r\n SetBounds(Left, Top, Round(Width * f), Round(Height * f));\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetCorners(const Value: TTMSFNCGraphicsCorners);\r\nbegin\r\n if FCorners <> Value then\r\n begin\r\n FCorners := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetRounding(const Value: Single);\r\nbegin\r\n if FRounding <> Value then\r\n begin\r\n FRounding := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\n{ TTMSFNCCustomToolBarSeparator }\r\n\r\nprocedure TTMSFNCCustomToolBarSeparator.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCCustomToolBarSeparator then\r\n begin\r\n FAppearance.Assign((Source as TTMSFNCCustomToolBarSeparator).Appearance);\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCCustomToolBarSeparator.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n {$IFDEF FMXLIB}\r\n Width := 3;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Width := 2;\r\n {$ENDIF}\r\n Height := 30;\r\n FAppearance := TTMSFNCToolBarSeparatorAppearance.Create(Self);\r\nend;\r\n\r\ndestructor TTMSFNCCustomToolBarSeparator.Destroy;\r\nbegin\r\n FAppearance.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarSeparator.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n cp: TPointF;\r\n r: TRectF;\r\nbegin\r\n inherited;\r\n r := LocalRect;\r\n {$IFDEF FMXLIB}\r\n cp := r.CenterPoint;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n cp := PointF(r.Left, r.Top);\r\n {$ENDIF}\r\n AGraphics.Stroke.Assign(Appearance.Stroke);\r\n AGraphics.DrawLine(PointF(cp.X, r.Top), PointF(cp.X, r.Bottom));\r\n AGraphics.Stroke.Assign(Appearance.InnerStroke);\r\n AGraphics.DrawLine(PointF(cp.X + 1, r.Top), PointF(cp.X + 1, r.Bottom));\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarSeparator.SetAppearance(\r\n const Value: TTMSFNCToolBarSeparatorAppearance);\r\nbegin\r\n FAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarSeparator.UpdateState;\r\nvar\r\n f: Single;\r\nbegin\r\n inherited;\r\n case State of\r\n esNormal: f := 0.8;\r\n esLarge: f := 1.25;\r\n else\r\n f := 1;\r\n end;\r\n\r\n if not (csLoading in ComponentState) then\r\n begin\r\n {$IFDEF FMXLIB}\r\n SetBounds(Position.X, Position.Y, Width, int(Height * f));\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n SetBounds(Left, Top, Width, Round(Height * f));\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\n{ TTMSFNCToolBarCustomButtonAppearance }\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCToolBarCustomButtonAppearance then\r\n begin\r\n FNormalFill.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).NormalFill);\r\n FDisabledFill.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).DisabledFill);\r\n FHoverFill.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).HoverFill);\r\n FDownFill.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).DownFill);\r\n FNormalStroke.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).NormalStroke);\r\n FDisabledStroke.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).DisabledStroke);\r\n FHoverStroke.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).HoverStroke);\r\n FDownStroke.Assign((Source as TTMSFNCToolBarCustomButtonAppearance).DownStroke);\r\n FRounding := (Source as TTMSFNCToolBarCustomButtonAppearance).Rounding;\r\n FCorners := (Source as TTMSFNCToolBarCustomButtonAppearance).Corners;\r\n FShowInnerStroke := (Source as TTMSFNCToolBarCustomButtonAppearance).ShowInnerStroke;\r\n FTransparent := (Source as TTMSFNCToolBarCustomButtonAppearance).Transparent;\r\n FFlatStyle := (Source as TTMSFNCToolBarCustomButtonAppearance).FlatStyle;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.Changed;\r\nbegin\r\n if Assigned(FOwner) then\r\n FOwner.AppearanceChanged\r\n else if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nconstructor TTMSFNCToolBarCustomButtonAppearance.Create(AOwner: TTMSFNCDefaultToolBarButton);\r\nbegin\r\n FOwner := AOwner;\r\n FCorners := [gcTopLeft, gcTopRight, gcBottomLeft, gcBottomRight];\r\n FRounding := 3;\r\n FTransparent := False;\r\n FShowInnerStroke := True;\r\n FFlatStyle := False;\r\n\r\n FNormalFill := TTMSFNCGraphicsFill.Create(gfkGradient);\r\n FHoverFill := TTMSFNCGraphicsFill.Create(gfkGradient);\r\n FDownFill := TTMSFNCGraphicsFill.Create(gfkGradient);\r\n FDisabledFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcLightgray);\r\n FNormalStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n FInnerStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcWhite);\r\n FHoverStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n FDownStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n FDisabledStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n\r\n FNormalFill.OnChanged := @FillChanged;\r\n FHoverFill.OnChanged := @FillChanged;\r\n FDownFill.OnChanged := @FillChanged;\r\n FDisabledFill.OnChanged := @FillChanged;\r\n\r\n FInnerStroke.OnChanged := @StrokeChanged;\r\n FNormalStroke.OnChanged := @StrokeChanged;\r\n FHoverStroke.OnChanged := @StrokeChanged;\r\n FDownStroke.OnChanged := @StrokeChanged;\r\n FDisabledStroke.OnChanged := @StrokeChanged;\r\n\r\n FNormalFill.Color := MakeGraphicsColor(249, 251, 252);\r\n FNormalFill.ColorTo := MakeGraphicsColor(230, 235, 235);\r\n FNormalFill.ColorMirror := MakeGraphicsColor(220, 220, 236);\r\n FNormalFill.ColorMirrorTo := MakeGraphicsColor(220, 225, 236);\r\n\r\n FHoverFill.Color := MakeGraphicsColor(229, 231, 232);\r\n FHoverFill.ColorTo := MakeGraphicsColor(210, 215, 215);\r\n FHoverFill.ColorMirror := MakeGraphicsColor(200, 200, 216);\r\n FHoverFill.ColorMirrorTo := MakeGraphicsColor(200, 205, 216);\r\n\r\n FDownFill.Color := MakeGraphicsColor(219, 221, 222);\r\n FDownFill.ColorTo := MakeGraphicsColor(200, 205, 205);\r\n FDownFill.ColorMirror := MakeGraphicsColor(190, 190, 206);\r\n FDownFill.ColorMirrorTo := MakeGraphicsColor(190, 195, 206);\r\nend;\r\n\r\ndestructor TTMSFNCToolBarCustomButtonAppearance.Destroy;\r\nbegin\r\n FNormalFill.Free;\r\n FHoverFill.Free;\r\n FDownFill.Free;\r\n FDisabledFill.Free;\r\n\r\n FInnerStroke.Free;\r\n FNormalStroke.Free;\r\n FHoverStroke.Free;\r\n FDownStroke.Free;\r\n FDisabledStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nfunction TTMSFNCToolBarCustomButtonAppearance.IsRoundingStored: Boolean;\r\nbegin\r\n Result := Rounding <> 3;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetDisabledFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FDisabledFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetDisabledStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FDisabledStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetDownFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FDownFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetDownStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FDownStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetFlatStyle(const Value: Boolean);\r\nvar\r\n c: TControl;\r\n I: Integer;\r\nbegin\r\n if FFlatStyle <> Value then\r\n begin\r\n FFlatStyle := Value;\r\n if Assigned(FOwner) then\r\n begin\r\n for I := 0 to FOwner.ControlCount - 1 do\r\n begin\r\n c := FOwner.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if c is TTMSFNCDefaultToolBarButton then\r\n (c as TTMSFNCDefaultToolBarButton).Appearance.FlatStyle := FlatStyle;\r\n\r\n if c is TTMSFNCCustomToolBar then\r\n (c as TTMSFNCCustomToolBar).Appearance.FlatStyle := FlatStyle;\r\n end;\r\n end;\r\n\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetHoverFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FHoverFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetHoverStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FHoverStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetInnerStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FInnerStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetNormalFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FNormalFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetNormalStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FNormalStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetShowInnerStroke(\r\n const Value: Boolean);\r\nbegin\r\n if FShowInnerStroke <> Value then\r\n begin\r\n FShowInnerStroke := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomButtonAppearance.SetTransparent(\r\n const Value: Boolean);\r\nbegin\r\n if FTransparent <> Value then\r\n begin\r\n FTransparent := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCCustomToolBarAppearance }\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomToolBarAppearance then\r\n begin\r\n FSeparatorStroke.Assign((Source as TTMSFNCCustomToolBarAppearance).SeparatorStroke);\r\n FSeparator := (Source as TTMSFNCCustomToolBarAppearance).Separator;\r\n FFill.Assign((Source as TTMSFNCCustomToolBarAppearance).Fill);\r\n FStroke.Assign((Source as TTMSFNCCustomToolBarAppearance).Stroke);\r\n FHorizontalSpacing := (Source as TTMSFNCCustomToolBarAppearance).HorizontalSpacing;\r\n FVerticalSpacing := (Source as TTMSFNCCustomToolBarAppearance).VerticalSpacing;\r\n FDragGripColor := (Source as TTMSFNCCustomToolBarAppearance).DragGripColor;\r\n FDragGrip := (Source as TTMSFNCCustomToolBarAppearance).DragGrip;\r\n FFlatStyle := (Source as TTMSFNCCustomToolBarAppearance).FlatStyle;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCCustomToolBarAppearance.Create(AOwner: TTMSFNCCustomToolBar);\r\nbegin\r\n FOwner := AOwner;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFlatStyle := False;\r\n FHorizontalSpacing := 3;\r\n FVerticalSpacing := 3;\r\n FDragGrip := True;\r\n FDragGripColor := gcLightgray;\r\n FFill := TTMSFNCGraphicsFill.Create(gfkGradient);\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n\r\n FFill.OnChanged := @FillChanged;\r\n FStroke.OnChanged := @StrokeChanged;\r\n\r\n FFill.Color := gcWhite;\r\n FFill.ColorTo := MakeGraphicsColor(230, 230, 230);\r\n\r\n FSeparatorStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcWhite);\r\n FSeparatorStroke.OnChanged := @StrokeChanged;\r\nend;\r\n\r\ndestructor TTMSFNCCustomToolBarAppearance.Destroy;\r\nbegin\r\n FSeparatorStroke.Free;\r\n FFont.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n FOwner.Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarAppearance.IsHorizontalSpacingStored: Boolean;\r\nbegin\r\n Result := HorizontalSpacing <> 3;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarAppearance.IsVerticalSpacingStored: Boolean;\r\nbegin\r\n Result := VerticalSpacing <> 3;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetDragGrip(const Value: Boolean);\r\nbegin\r\n if FDragGrip <> Value then\r\n begin\r\n FDragGrip := Value;\r\n FOwner.UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetDragGripColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDragGripColor <> Value then\r\n begin\r\n FDragGripColor := Value;\r\n FOwner.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetFlatStyle(const Value: Boolean);\r\nbegin\r\n if FFlatStyle <> Value then\r\n begin\r\n FFlatStyle := Value;\r\n if Assigned(FOwner) then\r\n FOwner.ApplyFlatStyle;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetHorizontalSpacing(\r\n const Value: Single);\r\nbegin\r\n if FHorizontalSpacing <> Value then\r\n begin\r\n FHorizontalSpacing := Value;\r\n FOwner.UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetSeparator(const Value: Boolean);\r\nbegin\r\n if FSeparator <> Value then\r\n begin\r\n FSeparator := Value;\r\n FOwner.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetSeparatorStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FSeparatorStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.SetVerticalSpacing(\r\n const Value: Single);\r\nbegin\r\n if FVerticalSpacing <> Value then\r\n begin\r\n FVerticalSpacing := Value;\r\n FOwner.UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n FOwner.Invalidate;\r\nend;\r\n\r\n{ TTMSFNCCustomToolBarSeparatorAppearance }\r\n\r\nprocedure TTMSFNCCustomToolBarSeparatorAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomToolBarSeparatorAppearance then\r\n begin\r\n Stroke.Assign((Source as TTMSFNCCustomToolBarSeparatorAppearance).Stroke);\r\n InnerStroke.Assign((Source as TTMSFNCCustomToolBarSeparatorAppearance).InnerStroke);\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nconstructor TTMSFNCCustomToolBarSeparatorAppearance.Create(\r\n AOwner: TTMSFNCCustomToolBarSeparator);\r\nbegin\r\n FOwner := AOwner;\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n FStroke.OnChanged := @StrokeChanged;\r\n FInnerStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcWhite);\r\n FInnerStroke.OnChanged := @StrokeChanged;\r\nend;\r\n\r\ndestructor TTMSFNCCustomToolBarSeparatorAppearance.Destroy;\r\nbegin\r\n FInnerStroke.Free;\r\n FStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarSeparatorAppearance.SetInnerStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FInnerStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarSeparatorAppearance.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarSeparatorAppearance.StrokeChanged(\r\n Sender: TObject);\r\nbegin\r\n FOwner.Invalidate;\r\nend;\r\n\r\n{ TTMSFNCCustomDockPanel }\r\n\r\nfunction TTMSFNCCustomDockPanel.AddToolBar(AIndex: Integer = -1): TTMSFNCToolBar;\r\nbegin\r\n FBlockUpdate := True;\r\n Result := TTMSFNCToolBar.Create(Self);\r\n {$IFDEF FMXLIB}\r\n if (AIndex >= 0) and (AIndex <= Self.ControlCount - 1) then\r\n InsertObject(AIndex, Result)\r\n else\r\n AddObject(Result);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result.Parent := Self;\r\n {$ENDIF}\r\n\r\n FBlockUpdate := False;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleHeaderFillColor(c) then\r\n begin\r\n Appearance.Fill.Kind := gfkSolid;\r\n Appearance.Fill.Color := c;\r\n end;\r\n\r\n if TTMSFNCStyles.GetStyleHeaderFillColorTo(c) then\r\n begin\r\n Appearance.Fill.Kind := gfkGradient;\r\n Appearance.Fill.ColorTo := c;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCCustomDockPanel then\r\n begin\r\n Appearance.Assign((Source as TTMSFNCCustomDockPanel).Appearance);\r\n AutoSize := (Source as TTMSFNCCustomDockPanel).AutoSize;\r\n AutoAlign := (Source as TTMSFNCCustomDockPanel).AutoAlign;\r\n State := (Source as TTMSFNCCustomDockPanel).State;\r\n end\r\n else\r\n inherited;\r\nend;\r\n\r\nconstructor TTMSFNCCustomDockPanel.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FState := esNormal;\r\n FAppearance := TTMSFNCDockPanelAppearance.Create(Self);\r\n FAutoSize := True;\r\n FAutoAlign := True;\r\n {$IFDEF FMXLIB}\r\n Align := TAlignLayout.Top;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Align := alTop;\r\n {$ENDIF}\r\n Height := 40;\r\nend;\r\n\r\ndestructor TTMSFNCCustomDockPanel.Destroy;\r\nbegin\r\n FAppearance.Free;\r\n inherited;\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomDockPanel.AlignControls(AControl: TControl; var Rect: TRect);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomDockPanel.DoAddObject(const AObject: TFmxObject);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.DoInsertObject(Index: Integer;\r\n const AObject: TFmxObject);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.DoRealign;\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.DoRemoveObject(\r\n const AObject: TFmxObject);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCCustomDockPanel.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.InitializeControls;\r\nvar\r\n I: Integer;\r\n c: TControl;\r\nbegin\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if c is TTMSFNCCustomToolBar then\r\n begin\r\n (c as TTMSFNCCustomToolBar).OnUpdateDockPanel := UpdateDockPanel;\r\n if (c as TTMSFNCCustomToolBar).FDragGripMoving then\r\n Continue;\r\n end;\r\n\r\n if c.Visible then\r\n begin\r\n {$IFDEF FMXLIB}\r\n if c.Position.y < Appearance.Margins.Top then\r\n c.Position.y := Appearance.Margins.Top;\r\n if c.Position.x < Appearance.Margins.Left then\r\n c.Position.x := Appearance.Margins.Left\r\n else if c.Position.x + c.Width > Width - Appearance.Margins.Right then\r\n c.Position.x := Width - Appearance.Margins.Right - c.Width;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if c.Top < Appearance.Margins.Top then\r\n c.Top := Round(Appearance.Margins.Top);\r\n if c.Left < Appearance.Margins.Left then\r\n c.Left := Round(Appearance.Margins.Left)\r\n else if c.Left + c.Width > Width - Appearance.Margins.Right then\r\n c.Left := Round(Width - Appearance.Margins.Right - c.Width);\r\n {$ENDIF}\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n r: TRectF;\r\nbegin\r\n inherited;\r\n AGraphics.Fill.Assign(Appearance.Fill);\r\n AGraphics.Stroke.Assign(Appearance.Stroke);\r\n\r\n r := LocalRect;\r\n AGraphics.DrawRectangle(r);\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.RearrangeControls;\r\nvar\r\n c, cl: TControl;\r\n cr, clr: TRectF;\r\n I, J: Integer;\r\nbegin\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n if not c.Visible then\r\n Continue;\r\n\r\n if c is TTMSFNCCustomToolBar then\r\n begin\r\n if (c as TTMSFNCCustomToolBar).FDragGripMoving then\r\n Continue;\r\n end;\r\n\r\n for J := 0 to Self.ControlCount - 1 do\r\n begin\r\n cl := Self.Controls[J];\r\n\r\n if (cl = c) or not cl.Visible then\r\n Continue;\r\n\r\n {$IFDEF FMXLIB}\r\n if Supports(cl, IDesignerControl) then\r\n Continue;\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n cr := RectF(c.Position.X, c.Position.Y, c.Position.X + c.Width, c.Position.Y + c.Height);\r\n clr := RectF(cl.Position.X, cl.Position.Y, cl.Position.X + cl.Width, cl.Position.Y + cl.Height);\r\n\r\n if (clr.Left >= cr.Left - 3) and (clr.Left <= cr.Right + 3) then\r\n begin\r\n if (clr.Top < CenterPointEx(cr).Y) and (clr.Top >= cr.Top - 3) then\r\n begin\r\n cl.Position.X := c.Position.X + c.Width + 3;\r\n cl.Position.Y := c.Position.Y;\r\n end\r\n else if (clr.Top >= CenterPointEx(cr).Y) and (clr.Top <= cr.Bottom + 3) then\r\n begin\r\n cl.Position.Y := c.Position.Y + c.Height + 3;\r\n cl.Position.X := c.Position.X;\r\n end;\r\n end;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n cr := RectF(c.Left, c.Top, c.Left + c.Width, c.Top + c.Height);\r\n clr := RectF(cl.Left, cl.Top, cl.Left + cl.Width, cl.Top + cl.Height);\r\n\r\n if (clr.Left >= cr.Left - 3) and (clr.Left <= cr.Right + 3) then\r\n begin\r\n if (clr.Top < CenterPointEx(cr).Y) and (clr.Top >= cr.Top - 3) then\r\n begin\r\n cl.Left := c.Left + c.Width + 3;\r\n cl.Top := c.Top;\r\n end\r\n else if (clr.Top >= CenterPointEx(cr).Y) and (clr.Top <= cr.Bottom + 3) then\r\n begin\r\n cl.Top := c.Top + c.Height + 3;\r\n cl.Left := c.Left;\r\n end;\r\n end;\r\n {$ENDIF}\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.ResetToDefaultStyle;\r\nbegin\r\n inherited;\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n inherited;\r\n UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.SetAppearance(\r\n const Value: TTMSFNCDockPanelAppearance);\r\nbegin\r\n FAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.SetAutoAlign(const Value: Boolean);\r\nbegin\r\n if FAutoAlign <> Value then\r\n begin\r\n FAutoAlign := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.SetAS(const Value: Boolean);\r\nbegin\r\n if FAutoSize <> Value then\r\n begin\r\n FAutoSize := Value;\r\n UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.SetState(\r\n const Value: TTMSFNCToolBarElementState);\r\nvar\r\n I: Integer;\r\n c: TControl;\r\nbegin\r\n if FState <> Value then\r\n begin\r\n FState := Value;\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n if c is TTMSFNCCustomToolBar then\r\n (c as TTMSFNCCustomToolBar).State := FState;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.UpdateControls;\r\nvar\r\n I: Integer;\r\n {$IFDEF FMXLIB}\r\n h, hsm: Single;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n h, hsm: Integer;\r\n {$ENDIF}\r\n c: TControl;\r\n {$IFDEF FNCLIB}\r\n ia: ITMSFNCAdaptToStyle;\r\n {$ENDIF}\r\nbegin\r\n if FBlockUpdate or IsLoading or IsDestroying then\r\n Exit;\r\n\r\n FBlockUpdate := True;\r\n h := 0;\r\n hsm := 30;\r\n\r\n if AutoAlign then\r\n begin\r\n InitializeControls;\r\n RearrangeControls;\r\n end;\r\n\r\n if AutoSize then\r\n begin\r\n for I := 0 to Self.ControlCount - 1 do\r\n begin\r\n c := Self.Controls[I];\r\n {$IFDEF FMXLIB}\r\n if Supports(c, IDesignerControl) then\r\n Continue;\r\n\r\n if c.Visible then\r\n h := Max(h, c.Position.y + c.Height + Appearance.Margins.Bottom);\r\n {$ENDIF}\r\n\r\n {$IFDEF FNCLIB}\r\n if Supports(c, ITMSFNCAdaptToStyle, ia) then\r\n ia.AdaptToStyle := AdaptToStyle;\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNWEBLIB}\r\n if c.Visible then\r\n h := Round(Max(h, c.Top + c.Height + Appearance.Margins.Bottom));\r\n {$ENDIF}\r\n end;\r\n\r\n if h = 0 then\r\n h := hsm;\r\n\r\n if csDesigning in ComponentState then\r\n h := h + 15;\r\n\r\n {$IFDEF FMXLIB}\r\n SetBounds(Position.X, Position.Y, Width, h);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n SetBounds(Left, Top, Width, h);\r\n {$ENDIF}\r\n end;\r\n\r\n FBlockUpdate := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanel.UpdateDockPanel(Sender: TObject);\r\nbegin\r\n UpdateControls;\r\nend;\r\n\r\n{ TTMSFNCCustomDockPanelAppearance }\r\n\r\nconstructor TTMSFNCCustomDockPanelAppearance.Create(AOwner: TTMSFNCCustomDockPanel);\r\nbegin\r\n FOwner := AOwner;\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcGray);\r\n\r\n FFill.OnChanged := @FillChanged;\r\n FStroke.OnChanged := @StrokeChanged;\r\n FMargins := TTMSFNCMargins.Create;\r\n FMargins.Left := 3;\r\n FMargins.Top := 3;\r\n FMargins.Bottom := 3;\r\n FMargins.Right := 3;\r\nend;\r\n\r\ndestructor TTMSFNCCustomDockPanelAppearance.Destroy;\r\nbegin\r\n FMargins.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanelAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n FOwner.Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanelAppearance.MarginsChanged(\r\n Sender: TObject);\r\nbegin\r\n FOwner.UpdateControls;\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanelAppearance.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanelAppearance.SetMargins(\r\n const Value: TTMSFNCMargins);\r\nbegin\r\n FMargins.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanelAppearance.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomDockPanelAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n FOwner.Invalidate;\r\nend;\r\n\r\n{ TTMSFNCCustomToolBarElement }\r\n\r\nprocedure TTMSFNCCustomToolBarElement.UpdateToolBarControl;\r\nbegin\r\n if Assigned(OnUpdateToolBarControl) then\r\n OnUpdateToolBarControl(Self);\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomToolBarElement.ReadControlIndex(Reader: TReader);\r\nbegin\r\n ControlIndex := Reader.ReadInteger;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarElement.WriteControlIndex(Writer: TWriter);\r\nbegin\r\n Writer.WriteInteger(ControlIndex);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomToolBarElement.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCCustomToolBarElement then\r\n begin\r\n FState := (Source as TTMSFNCCustomToolBarElement).State;\r\n FLastElement := (Source as TTMSFNCCustomToolBarElement).LastElement;\r\n FCanCopy := (Source as TTMSFNCCustomToolBarElement).CanCopy;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCCustomToolBarElement.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n DisableBackground;\r\n {$IFDEF CMNLIB}\r\n ParentColor := True;\r\n {$IFDEF VCLLIB}\r\n ParentBackground := True;\r\n {$ENDIF}\r\n {$ENDIF}\r\n FLastElement := False;\r\n FCanCopy := True;\r\n FState := esNormal;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomToolBarElement.DefineProperties(Filer: TFiler);\r\nbegin\r\n inherited;\r\n {$IFDEF LCLLIB}\r\n Filer.DefineProperty('ControlIndex', @ReadControlIndex, @WriteControlIndex, True);\r\n {$ENDIF}\r\n {$IFNDEF LCLLIB}\r\n Filer.DefineProperty('ControlIndex', ReadControlIndex, WriteControlIndex, True);\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\ndestructor TTMSFNCCustomToolBarElement.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomToolBarElement.DoMatrixChanged(Sender: TObject);\r\nbegin\r\n inherited;\r\n UpdateToolBar;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomToolBarElement.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n UpdateToolBar;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarElement.SetLastElement(const Value: Boolean);\r\nbegin\r\n if FLastElement <> Value then\r\n begin\r\n FLastElement := Value;\r\n UpdateToolBar;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarElement.SetState(\r\n const Value: TTMSFNCToolBarElementState);\r\nbegin\r\n if FState <> Value then\r\n begin\r\n FState := Value;\r\n UpdateState;\r\n end;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomToolBarElement.SetVisible(const Value: Boolean);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomToolBarElement.VisibleChanging;\r\n{$ENDIF}\r\nbegin\r\n inherited;\r\n UpdateToolBar;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarElement.UpdateState;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarElement.UpdateToolBar;\r\nbegin\r\n if Assigned(OnUpdateToolBar) and not FBlockUpdate then\r\n OnUpdateToolBar(Self);\r\nend;\r\n\r\n{ TTMSFNCToolBarControl }\r\n\r\nconstructor TTMSFNCToolBarControl.Create;\r\nbegin\r\n FBitmap := TTMSFNCBitmap.Create;\r\nend;\r\n\r\ndestructor TTMSFNCToolBarControl.Destroy;\r\nbegin \r\n FBitmap.Free;\r\n inherited;\r\nend;\r\n\r\n{ TTMSFNCCustomToolBarOptionsMenu }\r\n\r\nprocedure TTMSFNCCustomToolBarOptionsMenu.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCCustomToolBarOptionsMenu then\r\n begin\r\n FShowItemText := (Source as TTMSFNCCustomToolBarOptionsMenu).ShowItemText;\r\n FShowItemBitmap := (Source as TTMSFNCCustomToolBarOptionsMenu).ShowItemBitmap;\r\n FShowButton := (Source as TTMSFNCCustomToolBarOptionsMenu).ShowButton;\r\n FAutoItemBitmapWidth := (Source as TTMSFNCCustomToolBarOptionsMenu).AutoItemBitmapWidth;\r\n FItemBitmapWidth := (Source as TTMSFNCCustomToolBarOptionsMenu).ItemBitmapWidth;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCCustomToolBarOptionsMenu.Create(\r\n AOwner: TTMSFNCCustomToolBar);\r\nbegin\r\n FOwner := AOwner;\r\n FShowItemText := True;\r\n FShowButton := True;\r\n FShowItemBitmap := True;\r\n FAutoItemBitmapWidth := True;\r\n FItemBitmapWidth := 50;\r\nend;\r\n\r\ndestructor TTMSFNCCustomToolBarOptionsMenu.Destroy;\r\nbegin\r\n\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCCustomToolBarOptionsMenu.IsItemBitmapWidthStored: Boolean;\r\nbegin\r\n Result := ItemBitmapWidth <> 50;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarOptionsMenu.SetAutoItemBitmapWidth(\r\n const Value: Boolean);\r\nbegin\r\n if FAutoItemBitmapWidth <> Value then\r\n begin\r\n FAutoItemBitmapWidth := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarOptionsMenu.SetItemBitmapWidth(\r\n const Value: Single);\r\nbegin\r\n if FItemBitmapWidth <> Value then\r\n begin\r\n FItemBitmapWidth := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarOptionsMenu.SetShowButton(const Value: Boolean);\r\nbegin\r\n if FShowButton <> Value then\r\n begin\r\n FShowButton := Value;\r\n FOwner.FOptionsMenuButton.Visible := FShowButton;\r\n if FShowButton then\r\n FOwner.FOptionsMenuButton.Parent := FOwner\r\n else\r\n FOwner.FOptionsMenuButton.Parent := nil;\r\n\r\n FOwner.UpdateControls;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarOptionsMenu.SetShowItemBitmap(\r\n const Value: Boolean);\r\nbegin\r\n if FShowItemBitmap <> Value then\r\n begin\r\n FShowItemBitmap := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomToolBarOptionsMenu.SetShowItemText(const Value: Boolean);\r\nbegin\r\n if FShowItemText <> Value then\r\n begin\r\n FShowItemText := Value;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCToolBarFontNamePicker }\r\n\r\nconstructor TTMSFNCToolBarFontNamePicker.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n AutoOptionsMenuText := 'Font Name';\r\n TTMSFNCUtils.GetFonts(FItems);\r\n {$IFDEF LCLLIB}\r\n FItems.Insert(0, 'Default');\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCToolBarFontNamePicker.DoItemSelected;\r\nbegin\r\n inherited;\r\n if Assigned(OnFontNameSelected) then\r\n OnFontNameSelected(Self, SelectedFontName);\r\nend;\r\n\r\nfunction TTMSFNCToolBarFontNamePicker.GetSelectedFontName: String;\r\nbegin\r\n Result := GetSelectedItem;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarFontNamePicker.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBarFontNamePicker);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarFontNamePicker.SetSelectedFontName(const Value: String);\r\nbegin\r\n SelectedItem := Value;\r\nend;\r\n\r\n{ TTMSFNCToolBarFontNamePicker }\r\n\r\nconstructor TTMSFNCToolBarFontSizePicker.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n AutoOptionsMenuText := 'Font Size';\r\n FItems.Add('8');\r\n FItems.Add('9');\r\n FItems.Add('10');\r\n FItems.Add('11');\r\n FItems.Add('12');\r\n FItems.Add('14');\r\n FItems.Add('16');\r\n FItems.Add('18');\r\n FItems.Add('20');\r\n FItems.Add('22');\r\n FItems.Add('24');\r\n FItems.Add('26');\r\n FItems.Add('28');\r\n FItems.Add('36');\r\n FItems.Add('48');\r\n FItems.Add('72');\r\nend;\r\n\r\nprocedure TTMSFNCToolBarFontSizePicker.DoItemSelected;\r\nbegin\r\n inherited;\r\n if Assigned(OnFontSizeSelected) then\r\n OnFontSizeSelected(Self, SelectedFontSize);\r\nend;\r\n\r\nfunction TTMSFNCToolBarFontSizePicker.GetSelectedFontSize: Single;\r\nvar\r\n s: String;\r\nbegin\r\n Result := -1;\r\n s := GetSelectedItem;\r\n if s <> '' then\r\n Result := StrToFloat(GetSelectedItem)\r\nend;\r\n\r\nprocedure TTMSFNCToolBarFontSizePicker.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBarFontSizePicker);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarFontSizePicker.SetSelectedFontSize(const Value: Single);\r\nbegin\r\n SelectedItem := FloatToStr(Value);\r\nend;\r\n\r\n{ TTMSFNCToolBarColorPicker }\r\n\r\nfunction TTMSFNCToolBarColorPicker.BlockChange: Boolean;\r\nbegin\r\n Result := FColorSelector.BlockChange;\r\nend;\r\n\r\nfunction TTMSFNCToolBarColorPicker.CanChangeText: Boolean;\r\nbegin\r\n Result := not (csLoading in ComponentState) and not (csDesigning in ComponentState);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.ColorSelected(Sender: TObject;\r\n AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if CloseOnSelection and not BlockChange then\r\n CloseDropDown;\r\n DoColorSelected(AColor);\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCToolBarColorPicker.ColorSelector: TTMSFNCColorSelector;\r\nbegin\r\n Result := FColorSelector;\r\nend;\r\n\r\nconstructor TTMSFNCToolBarColorPicker.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n Width := 40;\r\n Height := 24;\r\n AutoOptionsMenuText := 'Color';\r\n FColorSelector := TTMSFNCColorSelector.Create(Self);\r\n FColorSelector.Appearance.HorizontalSpacing := 2;\r\n FColorSelector.Appearance.VerticalSpacing := 2;\r\n FColorSelector.Mode := csmExtended;\r\n FColorSelector.Width := 175;\r\n FColorSelector.Height := 125;\r\n FColorSelector.Stored := False;\r\n FColorSelector.SelectedColor := gcBlack;\r\n FColorSelector.OnColorSelected := ColorSelected;\r\n\r\n DropDownControl := FColorSelector;\r\n DropDownWidth := FColorSelector.Width;\r\n DropDownHeight := FColorSelector.Height;\r\n DropDownKind := ddkDropDownButton;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.DoColorSelected(AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if Assigned(OnColorSelected) then\r\n OnColorSelected(Self, AColor);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.DrawColor(AColor: TTMSFNCGraphicsColor;\r\n ARect: TRectF; AGraphics: TTMSFNCGraphics);\r\nvar\r\n r: TRectF;\r\n I, J: Integer;\r\n st: TTMSFNCGraphicsSaveState;\r\nbegin\r\n R := ARect;\r\n InflateRectEx(R, -3.5, -3.5);\r\n OffsetRectEx(R, 0.5, 0.5);\r\n st := AGraphics.SaveState;\r\n try\r\n AGraphics.ClipRect(R);\r\n AGraphics.Stroke.Kind := gskNone;\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.Stroke.Width := 1;\r\n AGraphics.Fill.Color := MakeGraphicsColor(255, 255, 255);\r\n AGraphics.DrawRectangle(R);\r\n AGraphics.Fill.Color := MakeGraphicsColor(211 , 211 , 211 );\r\n for I := 0 to Trunc((r.Right - r.Left) / 5) + 1 do\r\n for J := 0 to Trunc((r.Bottom - r.Top) / 5) + 1 do\r\n if Odd(I + J) then\r\n AGraphics.DrawRectangle(RectF(I * 5, J * 5, (I + 1) * 5, (J + 1) * 5), gcrmNone);\r\n\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.Fill.Color := AColor;\r\n AGraphics.Stroke.Color := gcBlack;\r\n AGraphics.Stroke.Kind := gskSolid;\r\n AGraphics.DrawRectangle(R);\r\n finally\r\n AGraphics.RestoreState(st);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.DrawSelectedColor(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n R: TRectF;\r\n c: TTMSFNCGraphicsColor;\r\n ct: TTMSFNCToolBarDropDownButton;\r\nbegin\r\n ct := GetDropDownButtonControl;\r\n if Assigned(ct) then\r\n begin\r\n R := RectF(0, 0, Width - ct.Width, Height);\r\n c := SelectedColor;\r\n DrawColor(c, r, AGraphics);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCToolBarColorPicker.GetItems: TTMSFNCColorSelectorItems;\r\nbegin\r\n Result := FColorSelector.Items;\r\nend;\r\n\r\nfunction TTMSFNCToolBarColorPicker.GetSelectedColor: TTMSFNCGraphicsColor;\r\nbegin\r\n Result := FColorSelector.SelectedColor;\r\nend;\r\n\r\nfunction TTMSFNCToolBarColorPicker.GetSelectedItemIndex: Integer;\r\nbegin\r\n Result := FColorSelector.SelectedItemIndex;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBarColorPicker);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n inherited;\r\n DrawSelectedColor(AGraphics, ARect);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(FColorSelector) then\r\n FColorSelector.AdaptToStyle := AdaptToStyle;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.SetItems(\r\n const Value: TTMSFNCColorSelectorItems);\r\nbegin\r\n FColorSelector.Items.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.SetSelectedColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n FColorSelector.SelectedColor := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarColorPicker.SetSelectedItemIndex(const Value: Integer);\r\nbegin\r\n FColorSelector.SelectedItemIndex := Value;\r\n Invalidate;\r\nend;\r\n\r\n{ TTMSFNCToolBarBitmapPicker }\r\n\r\nfunction TTMSFNCToolBarBitmapPicker.BitmapSelector: TTMSFNCBitmapSelector;\r\nbegin\r\n Result := FBitmapSelector;\r\nend;\r\n\r\nfunction TTMSFNCToolBarBitmapPicker.BlockChange: Boolean;\r\nbegin\r\n Result := FBitmapSelector.BlockChange;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarBitmapPicker.BitmapSelected(Sender: TObject;\r\n ABitmap: TTMSFNCBitmap);\r\nbegin\r\n Bitmaps.Clear;\r\n DisabledBitmaps.Clear;\r\n HoverBitmaps.Clear;\r\n Bitmaps.AddBitmap(ABitmap);\r\n DisabledBitmaps.AddBitmap(ABitmap);\r\n HoverBitmaps.AddBitmap(ABitmap);\r\n\r\n if CloseOnSelection and not BlockChange then\r\n CloseDropDown;\r\n DoBitmapSelected(ABitmap);\r\nend;\r\n\r\nfunction TTMSFNCToolBarBitmapPicker.CanChangeText: Boolean;\r\nbegin\r\n Result := not (csLoading in ComponentState) and not (csDesigning in ComponentState);\r\nend;\r\n\r\nconstructor TTMSFNCToolBarBitmapPicker.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n Width := 40;\r\n Height := 24;\r\n AutoOptionsMenuText := 'Bitmap';\r\n FBitmapSelector := TTMSFNCBitmapSelector.Create(Self);\r\n FBitmapSelector.Appearance.HorizontalSpacing := 2;\r\n FBitmapSelector.Appearance.VerticalSpacing := 2;\r\n FBitmapSelector.Stored := False;\r\n FBitmapSelector.OnBitmapSelected := BitmapSelected;\r\n\r\n DropDownControl := FBitmapSelector;\r\n DropDownWidth := FBitmapSelector.Width;\r\n DropDownHeight := FBitmapSelector.Height;\r\n DropDownKind := ddkDropDownButton;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarBitmapPicker.DoBitmapSelected(ABitmap: TTMSFNCBitmap);\r\nbegin\r\n if Assigned(OnBitmapSelected) then\r\n OnBitmapSelected(Self, ABitmap);\r\nend;\r\n\r\nfunction TTMSFNCToolBarBitmapPicker.GetBitmapRect(ARect: TRectF): TRectF;\r\nvar\r\n r: TRectF;\r\n dr: TRectf;\r\nbegin\r\n r := ARect;\r\n Result := RectF(r.Left, r.Top, r.Right, r.Bottom);\r\n if BitmapVisible then\r\n begin\r\n if DropDownKind <> ddkNormal then\r\n begin\r\n dr := GetDropDownRect;\r\n case DropDownPosition of\r\n ddpRight: Result := RectF(Result.Left + 3, Result.Top + 3, dr.Left - 3, Result.Bottom - 3);\r\n ddpBottom: Result := RectF(Result.Left + 3, Result.Top + 3, Result.Right - 3, dr.Top - 3);\r\n end;\r\n end\r\n else\r\n Result := RectF(Result.Left + 3, Result.Top + 3, Result.Right - 3, Result.Bottom - 3);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCToolBarBitmapPicker.GetItems: TTMSFNCBitmapSelectorItems;\r\nbegin\r\n Result := FBitmapSelector.Items;\r\nend;\r\n\r\nfunction TTMSFNCToolBarBitmapPicker.GetSelectedBitmap: TTMSFNCBitmap;\r\nbegin\r\n Result := FBitmapSelector.SelectedBitmap;\r\nend;\r\n\r\nfunction TTMSFNCToolBarBitmapPicker.GetSelectedItemIndex: Integer;\r\nbegin\r\n Result := FBitmapSelector.SelectedItemIndex;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarBitmapPicker.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBarBitmapPicker);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarBitmapPicker.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(FBitmapSelector) then\r\n FBitmapSelector.AdaptToStyle := AdaptToStyle;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarBitmapPicker.SetItems(\r\n const Value: TTMSFNCBitmapSelectorItems);\r\nbegin\r\n FBitmapSelector.Items.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarBitmapPicker.SetSelectedItemIndex(const Value: Integer);\r\nbegin\r\n FBitmapSelector.SelectedItemIndex := Value;\r\n Bitmaps.Clear;\r\n DisabledBitmaps.Clear;\r\n HoverBitmaps.Clear;\r\n Bitmaps.AddBitmap(SelectedBitmap);\r\n DisabledBitmaps.AddBitmap(SelectedBitmap);\r\n HoverBitmaps.AddBitmap(SelectedBitmap);\r\n Invalidate;\r\nend;\r\n\r\n{ TTMSFNCToolBarDropDownButton }\r\n\r\nfunction TTMSFNCToolBarDropDownButton.GetBitmapRect(ARect: TRectF): TRectF;\r\nvar\r\n r: TRectF;\r\nbegin\r\n r := ARect;\r\n Result := RectF(r.Left + 3, r.Top + 3, r.Right - 3, r.Bottom - 3);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarDropDownButton.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBarDropDownButton);\r\nend;\r\n\r\n{ TTMSFNCToolBarCustomItemPicker }\r\n\r\nfunction TTMSFNCToolBarCustomItemPicker.CanChangeText: Boolean;\r\nbegin\r\n Result := not (csLoading in ComponentState) and not (csDesigning in ComponentState);\r\nend;\r\n\r\nconstructor TTMSFNCToolBarCustomItemPicker.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FTimer := TTimer.Create(Self);\r\n FTimer.Interval := 1;\r\n FTimer.OnTimer := EnterTimerChanged;\r\n FTimer.Enabled := False;\r\n\r\n FEdit := TEdit.Create(Self);\r\n FEdit.TabStop := True;\r\n {$IFDEF FMXLIB}\r\n FEdit.Align := TAlignLayout.Client;\r\n FEdit.Stored := False;\r\n FEdit.OnChangeTracking := EditChange;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FEdit.Align := alClient;\r\n FEdit.OnChange := @EditChange;\r\n {$ENDIF}\r\n\r\n Width := 100;\r\n Height := 24;\r\n HorizontalTextAlign := gtaLeading;\r\n FItemIndex := -1;\r\n\r\n FItemSelector := TListBox.Create(Self);\r\n FItemSelector.Width := 200;\r\n FItemSelector.Height := 150;\r\n {$IFDEF LCLLIB}\r\n FItemSelector.ClickOnSelChange := False;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n FItemSelector.Align := TAlignLayout.Client;\r\n FItemSelector.OnItemClick := ItemSelected;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FItemSelector.Align := alClient;\r\n FItemSelector.OnClick := ItemSelected;\r\n {$ENDIF}\r\n\r\n FItemSelector.OnKeyUp := @ItemKeyUp;\r\n FItemSelector.OnKeyDown := @ItemKeyDown;\r\n\r\n DropDownControl := FItemSelector;\r\n DropDownKind := ddkDropDownButton;\r\n DropDownWidth := FItemSelector.Width;\r\n DropDownHeight := FItemSelector.Height;\r\n\r\n FItems := TStringList.Create;\r\nend;\r\n\r\ndestructor TTMSFNCToolBarCustomItemPicker.Destroy;\r\nbegin\r\n FTimer.Free;\r\n FItems.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.DoEnter;\r\nbegin\r\n inherited;\r\n FTimer.Enabled := Editable;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.DoItemSelected;\r\nbegin\r\n if Assigned(FEdit) {$IFDEF CMNWEBLIB} and FEdit.HandleAllocated{$ENDIF} then\r\n begin\r\n FEdit.Text := SelectedItem;\r\n FEdit.SelStart := Length(FEdit.Text);\r\n end;\r\n\r\n if Assigned(OnItemSelected) then\r\n OnItemSelected(Self, SelectedItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.Draw(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nbegin\r\n if not Editable then\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.DropDown;\r\nbegin\r\n inherited;\r\n if not Assigned(FPopup) then\r\n Exit;\r\n\r\n if FPopup.IsOpen and Assigned(FItemSelector) then\r\n begin\r\n FItemSelector.ItemIndex := -1;\r\n FItemSelector.ItemIndex := SelectedItemIndex;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.EditChange(Sender: TObject);\r\nbegin\r\n SelectedItem := FEdit.Text;\r\n if Assigned(OnEditChange) then\r\n OnEditChange(Self);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.EnterTimerChanged(Sender: TObject);\r\nbegin\r\n FEdit.SetFocus;\r\n FTimer.Enabled := False;\r\nend;\r\n\r\nfunction TTMSFNCToolBarCustomItemPicker.GetSelectedItem: String;\r\nbegin\r\n Result := '';\r\n if (FItemIndex >= 0) and (FItemIndex <= FItems.Count - 1) then\r\n Result := FItems[FItemIndex]\r\nend;\r\n\r\nfunction TTMSFNCToolBarCustomItemPicker.GetSelectedItemIndex: Integer;\r\nbegin\r\n Result := FItemIndex;\r\nend;\r\n\r\nfunction TTMSFNCToolBarCustomItemPicker.GetText: String;\r\nbegin\r\n if Editable then\r\n Result := FEdit.Text\r\n else\r\n Result := SelectedItem;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.HandleDialogKey(var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if Shift <> [] then\r\n Exit;\r\n\r\n if Editable and FEdit.IsFocused then\r\n begin\r\n case Key of\r\n KEY_F4:\r\n begin\r\n if not (ssAlt in Shift) then\r\n DropDown;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.InitializePopup;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n FItemSelector.BeginUpdate;\r\n {$ENDIF}\r\n FItemSelector.Items.Clear;\r\n FItemSelector.Items.Assign(FItems);\r\n FItemSelector.ItemIndex := FItemIndex;\r\n {$IFDEF FMXLIB}\r\n FItemSelector.EndUpdate;\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCToolBarCustomItemPicker.ItemKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCToolBarCustomItemPicker.ItemKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n{$ENDIF}\r\nbegin\r\n FKeyboardUsed := True;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCToolBarCustomItemPicker.ItemKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCToolBarCustomItemPicker.ItemKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n{$ENDIF}\r\nbegin\r\n if (Key = KEY_RETURN) or (Key = KEY_SPACE) then\r\n begin\r\n FItemIndex := FItemSelector.ItemIndex;\r\n if CloseOnSelection then\r\n DropDown;\r\n\r\n DoItemSelected;\r\n Invalidate;\r\n end;\r\n\r\n FKeyBoardUsed := False;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCToolBarCustomItemPicker.ItemSelected(const Sender: TCustomListBox; const Item: TListBoxItem);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCToolBarCustomItemPicker.ItemSelected(Sender: TObject);\r\n{$ENDIF}\r\nbegin\r\n if FKeyBoardUsed then\r\n Exit;\r\n\r\n FItemIndex := FItemSelector.ItemIndex;\r\n if CloseOnSelection then\r\n DropDown;\r\n\r\n DoItemSelected;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SelectFirstValue;\r\nbegin\r\n inherited;\r\n FItemIndex := 0;\r\n DoItemSelected;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SelectLastValue;\r\nbegin\r\n inherited;\r\n FItemIndex := FItems.Count - 1;\r\n DoItemSelected;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SelectNextValue;\r\nbegin\r\n inherited;\r\n if FItemIndex = -1 then\r\n FItemIndex := 0\r\n else\r\n FItemIndex := Min(FItems.Count - 1, FItemIndex + 1);\r\n\r\n DoItemSelected;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SelectPreviousValue;\r\nbegin\r\n inherited;\r\n if FItemIndex = -1 then\r\n FItemIndex := 0\r\n else\r\n FItemIndex := Max(0, FItemIndex - 1);\r\n\r\n DoItemSelected;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SelectValueWithCharacter(\r\n ACharacter: Char);\r\nvar\r\n I: Integer;\r\nbegin\r\n inherited;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if TTMSFNCUtils.MatchStrEx(ACharacter + '*', Items[I], False) then\r\n begin\r\n FItemIndex := I;\r\n DoItemSelected;\r\n Invalidate;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SelectValueWithString(AValue: string);\r\nvar\r\n I: Integer;\r\nbegin\r\n inherited;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if TTMSFNCUtils.MatchStrEx(AValue + '*', Items[I], False) then\r\n begin\r\n FItemIndex := I;\r\n DoItemSelected;\r\n Invalidate;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SetEditable(const Value: Boolean);\r\nbegin\r\n if FEditable <> Value then\r\n begin\r\n FEditable := Value;\r\n if Assigned(FEdit) then\r\n begin\r\n if FEditable then\r\n begin\r\n FEdit.Parent := Self;\r\n end\r\n else\r\n FEdit.Parent := nil;\r\n\r\n FEdit.Visible := FEditable;\r\n end;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SetItems(const Value: TStringList);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SetSelectedItem(const Value: String);\r\nbegin\r\n FItemIndex := FItems.IndexOf(Value);\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCToolBarCustomItemPicker.SetSelectedItemIndex(\r\n const Value: Integer);\r\nbegin\r\n FItemIndex := Value;\r\n Invalidate;\r\nend;\r\n\r\n{ TTMSFNCToolBarButton }\r\n\r\nprocedure TTMSFNCToolBarButton.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBarButton);\r\nend;\r\n\r\n{ TTMSFNCToolBarSeparator }\r\n\r\nprocedure TTMSFNCToolBarSeparator.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBarSeparator);\r\nend;\r\n\r\n{ TTMSFNCToolBar }\r\n\r\nprocedure TTMSFNCToolBar.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCToolBar);\r\nend;\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCToolBarControlObjectList.GetItem(\r\n Index: Integer): TTMSFNCToolBarControl;\r\nbegin\r\n Result := TTMSFNCToolBarControl(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarControlObjectList.SetItem(Index: Integer; const Value: TTMSFNCToolBarControl);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCToolBarControlList.GetItem(\r\n Index: Integer): TTMSFNCToolBarControl;\r\nbegin\r\n Result := TTMSFNCToolBarControl(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCToolBarControlList.SetItem(Index: Integer; const Value: TTMSFNCToolBarControl);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCControlList.GetItem(Index: Integer): TControl;\r\nbegin\r\n Result := TControl(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCControlList.SetItem(Index: Integer; const Value: TControl);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n{$ENDIF}\r\n\r\ninitialization\r\n RegisterClass(TTMSFNCToolBarButton);\r\n\r\nend.\r\n","{********************************************************************}\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCEdit;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCToolBar, {%H-}WEBLib.TMSFNCToolBarRes, WEBLib.TMSFNCCustomControl, WEBLib.TMSFNCTypes,\r\n WEBLib.TMSFNCPopup, WEBLib.StdCtrls, WEBLib.Graphics, WEBLib.Controls, WEBLib.TMSFNCGraphicsTypes\r\n {$IFDEF FMXLIB}\r\n ,FMX.ListBox, FMX.Edit, FMX.Types\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n ,UITypes, Generics.Collections\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 2; // Release nr.\r\n BLD_VER = 6; // Build nr.\r\n\r\n // version history\r\n // v1.0.0.0 : first release\r\n // v1.0.0.1 : Fixed: Issue with typing '-' with signedfloat when text is selected\r\n // v1.0.0.2 : Fixed: Issue with etSignedNumeric handling\r\n // v1.0.1.0 : New : UseValueList boolean to switch between Value and Display list when using the lookup functionality\r\n // v1.0.2.0 : New : MinimumWidth and MinimumHeight properties to defined lookup dropdown minimum size\r\n // : Fixed : Issue with escape and exiting control closing lookup window\r\n // v1.0.2.1 : Fixed : Issue with calculating size of lookup items\r\n // v1.0.2.2 : Fixed : Issue selecting lookup item entry with mouse\r\n // v1.0.2.3 : Fixed : Issue with lookup on RAD Studio 10.2 Tokyo\r\n // v1.0.2.4 : Improved : DisplayLookup method to display all values from the displaylist\r\n // v1.0.2.5 : New : LiveBindings Support\r\n // v1.0.2.6 : Fixed : Issue with binding only working on Windows\r\n\r\nconst\r\n LOOKUPITEMHEIGHT = 18;\r\n\r\ntype\r\n TTMSFNCEditType = (etString, etNumeric, etSignedNumeric, etFloat, etSignedFloat, etUppercase, etMixedCase, etLowerCase,\r\n etMoney, etHex, etAlphaNumeric, etValidChars);\r\n\r\n TTMSFNCEditPrecisionDisplay = (pdNormal, pdShortest);\r\n\r\n TTMSFNCEdit = class;\r\n\r\n TTMSFNCEditLookupSettings = class(TPersistent)\r\n private\r\n FDisplayList: TStringList;\r\n FValueList: TStringList;\r\n FDisplayCount: Integer;\r\n FColor: TTMSFNCGraphicsColor;\r\n FEnabled: Boolean;\r\n FNumChars: Integer;\r\n FCaseSensitive: Boolean;\r\n FHistory: Boolean;\r\n FMulti: Boolean;\r\n FSeparator: char;\r\n FAcceptOnTab: Boolean;\r\n FWidth: Integer;\r\n FHeight: Integer;\r\n FUseValueList: Boolean;\r\n FMinimumWidth: Integer;\r\n FMinimumHeight: Integer;\r\n procedure SetDisplayList(const Value: TStringList);\r\n procedure SetValueList(const Value: TStringList);\r\n procedure SetNumChars(const Value: Integer);\r\n procedure SetHeight(const Value: Integer);\r\n procedure SetWidth(const Value: Integer);\r\n procedure SetMinimumHeight(const Value: Integer);\r\n procedure SetMinimumWidth(const Value: Integer);\r\n protected\r\n property AcceptOnTab: boolean read FAcceptOnTab write FAcceptOnTab default False;\r\n property Color: TTMSFNCGraphicsColor read FColor write FColor default gcWhite;\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive default False;\r\n property DisplayCount: Integer read FDisplayCount write FDisplayCount default 4;\r\n property DisplayList: TStringList read FDisplayList write SetDisplayList;\r\n property Enabled: Boolean read FEnabled write FEnabled default False;\r\n property History: Boolean read FHistory write FHistory default False;\r\n property NumChars: Integer read FNumChars write SetNumChars default 2;\r\n property ValueList: TStringList read FValueList write SetValueList;\r\n property Multi: Boolean read FMulti write FMulti default False;\r\n property Separator: char read FSeparator write FSeparator;\r\n property Width: Integer read FWidth write SetWidth default 0;\r\n property Height: Integer read FHeight write SetHeight default 0;\r\n property MinimumWidth: Integer read FMinimumWidth write SetMinimumWidth default 0;\r\n property MinimumHeight: Integer read FMinimumHeight write SetMinimumHeight default 0;\r\n property UseValueList: Boolean read FUseValueList write FUseValueList default True;\r\n end;\r\n\r\n TTMSFNCEditLookupSelectEvent = procedure(Sender: TObject; var Value: string) of object;\r\n TTMSFNCEditLookupIndexSelectEvent = procedure(Sender: TObject; Index: Integer; var Value: string) of object;\r\n TTMSFNCEditLookupNeedDataEvent = procedure(Sender: TObject; Value: string; List: TStrings; var ItemIndex: integer) of object;\r\n\r\n TTMSFNCEditHexCharacterArray = array of char;\r\n\r\n TTMSFNCLookupListBoxItem = class\r\n private\r\n FIdx: Integer;\r\n public\r\n constructor Create(AIdx: Integer);\r\n property Idx: Integer read FIdx;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCLookupList = class(TList);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCLookupList = class(TList);\r\n {$ENDIF}\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCEdit = class(TCustomEdit)\r\n private\r\n FLookupListBoxItems: TTMSFNCLookupList;\r\n {$IFDEF CMNWEBLIB}\r\n FAllowFocus: Boolean;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n FDoneLookupTimer: TTimer;\r\n {$ENDIF}\r\n FKeyDown: Word;\r\n FShiftState: TShiftState;\r\n FEditType: TTMSFNCEditType;\r\n FValidChars: string;\r\n FLookupList: TTMSFNCPopup;\r\n FLookupListBox: TListBox;\r\n FLookup: TTMSFNCEditLookupSettings;\r\n FOnLookupSelect: TTMSFNCEditLookupSelectEvent;\r\n FOnLookupIndexSelect: TTMSFNCEditLookupIndexSelectEvent;\r\n FSigned: Boolean;\r\n FPrefix: string;\r\n FSuffix: string;\r\n FIsModified: Boolean;\r\n FLengthLimit: smallint;\r\n FFullTextSearch: boolean;\r\n FAutoThousandSeparator: Boolean;\r\n FPrecision: smallint;\r\n FPrecisionDisplay: TTMSFNCEditPrecisionDisplay;\r\n FBlockChange: Boolean;\r\n FAllowNumericNullValue: Boolean;\r\n FAutoComplete: Boolean;\r\n FOnCloseWithEscape: TNotifyEvent;\r\n FOnLookupNeedData: TTMSFNCEditLookupNeedDataEvent;\r\n procedure CloseLookup;\r\n procedure DoneLookup;\r\n procedure UpdateLookup;\r\n procedure UpdateAutoComplete;\r\n procedure SetLookup(const Value: TTMSFNCEditLookupSettings);\r\n function AllowMin(ch: char): boolean;\r\n function FixedLength(s: string): Integer;\r\n procedure SetPrefix(const Value: string);\r\n procedure SetSuffix(const Value: string);\r\n procedure SetModified(const Value: Boolean);\r\n function DecimalPos: Integer;\r\n procedure AutoSeparators;\r\n function GetFloat: double;\r\n procedure SetFloat(const Value: double);\r\n procedure SetAutoThousandSeparator(const Value: Boolean);\r\n procedure SetPrecision(const Value: smallint);\r\n procedure SetPrecisionDisplay(const Value: TTMSFNCEditPrecisionDisplay);\r\n function EStrToFloat(s: string): extended;\r\n function GetInt: Integer;\r\n procedure SetInt(const Value: Integer);\r\n procedure SetEditType(const Value: TTMSFNCEditType);\r\n function IsLookupListVisible: Boolean;\r\n function GetAllowFocus: Boolean;\r\n procedure SetAllowFocus(const Value: Boolean);\r\n protected\r\n {$IFDEF WEBLIB}\r\n class function GetVersionNumber(AMaj, AMin, ARel, ABld: ShortInt): string;\r\n {$ENDIF}\r\n function GetVersion: String; virtual;\r\n {$IFDEF FMXLIB}\r\n procedure DoDoneLookupTimer(Sender: TObject);\r\n function GetDefaultStyleLookupName: string; override;\r\n {$ENDIF}\r\n function GetT: string; virtual;\r\n function GetCaretPosition: Integer; virtual;\r\n {$IFDEF FMXLIB}\r\n procedure Change; virtual;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n function ChildClassAllowed(ChildClass: TClass): boolean; override;\r\n {$ENDIF}\r\n procedure CleanupLookupList;\r\n procedure SetCaretPosition(ACaretPosition: Integer); virtual;\r\n procedure SetT(const Value: string); virtual;\r\n procedure InsertText(const AText: string);\r\n {$IFDEF FMXLIB}\r\n procedure ListKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);\r\n procedure ListMouseUp(Sender: TObject; Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single);\r\n procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;\r\n procedure KeyUp(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure ListKeyUp(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);\r\n procedure ListMouseUp(Sender: TObject; {%H-}Button: TTMSFNCMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);\r\n procedure KeyPress(var Key: Char); override;\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure KeyUp(var Key: Word; Shift: TShiftState); override;\r\n {$ENDIF}\r\n procedure DoLookupNeedData(Value: string; List: TStrings; var ItemIndex: integer); virtual;\r\n procedure DoExit; override;\r\n property OnCloseWithEscape: TNotifyEvent read FOnCloseWithEscape write FOnCloseWithEscape;\r\n property Signed: Boolean read FSigned write FSigned default False;\r\n property Prefix: string read FPrefix write SetPrefix;\r\n property Suffix: string read FSuffix write SetSuffix;\r\n public\r\n function LookupListbox: TListBox;\r\n function LookupList: TTMSFNCPopup;\r\n {$IFDEF CMNWEBLIB}\r\n function CanFocus: Boolean; override;\r\n {$ENDIF}\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure DisplayLookup;\r\n property Modified: Boolean read FIsModified write SetModified;\r\n property FloatValue: double read GetFloat write SetFloat;\r\n property IntValue: Integer read GetInt write SetInt;\r\n {$IFNDEF WEBLIB}\r\n property Action;\r\n {$ENDIF}\r\n published\r\n property AllowFocus: Boolean read GetAllowFocus write SetAllowFocus default True;\r\n {$IFDEF FMXLIB}\r\n property Cursor default crIBeam;\r\n property CanParentFocus;\r\n property DisableFocusEffect;\r\n property KeyboardType;\r\n property ReturnKeyType;\r\n property Password;\r\n property ReadOnly;\r\n property TextSettings;\r\n property ImeMode;\r\n property Position;\r\n property Width;\r\n property Height;\r\n property ClipChildren default False;\r\n property ClipParent default False;\r\n property DragMode default TDragMode.dmManual;\r\n property EnableDragHighlight default True;\r\n property Enabled default True;\r\n property Locked default False;\r\n property HitTest default True;\r\n property Hint;\r\n property HelpContext;\r\n property HelpKeyword;\r\n property HelpType;\r\n property Padding;\r\n property Opacity;\r\n property Margins;\r\n property PopupMenu;\r\n property RotationAngle;\r\n property RotationCenter;\r\n property Scale;\r\n {$WARNINGS OFF}\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 27}\r\n property Size;\r\n {$IFEND}\r\n {$HINTS ON}\r\n {$WARNINGS ON}\r\n property TextPrompt;\r\n property StyleLookup;\r\n property StyledSettings;\r\n property TouchTargetExpansion;\r\n property Visible default True;\r\n property Caret;\r\n property ShowHint;\r\n property KillFocusByReturn;\r\n property CheckSpelling;\r\n property OnChange;\r\n property OnChangeTracking;\r\n property OnTyping;\r\n property OnApplyStyleLookup;\r\n property OnValidating;\r\n property OnValidate;\r\n property OnDragEnter;\r\n property OnDragLeave;\r\n property OnDragOver;\r\n property OnDragDrop;\r\n property OnDragEnd;\r\n property OnKeyDown;\r\n property OnKeyUp;\r\n property OnCanFocus;\r\n property OnClick;\r\n property OnDblClick;\r\n property OnEnter;\r\n property OnExit;\r\n property OnMouseDown;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n property OnMouseWheel;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnPainting;\r\n property OnPaint;\r\n property OnResize;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n property Align;\r\n property Alignment;\r\n property Anchors;\r\n property AutoSelect;\r\n property AutoSize;\r\n property Hint;\r\n {$IFDEF LCLLIB}\r\n property BorderSpacing;\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n property BevelEdges;\r\n property BevelInner;\r\n property BevelKind default bkNone;\r\n property BevelOuter;\r\n property BevelWidth;\r\n property Ctl3D;\r\n property ImeMode;\r\n property ImeName;\r\n property OEMConvert;\r\n property ParentCtl3D;\r\n property ParentDoubleBuffered;\r\n property TextHint;\r\n property Touch;\r\n {$HINTS OFF}\r\n {$IF COMPILERVERSION > 23}\r\n property StyleElements;\r\n {$IFEND}\r\n {$HINTS ON}\r\n property OnGesture;\r\n property OnMouseActivate;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n property BiDiMode;\r\n {$ENDIF}\r\n property BorderStyle;\r\n property Color;\r\n {$IFNDEF WEBLIB}\r\n property Constraints;\r\n {$ENDIF}\r\n property DoubleBuffered;\r\n {$IFNDEF WEBLIB}\r\n property DragCursor;\r\n property DragKind;\r\n property DragMode;\r\n {$ENDIF}\r\n property Enabled;\r\n property Font;\r\n property HideSelection;\r\n property MaxLength;\r\n {$IFNDEF WEBLIB}\r\n property ParentBiDiMode;\r\n property ParentColor;\r\n property ParentFont;\r\n property ParentShowHint;\r\n {$ENDIF}\r\n property PasswordChar;\r\n {$IFNDEF WEBLIB}\r\n property PopupMenu;\r\n {$ENDIF}\r\n property ReadOnly;\r\n property ShowHint;\r\n property TabOrder;\r\n property TabStop;\r\n property Visible;\r\n property OnChange;\r\n property OnClick;\r\n {$IFNDEF WEBLIB}\r\n property OnContextPopup;\r\n {$ENDIF}\r\n property OnDblClick;\r\n {$IFNDEF WEBLIB}\r\n property OnDragDrop;\r\n property OnDragOver;\r\n property OnEndDock;\r\n property OnEndDrag;\r\n {$ENDIF}\r\n property OnEnter;\r\n property OnExit;\r\n property OnKeyDown;\r\n property OnKeyPress;\r\n property OnKeyUp;\r\n property OnMouseDown;\r\n property OnMouseEnter;\r\n property OnMouseLeave;\r\n property OnMouseMove;\r\n property OnMouseUp;\r\n {$IFNDEF WEBLIB}\r\n property OnStartDock;\r\n property OnStartDrag;\r\n {$ENDIF}\r\n {$ENDIF} \r\n\r\n property Text: string read GetT write SetT;\r\n property Version: String read GetVersion;\r\n property AutoComplete: Boolean read FAutoComplete write FAutoComplete default False;\r\n property EditType: TTMSFNCEditType read FEditType write SetEditType default etString;\r\n property Lookup: TTMSFNCEditLookupSettings read FLookup write SetLookup;\r\n property ValidChars: string read FValidChars write FValidChars;\r\n property AllowNumericNullValue: Boolean read FAllowNumericNullValue write FAllowNumericNullValue default False;\r\n property AutoThousandSeparator: Boolean read FAutoThousandSeparator write SetAutoThousandSeparator default True;\r\n property FullTextSearch: boolean read FFullTextSearch write FFullTextSearch default false;\r\n property LengthLimit: smallint read FLengthLimit write FLengthLimit default 0;\r\n property Precision: smallint read FPrecision write SetPrecision default 0;\r\n property PrecisionDisplay: TTMSFNCEditPrecisionDisplay read FPrecisionDisplay write SetPrecisionDisplay default pdNormal;\r\n property OnLookupSelect: TTMSFNCEditLookupSelectEvent read FOnLookupSelect write FOnLookupSelect;\r\n property OnLookupIndexSelect: TTMSFNCEditLookupIndexSelectEvent read FOnLookupIndexSelect write FOnLookupIndexSelect;\r\n property OnLookupNeedData: TTMSFNCEditLookupNeedDataEvent read FOnLookupNeedData write FOnLookupNeedData;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCEditButton = class(TTMSFNCCustomControl)\r\n private\r\n FBlockDropDown: Boolean;\r\n FPopup: TTMSFNCPopup;\r\n FEdit: TTMSFNCEdit;\r\n FButton: TTMSFNCToolBarDropDownButton;\r\n FPopupControl: TControl;\r\n FOnButtonClick: TNotifyEvent;\r\n FModalPopup: Boolean;\r\n procedure SetPopupControl(const Value: TControl);\r\n function GetText: string;\r\n procedure SetText(const Value: string);\r\n protected\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure BeforeDropDown; virtual;\r\n {$IFDEF FMXLIB}\r\n procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;\r\n procedure PopupKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure PopupKeyDown(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);\r\n {$ENDIF}\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure ButtonClick(Sender: TObject);\r\n procedure ButtonDblClick(Sender: TObject);\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure DropDown; virtual;\r\n property Popup: TTMSFNCPopup read FPopup write FPopup;\r\n property Button: TTMSFNCToolBarDropDownButton read FButton;\r\n property Edit: TTMSFNCEdit read FEdit;\r\n property ModalPopup: Boolean read FModalPopup write FModalPopup default False;\r\n published\r\n property PopupControl: TControl read FPopupControl write SetPopupControl;\r\n property OnButtonClick: TNotifyEvent read FOnButtonClick write FOnButtonClick;\r\n published\r\n property Text: string read GetText write SetText;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, Types, WEBLib.TMSFNCUtils, Math\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,Data.Bind.Components\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\ntype\r\n TTMSFNCEditAutoType = (atNumeric, atFloat, atString, atDate, atTime, atHex);\r\n\r\nfunction CheckTerminator(ch: char): boolean;\r\nbegin\r\n Result := CharInArray(ch, [' ', ',', '.', '/', '\\', ':', '*', '$', '-', '(', ')', '[', ']', '\"','''','&']);\r\nend;\r\n\r\nfunction ShiftCase(AName: string): string;\r\nvar\r\n I, L: Integer;\r\n NewName: string;\r\n First: Boolean;\r\nbegin\r\n First := true;\r\n NewName := AName;\r\n L := Length(AName);\r\n\r\n {$IFDEF FMXMOBILE}\r\n for I := 0 to L - 1 do\r\n {$ELSE}\r\n for I := 1 to L do\r\n {$ENDIF}\r\n begin\r\n if CheckTerminator(NewName[I]) then\r\n First := true\r\n else\r\n if First then\r\n begin\r\n NewName[I] := UpperCase(AName)[I];\r\n First := false;\r\n end\r\n else\r\n NewName[I] := LowerCase(AName)[I];\r\n\r\n if (Copy(NewName, 1, I) = 'Mc') or (Copy(NewName, 1, I) = 'Mac') or\r\n ((Pos(' Mc', NewName) = I - 2) and (I > 2)) or\r\n ((I > L - 3) and ((Copy(NewName, I - 1, 2) = ' I') or\r\n (Copy(NewName, I - 2, 3) = ' II'))) then\r\n First := true;\r\n end;\r\n Result := NewName;\r\nend;\r\n\r\nfunction IsType(s: string): TTMSFNCEditAutoType;\r\nvar\r\n i: Integer;\r\n isI, isF, isH: Boolean;\r\n th, de, mi: Integer;\r\nbegin\r\n Result := atString;\r\n\r\n isI := true;\r\n isF := true;\r\n isH := true;\r\n\r\n if s = '' then\r\n begin\r\n isI := false;\r\n isF := false;\r\n isH := false;\r\n end;\r\n\r\n th := -1; de := 0; mi := 0;\r\n\r\n {$IFDEF FMXMOBILE}\r\n for i := 0 to Length(s) - 1 do\r\n {$ELSE}\r\n for i := 1 to Length(s) do\r\n {$ENDIF}\r\n begin\r\n\r\n if not CharIsNumber(s[i]) then\r\n isI := False;\r\n if not CharIsNumber(s[i]) and not CharInArray(s[i], ['.',',']) then\r\n isF := False;\r\n if not CharIsNumber(s[i]) and not CharIsLetter(s[i]) then\r\n isH := False;\r\n\r\n {$IFDEF WEBLIB}\r\n if (s[i] = ThousandSeparator) and (i - th < 3) then isF := false;\r\n if s[i] = ThousandSeparator then th := i;\r\n if s[i] = DecimalSeparator then inc(de);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n if (s[i] = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}ThousandSeparator) and (i - th < 3) then isF := false;\r\n if s[i] = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}ThousandSeparator then th := i;\r\n if s[i] = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator then inc(de);\r\n {$ENDIF}\r\n if s[i] = '-' then inc(mi);\r\n end;\r\n\r\n if isH and not isI then\r\n Result := atHex;\r\n\r\n if isI then\r\n Result := atNumeric\r\n else\r\n begin\r\n if isF then\r\n Result := atFloat;\r\n end;\r\n\r\n if (mi > 1) or (de > 1) then\r\n Result := atString;\r\nend;\r\n\r\nfunction HexToInt(s: string): Integer;\r\nvar\r\n i: Integer;\r\n r, m: Integer;\r\n\r\n function CharVal(c: char): Integer;\r\n begin\r\n Result := 0;\r\n if ((c >= '0') and (c <= '9')) then Result := ord(c) - ord('0');\r\n if ((c >= 'A') and (c <= 'F')) then Result := ord(c) - ord('A') + 10;\r\n if ((c >= 'a') and (c <= 'f')) then Result := ord(c) - ord('a') + 10;\r\n end;\r\n\r\nbegin\r\n r := 0;\r\n m := 1;\r\n {$IFDEF FMXMOBILE}\r\n for i := Length(s) - 1 downto 0 do\r\n {$ELSE}\r\n for i := Length(s) downto 1 do\r\n {$ENDIF}\r\n begin\r\n r := r + m * CharVal(s[i]);\r\n m := m shl 4;\r\n end;\r\n Result := r;\r\nend;\r\n\r\nfunction ValStr(s: string): Integer;\r\nvar\r\n {%H-}err: Integer;\r\nbegin\r\n val(s, result, err);\r\nend;\r\n\r\nfunction CleanString(s: string): string;\r\nvar\r\n i: Integer;\r\nbegin\r\n i := pos(#13, s);\r\n if i > 0 then\r\n delete(s, i, 1);\r\n i := pos(#10, s);\r\n if i > 0 then\r\n delete(s, i, 1);\r\n i := pos(#11, s);\r\n if i > 0 then\r\n delete(s, i, 1);\r\n\r\n Result := s;\r\nend;\r\n\r\n{ TTMSFNCEdit }\r\n\r\n{$IFDEF WEBLIB}\r\nclass function TTMSFNCEdit.GetVersionNumber(AMaj, AMin, ARel, ABld: ShortInt): string;\r\nbegin\r\n Result := '';\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCEdit.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\n{$IFDEF CMNWEBLIB}\r\nfunction TTMSFNCEdit.CanFocus: Boolean;\r\nbegin\r\n Result := inherited CanFocus;\r\n Result := Result and AllowFocus;\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCEdit.GetAllowFocus: Boolean;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := CanFocus;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := FAllowFocus;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetAllowFocus(const Value: Boolean);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n CanFocus := Value;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FAllowFocus := Value;\r\n {$ENDIF}\r\nend;\r\n\r\nconstructor TTMSFNCEdit.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n {$IFDEF CMNWEBLIB}\r\n FAllowFocus := True;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n FDoneLookupTimer := TTimer.Create(Self);\r\n FDoneLookupTimer.OnTimer := DoDoneLookupTimer;\r\n FDoneLookupTimer.Enabled := False;\r\n FDoneLookupTimer.Interval := 1;\r\n {$ENDIF}\r\n FAutoThousandSeparator := True;\r\n FLengthLimit := 0;\r\n FAutoComplete := False;\r\n FLookup := TTMSFNCEditLookupSettings.Create;\r\n\r\n FLookupListBoxItems := TTMSFNCLookupList.Create;\r\n\r\n FLookupList := TTMSFNCPopup.Create(Self);\r\n FLookupList.PlacementControl := Self;\r\n FLookupList.StaysOpen := True;\r\n\r\n FLookupListBox := TListBox.Create(Self);\r\n {$IFDEF LCLLIB}\r\n FLookupListBox.ClickOnSelChange := False;\r\n {$ENDIF}\r\n FLookupListBox.ItemHeight := LOOKUPITEMHEIGHT;\r\n FLookupListBox.OnKeyUp := @ListKeyUp;\r\n FLookupListBox.OnMouseUp := ListMouseUp;\r\n {$IFDEF FMXLIB}\r\n FLookupListBox.Align := TAlignLayout.Client;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n FLookupListBox.Visible := False;\r\n FLookupListBox.Align := alClient;\r\n AutoSize := False;\r\n {$ENDIF}\r\n\r\n FLookupList.ContentControl := FLookupListBox;\r\n FLookupList.FocusedControl := Self;\r\nend;\r\n\r\ndestructor TTMSFNCEdit.Destroy;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n FDoneLookupTimer.Free;\r\n {$ENDIF}\r\n FLookup.Free;\r\n CleanupLookupList;\r\n\r\n if Assigned(FLookupListBox) then\r\n begin\r\n FLookupListBox.Free;\r\n FLookupListBox := nil;\r\n end;\r\n\r\n FLookupListBoxItems.Free;\r\n\r\n if Assigned(FLookupList) then\r\n begin\r\n FLookupList.Free;\r\n FLookupList := nil;\r\n end;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.DisplayLookup;\r\nvar\r\n i, cnt: Integer;\r\n mw, mh, tw: Integer;\r\n LookupText: string;\r\n idx: Integer;\r\n obj: TTMSFNCLookupListBoxItem;\r\nbegin\r\n if not FLookup.Enabled or not Assigned(FLookupListBox) then\r\n Exit;\r\n\r\n mh := (LOOKUPITEMHEIGHT * FLookup.DisplayCount) + 4;\r\n FLookupListBox.Parent := Self;\r\n CleanupLookupList;\r\n FLookupListBox.Items.Clear;\r\n {$IFDEF FMXLIB}\r\n FLookupListBox.NeedStyleLookup;\r\n FLookupListBox.ApplyStyleLookup;\r\n FLookupListBox.BeginUpdate;\r\n {$ENDIF}\r\n\r\n for i := 1 to FLookup.DisplayList.Count do\r\n begin\r\n obj := TTMSFNCLookupListBoxItem.Create(i - 1);\r\n FLookupListbox.Items.AddObject(CleanString(FLookup.FDisplayList.Strings[i - 1]), obj);\r\n FLookupListBoxItems.Add(obj);\r\n end;\r\n\r\n idx := 0;\r\n DoLookupNeedData(LookupText, FLookupListBox.Items, idx);\r\n cnt := FLookupListBox.Items.Count;\r\n\r\n {$IFDEF FMXLIB}\r\n FLookupListBox.EndUpdate;\r\n {$ENDIF}\r\n\r\n if (FLookup.FDisplayList.Count > 0) and (FLookupListBox.Items.Count > 0) then\r\n FLookupListBox.ItemIndex := idx;\r\n\r\n if cnt < FLookup.DisplayCount then\r\n mh := (cnt * LOOKUPITEMHEIGHT) + 4;\r\n\r\n FLookupListBox.Sorted := True;\r\n mw := 50;\r\n FLookupList.DropDownWidth := 0;\r\n\r\n if cnt > 0 then\r\n begin\r\n for i := 1 to cnt do\r\n begin\r\n tw := 0;\r\n if Assigned(FLookupListBox.Canvas) then\r\n tw := Round(FLookupListBox.Canvas.TextWidth(FLookupListBox.Items[i - 1]));\r\n\r\n if tw > mw then\r\n mw := tw;\r\n end;\r\n\r\n mw := mw + 26;\r\n end;\r\n\r\n if (FLookup.Width > 0) then\r\n mw := FLookup.Width;\r\n\r\n if (FLookup.Height > 0) then\r\n mh := FLookup.Height;\r\n\r\n if (cnt > 0) then\r\n begin\r\n FLookupList.DropDownWidth := Max(Lookup.MinimumWidth, mw);\r\n FLookupList.DropDownHeight := Max(Lookup.MinimumHeight, mh);\r\n if FLookupList.HasPopupForm then\r\n begin\r\n FLookupListBox.Parent := FLookupList.PopupForm;\r\n FLookupList.PopupForm.Width := Round(FLookupList.DropDownWidth);\r\n FLookupList.PopupForm.Height := Round(FLookupList.DropDownHeight);\r\n end;\r\n FLookupList.IsOpen := True;\r\n end\r\n else\r\n FLookupList.IsOpen := False;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.DoExit;\r\nvar\r\n TT: string;\r\n OldModified: Boolean;\r\nbegin\r\n inherited;\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n if (FPrecision > 0) and (EditType in [etFloat, etSignedFloat, etMoney]) then\r\n begin\r\n if (self.Text <> '') or not FAllowNumericNullValue then\r\n begin\r\n OldModified := Modified;\r\n Floatvalue := self.Floatvalue;\r\n Modified := OldModified;\r\n end;\r\n end;\r\n\r\n if (EditType in [etNumeric]) and (Self.Text = '') and not FAllowNumericNullValue then\r\n Text := '0';\r\n\r\n if (EditType in [etFloat, etSignedFloat, etMoney]) and (Self.Text = '') and not FAllowNumericNullValue then\r\n Floatvalue := 0.0;\r\n\r\n TT := Trim(Text);\r\n if FLookup.Enabled and FLookup.History and (TT <> '') then\r\n begin\r\n if FLookup.DisplayList.IndexOf(TT) = -1 then\r\n FLookup.DisplayList.Add(TT);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.InsertText(const AText: string);\r\nvar\r\n TmpS: string;\r\nbegin\r\n if ReadOnly then\r\n Exit;\r\n\r\n TmpS := Text;\r\n System.Delete(TmpS, SelStart + 1, SelLength);\r\n System.Insert(AText, TmpS, SelStart + 1);\r\n if (MaxLength <= 0) or (Length(TmpS) <= MaxLength) then\r\n begin\r\n Text := TmpS;\r\n SetCaretPosition(SelStart + Length(AText));\r\n end;\r\n SelLength := 0;\r\nend;\r\n\r\nfunction TTMSFNCEdit.IsLookupListVisible: Boolean;\r\nbegin\r\n Result := Assigned(FLookupList) and FLookupList.IsOpen;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetT(const Value: string);\r\nvar\r\n fmt: string;\r\n f: extended;\r\n v: string;\r\nbegin\r\n v := Value;\r\n if not ((v = '') and AllowNumericNullValue) then\r\n begin\r\n case FEditType of\r\n etFloat: if not (IsType(v) in [atFloat, atNumeric]) then v := '0';\r\n etMoney: if not (IsType(v) in [atFloat, atNumeric]) then v := '0';\r\n etHex: if not (IsType(v) in [atHex, atNumeric]) then v := '0';\r\n etNumeric: if not (IsType(v) in [atNumeric]) then v := '0';\r\n end;\r\n\r\n if (PrecisionDisplay = pdNormal) then\r\n begin\r\n if ((FPrecision > 0) or (FEditType = etMoney)) and (v <> '') then\r\n begin\r\n if (FEditType in [etMoney]) and (FPrecision >= 0) then\r\n begin\r\n fmt := '%.' + IntToStr(FPrecision) + 'n';\r\n v := Format(fmt, [EStrToFloat(v)]);\r\n end;\r\n\r\n if (FEditType in [etFloat]) then\r\n begin\r\n fmt := '%.' + inttostr(FPrecision) + 'f';\r\n f := EStrToFloat(v);\r\n v := Format(fmt, [f]);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n if (FEditType in [etFloat, etMoney]) then\r\n begin\r\n f := EStrToFloat(v);\r\n v := Format('%g', [f]);\r\n end;\r\n end;\r\n end;\r\n\r\n if (FEditType in [etHex, etUppercase]) then\r\n v := UpperCase(v)\r\n else if FEditType in [etLowerCase] then\r\n v := LowerCase(v);\r\n\r\n {$IFDEF WEBLIB}\r\n inherited SetText(FPrefix + v + FSuffix);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n inherited Text := FPrefix + v + FSuffix;\r\n {$ENDIF}\r\n\r\n SetModified(False);\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEdit.DoDoneLookupTimer(Sender: TObject);\r\nbegin\r\n DoneLookup;\r\n FDoneLookupTimer.Enabled := False;\r\nend;\r\n\r\nfunction TTMSFNCEdit.GetDefaultStyleLookupName: string;\r\nbegin\r\n Result := 'editstyle';\r\nend;\r\n{$ENDIF}\r\n\r\nfunction TTMSFNCEdit.FixedLength(s: string): Integer;\r\nvar\r\n i: Integer;\r\nbegin\r\n s := TTMSFNCUtils.StripThousandSep(s);\r\n i := Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}decimalseparator, s);\r\n if (i > 0) then Result := i else Result := Length(s) + 1;\r\n\r\n if Signed and (EditType in [etFloat, etSignedFloat, etNumeric, etMoney]) and (pos('-',s) > 0) then\r\n Result := Result - 1;\r\nend;\r\n\r\nfunction TTMSFNCEdit.AllowMin(ch: char): boolean;\r\nbegin\r\n Result := Signed and (EditType in [etFloat, etSignedFloat, etNumeric, etMoney]) and (ch = '-');\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEdit.KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCEdit.KeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n FKeyDown := Key;\r\n FShiftState := Shift;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.KeyPress(var Key: Char);\r\n{$ENDIF}\r\nvar\r\n s, cl, st, stmin: string;\r\n allowclip: boolean;\r\n at: TTMSFNCEditAutoType;\r\n ismod: Boolean;\r\n d: Integer;\r\n kch: Char;\r\n\r\n procedure EatKey;\r\n begin\r\n {$IFDEF FMXLIB}\r\n KeyChar := #0;\r\n if not (Key in [KEY_UP, KEY_DOWN]) then\r\n Key := 0;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if not (FKeyDown in [KEY_UP, KEY_DOWN]) then\r\n Key := #0;\r\n {$ENDIF}\r\n end;\r\n\r\nbegin\r\n if not Assigned(FLookupListBox) then\r\n begin\r\n inherited;\r\n Exit;\r\n end;\r\n\r\n {$IFDEF FMXLIB}\r\n s := KeyChar;\r\n kch := KeyChar;\r\n FKeyDown := Key;\r\n {$ELSE}\r\n s := Key;\r\n kch := Key;\r\n {$ENDIF}\r\n\r\n if (FKeyDown = KEY_MENU) or (FKeyDown = KEY_ESCAPE) then\r\n begin\r\n CloseLookup;\r\n end;\r\n\r\n if (FKeyDown = KEY_BACK) and (FPrefix <> '') then\r\n if (SelStart <= Length(FPrefix)) and (SelLength = 0) then Exit;\r\n\r\n if (FLengthLimit > 0) and (FixedLength(self.Text) > FLengthLimit) and\r\n (SelLength = 0) and (SelStart < DecimalPos) and (FKeyDown <> KEY_BACK) and (FKeyDown <> ord({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}decimalseparator{$IFDEF WEBLIB}[0]{$ENDIF})) and not AllowMin(kch) then\r\n Exit;\r\n\r\n if (FKeyDown in [KEY_HOME, KEY_END, KEY_TAB, KEY_LEFT, KEY_RIGHT, KEY_PRIOR, KEY_NEXT, KEY_DELETE, KEY_BACK]) then\r\n begin\r\n if (FKeyDown = KEY_BACK) then\r\n begin\r\n s := self.Text;\r\n\r\n if SelLength = 0 then\r\n delete(s, SelStart - Length(fprefix), 1)\r\n else\r\n delete(s, Max(1, SelStart - Length(fprefix)), SelLength);\r\n\r\n ismod := (s <> Text) or Modified;\r\n Modified := ismod;\r\n\r\n inherited;\r\n\r\n if (EditType = etMoney) then\r\n AutoSeparators;\r\n\r\n if (Text = '') and ((s <> '') or ismod) then\r\n begin\r\n Change;\r\n end;\r\n\r\n Modified := ismod;\r\n\r\n UpdateLookup;\r\n Exit;\r\n end\r\n else\r\n begin\r\n if (FKeyDown in [KEY_HOME, KEY_END, KEY_TAB, KEY_LEFT, KEY_RIGHT, KEY_PRIOR, KEY_NEXT]) then\r\n begin\r\n if AutoComplete and (SelLength > 0) and IsLookupListVisible then\r\n CloseLookup;\r\n end;\r\n\r\n st := Self.Text;\r\n inherited;\r\n if Self.Text <> st then\r\n Modified := True;\r\n end;\r\n\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_RETURN) and IsLookupListVisible then\r\n begin\r\n DoneLookup;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown in [KEY_TAB, KEY_RETURN, KEY_ESCAPE, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6,\r\n KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12]) {and IsCtrl} then\r\n begin\r\n inherited;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_HOME) and IsLookupListVisible then\r\n begin\r\n if FLookupListBox.Items.Count > 0 then\r\n FLookupListBox.ItemIndex := 0\r\n else\r\n FLookupListBox.ItemIndex := -1;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_END) and IsLookupListVisible then\r\n begin\r\n if FLookupListBox.Items.Count > 0 then\r\n FLookupListBox.ItemIndex := FLookupListBox.Items.Count - 1\r\n else\r\n FLookupListBox.ItemIndex := -1;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_NEXT) and IsLookupListVisible then\r\n begin\r\n if FLookupListBox.Items.Count > 0 then\r\n begin\r\n if FLookupListBox.ItemIndex + FLookup.DisplayCount < FLookupListBox.Items.Count then\r\n FLookupListBox.ItemIndex := FLookupListBox.ItemIndex + FLookup.DisplayCount\r\n else\r\n FLookupListBox.ItemIndex := FLookupListBox.Items.Count - 1;\r\n end\r\n else\r\n FLookupListBox.ItemIndex := -1;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_PRIOR) and IsLookupListVisible then\r\n begin\r\n if FLookupListBox.Items.Count > 0 then\r\n begin\r\n if FLookupListBox.ItemIndex > FLookup.DisplayCount then\r\n FLookupListBox.ItemIndex := FLookupListBox.ItemIndex - FLookup.DisplayCount\r\n else\r\n FLookupListBox.ItemIndex := 0;\r\n end\r\n else\r\n FLookupListBox.ItemIndex := -1;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_UP) and IsLookupListVisible then\r\n begin\r\n if FLookupListBox.Items.Count > 0 then\r\n begin\r\n if FLookupListBox.ItemIndex > 0 then\r\n FLookupListBox.ItemIndex := FLookupListBox.ItemIndex - 1;\r\n end\r\n else\r\n FLookupListBox.ItemIndex := -1;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_DOWN) and IsLookupListVisible then\r\n begin\r\n if FLookupListBox.Items.Count > 0 then\r\n begin\r\n if FLookupListBox.ItemIndex + 1 < FLookupListBox.Items.Count then\r\n FLookupListBox.ItemIndex := FLookupListBox.ItemIndex + 1;\r\n end\r\n else\r\n FLookupListBox.ItemIndex := -1;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_ESCAPE) and IsLookupListVisible then\r\n begin\r\n CloseLookup;\r\n Exit;\r\n end;\r\n\r\n if (FKeyDown = KEY_DELETE) and (SelStart >= Length(FPrefix)) then\r\n begin\r\n s := self.text;\r\n if SelLength = 0 then\r\n Delete(s, SelStart - Length(fprefix) + 1, 1)\r\n else\r\n Delete(s, SelStart - Length(fprefix) + 1, SelLength);\r\n\r\n if (lengthlimit > 0) and (fixedLength(s) - 1 > lengthlimit) then\r\n begin\r\n EatKey;\r\n exit;\r\n end;\r\n SetModified(true);\r\n end;\r\n\r\n if (MaxLength > 0) and (SelLength = 0) and (Length(Text) >= MaxLength) then\r\n Exit;\r\n\r\n if (fPrefix <> '') and (SelStart < Length(fPrefix)) then\r\n SelStart := Length(fPrefix);\r\n\r\n if (FShiftState = [ssCtrl]) and (kch = ^V) then\r\n begin\r\n cl := TTMSFNCClipBoard.GetText;\r\n at := IsType(cl);\r\n\r\n allowclip := true;\r\n\r\n case FEditType of\r\n etNumeric: allowclip := at = atNumeric;\r\n etSignedNumeric: allowclip := at = atNumeric;\r\n etFloat, etSignedFloat: allowclip := at = atFloat;\r\n etUppercase: cl := Uppercase(cl);\r\n etMixedCase: cl := Shiftcase(cl);\r\n etLowerCase: cl := Lowercase(cl);\r\n etMoney: allowclip := at = atFloat;\r\n etHex: allowclip := at in [atHex, atNumeric];\r\n end;\r\n\r\n if Allowclip then\r\n InsertText(cl);\r\n Exit;\r\n end;\r\n\r\n case FEditType of\r\n etString:\r\n begin\r\n end;\r\n etNumeric:\r\n begin\r\n if not CharIsNumber(kch) then\r\n EatKey;\r\n end;\r\n etFloat:\r\n begin\r\n if not (CharIsNumber(kch) or (kch = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator)) then\r\n EatKey;\r\n\r\n {$IFDEF FMXLIB}\r\n if (Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator, Text) > 0) and (KeyChar = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator) then\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if (Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator, Text) > 0) and (Key = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator) then\r\n {$ENDIF}\r\n EatKey;\r\n end;\r\n etSignedFloat, etSignedNumeric:\r\n begin\r\n if not (CharInArray(kch, ['-']) or CharIsNumber(kch) or (kch = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator)) then\r\n EatKey;\r\n\r\n {$IFDEF FMXLIB}\r\n if (Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator, Text) > 0) and (KeyChar = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator) then\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if (Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator, Text) > 0) and (Key = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator) then\r\n {$ENDIF}\r\n EatKey;\r\n\r\n {$IFDEF FMXLIB}\r\n if (Pos('-', Text) > 0) and (KeyChar = '-') and not (SelLength = Length(Text)) then\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if (Pos('-', Text) > 0) and (Key = '-') and not (SelLength = Length(Text)) then\r\n {$ENDIF}\r\n EatKey;\r\n end;\r\n etUppercase:\r\n begin\r\n s := Uppercase(s);\r\n {$IFDEF FMXMOBILE}\r\n kch := s[0];\r\n {$ELSE}\r\n kch := s[1];\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n Key := ord(kch);\r\n KeyChar := kch;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Key := kch;\r\n {$ENDIF}\r\n end;\r\n etLowerCase:\r\n begin\r\n s := LowerCase(s);\r\n {$IFDEF FMXMOBILE}\r\n kch := s[0];\r\n {$ELSE}\r\n kch := s[1];\r\n {$ENDIF}\r\n\r\n {$IFDEF FMXLIB}\r\n Key := ord(kch);\r\n KeyChar := kch;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Key := kch;\r\n {$ENDIF}\r\n end;\r\n etMoney:\r\n begin\r\n if not (CharIsNumber(kch) or (kch = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator) or (kch = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}ThousandSeparator)) then\r\n EatKey;\r\n end;\r\n etHex:\r\n begin\r\n if not CharIsHex(kch) then\r\n EatKey;\r\n end;\r\n etAlphaNumeric:\r\n begin\r\n if not CharIsLetterOrNumber(kch) then\r\n EatKey;\r\n end;\r\n etValidChars:\r\n begin\r\n if (FValidChars <> '') then\r\n if Pos(UpperCase(s), Uppercase(FValidChars)) = 0 then\r\n EatKey;\r\n end;\r\n end;\r\n\r\n s := self.Text;\r\n inherited;\r\n if self.Text <> s then\r\n Modified := True;\r\n\r\n if (EditType in [etMoney, etSignedFloat, etSignedNumeric]) then\r\n begin\r\n stmin := Text;\r\n if pos('-', stmin) > 1 then\r\n begin\r\n delete(stmin,Pos('-', stmin),1);\r\n Text := '-' + stmin;\r\n end;\r\n end;\r\n\r\n\r\n if (EditType = etMoney) then\r\n AutoSeparators;\r\n\r\n if (FEditType in [etFloat, etSignedFloat, etMoney]) then\r\n begin\r\n d := Length(Text) - Length(s);\r\n if (d > 1) then\r\n SetCaretPosition(GetCaretPosition + d);\r\n end;\r\n\r\n if FShiftState = [] then\r\n UpdateLookup;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEdit.KeyUp(var Key: Word; var KeyChar: Char; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCEdit.KeyUp(var Key: Word; Shift: TShiftState);\r\n{$ENDIF}\r\nvar\r\n oldSelStart: integer;\r\n kch: Char;\r\nbegin\r\n inherited;\r\n\r\n {$IFDEF FMXLIB}\r\n kch := KeyChar;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n kch := Chr(Key);\r\n {$ENDIF}\r\n\r\n if (Key = KEY_TAB) and IsLookupListVisible and (Lookup.AcceptOnTab) then\r\n DoneLookup;\r\n\r\n if EditType = etMixedCase then\r\n begin\r\n oldSelStart := SelStart;\r\n Text := ShiftCase(Text);\r\n SelStart := oldSelStart;\r\n end;\r\n\r\n if (kch <> '') and (kch <> #8) then\r\n UpdateAutoComplete;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEdit.ListKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCEdit.ListKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n{$ENDIF}\r\nbegin\r\n if Key = KEY_RETURN then\r\n DoneLookup;\r\n\r\n if (Key = KEY_TAB) and (Lookup.AcceptOnTab) then\r\n DoneLookup;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEdit.ListMouseUp(Sender: TObject; Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single);\r\nbegin\r\n FDoneLookupTimer.Enabled := True;\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCEdit.ListMouseUp(Sender: TObject; Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Integer);\r\nbegin\r\n DoneLookup;\r\n{$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCEdit.LookupList: TTMSFNCPopup;\r\nbegin\r\n Result := FLookupList;\r\nend;\r\n\r\nfunction TTMSFNCEdit.LookupListbox: TListBox;\r\nbegin\r\n Result := FLookupListBox;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetEditType(const Value: TTMSFNCEditType);\r\nvar\r\n at: TTMSFNCEditAutoType;\r\nbegin\r\n if FEditType <> Value then\r\n begin\r\n FEditType := Value;\r\n\r\n if (csLoading in ComponentState) then\r\n Exit;\r\n\r\n if (Text <> '') or (not AllowNumericNullValue) then\r\n begin\r\n at := IsType(self.Text);\r\n case FEditType of\r\n etHex: if not (at in [atNumeric, atHex]) then self.IntValue := 0;\r\n etNumeric: if (at <> atNumeric) then self.IntValue := 0;\r\n etFloat, etSignedFloat, etMoney: if not (at in [atFloat, atNumeric]) then self.FloatValue := 0.0;\r\n end;\r\n end;\r\n\r\n if (csDesigning in ComponentState) and not(csLoading in ComponentState) and ((FEditType = etFloat) or (FEditType = etSignedFloat)) and (Precision = 0) then\r\n Precision := 2;\r\n end;\r\nend;\r\n\r\n\r\n{$IFDEF LCLLIB}\r\nfunction TTMSFNCEdit.ChildClassAllowed(ChildClass: TClass): Boolean;\r\nbegin\r\n if ChildClass = TListBox then\r\n Result := True\r\n else\r\n inherited;\r\nend;\r\n{$ENDIF}\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEdit.Change;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCEdit.CleanupLookupList;\r\nvar\r\n I: Integer;\r\n obj: TObject;\r\nbegin\r\n for I := 0 to FLookupListBoxItems.Count - 1 do\r\n begin\r\n obj := TObject(FLookupListBoxItems[I]);\r\n if Assigned(obj) then\r\n obj.Free;\r\n end;\r\n\r\n FLookupListBoxItems.Clear;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.CloseLookup;\r\nbegin\r\n if CanFocus then\r\n SetFocus;\r\n\r\n if Assigned(FLookupList) then\r\n FLookupList.IsOpen := False;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.DoneLookup;\r\nvar\r\n idx, vp: Integer;\r\n NewValue: string;\r\n LookupText, NewText: string;\r\nbegin\r\n if not Assigned(FLookupListBox) then\r\n Exit;\r\n\r\n if (FlookupListBox.ItemIndex <> -1) then\r\n begin\r\n idx := TTMSFNCLookupListBoxItem(FLookupListBox.Items.Objects[FlookupListBox.ItemIndex]).Idx;\r\n\r\n if ((idx >= 0) and (idx < FLookup.ValueList.Count)) and Lookup.UseValueList then\r\n NewValue := FLookup.ValueList.Strings[idx]\r\n else\r\n NewValue := FLookupListbox.Items[FLookupListBox.ItemIndex];\r\n\r\n if Assigned(FOnLookupSelect) then\r\n FOnLookupSelect(Self, NewValue);\r\n\r\n if Assigned(FOnlookupIndexSelect) then\r\n FOnLookupIndexSelect(Self, idx, NewValue);\r\n\r\n if FLookup.Multi then\r\n begin\r\n NewValue := NewValue + FLookup.Separator;\r\n LookupText := Text;\r\n NewText := '';\r\n vp := -1;\r\n while TTMSFNCUtils.VarPos(FLookup.Separator, LookupText, vp) > 0 do\r\n begin\r\n NewText := NewText + Copy(LookupText, 1, vp);\r\n Delete(LookupText, 1, vp);\r\n end;\r\n Text := NewText + NewValue;\r\n\r\n end\r\n else\r\n Text := NewValue;\r\n\r\n if FLookup.Multi then\r\n SelStart := length(Text)\r\n else\r\n SelectAll;\r\n\r\n\r\n CloseLookup;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetLookup(const Value: TTMSFNCEditLookupSettings);\r\nbegin\r\n FLookup.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCEdit.DoLookupNeedData(Value: string; List: TStrings; var ItemIndex: integer);\r\nbegin\r\n if Assigned(OnLookupNeedData) then\r\n OnLookupNeedData(Self, Value, List, ItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCEdit.UpdateLookup;\r\nvar\r\n i, cnt: Integer;\r\n mw, mh, tw, vp: Integer;\r\n LookupText: string;\r\n ismatch: Boolean;\r\n idx: Integer;\r\n obj: TTMSFNCLookupListBoxItem;\r\nbegin\r\n if not FLookup.Enabled or not Assigned(FLookupListBox) then\r\n Exit;\r\n\r\n if FLookup.Multi then\r\n begin\r\n LookupText := Text;\r\n vp := -1;\r\n while TTMSFNCUtils.VarPos(FLookup.Separator, LookupText, vp) > 0 do\r\n Delete(LookupText, 1, vp);\r\n end\r\n else\r\n LookupText := Text;\r\n\r\n if Length(LookupText) >= FLookup.NumChars then\r\n begin\r\n mh := (LOOKUPITEMHEIGHT * FLookup.DisplayCount) + 4;\r\n FLookupListBox.Parent := Self;\r\n CleanupLookupList;\r\n FLookupListBox.Items.Clear;\r\n {$IFDEF FMXLIB}\r\n FLookupListBox.NeedStyleLookup;\r\n FLookupListBox.ApplyStyleLookup;\r\n FLookupListBox.BeginUpdate;\r\n {$ENDIF}\r\n\r\n for i := 1 to FLookup.DisplayList.Count do\r\n begin\r\n if FLookup.CaseSensitive then\r\n begin\r\n if Pos(LookupText, FLookup.FDisplayList.Strings[i - 1]) = 1 then\r\n begin\r\n obj := TTMSFNCLookupListBoxItem.Create(i - 1);\r\n FLookupListbox.Items.AddObject(CleanString(FLookup.FDisplayList.Strings[i - 1]), obj);\r\n FLookupListBoxItems.Add(obj);\r\n end;\r\n end\r\n else\r\n begin\r\n vp := Pos(Uppercase(LookupText), Uppercase(FLookup.FDisplayList.Strings[i - 1]));\r\n\r\n if FullTextSearch then\r\n ismatch := vp > 0\r\n else\r\n ismatch := vp = 1;\r\n\r\n if ismatch then\r\n begin\r\n obj := TTMSFNCLookupListBoxItem.Create(i - 1);\r\n FLookupListbox.Items.AddObject(CleanString(FLookup.FDisplayList.Strings[i - 1]), obj);\r\n FLookupListBoxItems.Add(obj);\r\n end;\r\n end;\r\n end;\r\n\r\n idx := 0;\r\n DoLookupNeedData(LookupText, FLookupListBox.Items, idx);\r\n cnt := FLookupListBox.Items.Count;\r\n\r\n {$IFDEF FMXLIB}\r\n FLookupListBox.EndUpdate;\r\n {$ENDIF}\r\n\r\n if (FLookup.FDisplayList.Count > 0) and (FLookupListBox.Items.Count > 0) then\r\n FLookupListBox.ItemIndex := idx;\r\n\r\n if cnt < FLookup.DisplayCount then\r\n mh := (cnt * LOOKUPITEMHEIGHT) + 4;\r\n\r\n FLookupListBox.Sorted := True;\r\n mw := 50;\r\n FLookupList.DropDownWidth := 0;\r\n\r\n if cnt > 0 then\r\n begin\r\n for i := 1 to cnt do\r\n begin\r\n tw := 0;\r\n if Assigned(FLookupListBox.Canvas) then\r\n tw := Round(FLookupListBox.Canvas.TextWidth(FLookupListBox.Items[i - 1]));\r\n\r\n if tw > mw then\r\n mw := tw;\r\n end;\r\n\r\n mw := mw + 26;\r\n end;\r\n\r\n if (FLookup.Width > 0) then\r\n mw := FLookup.Width;\r\n\r\n if (FLookup.Height > 0) then\r\n mh := FLookup.Height;\r\n\r\n if (cnt > 0) then\r\n begin\r\n FLookupList.DropDownWidth := Max(Lookup.MinimumWidth, mw);\r\n FLookupList.DropDownHeight := Max(Lookup.MinimumHeight, mh);\r\n if FLookupList.HasPopupForm then\r\n begin\r\n FLookupListBox.Parent := FLookupList.PopupForm;\r\n FLookupList.PopupForm.Width := Round(FLookupList.DropDownWidth);\r\n FLookupList.PopupForm.Height := Round(FLookupList.DropDownHeight);\r\n end;\r\n FLookupList.IsOpen := True;\r\n end\r\n else\r\n FLookupList.IsOpen := False;\r\n end\r\n else\r\n FLookupList.IsOpen := False;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.UpdateAutoComplete;\r\nvar\r\n s, ms: string;\r\n i, vp: Integer;\r\nbegin\r\n if not AutoComplete then\r\n Exit;\r\n\r\n s := Text;\r\n ms := '';\r\n if Length(s) >= 1 then\r\n begin\r\n for i := 1 to FLookup.DisplayList.Count do\r\n begin\r\n if FLookup.CaseSensitive then\r\n begin\r\n if Pos(s, FLookup.FDisplayList.Strings[i - 1]) = 1 then\r\n begin\r\n ms := FLookup.FDisplayList.Strings[i - 1];\r\n Break;\r\n end;\r\n end\r\n else\r\n begin\r\n vp := Pos(Uppercase(s), Uppercase(FLookup.FDisplayList.Strings[i - 1]));\r\n if (vp = 1) then\r\n begin\r\n ms := FLookup.FDisplayList.Strings[i - 1];\r\n Break;\r\n end;\r\n end;\r\n end;\r\n\r\n if (ms <> '') then\r\n begin\r\n Text := CleanString(ms);\r\n SelStart := Length(s);\r\n SelLength := Length(Text) - SelStart;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetPrefix(const Value: string);\r\nbegin\r\n FPrefix := Value;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetSuffix(const Value: string);\r\nbegin\r\n FSuffix := Value;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetModified(const Value: Boolean);\r\nbegin\r\n if csLoading in ComponentState then\r\n Exit;\r\n\r\n if ReadOnly then\r\n Exit;\r\n\r\n FIsModified := value;\r\nend;\r\n\r\nfunction TTMSFNCEdit.DecimalPos: Integer;\r\nvar\r\n i: Integer;\r\nbegin\r\n i := Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}decimalseparator, self.text);\r\n if (i = 0) then Result := Length(fprefix) + Length(self.text) + Length(fSuffix) + 1\r\n else Result := Length(fPrefix) + i;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.AutoSeparators;\r\nvar\r\n s, si, neg: string;\r\n d: Double;\r\n Diffl, OldSelStart, OldPrec: Integer;\r\n\r\nbegin\r\n s := self.Text;\r\n Diffl := Length(s);\r\n\r\n OldSelStart := SelStart;\r\n\r\n if (s = '') then\r\n Exit;\r\n\r\n if (Pos('-', s) = 1) then\r\n begin\r\n Delete(s, 1, 1);\r\n neg := '-';\r\n end\r\n else\r\n neg := '';\r\n\r\n if (Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator, s) > 0) then\r\n s := Copy(s, Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator, s), 255)\r\n else\r\n s := '';\r\n\r\n d := Trunc(Abs(self.FloatValue));\r\n\r\n if FAutoThousandSeparator then\r\n si := Format('%n', [d])\r\n else\r\n si := Format('%f', [d]);\r\n\r\n si := Copy(si, 1, Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}decimalseparator, si) - 1);\r\n\r\n OldPrec := FPrecision;\r\n FPrecision := 0;\r\n\r\n FBlockChange := (Text <> FPrefix + neg + si + s + FSuffix);\r\n\r\n if FBlockChange then\r\n begin\r\n {$IFDEF WEBLIB}\r\n inherited SetText(FPrefix + neg + si + s + fSuffix);\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n inherited Text := FPrefix + neg + si + s + fSuffix;\r\n {$ENDIF}\r\n end;\r\n\r\n FBlockChange := false;\r\n\r\n FPrecision := OldPrec;\r\n\r\n Diffl := Length(self.Text) - Diffl;\r\n\r\n SelStart := OldSelStart + Diffl;\r\n SelLength := 0;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetAutoThousandSeparator(const Value: Boolean);\r\nbegin\r\n FAutoThousandSeparator := Value;\r\n if FEditType in [etMoney, etFloat, etSignedFloat] then AutoSeparators;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetCaretPosition(ACaretPosition: Integer);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n CaretPosition := ACaretPosition;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n SelStart := ACaretPosition;\r\n SelLength := 0;\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetFloat(const Value: double);\r\nvar\r\n s:string;\r\nbegin\r\n case FEditType of\r\n etHex: self.Text := IntToHex(trunc(value), 0);\r\n etNumeric:\r\n if (FPrecision >= 0) then\r\n self.Text := Format('%.' + inttostr(FPrecision) + 'n', [value])\r\n else\r\n self.Text := Format('%g', [Value]);\r\n etFloat, etSignedFloat, etString:\r\n if (FPrecision >= 0) then\r\n begin\r\n s := Format('%.' + inttostr(FPrecision) + 'f', [value]);\r\n self.Text := s;\r\n end\r\n else\r\n self.Text := Format('%g', [Value]);\r\n etMoney:\r\n begin\r\n if (FPrecision >= 0) then\r\n self.Text := Format('%.' + inttostr(FPrecision) + 'f', [value]) else self.Text := Format('%g', [Value]);\r\n AutoSeparators;\r\n end;\r\n end;\r\n SetModified(True);\r\nend;\r\n\r\nfunction TTMSFNCEdit.GetCaretPosition: Integer;\r\nbegin\r\n {$IFDEF FMXLIB}\r\n Result := CaretPosition;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Result := SelStart;\r\n {$ENDIF}\r\nend;\r\n\r\nfunction TTMSFNCEdit.GetFloat: double;\r\nvar\r\n s: string;\r\n d: double;\r\n {%H-}e: integer;\r\nbegin\r\n Result := 0;\r\n case FEditType of\r\n etHex: if self.Text <> '' then Result := HexToInt(self.Text);\r\n etString:\r\n begin\r\n s := Self.Text;\r\n if {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator = ',' then\r\n s := StringReplace(s,',','.',[rfReplaceAll]);\r\n\r\n Val(s, d, e);\r\n Result := d;\r\n end;\r\n etNumeric, etFloat, etSignedFloat:\r\n if (self.Text <> '') then\r\n begin\r\n s := self.Text;\r\n if (s = '-') then\r\n Result := 0\r\n else\r\n Result := EStrToFloat(s);\r\n end;\r\n etMoney:\r\n if self.Text <> '' then\r\n begin\r\n s := TTMSFNCUtils.StripThousandSep(self.Text);\r\n if (Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}Decimalseparator, s) = Length(s)) then Delete(s, Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}DecimalSeparator, s), 1);\r\n if (s = '') or (s = '-') then Result := 0 else\r\n Result := EStrToFloat(s);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetPrecision(const Value: smallint);\r\nvar\r\n at: TTMSFNCEditAutoType;\r\nbegin\r\n if (FPrecision <> value) and (editType in [etFloat, etSignedFloat, etMoney, etString]) then\r\n begin\r\n FPrecision := Value;\r\n if (Text <> '') or (not AllowNumericNullValue) then\r\n begin\r\n at := IsType(self.text);\r\n if (at in [atFloat, atNumeric]) then\r\n FloatValue := FloatValue\r\n else\r\n FloatValue := 0.0;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetPrecisionDisplay(const Value: TTMSFNCEditPrecisionDisplay);\r\nbegin\r\n if (FPrecisionDisplay <> Value) then\r\n begin\r\n FPrecisionDisplay := Value;\r\n FloatValue := FloatValue;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCEdit.EStrToFloat(s: string): extended;\r\nbegin\r\n Result := 0;\r\n\r\n if Pos({$IFNDEF WEBLIB}FormatSettings.{$ENDIF}ThousandSeparator, s) > 0 then\r\n s := TTMSFNCUtils.StripThousandSep(s);\r\n\r\n if (FPrecision > 0) and (Length(s) > FPrecision) then\r\n if s[Length(s){$IFDEF FMXMOBILE}-1{$ENDIF} - FPrecision] = {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}Thousandseparator{$IFDEF WEBLIB}[0]{$ENDIF} then\r\n s[Length(s){$IFDEF FMXMOBILE}-1{$ENDIF} - FPrecision] := {$IFNDEF WEBLIB}FormatSettings.{$ENDIF}Decimalseparator{$IFDEF WEBLIB}[0]{$ENDIF};\r\n try\r\n TryStrToFloat(s, Result);\r\n except\r\n Result := 0;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCEdit.GetInt: Integer;\r\nbegin\r\n Result := 0;\r\n case FEditType of\r\n etHex: if (self.Text <> '') then Result := HexToInt(self.Text);\r\n etSignedNumeric, etNumeric, etSignedFloat, etFloat: Result := ValStr(self.Text);\r\n etMoney: Result := ValStr(TTMSFNCUtils.StripThousandSep(self.Text));\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCEdit.GetT: string;\r\nvar\r\n s: string;\r\nbegin\r\n {$IFDEF WEBLIB}\r\n s := inherited GetText;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n s := inherited Text;\r\n {$ENDIF}\r\n if (fPrefix <> '') and (Pos(Uppercase(fPrefix), Uppercase(s)) = 1) then delete(s, 1, Length(fPrefix));\r\n if (fSuffix <> '') then delete(s, Length(s) - Length(fSuffix) + 1, Length(fSuffix));\r\n Result := s;\r\nend;\r\n\r\nprocedure TTMSFNCEdit.SetInt(const Value: Integer);\r\nbegin\r\n case FEditType of\r\n etHex: self.Text := IntToHex(value, 0);\r\n etSignedNumeric, etNumeric, etSignedFloat, etFloat: self.Text := Inttostr(value);\r\n etMoney:\r\n begin\r\n self.Text := IntToStr(value);\r\n AutoSeparators;\r\n end;\r\n end;\r\n SetModified(True);\r\nend;\r\n\r\n{ TTMSFNCEditLookupSettings }\r\n\r\nprocedure TTMSFNCEditLookupSettings.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCEditLookupSettings) then\r\n begin\r\n FAcceptOnTab := (Source as TTMSFNCEditLookupSettings).AcceptOnTab;\r\n FCaseSensitive := (Source as TTMSFNCEditLookupSettings).CaseSensitive;\r\n FColor := (Source as TTMSFNCEditLookupSettings).Color;\r\n FDisplayCount := (Source as TTMSFNCEditLookupSettings).DisplayCount;\r\n FDisplayList.Assign((Source as TTMSFNCEditLookupSettings).DisplayList);\r\n FEnabled := (Source as TTMSFNCEditLookupSettings).Enabled;\r\n FHistory := (Source as TTMSFNCEditLookupSettings).History;\r\n FNumChars := (Source as TTMSFNCEditLookupSettings).NumChars;\r\n FValueList.Assign((Source as TTMSFNCEditLookupSettings).ValueList);\r\n FMulti := (Source as TTMSFNCEditLookupSettings).Multi;\r\n FSeparator := (Source as TTMSFNCEditLookupSettings).Separator;\r\n FWidth := (Source as TTMSFNCEditLookupSettings).Width;\r\n FHeight := (Source as TTMSFNCEditLookupSettings).Height;\r\n FMinimumWidth := (Source as TTMSFNCEditLookupSettings).MinimumWidth;\r\n FMinimumHeight := (Source as TTMSFNCEditLookupSettings).MinimumHeight;\r\n FUseValueList := (Source as TTMSFNCEditLookupSettings).UseValueList;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCEditLookupSettings.Create;\r\nbegin\r\n inherited Create;\r\n FUseValueList := True;\r\n FWidth := 0;\r\n FMinimumWidth := 0;\r\n FHeight := 0;\r\n FMinimumHeight := 0;\r\n FDisplayList := TStringList.Create;\r\n FDisplayList.Sorted := true;\r\n FDisplayList.Duplicates := dupIgnore;\r\n FValueList := TStringList.Create;\r\n FColor := gcWhite;\r\n FDisplayCount := 4;\r\n FNumChars := 2;\r\n FEnabled := False;\r\n FSeparator := ';';\r\nend;\r\n\r\ndestructor TTMSFNCEditLookupSettings.Destroy;\r\nbegin\r\n FValueList.Free;\r\n FDisplayList.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCEditLookupSettings.SetDisplayList(const Value: TStringList);\r\nbegin\r\n FDisplayList.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCEditLookupSettings.SetHeight(const Value: Integer);\r\nbegin\r\n FHeight := Value;\r\nend;\r\n\r\nprocedure TTMSFNCEditLookupSettings.SetMinimumHeight(const Value: Integer);\r\nbegin\r\n FMinimumHeight := Value;\r\nend;\r\n\r\nprocedure TTMSFNCEditLookupSettings.SetMinimumWidth(const Value: Integer);\r\nbegin\r\n FMinimumWidth := Value;\r\nend;\r\n\r\nprocedure TTMSFNCEditLookupSettings.SetNumChars(const Value: Integer);\r\nbegin\r\n if Value > 0 then\r\n FNumChars := Value\r\nend;\r\n\r\nprocedure TTMSFNCEditLookupSettings.SetValueList(const Value: TStringList);\r\nbegin\r\n FValueList.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCEditLookupSettings.SetWidth(const Value: Integer);\r\nbegin\r\n FWidth := Value;\r\nend;\r\n\r\n{ TTMSFNCEditButton }\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEditButton.KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCEditButton.KeyDown(var Key: Word; Shift: TShiftState);\r\n{$ENDIF}\r\nbegin\r\n inherited;\r\n if Key = KEY_F4 then\r\n begin\r\n DropDown;\r\n Exit;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n if (Operation = opRemove) and (AComponent = FPopupControl) then\r\n FPopupControl := nil;\r\n inherited;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCEditButton.PopupKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCEditButton.PopupKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);\r\n{$ENDIF}\r\nbegin\r\n case Key of\r\n KEY_RETURN:\r\n begin\r\n DropDown;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(FButton) then\r\n FButton.AdaptToStyle := AdaptToStyle;\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.SetPopupControl(const Value: TControl);\r\nbegin\r\n FPopupControl := Value;\r\n FPopup.ContentControl := FPopupControl;\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.SetText(const Value: string);\r\nbegin\r\n FEdit.Text := Value;\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.BeforeDropDown;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.ButtonClick(Sender: TObject);\r\nbegin\r\n if not FBlockDropDown then\r\n DropDown;\r\n\r\n FBlockDropDown := False;\r\n\r\n if Assigned(OnButtonClick) then\r\n OnButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.ButtonDblClick(Sender: TObject);\r\nbegin\r\n FBlockDropDown := True;\r\nend;\r\n\r\nconstructor TTMSFNCEditButton.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FModalPopup := False;\r\n FButton := TTMSFNCToolBarDropDownButton.Create(Self);\r\n FButton.TabStop := False;\r\n FButton.AllowFocus := False;\r\n FButton.Stored := False;\r\n FButton.Width := 18;\r\n FButton.Appearance.Rounding := 0;\r\n {$IFDEF CMNWEBLIB}\r\n FButton.Align := alRight;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n FButton.Align := TAlignLayout.Right;\r\n {$ENDIF}\r\n FButton.Parent := Self;\r\n FButton.OnClick := ButtonClick;\r\n FButton.OnDblClick := ButtonDblClick;\r\n\r\n FButton.Bitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPAND, HInstance, 1.0);\r\n FButton.Bitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPANDLARGE, HInstance, 1.5);\r\n FButton.DisabledBitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPAND, HInstance, 1.0);\r\n FButton.DisabledBitmaps.AddBitmapFromResource(TMSFNCTOOLBAREXPANDLARGE, HInstance, 1.5);\r\n\r\n FEdit := TTMSFNCEdit.Create(Self);\r\n {$IFDEF FMXLIB}\r\n FEdit.Stored := False;\r\n {$ENDIF}\r\n FEdit.Parent := Self;\r\n {$IFDEF CMNWEBLIB}\r\n FEdit.Align := alClient;\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n FEdit.Align := TAlignLayout.Client;\r\n {$ENDIF}\r\n FPopup := TTMSFNCPopup.Create(Self);\r\n FPopup.Placement := ppBottom;\r\n FPopup.PlacementControl := Self;\r\n FPopup.Stored := False;\r\n FPopup.DragWithParent := True;\r\n FPopup.Width := 240;\r\n FPopup.Height := 160;\r\n\r\n Width := 118;\r\n Height := 22;\r\nend;\r\n\r\ndestructor TTMSFNCEditButton.Destroy;\r\nbegin\r\n FButton.Free;\r\n FPopup.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCEditButton.DropDown;\r\nbegin\r\n if Assigned(PopupControl) then\r\n begin\r\n if not FPopup.IsOpen then\r\n begin\r\n BeforeDropDown;\r\n FPopup.Popup(ModalPopup)\r\n end\r\n else\r\n FPopup.IsOpen := False;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCEditButton.GetText: string;\r\nbegin\r\n Result := FEdit.Text;\r\nend;\r\n\r\n{ TTMSFNCLookupListBoxItem }\r\n\r\nconstructor TTMSFNCLookupListBoxItem.Create(AIdx: Integer);\r\nbegin\r\n FIdx := AIdx;\r\nend;\r\n\r\ninitialization\r\nbegin\r\n RegisterClass(TTMSFNCEditButton);\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n RegisterClass(TTMSFNCEdit);\r\n RegisterObservableMember(\r\n TArray.Create(\r\n TTMSFNCEdit\r\n {$IFDEF FMXLIB}\r\n ), 'Text', 'FMX');\r\n {$ENDIF}\r\n {$IFDEF VCLLIB}\r\n ), 'Text', 'VCL');\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nfinalization\r\nbegin\r\n {$IFNDEF LCLLIB}\r\n UnRegisterObservableMember(\r\n TArray.Create(\r\n TTMSFNCEdit\r\n ));\r\n {$ENDIF}\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2017 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCTableView;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF WEBLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCTreeView, WEBLib.TMSFNCTreeViewData, WEBLib.TMSFNCCustomControl,\r\n WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCCustomTreeView, WEBLib.TMSFNCBitmapContainer,\r\n WEBLib.TMSFNCGraphicsTypes, WEBLib.TMSFNCEdit, WEBLib.TMSFNCToolBar, WEBLib.Controls, WEBLib.ExtCtrls\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n ,UITypes, Types, Generics.Collections\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ,Contnrs\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 2; // Release nr.\r\n BLD_VER = 2; // Build nr.\r\n CLP_FMT = '#TableView#';\r\n SWIPEOFFSET = 30;\r\n\r\n // version history\r\n // v1.0.0.0 : first release\r\n // v1.0.1.0 : New : SwipeBounceGesture property to toggle bounce effect when swiping up/down on the list\r\n // : Fixed : Issue with lookup category\r\n // v1.0.2.0 : New : KeyboardEscapeMode property to clear or stop filtering\r\n // : Improved : CategoryID can be a number that doesn't start from 0\r\n // v1.0.2.1 : Fixed : Issue with badge drawing\r\n // v1.0.2.2 : Fixed : Issue with showing filter button\r\n\r\ntype\r\n TTMSFNCTableViewItemAccessory = (tviaNone, tviaDetail, tviaProgress, tviaButton, tviaBadge, tviaCustom);\r\n TTMSFNCTableViewItemAccessories = set of TTMSFNCTableViewItemAccessory;\r\n\r\nconst\r\n ClickAccessories = [tviaButton, tviaCustom];\r\n\r\ntype\r\n TTMSFNCCustomTableView = class;\r\n TTMSFNCTableViewInteraction = class;\r\n\r\n TTMSFNCTableViewCategory = class;\r\n\r\n TTMSFNCTableViewItemCheckType = (tvictNone, tvictCheckBox, tvictRadioButton);\r\n\r\n TTMSFNCTableViewItem = class(TCollectionItem)\r\n private\r\n FRow: Integer;\r\n FTag: NativeInt;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FTableView: TTMSFNCCustomTableView;\r\n FText: String;\r\n FDBKey: String;\r\n FChecked: Boolean;\r\n FDataBoolean: Boolean;\r\n FWordWrapping: Boolean;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FSelectedTextColor: TTMSFNCGraphicsColor;\r\n FTextColor: TTMSFNCGraphicsColor;\r\n FDisabledTextColor: TTMSFNCGraphicsColor;\r\n FEnabled: Boolean;\r\n FBitmapName: string;\r\n FBitmap: TTMSFNCBitmap;\r\n FHeight: Double;\r\n FDataPointer: Pointer;\r\n FHTMLTemplateItems: TStringList;\r\n FVisible: Boolean;\r\n FCategoryID: integer;\r\n FDetailControl: TControl;\r\n FAccessory: TTMSFNCTableViewItemAccessory;\r\n FAccessoryWidth: Single;\r\n FAccessoryProgress: Single;\r\n FAccessoryHeight: Single;\r\n FAccessoryText: String;\r\n FCheckType: TTMSFNCTableViewItemCheckType;\r\n FAccessoryFontColor: TTMSFNCGraphicsColor;\r\n FAccessoryBorderColor: TTMSFNCGraphicsColor;\r\n FAccessoryColor: TTMSFNCGraphicsColor;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FEnableMoreOptions: Boolean;\r\n FTitleTrimming: TTMSFNCGraphicsTextTrimming;\r\n FTitleHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTitle: String;\r\n FDisabledTitleColor: TTMSFNCGraphicsColor;\r\n FTitleWordWrapping: Boolean;\r\n FSelectedTitleColor: TTMSFNCGraphicsColor;\r\n FTitleColor: TTMSFNCGraphicsColor;\r\n FTitleVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTitleExpanded: Boolean;\r\n procedure SetText(const Value: String);\r\n procedure SetHeight(const Value: Double);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetSelectedTextColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTextColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetDisabledTextColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetEnabled(const Value: Boolean);\r\n procedure SetBitmapName(const Value: string);\r\n procedure SetBitmap(const Value: TTMSFNCBitmap);\r\n procedure SetChecked(const Value: Boolean);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n function GetStrippedHTMLText: string;\r\n function IsHeightStored: Boolean;\r\n procedure SetHTMLTemplateItems(const Value: TStringList);\r\n procedure SetVisible(const Value: Boolean);\r\n procedure SetCategoryID(const Value: integer);\r\n procedure SetDetailControl(const Value: TControl);\r\n procedure SetAccessory(const Value: TTMSFNCTableViewItemAccessory);\r\n function IsAccessoryWidthStored: Boolean;\r\n procedure SetAccessoryWidth(const Value: Single);\r\n function IsAccessoryProgressStored: Boolean;\r\n procedure SetAccessoryProgress(const Value: Single);\r\n function IsAccessoryHeightStored: Boolean;\r\n procedure SetAccessoryHeight(const Value: Single);\r\n procedure SetAccessoryText(const Value: String);\r\n procedure SetCheckType(const Value: TTMSFNCTableViewItemCheckType);\r\n procedure SetAccessoryBorderColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetAccessoryColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetAccessoryFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetDisabledTitleColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetSelectedTitleColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTitle(const Value: String);\r\n procedure SetTitleColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTitleHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTitleTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetTitleVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTitleWordWrapping(const Value: Boolean);\r\n procedure SetTitleExpanded(const Value: Boolean);\r\n protected\r\n procedure UpdateItem;\r\n procedure Changed(Sender: TObject);\r\n procedure BitmapChanged(Sender: TObject);\r\n procedure TemplateItemsChanged(Sender: TObject);\r\n public\r\n function GetTableView: TTMSFNCCustomTableView;\r\n function GetText: string;\r\n function GetTitle: string;\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n function SaveToString(ATextOnly: Boolean = True): String; virtual;\r\n function IsSelected: Boolean; virtual;\r\n procedure LoadFromString(AString: String); virtual;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure AssignData(Source: TPersistent); virtual;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer;\r\n property StrippedHTMLText: String read GetStrippedHTMLText;\r\n property TableView: TTMSFNCCustomTableView read GetTableView;\r\n procedure ShowDetailControl; virtual;\r\n procedure HideDetailControl; virtual;\r\n property Title: String read FTitle write SetTitle;\r\n property TitleExpanded: Boolean read FTitleExpanded write SetTitleExpanded default True;\r\n property TitleWordWrapping: Boolean read FTitleWordWrapping write SetTitleWordWrapping default True;\r\n property TitleTrimming: TTMSFNCGraphicsTextTrimming read FTitleTrimming write SetTitleTrimming default gttNone;\r\n property TitleHorizontalTextAlign: TTMSFNCGraphicsTextAlign read FTitleHorizontalTextAlign write SetTitleHorizontalTextAlign default gtaLeading;\r\n property TitleVerticalTextAlign: TTMSFNCGraphicsTextAlign read FTitleVerticalTextAlign write SetTitleVerticalTextAlign default gtaLeading;\r\n property TitleColor: TTMSFNCGraphicsColor read FTitleColor write SetTitleColor default gcBlack;\r\n property SelectedTitleColor: TTMSFNCGraphicsColor read FSelectedTitleColor write SetSelectedTitleColor default gcWhite;\r\n property DisabledTitleColor: TTMSFNCGraphicsColor read FDisabledTitleColor write SetDisabledTitleColor default gcSilver;\r\n published\r\n property Checked: Boolean read FChecked write SetChecked default False;\r\n property DetailControl: TControl read FDetailControl write SetDetailControl;\r\n property Text: String read FText write SetText;\r\n property HTMLTemplateItems: TStringList read FHTMLTemplateItems write SetHTMLTemplateItems;\r\n property Bitmap: TTMSFNCBitmap read FBitmap write SetBitmap;\r\n property BitmapName: string read FBitmapName write SetBitmapName;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping default True;\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming default gttNone;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaLeading;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaLeading;\r\n property TextColor: TTMSFNCGraphicsColor read FTextColor write SetTextColor default gcBlack;\r\n property SelectedTextColor: TTMSFNCGraphicsColor read FSelectedTextColor write SetSelectedTextColor default gcWhite;\r\n property DisabledTextColor: TTMSFNCGraphicsColor read FDisabledTextColor write SetDisabledTextColor default gcSilver;\r\n property Enabled: Boolean read FEnabled write SetEnabled default True;\r\n property Height: Double read FHeight write SetHeight stored IsHeightStored nodefault;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property CategoryID: integer read FCategoryID write SetCategoryID default -1;\r\n property Tag: NativeInt read FTag write FTag default 0;\r\n property AccessoryWidth: Single read FAccessoryWidth write SetAccessoryWidth stored IsAccessoryWidthStored nodefault;\r\n property AccessoryHeight: Single read FAccessoryHeight write SetAccessoryHeight stored IsAccessoryHeightStored nodefault;\r\n property Accessory: TTMSFNCTableViewItemAccessory read FAccessory write SetAccessory default tviaNone;\r\n property AccessoryProgress: Single read FAccessoryProgress write SetAccessoryProgress stored IsAccessoryProgressStored nodefault;\r\n property AccessoryText: String read FAccessoryText write SetAccessoryText;\r\n property AccessoryColor: TTMSFNCGraphicsColor read FAccessoryColor write SetAccessoryColor default gcNull;\r\n property AccessoryBorderColor: TTMSFNCGraphicsColor read FAccessoryBorderColor write SetAccessoryBorderColor default gcNull;\r\n property AccessoryFontColor: TTMSFNCGraphicsColor read FAccessoryFontColor write SetAccessoryFontColor default gcNull;\r\n property CheckType: TTMSFNCTableViewItemCheckType read FCheckType write SetCheckType default tvictNone;\r\n property EnableMoreOptions: Boolean read FEnableMoreOptions write FEnableMoreOptions default True;\r\n end;\r\n\r\n TTMSFNCTableViewItemsSortMode = (tvismAscending, tvismDescending);\r\n TTMSFNCTableViewItemsSortKind = (tviskNone, tviskAscending, tviskDescending);\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTableViewItems = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTableViewItems = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n function GetItem(Index: Integer): TTMSFNCTableViewItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTableViewItem);\r\n protected\r\n function GetItemClass: TCollectionItemClass; virtual;\r\n function Compare(AItem1, AItem2: TTMSFNCTableViewItem; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewItemsSortMode = tvismAscending): Integer; virtual;\r\n procedure QuickSort(L, R: Integer; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewItemsSortMode = tvismAscending); virtual;\r\n public\r\n function TableView: TTMSFNCCustomTableView;\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n function Add: TTMSFNCTableViewItem; virtual;\r\n function Insert(Index: Integer): TTMSFNCTableViewItem;\r\n procedure Clear; virtual;\r\n procedure Sort(ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewItemsSortMode = tvismAscending);\r\n property Items[Index: Integer]: TTMSFNCTableViewItem read GetItem write SetItem; default;\r\n end;\r\n\r\n TTMSFNCTableViewLookup = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCTableViewInteraction;\r\n function GetAutoSelect: Boolean;\r\n function GetCaseSensitive: Boolean;\r\n function GetEnabled: Boolean;\r\n function GetIncremental: Boolean;\r\n procedure SetAutoSelect(const Value: Boolean);\r\n procedure SetCaseSensitive(const Value: Boolean);\r\n procedure SetEnabled(const Value: Boolean);\r\n procedure SetIncremental(const Value: Boolean);\r\n public\r\n constructor Create(AOwner: TTMSFNCTableViewInteraction);\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property CaseSensitive: Boolean read GetCaseSensitive write SetCaseSensitive default False;\r\n property Enabled: Boolean read GetEnabled write SetEnabled default True;\r\n property Incremental: Boolean read GetIncremental write SetIncremental default True;\r\n property AutoSelect: Boolean read GetAutoSelect write SetAutoSelect default True;\r\n end;\r\n\r\n TTMSFNCTableViewFiltering = class(TPersistent)\r\n private\r\n FOwner: TTMSFNCTableViewInteraction;\r\n function GetDropDownHeight: integer;\r\n function GetDropDownWidth: integer;\r\n function GetEnabled: Boolean;\r\n procedure SetDropDownHeight(const Value: integer);\r\n procedure SetDropDownWidth(const Value: integer);\r\n procedure SetEnabled(const Value: Boolean);\r\n public\r\n constructor Create(AOwner: TTMSFNCTableViewInteraction);\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Enabled: Boolean read GetEnabled write SetEnabled default False;\r\n property DropDownWidth: integer read GetDropDownWidth write SetDropDownWidth default 100;\r\n property DropDownHeight: integer read GetDropDownHeight write SetDropDownHeight default 120;\r\n end;\r\n\r\n TTMSFNCTableViewMouseEditMode = (tvmemDoubleClick, tvmemSingleClick, tvmemSingleClickOnSelectedItem);\r\n TTMSFNCTableViewClipboardMode = (tvcmNone, tvcmTextOnly, tvcmFull);\r\n TTMSFNCTableViewDragDropMode = (tvdmNone, tvdmMove, tvdmCopy);\r\n TTMSFNCTableViewSorting = (tvcsNone, tvcsNormal, tvcsNormalCaseSensitive);\r\n TTMSFNCTableViewShowDetailMode = (tvdtNone, tvdtAfterSelectItem);\r\n TTMSFNCTableViewKeyboardEscapeMode = (tvkeNone, tvkeClearEdit, tvkeStopFilter);\r\n\r\n TTMSFNCTableViewInteraction = class(TPersistent)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FLookup: TTMSFNCTableViewLookup;\r\n FFiltering: TTMSFNCTableViewFiltering;\r\n FShowDetailMode: TTMSFNCTableViewShowDetailMode;\r\n FShowEditButton: Boolean;\r\n FShowFilterButton: Boolean;\r\n FAccessoryClickDetection: TTMSFNCTableViewItemAccessories;\r\n FLongPressToEdit: Boolean;\r\n FSwipeToShowMoreOptions: Boolean;\r\n FSwipeBounceGesture: Boolean;\r\n FKeyboardEscapeMode: TTMSFNCTableViewKeyboardEscapeMode;\r\n function GetMultiSelect: Boolean;\r\n procedure SetMultiSelect(const Value: Boolean);\r\n function GetClipboardMode: TTMSFNCTableViewClipboardMode;\r\n function GetDragDropMode: TTMSFNCTableViewDragDropMode;\r\n function GetReorder: Boolean;\r\n function GetTouchScrolling: Boolean;\r\n procedure SetDragDropMode(const Value: TTMSFNCTableViewDragDropMode);\r\n procedure SetFiltering(const Value: TTMSFNCTableViewFiltering);\r\n procedure SetLookup(const Value: TTMSFNCTableViewLookup);\r\n procedure SetReorder(const Value: Boolean);\r\n procedure SetTouchScrolling(const Value: Boolean);\r\n procedure SetClipboardMode(const Value: TTMSFNCTableViewClipboardMode);\r\n function GetSorting: TTMSFNCTableViewSorting;\r\n procedure SetSorting(const Value: TTMSFNCTableViewSorting);\r\n procedure SetShowDetailMode(const Value: TTMSFNCTableViewShowDetailMode);\r\n procedure SetShowEditButton(const Value: Boolean);\r\n procedure SetShowFilterButton(const Value: Boolean);\r\n procedure SetAccessoryClickDetection(\r\n const Value: TTMSFNCTableViewItemAccessories);\r\n function GetAutoOpenURL: Boolean;\r\n procedure SetAutoOpenURL(const Value: Boolean);\r\n protected\r\n property ClipboardMode: TTMSFNCTableViewClipboardMode read GetClipboardMode write SetClipboardMode default tvcmNone;\r\n property Reorder: Boolean read GetReorder write SetReorder default False;\r\n property Sorting: TTMSFNCTableViewSorting read GetSorting write SetSorting default tvcsNone;\r\n property Filtering: TTMSFNCTableViewFiltering read FFiltering write SetFiltering;\r\n property Lookup: TTMSFNCTableViewLookup read FLookup write SetLookup;\r\n public\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n property DragDropMode: TTMSFNCTableViewDragDropMode read GetDragDropMode write SetDragDropMode default tvdmNone;\r\n published\r\n property AutoOpenURL: Boolean read GetAutoOpenURL write SetAutoOpenURL default True;\r\n property MultiSelect: Boolean read GetMultiSelect write SetMultiSelect default False;\r\n property TouchScrolling: Boolean read GetTouchScrolling write SetTouchScrolling default True;\r\n property ShowDetailMode: TTMSFNCTableViewShowDetailMode read FShowDetailMode write SetShowDetailMode default tvdtAfterSelectItem;\r\n property ShowEditButton: Boolean read FShowEditButton write SetShowEditButton default False;\r\n property ShowFilterButton: Boolean read FShowFilterButton write SetShowFilterButton default False;\r\n property SwipeBounceGesture: Boolean read FSwipeBounceGesture write FSwipeBounceGesture default True;\r\n property AccessoryClickDetection: TTMSFNCTableViewItemAccessories read FAccessoryClickDetection write SetAccessoryClickDetection default ClickAccessories;\r\n property SwipeToShowMoreOptions: Boolean read FSwipeToShowMoreOptions write FSwipeToShowMoreOptions default True;\r\n property LongPressToEdit: Boolean read FLongPressToEdit write FLongPressToEdit default true;\r\n property KeyboardEscapeMode: TTMSFNCTableViewKeyboardEscapeMode read FKeyboardEscapeMode write FKeyboardEscapeMode default tvkeStopFilter;\r\n end;\r\n\r\n TTMSFNCTableViewItemHeightMode = (tvhmFixed, tvhmVariable);\r\n\r\n TTMSFNCTableViewItemAppearance = class(TPersistent)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FHTMLTemplate: string;\r\n FAccessoryDetailBitmaps: TTMSFNCScaledBitmaps;\r\n FAccessoryFont: TTMSFNCGraphicsFont;\r\n FAccessoryStroke: TTMSFNCGraphicsStroke;\r\n FAccessoryFill: TTMSFNCGraphicsFill;\r\n FHeight: Double;\r\n function GetFont: TTMSFNCGraphicsFont;\r\n function GetSelectedFill: TTMSFNCGraphicsFill;\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetSelectedFill(const Value: TTMSFNCGraphicsFill);\r\n function GetSelectedStroke: TTMSFNCGraphicsStroke;\r\n procedure SetSelectedStroke(const Value: TTMSFNCGraphicsStroke);\r\n function GetDisabledFill: TTMSFNCGraphicsFill;\r\n function GetDisabledStroke: TTMSFNCGraphicsStroke;\r\n function GetFill: TTMSFNCGraphicsFill;\r\n function GetStroke: TTMSFNCGraphicsStroke;\r\n procedure SetDisabledFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetDisabledStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n function GetHeightMode: TTMSFNCTableViewItemHeightMode;\r\n procedure SetHeightMode(const Value: TTMSFNCTableViewItemHeightMode);\r\n function GetFixedHeight: Double;\r\n procedure SetFixedHeight(const Value: Double);\r\n procedure SetHTMLTemplate(const Value: string);\r\n procedure SetAccessoryDetailBitmaps(const Value: TTMSFNCScaledBitmaps);\r\n procedure SetAccessoryFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetAccessoryFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetAccessoryStroke(const Value: TTMSFNCGraphicsStroke);\r\n function IsHeightStored: Boolean;\r\n procedure SetHeight(const Value: Double);\r\n function GetShowFocus: Boolean;\r\n procedure SetShowFocus(const Value: Boolean);\r\n protected\r\n procedure DoAccessoryDetailBitmapsChanged(Sender: TObject);\r\n procedure FontChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n function GetOwner: TPersistent; override;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n destructor Destroy; override;\r\n published\r\n property Font: TTMSFNCGraphicsFont read GetFont write SetFont;\r\n property Fill: TTMSFNCGraphicsFill read GetFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read GetStroke write SetStroke;\r\n property SelectedFill: TTMSFNCGraphicsFill read GetSelectedFill write SetSelectedFill;\r\n property SelectedStroke: TTMSFNCGraphicsStroke read GetSelectedStroke write SetSelectedStroke;\r\n property DisabledFill: TTMSFNCGraphicsFill read GetDisabledFill write SetDisabledFill;\r\n property DisabledStroke: TTMSFNCGraphicsStroke read GetDisabledStroke write SetDisabledStroke;\r\n property HeightMode: TTMSFNCTableViewItemHeightMode read GetHeightMode write SetHeightMode default tvhmVariable;\r\n property FixedHeight: Double read GetFixedHeight write SetFixedHeight;\r\n property Height: Double read FHeight write SetHeight stored IsHeightStored nodefault;\r\n property HTMLTemplate: string read FHTMLTemplate write SetHTMLTemplate;\r\n property AccessoryDetailBitmaps: TTMSFNCScaledBitmaps read FAccessoryDetailBitmaps write SetAccessoryDetailBitmaps;\r\n property AccessoryFont: TTMSFNCGraphicsFont read FAccessoryFont write SetAccessoryFont;\r\n property AccessoryStroke: TTMSFNCGraphicsStroke read FAccessoryStroke write SetAccessoryStroke;\r\n property AccessoryFill: TTMSFNCGraphicsFill read FAccessoryFill write SetAccessoryFill;\r\n property ShowFocus: Boolean read GetShowFocus write SetShowFocus default True;\r\n end;\r\n\r\n TTMSFNCTableViewCategoryAppearance = class(TPersistent)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FHeight: Single;\r\n function GetFont: TTMSFNCGraphicsFont;\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n function GetFill: TTMSFNCGraphicsFill;\r\n function GetStroke: TTMSFNCGraphicsStroke;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n function IsHeightStored: Boolean;\r\n procedure SetHeight(const Value: Single);\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n destructor Destroy; override;\r\n published\r\n property Font: TTMSFNCGraphicsFont read GetFont write SetFont;\r\n property Fill: TTMSFNCGraphicsFill read GetFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read GetStroke write SetStroke;\r\n property Height: Single read FHeight write SetHeight stored IsHeightStored nodefault;\r\n end;\r\n\r\n TTMSFNCTableViewMoreOptionAppearance = class(TPersistent)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FFont: TTMSFNCGraphicsFont;\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n protected\r\n procedure FontChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n destructor Destroy; override;\r\n published\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n end;\r\n\r\n TTMSFNCTableViewIntegerArray = array of Integer;\r\n\r\n TTMSFNCTableViewHeaderFooter = class(TPersistent)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FText: String;\r\n FWordWrapping: Boolean;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n function GetVisible: Boolean;\r\n procedure SetVisible(const Value: Boolean);\r\n procedure SetText(const Value: String);\r\n function GetFill: TTMSFNCGraphicsFill;\r\n function GetHeight: Single;\r\n function GetStroke: TTMSFNCGraphicsStroke;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetHeight(const Value: Single);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n function GetFont: TTMSFNCGraphicsFont;\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n function GetSortIndicatorColor: TTMSFNCGraphicsColor;\r\n procedure SetSortIndicatorColor(const Value: TTMSFNCGraphicsColor);\r\n protected\r\n property Visible: Boolean read GetVisible write SetVisible default True;\r\n property Text: String read FText write SetText;\r\n property Fill: TTMSFNCGraphicsFill read GetFill write SetFill;\r\n property Font: TTMSFNCGraphicsFont read GetFont write SetFont;\r\n property Stroke: TTMSFNCGraphicsStroke read GetStroke write SetStroke;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaCenter;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaCenter;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping default False;\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming default gttNone;\r\n property Height: Single read GetHeight write SetHeight;\r\n property SortIndicatorColor: TTMSFNCGraphicsColor read GetSortIndicatorColor write SetSortIndicatorColor default TTMSFNCTreeViewColorSelection;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(ATableView: TTMSFNCCustomTableView); virtual;\r\n end;\r\n\r\n TTMSFNCTableViewHeader = class(TTMSFNCTableViewHeaderFooter)\r\n published\r\n property Visible;\r\n property Text;\r\n property Fill;\r\n property Font;\r\n property Stroke;\r\n property HorizontalTextAlign;\r\n property VerticalTextAlign;\r\n property WordWrapping;\r\n property Trimming;\r\n property Height;\r\n end;\r\n\r\n TTMSFNCTableViewFooter = class(TTMSFNCTableViewHeaderFooter)\r\n published\r\n property Visible;\r\n property Text;\r\n property Fill;\r\n property Font;\r\n property Stroke;\r\n property HorizontalTextAlign;\r\n property VerticalTextAlign;\r\n property WordWrapping;\r\n property Trimming;\r\n property Height;\r\n end;\r\n\r\n TTMSFNCTableViewCopyItems = class(TTMSFNCTableViewItems);\r\n\r\n TTMSFNCTableViewBeforeDrawSortIndicatorEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ASortIndex: Integer; ASortKind: TTMSFNCTableViewItemsSortKind; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTableViewAfterDrawSortIndicatorEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ASortIndex: Integer; ASortKind: TTMSFNCTableViewItemsSortKind) of object;\r\n TTMSFNCTableViewNeedFilterDropDownDataEvent = procedure(Sender: TObject; AValues: TStrings) of object;\r\n TTMSFNCTableViewItemAnchorClickEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; AAnchor: String) of object;\r\n TTMSFNCTableViewBeforeReorderItemEvent = procedure(Sender: TObject; AFromItem, AToItem: TTMSFNCTableViewItem; var ACanReorder: Boolean) of object;\r\n TTMSFNCTableViewAfterReorderItemEvent = procedure(Sender: TObject; AFromItem, AToItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewBeforeDropItemEvent = procedure(Sender: TObject; AFromItem, AToItem: TTMSFNCTableViewItem; var ACanDrop: Boolean) of object;\r\n TTMSFNCTableViewAfterDropItemEvent = procedure(Sender: TObject; AFromItem, AToItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewBeforeCopyToClipboardEvent = procedure(Sender: TObject; var ACanCopy: Boolean) of object;\r\n TTMSFNCTableViewBeforeCutToClipboardEvent = procedure(Sender: TObject; var ACanCut: Boolean) of object;\r\n TTMSFNCTableViewBeforePasteFromClipboardEvent = procedure(Sender: TObject; var ACanPaste: Boolean) of object;\r\n TTMSFNCTableViewAfterCopyToClipboardEvent = procedure(Sender: TObject) of object;\r\n TTMSFNCTableViewAfterCutToClipboardEvent = procedure(Sender: TObject) of object;\r\n TTMSFNCTableViewAfterPasteFromClipboardEvent = procedure(Sender: TObject) of object;\r\n TTMSFNCTableViewBeforeDrawItemTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AText: String; var AAllow: Boolean) of object;\r\n TTMSFNCTableViewAfterDrawItemTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AText: String) of object;\r\n TTMSFNCTableViewBeforeDrawItemTitleEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ATitle: String; var AAllow: Boolean) of object;\r\n TTMSFNCTableViewAfterDrawItemTitleEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ATitle: String) of object;\r\n TTMSFNCTableViewItemSelectedEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewItemUnSelectedEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewItemSelectionChangedEvent = TNotifyEvent;\r\n TTMSFNCTableViewItemClickEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewItemCheckChangedEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewScrollEvent = procedure(Sender: TObject; APosition: Single) of object;\r\n TTMSFNCTableViewGetItemHeightEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; var AHeight: Double) of object;\r\n TTMSFNCTableViewBeforeDrawItemIconEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AIcon:TTMSFNCBitmap; var AAllow: Boolean) of object;\r\n TTMSFNCTableViewAfterDrawItemIconEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AIcon:TTMSFNCBitmap) of object;\r\n TTMSFNCTableViewBeforeDrawItemCheckEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ACheck: TTMSFNCBitmap; var AAllow: Boolean) of object;\r\n TTMSFNCTableViewAfterDrawItemCheckEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ACheck: TTMSFNCBitmap) of object;\r\n TTMSFNCTableViewBeforeDrawItemEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTableViewAfterDrawItemEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewItemCompareEvent = procedure(Sender: TObject; Item1, Item2: TTMSFNCTableViewItem; var ACompareResult: Integer) of object;\r\n TTMSFNCTableViewCategoryCompareEvent = procedure(Sender: TObject; Category1, Category2: TTMSFNCTableViewCategory; var ACompareResult: Integer) of object;\r\n TTMSFNCTableViewFilterSelectEvent = procedure(Sender: TObject; var ACondition: string) of object;\r\n TTMSFNCTableViewGetHTMLTemplateValueEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; AName: string; var AValue: string) of object;\r\n TTMSFNCTableViewGetHTMLTemplateEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; var AHTMLTemplate: string) of object;\r\n\r\n TTMSFNCTableViewFilterOperation = (tvfoSHORT, tvfoNONE, tvfoAND, tvfoXOR, tvfoOR);\r\n\r\n TTMSFNCTableViewFilterData = class(TCollectionItem)\r\n private\r\n FCondition: string;\r\n FCaseSensitive: Boolean;\r\n FSuffix: string;\r\n FPrefix: string;\r\n FOperation: TTMSFNCTableViewFilterOperation;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Condition:string read FCondition write FCondition;\r\n property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive default True;\r\n property Prefix: string read FPrefix write FPrefix;\r\n property Suffix: string read FSuffix write FSuffix;\r\n property Operation: TTMSFNCTableViewFilterOperation read FOperation write FOperation;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTableViewFilter = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTableViewFilter = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FOwner: TTMSFNCCustomTableView;\r\n function GetItem(Index: Integer): TTMSFNCTableViewFilterData;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTableViewFilterData);\r\n public\r\n constructor Create(AOwner: TTMSFNCCustomTableView);\r\n function Add: TTMSFNCTableViewFilterData;\r\n function Insert(index: Integer): TTMSFNCTableViewFilterData;\r\n property Items[Index: Integer]: TTMSFNCTableViewFilterData read GetItem write SetItem; default;\r\n end;\r\n\r\n TTMSFNCTableViewBeforeApplyFilterEvent = procedure(Sender: TObject; AFilter: TTMSFNCTableViewFilterData; var AAllow: Boolean) of object;\r\n TTMSFNCTableViewAfterApplyFilterEvent = procedure(Sender: TObject; AFilter: TTMSFNCTableViewFilterData) of object;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTreeViewTableViewFloatingNodes = class(TObjectList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTreeViewVirtualNode read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTreeViewTableViewFloatingNodes = class(TObjectList);\r\n {$ENDIF}\r\n\r\n TTMSFNCTableViewMoreOption = class;\r\n\r\n TTMSFNCTreeViewTableView = class(TTMSFNCTreeView)\r\n private\r\n FDownMoreOption: TTMSFNCTableViewMoreOption;\r\n FMoreOffset, FMoreOffsetTo: Double;\r\n FMoreOffsetItem: TTMSFNCTableViewItem;\r\n FDownAction: Boolean;\r\n FDownCount: Integer;\r\n FDownTimer: Boolean;\r\n FDownX, FDownY: Single;\r\n FAnimTimer: TTimer;\r\n FAnimateMoreOptions, FAnimateMoreOptionsClose: Boolean;\r\n FMouseDownOnAccessory: Boolean;\r\n FAnimMarqueeSwitch: Boolean;\r\n FAnimMarqueeStartAngle, FAnimMarqueeSweepAngle, FAnimShiftAngle: Single;\r\n FManualProgressSweepAngle, FManualProgressStartAngle: Single;\r\n FReloadActive: Boolean;\r\n FMouseDownOnLookupBar: Boolean;\r\n FTableView: TTMSFNCCustomTableView;\r\n FFloatingNodes: TTMSFNCTreeViewTableViewFloatingNodes;\r\n protected\r\n procedure AnimateTimerChanged(Sender: TObject);\r\n procedure OffsetNodeRects(ANode: TTMSFNCTreeViewVirtualNode; AX, AY: Single; var ARect: TRectF); override;\r\n procedure CustomizeNodeCache({%H-}AGraphics: TTMSFNCGraphics; {%H-}AStartY: Single); override;\r\n procedure CustomizeScrollPosition({%H-}ANode: TTMSFNCTreeViewVirtualNode; var {%H-}APosition, {%H-}ATopPosition: Double); override;\r\n procedure DrawLookupBar(AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n procedure DrawReload(AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n procedure HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleKeyDown(var Key: Word; Shift: TShiftState); override;\r\n procedure ProcessLookup(X, Y: Single; DoLookup: Boolean = True); virtual;\r\n procedure StartReload; override;\r\n procedure UpdateCheckState({%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}AChecked: Boolean); override;\r\n function ScrollLimitation: Boolean; override;\r\n function NeedsReload(AVerticalOffset: Single): Boolean; override;\r\n function GetReloadOffset: Single; override;\r\n function GetNodesRect: TRectF; override;\r\n function GetContentRect: TRectF; override;\r\n function GetCategoryAtXY(X, Y: Single): Integer; virtual;\r\n function GetLookupBarRect: TRectF; virtual;\r\n function GetContentClipRect: TRectF; override;\r\n function CanApplyVerticalOffset: Boolean; override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n function GetTotalColumnNodeWidth: Double; override;\r\n function GetColumnWidth(AColumn: Integer): Double; override;\r\n property CustomScrollBars;\r\n end;\r\n\r\n TTMSFNCTableViewDisplayItemKind = (tvikNone, tvikItem, tvikCategory);\r\n\r\n TTMSFNCTableViewDisplayItem = record\r\n Kind: TTMSFNCTableViewDisplayItemKind;\r\n Item: TTMSFNCTableViewItem;\r\n CategoryID: Integer;\r\n Row: Integer;\r\n Text: string;\r\n {$IFDEF LCLLIB}\r\n class operator = (z1, z2 : TTMSFNCTableViewDisplayItem) b : boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTableViewDisplayList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTableViewDisplayItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTableViewDisplayItem);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTableViewDisplayItem read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTableViewDisplayList = class(TList);\r\n {$ENDIF}\r\n\r\n TTMSFNCTableViewLookupBarDisplayItem = record\r\n Rect: TRectF;\r\n Text: string;\r\n Active: Boolean;\r\n {$IFDEF LCLLIB}\r\n class operator = (z1, z2 : TTMSFNCTableViewLookupBarDisplayItem) b : boolean;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTableViewLookupBarDisplayList = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTableViewLookupBarDisplayItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTableViewLookupBarDisplayItem);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTableViewLookupBarDisplayItem read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTableViewLookupBarDisplayList = class(TList);\r\n {$ENDIF}\r\n\r\n TTMSFNCTableViewLookupBarPosition = (tvlbpLeft, tvlbpRight);\r\n\r\n TTMSFNCTableViewLookupBar = class(TPersistent)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FVisible: Boolean;\r\n FFont: TTMSFNCGraphicsFont;\r\n FAutoLookup: Boolean;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FWidth: Single;\r\n FPosition: TTMSFNCTableViewLookupBarPosition;\r\n FDownFill: TTMSFNCGraphicsFill;\r\n FDownStroke: TTMSFNCGraphicsStroke;\r\n FInActiveFont: TTMSFNCGraphicsFont;\r\n procedure SetVisible(const Value: Boolean);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetAutoLookup(const Value: Boolean);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n function IsWidthStored: Boolean;\r\n procedure SetPosition(const Value: TTMSFNCTableViewLookupBarPosition);\r\n procedure SetWidth(const Value: Single);\r\n procedure SetDownFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetDownStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetInActiveFont(const Value: TTMSFNCGraphicsFont);\r\n protected\r\n procedure FontChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n public\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Width: Single read FWidth write SetWidth stored IsWidthStored nodefault;\r\n property Position: TTMSFNCTableViewLookupBarPosition read FPosition write SetPosition default tvlbpRight;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property InActiveFont: TTMSFNCGraphicsFont read FInActiveFont write SetInActiveFont;\r\n property AutoLookup: Boolean read FAutoLookup write SetAutoLookup default True;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property DownFill: TTMSFNCGraphicsFill read FDownFill write SetDownFill;\r\n property DownStroke: TTMSFNCGraphicsStroke read FDownStroke write SetDownStroke;\r\n end;\r\n\r\n TTMSFNCTableViewReloadProgressMode = (tvrpmMarquee, tvrpmMarqueeAlternate, tvrpmManual);\r\n\r\n TTMSFNCTableViewReload = class(TPersistent)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FOffset: Single;\r\n FEnabled: Boolean;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FSize: Single;\r\n FProgressMode: TTMSFNCTableViewReloadProgressMode;\r\n function IsOffsetStored: Boolean;\r\n procedure SetOffset(const Value: Single);\r\n procedure SetEnabled(const Value: Boolean);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n function IsSizeStored: Boolean;\r\n procedure SetSize(const Value: Single);\r\n procedure SetProgressMode(const Value: TTMSFNCTableViewReloadProgressMode);\r\n public\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Offset: Single read FOffset write SetOffset stored IsOffsetStored nodefault;\r\n property Enabled: Boolean read FEnabled write SetEnabled default False;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property Size: Single read FSize write SetSize stored IsSizeStored nodefault;\r\n property ProgressMode: TTMSFNCTableViewReloadProgressMode read FProgressMode write SetProgressMode default tvrpmMarquee;\r\n end;\r\n\r\n TTMSFNCTableViewCategory = class(TCollectionItem)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FText: String;\r\n FID: integer;\r\n FLookupText: String;\r\n FDataPointer: Pointer;\r\n FDataBoolean: Boolean;\r\n FDBKey: String;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n procedure SetText(const Value: String);\r\n procedure SetId(const Value: integer);\r\n procedure SetLookupText(const Value: String);\r\n function GetStrippedHTMLText: String;\r\n protected\r\n procedure Changed;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n property StrippedHTMLText: String read GetStrippedHTMLText;\r\n published\r\n property Text: String read FText write SetText;\r\n property LookupText: String read FLookupText write SetLookupText;\r\n property Id: integer read FID write SetId;\r\n end;\r\n\r\n TTMSFNCTableViewCategoriesSortMode = (tvcsmAscending, tvcsmDescending);\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTableViewCategories = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTableViewCategories = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: Integer): TTMSFNCTableViewCategory;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTableViewCategory);\r\n protected\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n function Compare(AItem1, AItem2: TTMSFNCTableViewCategory; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewCategoriesSortMode = tvcsmAscending): Integer; virtual;\r\n procedure QuickSort(L, R: Integer; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewCategoriesSortMode = tvcsmAscending); virtual;\r\n public\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n property Items[Index: Integer]: TTMSFNCTableViewCategory read GetItem write SetItem; default;\r\n function ItemById(id: integer): TTMSFNCTableViewCategory;\r\n function ItemIndexById(id: integer): integer;\r\n function Add: TTMSFNCTableViewCategory;\r\n function Insert(Index: Integer): TTMSFNCTableViewCategory;\r\n procedure Delete(Index: Integer);\r\n procedure Sort(ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewCategoriesSortMode = tvcsmAscending);\r\n procedure Clear;\r\n end;\r\n\r\n TTMSFNCTableViewMoreOption = class(TCollectionItem)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FText: String;\r\n FDataPointer: Pointer;\r\n FDataBoolean: Boolean;\r\n FDBKey: String;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FWidth: Single;\r\n FColor: TTMSFNCGraphicsColor;\r\n FFontColor: TTMSFNCGraphicsColor;\r\n FBorderColor: TTMSFNCGraphicsColor;\r\n procedure SetText(const Value: String);\r\n function GetStrippedHTMLText: String;\r\n function IsWidthStored: Boolean;\r\n procedure SetWidth(const Value: Single);\r\n procedure SetColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetFontColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetBorderColor(const Value: TTMSFNCGraphicsColor);\r\n protected\r\n procedure Changed;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n property StrippedHTMLText: String read GetStrippedHTMLText;\r\n published\r\n property Text: String read FText write SetText;\r\n property Width: Single read FWidth write SetWidth stored IsWidthStored nodefault;\r\n property Color: TTMSFNCGraphicsColor read FColor write SetColor default gcNull;\r\n property BorderColor: TTMSFNCGraphicsColor read FBorderColor write SetBorderColor default gcNull;\r\n property FontColor: TTMSFNCGraphicsColor read FFontColor write SetFontColor default gcNull;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTableViewMoreOptions = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTableViewMoreOptions = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n FOnChange: TNotifyEvent;\r\n function GetItem(Index: Integer): TTMSFNCTableViewMoreOption;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTableViewMoreOption);\r\n protected\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n public\r\n constructor Create(ATableView: TTMSFNCCustomTableView);\r\n property Items[Index: Integer]: TTMSFNCTableViewMoreOption read GetItem write SetItem; default;\r\n function ItemById(id: integer): TTMSFNCTableViewMoreOption;\r\n function ItemIndexById(id: integer): integer;\r\n function Add: TTMSFNCTableViewMoreOption;\r\n function Insert(Index: Integer): TTMSFNCTableViewMoreOption;\r\n procedure Delete(Index: Integer);\r\n procedure Clear;\r\n end;\r\n\r\n TTMSFNCTableViewCategoryType = (tvctNone, tvctAlphaBetic, tvctAlphaNumericFirst, tvctAlphaNumericLast, tvctCustom);\r\n\r\n TTMSFNCTableViewLookupCategoryEvent = procedure(Sender: TObject; ACharacter: String; ACharacterID: Integer) of object;\r\n TTMSFNCTableViewDrawItemCustomAccessoryEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem) of object;\r\n TTMSFNCTableViewItemMoreOptionClickEvent = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; AMoreOption: TTMSFNCTableViewMoreOption) of object;\r\n TTMSFNCTableViewBeforeDrawItemMoreOptionEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AMoreOption: TTMSFNCTableViewMoreOption; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCTableViewAfterDrawItemMoreOptionEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AMoreOption: TTMSFNCTableViewMoreOption) of object;\r\n TTMSFNCTableViewBeforeItemShowDetailControl = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; ADetailControl: TControl; var AAllow: Boolean) of object;\r\n TTMSFNCTableViewBeforeItemHideDetailControl = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; ADetailControl: TControl; var AAllow: Boolean) of object;\r\n TTMSFNCTableViewItemShowDetailControl = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; ADetailControl: TControl) of object;\r\n TTMSFNCTableViewItemHideDetailControl = procedure(Sender: TObject; AItem: TTMSFNCTableViewItem; ADetailControl: TControl) of object;\r\n\r\n TTMSFNCTableViewItemArray = array of TTMSFNCTableViewItem;\r\n TTMSFNCTableViewCheckedItems = TTMSFNCTableViewItemArray;\r\n TTMSFNCTableViewSelectedItems = TTMSFNCTableViewItemArray;\r\n\r\n TTMSFNCTableViewCustomChar = class\r\n private\r\n FID: Integer;\r\n FActive: Boolean;\r\n public\r\n constructor Create(AID: Integer; AActive: Boolean);\r\n property ID: Integer read FID write FID;\r\n property Active: Boolean read FActive write FActive;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCTableViewCustomCharList = class(TObjectList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCTableViewCustomChar;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCTableViewCustomChar);\r\n public\r\n property Items[Index: Integer]: TTMSFNCTableViewCustomChar read GetItem write SetItem; default;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCTableViewCustomCharList = class(TObjectList)\r\n public\r\n {$ENDIF}\r\n procedure ActivateID(AID: Integer);\r\n function IsIDActive(AID: Integer): Boolean;\r\n end;\r\n\r\n TTMSFNCTableViewEdit = class(TTMSFNCEdit)\r\n private\r\n FTableView: TTMSFNCCustomTableView;\r\n protected\r\n {$IFDEF FMXLIB}\r\n procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure KeyDown(var Key: Word; Shift: TShiftState); override;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFDEF FNCLIB}\r\n TTMSFNCCustomTableView = class(TTMSFNCCustomControl, ITMSFNCBitmapContainer)\r\n {$ENDIF}\r\n {$IFNDEF FNCLIB}\r\n TTMSFNCCustomTableView = class(TTMSFNCCustomControl)\r\n {$ENDIF}\r\n private\r\n FFilterActive: Boolean;\r\n FEditMode: Boolean;\r\n FDoneButton, FEditButton, FBackButton, FFilterButton: TTMSFNCToolBarButton;\r\n FEdit: TTMSFNCTableViewEdit;\r\n FActiveAccessoryItem: TTMSFNCTableViewItem;\r\n FDetailControlTimer: TTimer;\r\n FDetailControlOffset: Double;\r\n FShowDetailControl: Boolean;\r\n FActiveDetailControl: TControl;\r\n FActiveDetailItem: TTMSFNCTableViewItem;\r\n FCustomChar: TTMSFNCTableViewCustomCharList;\r\n FLookupBarDisplayList: TTMSFNCTableViewLookupBarDisplayList;\r\n FFilterApplied: Boolean;\r\n FUpdateCount: Integer;\r\n FDisplayList: TTMSFNCTableViewDisplayList;\r\n FCategoryList: TTMSFNCTableViewDisplayList;\r\n FSaveSelectedItem: Integer;\r\n FCopyItems: TTMSFNCTableViewCopyItems;\r\n FAccepted: Boolean;\r\n FItems: TTMSFNCTableViewItems;\r\n FTreeView: TTMSFNCTreeViewTableView;\r\n FColumn: TTMSFNCTreeViewColumn;\r\n FDefaultItem: TTMSFNCTableViewItem;\r\n FItemAppearance: TTMSFNCTableViewItemAppearance;\r\n FOnItemSelected: TTMSFNCTableViewItemSelectedEvent;\r\n FInteraction: TTMSFNCTableViewInteraction;\r\n FHeader: TTMSFNCTableViewHeader;\r\n FFooter: TTMSFNCTableViewFooter;\r\n FOnItemAnchorClick: TTMSFNCTableViewItemAnchorClickEvent;\r\n FOnAfterCutToClipboard: TTMSFNCTableViewAfterCutToClipboardEvent;\r\n FOnBeforePasteFromClipboard: TTMSFNCTableViewBeforePasteFromClipboardEvent;\r\n FOnAfterReorderItem: TTMSFNCTableViewAfterReorderItemEvent;\r\n FOnBeforeDropItem: TTMSFNCTableViewBeforeDropItemEvent;\r\n FOnBeforeDrawItemText: TTMSFNCTableViewBeforeDrawItemTextEvent;\r\n FOnVScroll: TTMSFNCTableViewScrollEvent;\r\n FOnBeforeCopyToClipboard: TTMSFNCTableViewBeforeCopyToClipboardEvent;\r\n FOnItemDblClick: TTMSFNCTableViewItemClickEvent;\r\n FOnBeforeDrawItemCheck: TTMSFNCTableViewBeforeDrawItemCheckEvent;\r\n FOnAfterDrawItemIcon: TTMSFNCTableViewAfterDrawItemIconEvent;\r\n FOnBeforeDrawItem: TTMSFNCTableViewBeforeDrawItemEvent;\r\n FOnAfterPasteFromClipboard: TTMSFNCTableViewAfterPasteFromClipboardEvent;\r\n FOnItemClick: TTMSFNCTableViewItemClickEvent;\r\n FOnAfterDropItem: TTMSFNCTableViewAfterDropItemEvent;\r\n FOnAfterDrawItemText: TTMSFNCTableViewAfterDrawItemTextEvent;\r\n FOnItemCompare: TTMSFNCTableViewItemCompareEvent;\r\n FOnBeforeCutToClipboard: TTMSFNCTableViewBeforeCutToClipboardEvent;\r\n FOnBeforeReorderItem: TTMSFNCTableViewBeforeReorderItemEvent;\r\n FOnNeedFilterDropDownData: TTMSFNCTableViewNeedFilterDropDownDataEvent;\r\n FOnAfterCopyToClipboard: TTMSFNCTableViewAfterCopyToClipboardEvent;\r\n FOnFilterSelect: TTMSFNCTableViewFilterSelectEvent;\r\n FOnAfterDrawItemCheck: TTMSFNCTableViewAfterDrawItemCheckEvent;\r\n FOnAfterDrawItem: TTMSFNCTableViewAfterDrawItemEvent;\r\n FOnBeforeDrawItemIcon: TTMSFNCTableViewBeforeDrawItemIconEvent;\r\n FFilter: TTMSFNCTableViewFilter;\r\n FOnBeforeDrawSortIndicator: TTMSFNCTableViewBeforeDrawSortIndicatorEvent;\r\n FOnAfterDrawSortIndicator: TTMSFNCTableViewAfterDrawSortIndicatorEvent;\r\n FOnGetHTMLTemplateValue: TTMSFNCTableViewGetHTMLTemplateValueEvent;\r\n FOnGetHTMLTemplate: TTMSFNCTableViewGetHTMLTemplateEvent;\r\n FCategoryType: TTMSFNCTableViewCategoryType;\r\n FCategories: TTMSFNCTableViewCategories;\r\n FOnCategoryCompare: TTMSFNCTableViewCategoryCompareEvent;\r\n FLookupBar: TTMSFNCTableViewLookupBar;\r\n FOnManualLookupCategory: TTMSFNCTableViewLookupCategoryEvent;\r\n FOnCategoryClick: TTMSFNCTableViewLookupCategoryEvent;\r\n FReload: TTMSFNCTableViewReload;\r\n FOnStopReload: TNotifyEvent;\r\n FOnStartReload: TNotifyEvent;\r\n FOnDrawItemCustomAccessory: TTMSFNCTableViewDrawItemCustomAccessoryEvent;\r\n FOnItemAccessoryClick: TTMSFNCTableViewItemClickEvent;\r\n FCategoryAppearance: TTMSFNCTableViewCategoryAppearance;\r\n FOnItemCheckChanged: TTMSFNCTableViewItemCheckChangedEvent;\r\n FOnAfterApplyFilter: TTMSFNCTableViewAfterApplyFilterEvent;\r\n FOnBeforeApplyFilter: TTMSFNCTableViewBeforeApplyFilterEvent;\r\n FMoreOptions: TTMSFNCTableViewMoreOptions;\r\n FMoreOptionAppearance: TTMSFNCTableViewMoreOptionAppearance;\r\n FOnItemMoreOptionClick: TTMSFNCTableViewItemMoreOptionClickEvent;\r\n FOnAfterDrawItemMoreOption: TTMSFNCTableViewAfterDrawItemMoreOptionEvent;\r\n FOnBeforeDrawItemMoreOption: TTMSFNCTableViewBeforeDrawItemMoreOptionEvent;\r\n FOnItemShowDetailControl: TTMSFNCTableViewItemShowDetailControl;\r\n FOnItemHideDetailControl: TTMSFNCTableViewItemHideDetailControl;\r\n FOnBeforeItemShowDetailControl: TTMSFNCTableViewBeforeItemShowDetailControl;\r\n FOnBeforeItemHideDetailControl: TTMSFNCTableViewBeforeItemHideDetailControl;\r\n FOnItemSelectionChanged: TTMSFNCTableViewItemSelectionChangedEvent;\r\n FOnItemUnSelected: TTMSFNCTableViewItemUnSelectedEvent;\r\n FOnAfterDrawItemTitle: TTMSFNCTableViewAfterDrawItemTitleEvent;\r\n FOnBeforeDrawItemTitle: TTMSFNCTableViewBeforeDrawItemTitleEvent;\r\n procedure SetItems(const Value: TTMSFNCTableViewItems);\r\n procedure SetDefaultItem(const Value: TTMSFNCTableViewItem);\r\n procedure SetItemAppearance(const Value: TTMSFNCTableViewItemAppearance);\r\n function GetItemIndex: Integer;\r\n procedure SetItemIndex(const Value: Integer);\r\n procedure SetInteraction(const Value: TTMSFNCTableViewInteraction);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n procedure SetHeader(const Value: TTMSFNCTableViewHeader);\r\n procedure SetFooter(const Value: TTMSFNCTableViewFooter);\r\n function GetSelectedItem: TTMSFNCTableViewItem;\r\n procedure SetSelectedItem(const Value: TTMSFNCTableViewItem);\r\n function GetSelItem(AIndex: Integer): TTMSFNCTableViewItem;\r\n function GetVerticalScrollBarVisible: Boolean;\r\n procedure SetVerticalScrollBarVisible(const Value: Boolean);\r\n function GetFill: TTMSFNCGraphicsFill;\r\n function GetStroke: TTMSFNCGraphicsStroke;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetCategoryType(const Value: TTMSFNCTableViewCategoryType);\r\n procedure SetCategories(const Value: TTMSFNCTableViewCategories);\r\n procedure SetLookupBar(const Value: TTMSFNCTableViewLookupBar);\r\n procedure SetReload(const Value: TTMSFNCTableViewReload);\r\n procedure SetCategoryAppearance(\r\n const Value: TTMSFNCTableViewCategoryAppearance);\r\n function GetChecked(AItemIndex: Integer): Boolean;\r\n function GetCheckedItem(AItem: TTMSFNCTableViewItem): Boolean;\r\n procedure SetChecked(AItemIndex: Integer; const Value: Boolean);\r\n procedure SetCheckedItem(AItem: TTMSFNCTableViewItem;\r\n const Value: Boolean);\r\n procedure SetMoreOptions(const Value: TTMSFNCTableViewMoreOptions);\r\n procedure SetMoreOptionAppearance(\r\n const Value: TTMSFNCTableViewMoreOptionAppearance);\r\n protected\r\n function GetVersion: string; override;\r\n function GetItemsRect: TRectF; virtual;\r\n function CreateTreeView: TTMSFNCTreeViewTableView; virtual;\r\n function CreateItems: TTMSFNCTableViewItems; virtual;\r\n function GetRowForItemIndex(AItemIndex: Integer): Integer; virtual;\r\n function GetDisplayCategoryIndex(AIndex: Integer): Integer; virtual;\r\n function GetDisplayItemIndex(AIndex: Integer): Integer; virtual;\r\n function GetNextDisplayCategoryIndex(AIndex: Integer): Integer; virtual;\r\n function GetItemIndexForNode(ANode: TTMSFNCTreeViewVirtualNode): Integer; virtual;\r\n function GetItemForNode(ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTableViewItem; virtual;\r\n function GetNodeForItemIndex(AItemIndex: Integer): TTMSFNCTreeViewVirtualNode; virtual;\r\n function HTMLReplace(AValue: string; AItem: TTMSFNCTableViewItem): string;\r\n function ItemFromDifferentCategory(AItem1, AItem2: TTMSFNCTableViewItem): Boolean; virtual;\r\n function MatchFilter(AItem: TTMSFNCTableViewItem): Boolean; virtual;\r\n function GetCharacterForItem(AItem: TTMSFNCTableViewItem): String; virtual;\r\n function GetCharacter(Idx: Integer): String; virtual;\r\n function GetCharacterCount: Integer; virtual;\r\n function FindCategoryWithCharacter(ACategory: String): TTMSFNCTableViewDisplayItem;\r\n function FindCategoryWithCharacterID(ACategoryID: Integer): TTMSFNCTableViewDisplayItem;\r\n function FindFirstItemWithCategory(ACategory: String): TTMSFNCTableViewItem; virtual;\r\n function FindFirstItemWithCategoryID(ACategoryID: Integer): TTMSFNCTableViewItem; virtual;\r\n function GetMoreOptionsSize: Single; virtual;\r\n procedure DoEnter; override;\r\n procedure DoItemMoreOptionClick(AItem: TTMSFNCTableViewItem; AMoreOption: TTMSFNCTableViewMoreOption); virtual;\r\n procedure DoFilterButtonClicked(Sender: TObject); virtual;\r\n procedure DoEditButtonClicked(Sender: TObject); virtual;\r\n procedure DoEditChange(Sender: TObject); virtual;\r\n procedure DoBeforeApplyFilter(AFilter: TTMSFNCTableViewFilterData; AAllow: Boolean); virtual;\r\n procedure DoAfterApplyFilter(AFilter: TTMSFNCTableViewFilterData); virtual;\r\n procedure DoDoneButtonClicked(Sender: TObject); virtual;\r\n procedure DoBackButtonClicked(Sender: TObject); virtual;\r\n procedure DoItemAccessoryClick(AItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoDetailControlTimer(Sender: TObject);\r\n procedure DoItemShowDetailControl(AItem: TTMSFNCTableViewItem; ADetailControl: TControl); virtual;\r\n procedure DoItemHideDetailControl(AItem: TTMSFNCTableViewItem; ADetailControl: TControl); virtual;\r\n procedure DoBeforeItemShowDetailControl(AItem: TTMSFNCTableViewItem; ADetailControl: TControl; var AAllow: Boolean); virtual;\r\n procedure DoBeforeItemHideDetailControl(AItem: TTMSFNCTableViewItem; ADetailControl: TControl; var AAllow: Boolean); virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure DoStartReload; virtual;\r\n procedure DoStopReload; virtual;\r\n procedure ScrollToCategoryId(ACategoryID: Integer); virtual;\r\n procedure ScrollToCategoryCharacter(ACharacter: String); virtual;\r\n procedure RegisterRuntimeClasses; override;\r\n procedure ApplyStyle; override;\r\n procedure UpdateControlAfterResize; override;\r\n procedure ResetToDefaultStyle; override;\r\n procedure SetAdaptToStyle(const Value: Boolean); override;\r\n procedure UpdateTableView(ADisplayOnly: Boolean = False); virtual;\r\n procedure CustomizeButtons; virtual;\r\n procedure SelectAllCheckedItems; virtual;\r\n procedure UnSelectAllItems; virtual;\r\n procedure CalculateItems; virtual;\r\n procedure CalculateLookupBar; virtual;\r\n procedure AddDisplayCategory(AItem: TTMSFNCTableViewItem); virtual;\r\n procedure AddDisplayItem(AItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoGetNodeHeight(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var AHeight: Double); virtual;\r\n procedure DoGetNodeIcon(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}ALarge: Boolean; var AIcon: TTMSFNCBitmap); virtual;\r\n procedure DoGetNodeSides(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ASides: TTMSFNCGraphicsSides); virtual;\r\n procedure DoGetColumnText(Sender: TObject; {%H-}AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AText: String); virtual;\r\n procedure DoGetColumnTrimming(Sender: TObject; {%H-}AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var ATrimming: TTMSFNCGraphicsTextTrimming); virtual;\r\n procedure DoGetColumnWordWrapping(Sender: TObject; {%H-}AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AWordWrapping: Boolean); virtual;\r\n procedure DoGetColumnHorizontalTextAlign(Sender: TObject; {%H-}AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetColumnVerticalTextAlign(Sender: TObject; {%H-}AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AVerticalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoIsNodeChecked(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AIsChecked: Boolean); virtual;\r\n procedure DoGetNodeCheckType(Sender: TObject; {%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ACheckType: TTMSFNCTreeViewNodeCheckType); virtual;\r\n procedure DoAfterCheckNode(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer); virtual;\r\n procedure DoAfterUnCheckNode(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer); virtual;\r\n procedure DoItemCheckChanged(AItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoGetNumberOfNodes(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer); virtual;\r\n procedure DoGetHTMLTemplateValue(AItem: TTMSFNCTableViewItem; AName: string; var AValue: string); virtual;\r\n procedure DoGetHTMLTemplate(AItem: TTMSFNCTableViewItem; var AHTMLTemplate: string); virtual;\r\n procedure DoIsNodeExtended(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AExtended: Boolean); virtual;\r\n procedure DoGetNodeText(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}AMode: TTMSFNCTreeViewNodeTextMode; var AText: String); virtual;\r\n procedure DoGetNodeTitle(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; {%H-}AMode: TTMSFNCTreeViewNodeTextMode; var ATitle: String); virtual;\r\n procedure DoGetNodeTitleExpanded(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var AExpanded: Boolean); virtual;\r\n procedure DoGetNodeTrimming(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ATrimming: TTMSFNCGraphicsTextTrimming); virtual;\r\n procedure DoGetNodeTitleTrimming(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ATrimming: TTMSFNCGraphicsTextTrimming); virtual;\r\n procedure DrawBadge(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoDrawNodeExtra(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoDrawItemCustomAccessory(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoBeforeDrawItemMoreOption(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AMoreOption: TTMSFNCTableViewMoreOption; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawItemMoreOption(AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AMoreOption: TTMSFNCTableViewMoreOption); virtual;\r\n procedure DoGetNodeWordWrapping(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var AWordWrapping: Boolean); virtual;\r\n procedure DoGetNodeTitleWordWrapping(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var AWordWrapping: Boolean); virtual;\r\n procedure DoGetNodeExtraSize(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var AExtraSize: Single); virtual;\r\n procedure DoGetNodeTitleHorizontalTextAlign(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeTitleVerticalTextAlign(Sender: TObject; {%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AVerticalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeHorizontalTextAlign(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeVerticalTextAlign(Sender: TObject; {%H-}ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var {%H-}AVerticalTextAlign: TTMSFNCGraphicsTextAlign); virtual;\r\n procedure DoGetNodeTextColor(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ATextColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeSelectedTextColor(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ASelectedTextColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeDisabledTextColor(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ADisabledTextColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeTitleColor(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ATitleColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeSelectedTitleColor(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ASelectedTitleColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoGetNodeDisabledTitleColor(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; var ADisabledTitleColor: TTMSFNCGraphicsColor); virtual;\r\n procedure DoIsNodeEnabled(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; var AEnabled: Boolean); virtual;\r\n procedure DoAfterSelectNode(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoAfterUnSelectNode(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoNeedFilterDropDownData(Sender: TObject; {%H-}AColumn: Integer; AValues: TStrings); virtual;\r\n procedure DoFilterSelect(Sender: TObject; {%H-}AColumn: integer; var ACondition: string); virtual;\r\n procedure DoBeforeDrawSortIndicator(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawSortIndicator(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ASortIndex: Integer; ASortKind: TTMSFNCTreeViewNodesSortKind); virtual;\r\n procedure DoBeforeDrawNode(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawNode(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoItemCompare(AItem1, AItem2: TTMSFNCTableViewItem; var ACompareResult: Integer); virtual;\r\n procedure DoCategoryCompare(ACategory1, ACategory2: TTMSFNCTableViewCategory; var ACompareResult: Integer); virtual;\r\n procedure DoBeforeDrawNodeText(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeText(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AText: String); virtual;\r\n procedure DoBeforeDrawNodeTitle(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ATitle: String; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeTitle(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ATitle: String); virtual;\r\n procedure DoBeforeDrawNodeIcon(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AIcon: TTMSFNCBitmap; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeIcon(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; AIcon: TTMSFNCBitmap); virtual;\r\n procedure DoBeforeDrawNodeCheck(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawNodeCheck(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; {%H-}AColumn: Integer; ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap); virtual;\r\n procedure DoNodeAnchorClick(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; {%H-}AColumn: Integer; AAnchor: String); virtual;\r\n procedure DoNodeClick(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoNodeDblClick(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoVScroll(Sender: TObject; APosition: Single); virtual;\r\n procedure DoBeforeCutToClipboard(Sender: TObject; var ACanCut: Boolean); virtual;\r\n procedure DoBeforeCopyToClipboard(Sender: TObject; var ACanCopy: Boolean); virtual;\r\n procedure DoBeforePasteFromClipboard(Sender: TObject; var ACanPaste: Boolean); virtual;\r\n procedure DoAfterCutToClipboard(Sender: TObject); virtual;\r\n procedure DoAfterCopyToClipboard(Sender: TObject); virtual;\r\n procedure DoAfterPasteFromClipboard(Sender: TObject); virtual;\r\n procedure DoBeforeReorderItem(AFromItem, AToItem: TTMSFNCTableViewItem; var ACanReorder: Boolean); virtual;\r\n procedure DoAfterReorderItem(AFromItem, AToItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoBeforeDropItem(AFromItem, AToItem: TTMSFNCTableViewItem; var ACanDrop: Boolean); virtual;\r\n procedure DoAfterDropItem(AFromItem, AToItem: TTMSFNCTableViewItem); virtual;\r\n procedure CustomizeTreeView({%H-}ATreeView: TTMSFNCTreeView); virtual;\r\n procedure DoCustomDragOver(Sender: TObject; Source: TObject; {%H-}Point: TPointF; var Accept: Boolean); virtual;\r\n procedure DoCustomDragDrop(Sender: TObject; Source: TObject; {%H-}Point: TPointF); virtual;\r\n procedure DragItemMove({%H-}AFromItem, {%H-}AToItem: TTMSFNCTableViewItem); virtual;\r\n procedure DragItemAdd({%H-}ANewItem, {%H-}AAssignItem, {%H-}AInsertItem: TTMSFNCTableViewItem); virtual;\r\n procedure DragItemDelete({%H-}AItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoCustomReorder(Sender: TObject; AFromNode, AToNode: TTMSFNCTreeViewVirtualNode); virtual;\r\n procedure DoCopyToClipboard(Sender: TObject); virtual;\r\n procedure DoCutToClipboard(Sender: TObject); virtual;\r\n procedure DoPasteFromClipboard(Sender: TObject); virtual;\r\n procedure DoColumnSort(Sender: TObject; {%H-}AColumn: Integer; ASortMode: TTMSFNCTreeViewNodesSortMode); virtual;\r\n procedure DoLookup(Sender: TObject; ALookupString: String); virtual;\r\n procedure UpdateActiveDetailControl; virtual;\r\n property Fill: TTMSFNCGraphicsFill read GetFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read GetStroke write SetStroke;\r\n property Version: String read GetVersion;\r\n property TreeView: TTMSFNCTreeViewTableView read FTreeView;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n property Items: TTMSFNCTableViewItems read FItems write SetItems;\r\n property DefaultItem: TTMSFNCTableViewItem read FDefaultItem write SetDefaultItem;\r\n property ItemAppearance: TTMSFNCTableViewItemAppearance read FItemAppearance write SetItemAppearance;\r\n property CategoryAppearance: TTMSFNCTableViewCategoryAppearance read FCategoryAppearance write SetCategoryAppearance;\r\n property MoreOptionAppearance: TTMSFNCTableViewMoreOptionAppearance read FMoreOptionAppearance write SetMoreOptionAppearance;\r\n property Interaction: TTMSFNCTableViewInteraction read FInteraction write SetInteraction;\r\n property ItemIndex: Integer read GetItemIndex write SetItemIndex default -1;\r\n property LookupBar: TTMSFNCTableViewLookupBar read FLookupBar write SetLookupBar;\r\n property Reload: TTMSFNCTableViewReload read FReload write SetReload;\r\n property Categories: TTMSFNCTableViewCategories read FCategories write SetCategories;\r\n property MoreOptions: TTMSFNCTableViewMoreOptions read FMoreOptions write SetMoreOptions;\r\n property CategoryType: TTMSFNCTableViewCategoryType read FCategoryType write SetCategoryType default tvctNone;\r\n property OnItemSelected: TTMSFNCTableViewItemSelectedEvent read FOnItemSelected write FOnItemSelected;\r\n property OnItemUnSelected: TTMSFNCTableViewItemUnSelectedEvent read FOnItemUnSelected write FOnItemUnSelected;\r\n property OnItemSelectionChanged: TTMSFNCTableViewItemSelectionChangedEvent read FOnItemSelectionChanged write FOnItemSelectionChanged;\r\n property Header: TTMSFNCTableViewHeader read FHeader write SetHeader;\r\n property Footer: TTMSFNCTableViewFooter read FFooter write SetFooter;\r\n property VerticalScrollBarVisible: Boolean read GetVerticalScrollBarVisible write SetVerticalScrollBarVisible default False;\r\n property OnNeedFilterDropDownData: TTMSFNCTableViewNeedFilterDropDownDataEvent read FOnNeedFilterDropDownData write FOnNeedFilterDropDownData;\r\n property OnFilterSelect: TTMSFNCTableViewFilterSelectEvent read FOnFilterSelect write FOnFilterSelect;\r\n property OnBeforeDrawItem: TTMSFNCTableViewBeforeDrawItemEvent read FOnBeforeDrawItem write FOnBeforeDrawItem;\r\n property OnAfterDrawItem: TTMSFNCTableViewAfterDrawItemEvent read FOnAfterDrawItem write FOnAfterDrawItem;\r\n property OnBeforeDrawItemMoreOption: TTMSFNCTableViewBeforeDrawItemMoreOptionEvent read FOnBeforeDrawItemMoreOption write FOnBeforeDrawItemMoreOption;\r\n property OnAfterDrawItemMoreOption: TTMSFNCTableViewAfterDrawItemMoreOptionEvent read FOnAfterDrawItemMoreOption write FOnAfterDrawItemMoreOption;\r\n property OnItemCompare: TTMSFNCTableViewItemCompareEvent read FOnItemCompare write FOnItemCompare;\r\n property OnCategoryCompare: TTMSFNCTableViewCategoryCompareEvent read FOnCategoryCompare write FOnCategoryCompare;\r\n property OnAfterDrawItemIcon: TTMSFNCTableViewAfterDrawItemIconEvent read FOnAfterDrawItemIcon write FOnAfterDrawItemIcon;\r\n property OnBeforeDrawItemIcon: TTMSFNCTableViewBeforeDrawItemIconEvent read FOnBeforeDrawItemIcon write FOnBeforeDrawItemIcon;\r\n property OnAfterDrawItemCheck: TTMSFNCTableViewAfterDrawItemCheckEvent read FOnAfterDrawItemCheck write FOnAfterDrawItemCheck;\r\n property OnBeforeDrawItemCheck: TTMSFNCTableViewBeforeDrawItemCheckEvent read FOnBeforeDrawItemCheck write FOnBeforeDrawItemCheck;\r\n property OnBeforeDrawItemText: TTMSFNCTableViewBeforeDrawItemTextEvent read FOnBeforeDrawItemText write FOnBeforeDrawItemText;\r\n property OnAfterDrawItemText: TTMSFNCTableViewAfterDrawItemTextEvent read FOnAfterDrawItemText write FOnAfterDrawItemText;\r\n property OnBeforeDrawItemTitle: TTMSFNCTableViewBeforeDrawItemTitleEvent read FOnBeforeDrawItemTitle write FOnBeforeDrawItemTitle;\r\n property OnAfterDrawItemTitle: TTMSFNCTableViewAfterDrawItemTitleEvent read FOnAfterDrawItemTitle write FOnAfterDrawItemTitle;\r\n property OnAfterDrawSortIndicator: TTMSFNCTableViewAfterDrawSortIndicatorEvent read FOnAfterDrawSortIndicator write FOnAfterDrawSortIndicator;\r\n property OnBeforeDrawSortIndicator: TTMSFNCTableViewBeforeDrawSortIndicatorEvent read FOnBeforeDrawSortIndicator write FOnBeforeDrawSortIndicator;\r\n property OnItemAnchorClick: TTMSFNCTableViewItemAnchorClickEvent read FOnItemAnchorClick write FOnItemAnchorClick;\r\n property OnItemClick: TTMSFNCTableViewItemClickEvent read FOnItemClick write FOnItemClick;\r\n property OnItemDblClick: TTMSFNCTableViewItemClickEvent read FOnItemDblClick write FOnItemDblClick;\r\n property OnVScroll: TTMSFNCTableViewScrollEvent read FOnVScroll write FOnVScroll;\r\n property OnBeforeReorderItem: TTMSFNCTableViewBeforeReorderItemEvent read FOnBeforeReorderItem write FOnBeforeReorderItem;\r\n property OnAfterReorderItem: TTMSFNCTableViewAfterReorderItemEvent read FOnAfterReorderItem write FOnAfterReorderItem;\r\n property OnBeforeDropItem: TTMSFNCTableViewBeforeDropItemEvent read FOnBeforeDropItem write FOnBeforeDropItem;\r\n property OnAfterDropItem: TTMSFNCTableViewAfterDropItemEvent read FOnAfterDropItem write FOnAfterDropItem;\r\n property OnBeforeCutToClipboard: TTMSFNCTableViewBeforeCutToClipboardEvent read FOnBeforeCutToClipboard write FOnBeforeCutToClipboard;\r\n property OnBeforeCopyToClipboard: TTMSFNCTableViewBeforeCopyToClipboardEvent read FOnBeforeCopyToClipboard write FOnBeforeCopyToClipboard;\r\n property OnBeforePasteFromClipboard: TTMSFNCTableViewBeforePasteFromClipboardEvent read FOnBeforePasteFromClipboard write FOnBeforePasteFromClipboard;\r\n property OnAfterCutToClipboard: TTMSFNCTableViewAfterCutToClipboardEvent read FOnAfterCutToClipboard write FOnAfterCutToClipboard;\r\n property OnAfterCopyToClipboard: TTMSFNCTableViewAfterCopyToClipboardEvent read FOnAfterCopyToClipboard write FOnAfterCopyToClipboard;\r\n property OnAfterPasteFromClipboard: TTMSFNCTableViewAfterPasteFromClipboardEvent read FOnAfterPasteFromClipboard write FOnAfterPasteFromClipboard;\r\n property OnGetHTMLTemplateValue: TTMSFNCTableViewGetHTMLTemplateValueEvent read FOnGetHTMLTemplateValue write FOnGetHTMLTemplateValue;\r\n property OnGetHTMLTemplate: TTMSFNCTableViewGetHTMLTemplateEvent read FOnGetHTMLTemplate write FOnGetHTMLTemplate;\r\n property OnManualLookupCategory: TTMSFNCTableViewLookupCategoryEvent read FOnManualLookupCategory write FOnManualLookupCategory;\r\n property OnCategoryClick: TTMSFNCTableViewLookupCategoryEvent read FOnCategoryClick write FOnCategoryClick;\r\n property OnStartReload: TNotifyEvent read FOnStartReload write FOnStartReload;\r\n property OnStopReload: TNotifyEvent read FOnStopReload write FOnStopReload;\r\n property OnDrawItemCustomAccessory: TTMSFNCTableViewDrawItemCustomAccessoryEvent read FOnDrawItemCustomAccessory write FOnDrawItemCustomAccessory;\r\n property OnItemAccessoryClick: TTMSFNCTableViewItemClickEvent read FOnItemAccessoryClick write FOnItemAccessoryClick;\r\n property OnItemCheckChanged: TTMSFNCTableViewItemCheckChangedEvent read FOnItemCheckChanged write FOnItemCheckChanged;\r\n property OnBeforeApplyFilter: TTMSFNCTableViewBeforeApplyFilterEvent read FOnBeforeApplyFilter write FOnBeforeApplyFilter;\r\n property OnAfterApplyFilter: TTMSFNCTableViewAfterApplyFilterEvent read FOnAfterApplyFilter write FOnAfterApplyFilter;\r\n property OnItemMoreOptionClick: TTMSFNCTableViewItemMoreOptionClickEvent read FOnItemMoreOptionClick write FOnItemMoreOptionClick;\r\n property OnBeforeItemShowDetailControl: TTMSFNCTableViewBeforeItemShowDetailControl read FOnBeforeItemShowDetailControl write FOnBeforeItemShowDetailControl;\r\n property OnBeforeItemHideDetailControl: TTMSFNCTableViewBeforeItemHideDetailControl read FOnBeforeItemHideDetailControl write FOnBeforeItemHideDetailControl;\r\n property OnItemShowDetailControl: TTMSFNCTableViewItemShowDetailControl read FOnItemShowDetailControl write FOnItemShowDetailControl;\r\n property OnItemHideDetailControl: TTMSFNCTableViewItemHideDetailControl read FOnItemHideDetailControl write FOnItemHideDetailControl;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function AddItem(AText: string = ''): TTMSFNCTableViewItem; virtual;\r\n function XYToAccessoryItem(X, Y: Single): TTMSFNCTableViewItem; virtual;\r\n function XYToItem(X, Y: Single): TTMSFNCTableViewItem; virtual;\r\n function XYToMoreOption(X, Y: Single): TTMSFNCTableViewMoreOption; virtual;\r\n function XYToItemIndex(X, Y: Single): Integer; virtual;\r\n function SelectedItemCount: Integer; virtual;\r\n function GetItemsFromClipboard: TTMSFNCTableViewCopyItems; virtual;\r\n function LookupItem(ALookupString: String; ACaseSensitive: Boolean = False; AAutoSelect: Boolean = False): TTMSFNCTableViewItem; virtual;\r\n function IsItemSelectable(AItem: TTMSFNCTableViewItem): Boolean; virtual;\r\n function ReloadProgress: Single; virtual;\r\n function DetailControlActive: Boolean; virtual;\r\n function GetCheckedItems: TTMSFNCTableViewCheckedItems; virtual;\r\n function GetSelectedItems: TTMSFNCTableViewSelectedItems; virtual;\r\n procedure LookupCustomCategory(ACategoryID: Integer); virtual;\r\n procedure LookupCategory(ACategory: String);virtual;\r\n procedure RemoveItem(AItem: TTMSFNCTableViewItem); virtual;\r\n procedure EnableInteraction; virtual;\r\n procedure DisableInteraction; virtual;\r\n procedure BeginUpdate; override;\r\n procedure EndUpdate; override;\r\n procedure InitSample; virtual;\r\n procedure ScrollToItem(AItemIndex: Integer); virtual;\r\n procedure ClearSelection; virtual;\r\n procedure UnCheckAllItems; virtual;\r\n procedure StartFiltering; virtual;\r\n procedure StopFiltering; virtual;\r\n procedure StartEditMode; virtual;\r\n procedure ShowMoreOptions(AItem: TTMSFNCTableViewItem); virtual;\r\n procedure HideMoreOptions; virtual;\r\n procedure StopEditMode; virtual;\r\n procedure ToggleEditMode; virtual;\r\n procedure CheckAllItems; virtual;\r\n procedure SelectItem(AItemIndex: Integer); virtual;\r\n procedure SelectItems(AItemIndexes: TTMSFNCTableViewIntegerArray); virtual;\r\n procedure LoadFromStrings(AStrings: TStrings); virtual;\r\n {$IFNDEF WEBLIB}\r\n procedure LoadFromFile(AFileName: string); virtual;\r\n procedure LoadFromStream(AStream: TStream); virtual;\r\n procedure SaveToStrings(AStrings: TStrings); virtual;\r\n procedure SaveToFile(AFileName: string; ATextOnly: Boolean = True); virtual;\r\n procedure SaveToStream(AStream: TStream; ATextOnly: Boolean = True); virtual;\r\n {$ENDIF}\r\n procedure CutToClipboard(ATextOnly: Boolean = False); virtual;\r\n procedure CopyToClipboard(ATextOnly: Boolean = False); virtual;\r\n procedure PasteFromClipboard; virtual;\r\n procedure Sort(ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewItemsSortMode = tvismAscending); {$IFDEF FMXLIB}reintroduce;{$ENDIF} virtual;\r\n procedure ApplyFilter; virtual;\r\n procedure RemoveFilter; virtual;\r\n procedure RemoveFilters; virtual;\r\n procedure StopReload; virtual;\r\n procedure StartReload; virtual;\r\n procedure ShowDetailControl(AItemIndex: Integer = -1); virtual;\r\n procedure HideDetailControl; virtual;\r\n procedure UpdateReloadProgress(AProgress: Single; AAutoStopReload: Boolean = True); virtual;\r\n property Filter: TTMSFNCTableViewFilter read FFilter;\r\n property SelectedItem: TTMSFNCTableViewItem read GetSelectedItem write SetSelectedItem;\r\n property SelectedItems[AIndex: Integer]: TTMSFNCTableViewItem read GetSelItem;\r\n property CheckedItem[AItem: TTMSFNCTableViewItem]: Boolean read GetCheckedItem write SetCheckedItem;\r\n property Checked[AItemIndex: Integer]: Boolean read GetChecked write SetChecked;\r\n property DoneButton: TTMSFNCToolBarButton read FDoneButton;\r\n property EditButton: TTMSFNCToolBarButton read FEditButton;\r\n property FilterButton: TTMSFNCToolBarButton read FFilterButton;\r\n property BackButton: TTMSFNCToolBarButton read FBackButton;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCTableView = class(TTMSFNCCustomTableView)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n property OnNeedFilterDropDownData;\r\n property OnFilterSelect;\r\n property OnBeforeReorderItem;\r\n property OnAfterReorderItem;\r\n property OnBeforeDropItem;\r\n property OnAfterDropItem;\r\n property OnBeforeCutToClipboard;\r\n property OnBeforeCopyToClipboard;\r\n property OnBeforePasteFromClipboard;\r\n property OnAfterCutToClipboard;\r\n property OnAfterCopyToClipboard;\r\n property OnAfterPasteFromClipboard;\r\n public\r\n property TreeView;\r\n published\r\n property Fill;\r\n property Stroke;\r\n property BitmapContainer;\r\n property ItemAppearance;\r\n property DefaultItem;\r\n property Items;\r\n property Header;\r\n property Footer;\r\n property ItemIndex;\r\n property Interaction;\r\n property LookupBar;\r\n property Reload;\r\n property Categories;\r\n property MoreOptions;\r\n property MoreOptionAppearance;\r\n property CategoryAppearance;\r\n property CategoryType;\r\n property OnItemSelected;\r\n property OnItemUnSelected;\r\n property OnItemSelectionChanged;\r\n property Version;\r\n property VerticalScrollBarVisible;\r\n property OnBeforeDrawItem;\r\n property OnAfterDrawItem;\r\n property OnItemCompare;\r\n property OnCategoryCompare;\r\n property OnCategoryClick;\r\n property OnManualLookupCategory;\r\n property OnAfterDrawItemIcon;\r\n property OnBeforeDrawItemIcon;\r\n property OnBeforeDrawItemText;\r\n property OnAfterDrawItemText;\r\n property OnItemAnchorClick;\r\n property OnItemClick;\r\n property OnItemDblClick;\r\n property OnVScroll;\r\n property OnStartReload;\r\n property OnStopReload;\r\n property OnDrawItemCustomAccessory;\r\n property OnItemAccessoryClick;\r\n property OnItemCheckChanged;\r\n property OnAfterDrawItemCheck;\r\n property OnBeforeDrawItemCheck;\r\n property OnBeforeApplyFilter;\r\n property OnAfterApplyFilter;\r\n property OnItemMoreOptionClick;\r\n property OnBeforeItemShowDetailControl;\r\n property OnBeforeItemHideDetailControl;\r\n property OnItemShowDetailControl;\r\n property OnItemHideDetailControl;\r\n end;\r\n\r\n{$IFDEF WEBLIB}\r\nconst\r\n TMSFNCTABLEVIEWSEARCH = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABXElEQVQ4jY2TP0'+\r\n '/CUBTFf1VJGhmoEzCQIIkDG4y4gNGJ5cnoiKMTfACCpoubDk5OfAPoUpcm4sRYEkzcsEkHJNGIRgwJiwPUtKVFz3Tzzj3n3PdPYg3KDS0NlID0cq'+\r\n 'mrq6Lr7pFChArQBGoBtAVUHaMwAxPIReUIR/kUhWyS8fs3Rt9m8PzqtFV0VXRWDMoN7RxoZhIxLk/3icoRD2+YNldtE2AC7G76DfaKJ+2oHJFvzo'+\r\n 'orYoBMMoYEDKw3GRhv+NJLgFLIJgLFDg7zKacUG0ENcWU7VOznAw2+ZvO1BlMX7zFwrsYwbU+TH1pv6JQPQRNcT2dzbu8eA8XDlw86C4MJ0NoKCg'+\r\n 'BqhmkzHH0iChniO4s9955G7vS6rgrL8w7KDS0H3ANK6PyL5Lquiha4XqJPPAEOltSxS2wBHV0VE2dBChPrquivmeIXziG6x678V+w2uFgmV/3f9S'+\r\n '/8AOOWdCNEGLMkAAAAAElFTkSuQmCC';\r\n{$ENDIF}\r\n\r\nimplementation\r\n\r\n{$R 'TMSFNCTableView.res'}\r\n\r\nuses\r\n Math, WEBLib.TMSFNCUtils, SysUtils, WEBLib.Graphics, WEBLib.TMSFNCStyles;\r\n\r\ntype\r\n TTMSFNCTreeViewOpen = class(TTMSFNCTreeViewTableView);\r\n TTMSFNCCustomTreeViewOpen = class(TTMSFNCCustomTreeView);\r\n TTMSFNCCustomTableViewOpen = class(TTMSFNCCustomTableView);\r\n TTMSFNCTreeViewColumnOpen = class(TTMSFNCTreeViewColumn);\r\n\r\nfunction AnimateDouble(var Start, Stop: Double; Delta, Margin: Double): Boolean;\r\nbegin\r\n Result := true;\r\n if (Start > Stop - Margin) and (Start < Stop + Margin) then\r\n begin\r\n Start := Stop;\r\n Result := false;\r\n end\r\n else\r\n begin\r\n Delta := Max(Margin, Delta);\r\n if Start < Stop then\r\n Start := Start + Delta\r\n else\r\n Start := Start - Delta;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.AddDisplayItem(AItem: TTMSFNCTableViewItem);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n dp.CategoryID := -1;\r\n dp.Item := AItem;\r\n dp.Kind := tvikItem;\r\n dp.Text := '';\r\n dp.Row := FDisplayList.Count;\r\n if Assigned(AItem) then\r\n AItem.FRow := dp.Row;\r\n FDisplayList.Add(dp);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.AddDisplayCategory(AItem: TTMSFNCTableViewItem);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if AItem.Visible then\r\n begin\r\n dp.Item := nil;\r\n dp.Kind := tvikCategory;\r\n dp.Text := GetCharacterForItem(AItem);\r\n dp.CategoryID := AItem.CategoryID;\r\n dp.Row := FDisplayList.Count;\r\n if Assigned(AItem) then\r\n AItem.FRow := dp.Row;\r\n FDisplayList.Add(dp);\r\n FCategoryList.Add(dp);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.AddItem(AText: string = ''): TTMSFNCTableViewItem;\r\nbegin\r\n Result := Items.Add;\r\n Result.Text := AText;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ApplyFilter;\r\nbegin\r\n FFilterApplied := True;\r\n UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ApplyStyle;\r\nvar\r\n I: Integer;\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleTextFontColor(c) then\r\n begin\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n Items[I].TextColor := c;\r\n Items[I].TitleColor := c;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCCustomTableView) then\r\n begin\r\n FTreeView.Assign((Source as TTMSFNCCustomTableView).TreeView);\r\n FItems.Assign((Source as TTMSFNCCustomTableView).Items);\r\n FItemAppearance.Assign((Source as TTMSFNCCustomTableView).ItemAppearance);\r\n FCategoryAppearance.Assign((Source as TTMSFNCCustomTableView).CategoryAppearance);\r\n FCategoryType := (Source as TTMSFNCCustomTableView).CategoryType;\r\n FFilter.Assign((Source as TTMSFNCCustomTableView).Filter);\r\n FHeader.Assign((Source as TTMSFNCCustomTableView).Header);\r\n FFooter.Assign((Source as TTMSFNCCustomTableView).Footer);\r\n FDefaultItem.Assign((Source as TTMSFNCCustomTableView).DefaultItem);\r\n FInteraction.Assign((Source as TTMSFNCCustomTableView).Interaction);\r\n FReload.Assign((Source as TTMSFNCCustomTableView).Reload);\r\n FLookupBar.Assign((Source as TTMSFNCCustomTableView).LookupBar);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.BeginUpdate;\r\nbegin\r\n inherited;\r\n Inc(FUpdateCount);\r\n if Assigned(FTreeView) then\r\n begin\r\n if Assigned(SelectedItem) then\r\n FSaveSelectedItem := SelectedItem.Index\r\n else\r\n FSaveSelectedItem := -1;\r\n\r\n FTreeView.BeginUpdate;\r\n FTreeView.ClearNodeList;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.CalculateItems;\r\nvar\r\n I: Integer;\r\n J: Integer;\r\n v: Boolean;\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n if (FUpdateCount > 0) or IsDestroying then\r\n Exit;\r\n\r\n FDisplayList.Clear;\r\n FCategoryList.Clear;\r\n\r\n j := 0;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n it := Items[I];\r\n v := it.Visible;\r\n if FFilterApplied then\r\n v := v and MatchFilter(it);\r\n\r\n if CategoryType <> tvctNone then\r\n begin\r\n if FDisplayList.Count = 0 then\r\n begin\r\n if v then\r\n begin\r\n AddDisplayCategory(it);\r\n AddDisplayItem(it);\r\n end;\r\n Inc(J);\r\n end\r\n else\r\n begin\r\n if ItemFromDifferentCategory(it, Items[J - 1]) then\r\n begin\r\n if v then\r\n begin\r\n AddDisplayCategory(it);\r\n AddDisplayItem(it);\r\n end;\r\n Inc(J);\r\n end\r\n else\r\n begin\r\n if v then\r\n AddDisplayItem(it);\r\n Inc(J);\r\n end;\r\n end;\r\n end\r\n else if v then\r\n AddDisplayItem(it);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.CalculateLookupBar;\r\nvar\r\n s: Integer;\r\n I: Integer;\r\n str: string;\r\n r, cr: TRectF;\r\n ldp: TTMSFNCTableViewLookupBarDisplayItem;\r\n ypos: Single;\r\n g: TTMSFNCGraphics;\r\n j: Integer;\r\nbegin\r\n if (FUpdateCount > 0) or IsDestroying or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FLookupBarDisplayList.Clear;\r\n\r\n if LookupBar.Visible and (CategoryType <> tvctNone) then\r\n begin\r\n cr := FTreeView.GetLookupBarRect;\r\n\r\n case CategoryType of\r\n tvctAlphaBetic, tvctAlphaNumericFirst, tvctAlphaNumericLast:\r\n begin\r\n s := GetCharacterCount;\r\n for I := 1 to s do\r\n begin\r\n str := GetCharacter(I);\r\n r.Left := cr.Left;\r\n r.Right := cr.Right;\r\n r.Top := cr.Top + ((I - 1) * ((cr.Bottom - cr.Top) / s));\r\n r.Bottom := r.Top + ((cr.Bottom - cr.Top) / s);\r\n\r\n ldp.Rect := r;\r\n ldp.Text := str;\r\n ldp.Active := Assigned(FindFirstItemWithCategory(str));\r\n\r\n FLookupBarDisplayList.Add(ldp);\r\n end;\r\n end;\r\n tvctCustom:\r\n begin\r\n FCustomChar.Clear;\r\n for I := 0 to Categories.Count - 1 do\r\n FCustomChar.Add(TTMSFNCTableViewCustomChar.Create(Categories[I].Id, False));\r\n\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n str := Items[I].StrippedHTMLText;\r\n if (str <> '') then\r\n begin\r\n j := Items[I].CategoryID;\r\n FCustomChar.ActivateID(j);\r\n end;\r\n end;\r\n\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n try\r\n g.Font.Assign(LookupBar.Font);\r\n s := Categories.Count - 1;\r\n ypos := cr.Top + 3;\r\n for I := 0 to s do\r\n begin\r\n str := Categories[I].LookupText;\r\n\r\n r.Left := cr.Left;\r\n r.Right := cr.Right;\r\n r.Top := ypos;\r\n r.Bottom := r.Top + g.CalculateTextHeight(str);\r\n ypos := ypos + (r.Bottom - r.Top) + 3;\r\n\r\n ldp.Rect := r;\r\n ldp.Text := str;\r\n ldp.Active := Assigned(FindFirstItemWithCategoryID(Categories[I].Id));\r\n\r\n FLookupBarDisplayList.Add(ldp);\r\n end;\r\n finally\r\n g.Free;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.CheckAllItems;\r\nvar\r\n I: Integer;\r\nbegin\r\n BeginUpdate;\r\n for I := 0 to Items.Count - 1 do\r\n Items[I].Checked := True;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ClearSelection;\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n if FEditMode then\r\n UnCheckAllItems;\r\n FTreeView.UnSelectAllNodes;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetCheckedItems: TTMSFNCTableViewCheckedItems;\r\nvar\r\n I: Integer;\r\n n: TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n n := Items[I] as TTMSFNCTableViewItem;\r\n if n.Checked then\r\n begin\r\n SetLength(Result, Length(Result) + 1);\r\n Result[Length(Result) - 1] := n;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.CopyToClipboard(ATextOnly: Boolean);\r\nvar\r\n s: String;\r\n I: Integer;\r\n it: TTMSFNCTableViewItem;\r\n cl: TTMSFNCTreeViewIntegerList;\r\nbegin\r\n cl := TTMSFNCTreeViewIntegerList.Create;\r\n try\r\n s := '';\r\n for I := 0 to SelectedItemCount - 1 do\r\n begin\r\n it := SelectedItems[I];\r\n if Assigned(it) and (cl.IndexOf(it.Index) = -1) then\r\n begin\r\n s := s + it.SaveToString(ATextOnly) + ENDOFLINE;\r\n cl.Add(it.Index);\r\n end;\r\n end;\r\n\r\n if s <> '' then\r\n TTMSFNCClipBoard.SetText(CLP_FMT + s);\r\n finally\r\n cl.Free;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCCustomTableView.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FEdit := TTMSFNCtableviewEdit.Create(Self);\r\n FEdit.FTableView := Self;\r\n FEdit.OnChange := @DoEditChange;\r\n {$IFDEF FMXLIB}\r\n FEdit.OnChangeTracking := DoEditChange;\r\n FEdit.Stored := False;\r\n {$ENDIF}\r\n\r\n FEditButton := TTMSFNCToolBarButton.Create(Self);\r\n FEditButton.OnClick := DoEditButtonClicked;\r\n FEditButton.Stored := False;\r\n FEditButton.Width := 50;\r\n FEditButton.Appearance.FlatStyle := True;\r\n\r\n FDoneButton := TTMSFNCToolBarButton.Create(Self);\r\n FDoneButton.OnClick := DoDoneButtonClicked;\r\n FDoneButton.Stored := False;\r\n FDoneButton.Width := 50;\r\n FDoneButton.Appearance.FlatStyle := True;\r\n\r\n FFilterButton := TTMSFNCToolBarButton.Create(Self);\r\n FFilterButton.OnClick := DoFilterButtonClicked;\r\n FFilterButton.Stored := False;\r\n FFilterButton.Width := 30;\r\n FFilterButton.Appearance.FlatStyle := True;\r\n FFilterButton.Bitmaps.AddBitmapFromResource(TMSFNCTABLEVIEWSEARCH, HInstance);\r\n FFilterButton.BitmapVisible := True;\r\n\r\n FBackButton := TTMSFNCToolBarButton.Create(Self);\r\n FBackButton.OnClick := DoBackButtonClicked;\r\n FBackButton.Stored := False;\r\n FBackButton.Width := 50;\r\n FBackButton.Appearance.FlatStyle := True;\r\n\r\n FEditButton.Text := 'Edit';\r\n FDoneButton.Text := 'Done';\r\n FBackButton.Text := 'Back';\r\n\r\n FDetailControlTimer := TTimer.Create(Self);\r\n FDetailControlTimer.OnTimer := DoDetailControlTimer;\r\n FDetailControlTimer.Enabled := False;\r\n FDetailControlTimer.Interval := 1;\r\n\r\n FDisplayList := TTMSFNCTableViewDisplayList.Create;\r\n FCategoryList := TTMSFNCTableViewDisplayList.Create;\r\n FLookupBarDisplayList := TTMSFNCTableViewLookupBarDisplayList.Create;\r\n FItems := CreateItems;\r\n FLookupBar := TTMSFNCTableViewLookupBar.Create(Self);\r\n FReload := TTMSFNCTableViewReload.Create(Self);\r\n FCategories := TTMSFNCTableViewCategories.Create(Self);\r\n FMoreOptions := TTMSFNCTableViewMoreOptions.Create(Self);\r\n FCategoryType := tvctNone;\r\n\r\n FCustomChar := TTMSFNCTableViewCustomCharList.Create;\r\n\r\n FTreeView := CreateTreeView;\r\n FTreeView.OptimizedHTMLDrawing := True;\r\n FTreeView.FTableView := Self;\r\n FTreeView.Stored := False;\r\n FTreeView.Parent := Self;\r\n FTreeView.Columns.Clear;\r\n FColumn := FTreeView.Columns.Add;\r\n FTreeView.ClearNodes;\r\n FTreeView.ColumnsAppearance.Layouts := [tclTop, tclBottom];\r\n FTreeView.ColumnsAppearance.TopSize := 30;\r\n FTreeView.ColumnsAppearance.BottomSize := 30;\r\n FTreeView.StretchScrollBars := True;\r\n FTreeView.VerticalScrollBarVisible := False;\r\n FTreeview.NodesAppearance.Stroke.Kind := gskSolid;\r\n FTreeView.NodesAppearance.ExpandColumn := -1;\r\n FTreeView.NodesAppearance.LevelIndent := 0;\r\n FTreeView.NodesAppearance.ShowLines := False;\r\n FTreeView.NodesAppearance.ExpandWidth := 0;\r\n FTreeView.NodesAppearance.ExpandHeight := 0;\r\n FTreeView.NodesAppearance.SelectionArea := tsaDefault;\r\n FTreeView.NodesAppearance.ShowFocus := True;\r\n FTreeView.NodesAppearance.SelectedFill.Color := MakeGraphicsColor(217, 217, 217);\r\n FTreeView.NodesAppearance.SelectedStroke.Color := MakeGraphicsColor(217, 217, 217);\r\n FTreeView.NodesAppearance.Stroke.Color := MakeGraphicsColor(200, 199, 204);\r\n FTreeView.OnGetNodeSides := DoGetNodeSides;\r\n FTreeView.OnGetColumnText := DoGetColumnText;\r\n FTreeView.OnGetColumnWordWrapping := DoGetColumnWordWrapping;\r\n FTreeView.OnGetColumnHorizontalTextAlign := DoGetColumnHorizontalTextAlign;\r\n FTreeView.OnGetColumnVerticalTextAlign := DoGetColumnVerticalTextAlign;\r\n FTreeView.OnGetColumnTrimming := DoGetColumnTrimming;\r\n FTreeView.OnGetNumberOfNodes := DoGetNumberOfNodes;\r\n FTreeView.OnIsNodeChecked := DoIsNodeChecked;\r\n FTreeView.OnGetNodeCheckType := DoGetNodeCheckType;\r\n FTreeView.OnAfterUnCheckNode := DoAfterUnCheckNode;\r\n FTreeView.OnAfterCheckNode := DoAfterCheckNode;\r\n FTreeView.OnGetNodeHeight := DoGetNodeHeight;\r\n FTreeView.OnGetNodeIcon := DoGetNodeIcon;\r\n FTreeView.OnGetNodeTrimming := DoGetNodeTrimming;\r\n FTreeView.OnGetNodeWordWrapping := DoGetNodeWordWrapping;\r\n FTreeView.OnGetNodeTitleTrimming := DoGetNodeTitleTrimming;\r\n FTreeView.OnGetNodeTitleWordWrapping := DoGetNodeTitleWordWrapping;\r\n FTreeView.OnDrawNodeExtra := DoDrawNodeExtra;\r\n FTreeView.OnGetNodeExtraSize := DoGetNodeExtraSize;\r\n FTreeView.OnGetNodeTextColor := DoGetNodeTextColor;\r\n FTreeView.OnGetNodeTitleColor := DoGetNodeTitleColor;\r\n FTreeView.OnIsNodeExtended := DoIsNodeExtended;\r\n FTreeView.OnGetNodeSelectedTextColor := DoGetNodeSelectedTextColor;\r\n FTreeView.OnGetNodeDisabledTextColor := DoGetNodeDisabledTextColor;\r\n FTreeView.OnGetNodeSelectedTitleColor := DoGetNodeSelectedTitleColor;\r\n FTreeView.OnGetNodeDisabledTitleColor := DoGetNodeDisabledTitleColor;\r\n FTreeView.OnGetNodeText := DoGetNodeText;\r\n FTreeView.OnGetNodeTitle := DoGetNodeTitle;\r\n FTreeView.OnGetNodeTitleExpanded := DoGetNodeTitleExpanded;\r\n FTreeView.OnGetNodeHorizontalTextAlign := DoGetNodeHorizontalTextAlign;\r\n FTreeView.OnGetNodeVerticalTextAlign := DoGetNodeVerticalTextAlign;\r\n FTreeView.OnGetNodeTitleHorizontalTextAlign := DoGetNodeTitleHorizontalTextAlign;\r\n FTreeView.OnGetNodeTitleVerticalTextAlign := DoGetNodeTitleVerticalTextAlign;\r\n FTreeView.OnIsNodeEnabled := DoIsNodeEnabled;\r\n FTreeView.OnAfterSelectNode := DoAfterSelectNode;\r\n FTreeView.OnAfterUnSelectNode := DoAfterUnSelectNode;\r\n FTreeView.OnNeedFilterDropDownData := DoNeedFilterDropDownData;\r\n FTreeView.OnFilterSelect := DoFilterSelect;\r\n FTreeView.OnBeforeDrawNode := DoBeforeDrawNode;\r\n FTreeView.OnAfterDrawNode := DoAfterDrawNode;\r\n FTreeView.OnAfterDrawNodeIcon := DoAfterDrawNodeIcon;\r\n FTreeView.OnBeforeDrawNodeIcon := DoBeforeDrawNodeIcon;\r\n FTreeView.OnAfterDrawNodeCheck := DoAfterDrawNodeCheck;\r\n FTreeView.OnBeforeDrawNodeCheck := DoBeforeDrawNodeCheck;\r\n FTreeView.OnBeforeDrawNodeText := DoBeforeDrawNodeText;\r\n FTreeView.OnAfterDrawNodeText := DoAfterDrawNodeText;\r\n FTreeView.OnBeforeDrawNodeTitle := DoBeforeDrawNodeTitle;\r\n FTreeView.OnAfterDrawNodeTitle := DoAfterDrawNodeTitle;\r\n FTreeView.OnNodeAnchorClick := DoNodeAnchorClick;\r\n FTreeView.OnBeforeDrawSortIndicator := DoBeforeDrawSortIndicator;\r\n FTreeView.OnAfterDrawSortIndicator := DoAfterDrawSortIndicator;\r\n FTreeView.OnNodeClick := DoNodeClick;\r\n FTreeView.OnNodeDblClick := DoNodeDblClick;\r\n FTreeView.OnVScroll := DoVScroll;\r\n FTreeView.OnBeforeCutToClipboard := DoBeforeCutToClipboard;\r\n FTreeView.OnBeforeCopyToClipboard := DoBeforeCopyToClipboard;\r\n FTreeView.OnBeforePasteFromClipboard := DoBeforePasteFromClipboard;\r\n FTreeView.OnAfterCutToClipboard := DoAfterCutToClipboard;\r\n FTreeView.OnAfterCopyToClipboard := DoAfterCopyToClipboard;\r\n FTreeView.OnAfterPasteFromClipboard := DoAfterPasteFromClipboard;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomReorder := DoCustomReorder;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomDragOver := DoCustomDragOver;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomDragDrop := DoCustomDragDrop;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomCopyToClipboard := DoCopyToClipboard;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomCutToClipboard := DoCutToClipboard;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomPasteFromClipboard := DoPasteFromClipboard;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomColumnSort := DoColumnSort;\r\n TTMSFNCTreeViewOpen(FTreeView).OnCustomLookup := DoLookup;\r\n\r\n CustomizeTreeView(FTreeView);\r\n\r\n FFilter := TTMSFNCTableViewFilter.Create(Self);\r\n FHeader := TTMSFNCTableViewHeader.Create(Self);\r\n FFooter := TTMSFNCTableViewFooter.Create(Self);\r\n FItemAppearance := TTMSFNCTableViewItemAppearance.Create(Self);\r\n FCategoryAppearance := TTMSFNCTableViewCategoryAppearance.Create(Self);\r\n FMoreOptionAppearance := TTMSFNCTableViewMoreOptionAppearance.Create(Self);\r\n FDefaultItem := TTMSFNCTableViewItem.Create(nil);\r\n FInteraction := TTMSFNCTableViewInteraction.Create(Self);\r\n FCopyItems := TTMSFNCTableViewCopyItems.Create(nil);\r\n\r\n Width := 250;\r\n Height := 350;\r\n if IsDesignTime then\r\n begin\r\n Stroke.Color := MakeGraphicsColor(200, 199, 204);\r\n InitSample;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.CreateItems: TTMSFNCTableViewItems;\r\nbegin\r\n Result := TTMSFNCTableViewItems.Create(Self);\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.CreateTreeView: TTMSFNCTreeViewTableView;\r\nbegin\r\n Result := TTMSFNCTreeViewTableView.Create(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.CustomizeTreeView(\r\n ATreeView: TTMSFNCTreeView);\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.CutToClipboard(ATextOnly: Boolean);\r\nvar\r\n I: Integer;\r\nbegin\r\n BeginUpdate;\r\n CopyToClipboard(ATextOnly);\r\n for I := SelectedItemCount - 1 downto 0 do\r\n RemoveItem(SelectedItems[I]);\r\n EndUpdate;\r\nend;\r\n\r\ndestructor TTMSFNCCustomTableView.Destroy;\r\nbegin\r\n FEditButton.Free;\r\n FFilterButton.Free;\r\n FEdit.Free;\r\n FBackButton.Free;\r\n FDoneButton.Free;\r\n\r\n FDetailControlTimer.Free;\r\n FMoreOptions.Free;\r\n FCategories.Free;\r\n FReload.Free;\r\n FLookupBar.Free;\r\n FCustomChar.Free;\r\n FDisplayList.Free;\r\n FCategoryList.Free;\r\n FLookupBarDisplayList.Free;\r\n FFilter.Free;\r\n FCopyItems.Free;\r\n FHeader.Free;\r\n FFooter.Free;\r\n FDefaultItem.Free;\r\n FInteraction.Free;\r\n FItems.Free;\r\n FTreeView.Free;\r\n FItemAppearance.Free;\r\n FCategoryAppearance.Free;\r\n FMoreOptionAppearance.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.DetailControlActive: Boolean;\r\nbegin\r\n Result := Assigned(FActiveDetailControl);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.StopEditMode;\r\nbegin\r\n if (Assigned(FTreeView) and FTreeView.FReloadActive) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FEditMode := False;\r\n UpdateTableView;\r\n UnSelectAllItems;\r\n UnCheckAllItems;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.StopFiltering;\r\nbegin\r\n if (Assigned(FTreeView) and FTreeView.FReloadActive) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FFilterActive := False;\r\n RemoveFilters;\r\n UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DisableInteraction;\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.BlockUserInput := True;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterApplyFilter(\r\n AFilter: TTMSFNCTableViewFilterData);\r\nbegin\r\n if Assigned(OnAfterApplyFilter) then\r\n OnAfterApplyFilter(Self, AFilter);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterCheckNode(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n begin\r\n dp.Item.Checked := True;\r\n if Assigned(FTreeView) then\r\n FTreeView.DoAfterSelectNode(ANode);\r\n DoItemCheckChanged(dp.Item);\r\n end;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterCopyToClipboard(Sender: TObject);\r\nbegin\r\n if Assigned(OnAfterCopyToClipboard) then\r\n OnAfterCopyToClipboard(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterCutToClipboard(Sender: TObject);\r\nbegin\r\n if Assigned(OnAfterCutToClipboard) then\r\n OnAfterCutToClipboard(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDrawItemMoreOption(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem;\r\n AMoreOption: TTMSFNCTableViewMoreOption);\r\nbegin\r\n if Assigned(OnAfterDrawItemMoreOption) then\r\n OnAfterDrawItemMoreOption(Self, AGraphics, ARect, AItem, AMoreOption);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDrawNode(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnAfterDrawItem) then\r\n OnAfterDrawItem(Self, AGraphics, ARect, GetItemForNode(ANode));\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDrawNodeCheck(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap);\r\nbegin\r\n if Assigned(OnAfterDrawItemCheck) then\r\n OnAfterDrawItemCheck(Self, AGraphics, ARect, GetItemForNode(ANode), ACheck);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDrawNodeIcon(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; AIcon: TTMSFNCBitmap);\r\nbegin\r\n if Assigned(OnAfterDrawItemIcon) then\r\n OnAfterDrawItemIcon(Self, AGraphics, ARect, GetItemForNode(ANode), AIcon);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDrawNodeText(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; AText: String);\r\nbegin\r\n if Assigned(OnAfterDrawItemText) then\r\n OnAfterDrawItemText(Self, AGraphics, ARect, GetItemForNode(ANode), AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDrawNodeTitle(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; ATitle: String);\r\nbegin\r\n if Assigned(OnAfterDrawItemTitle) then\r\n OnAfterDrawItemTitle(Self, AGraphics, ARect, GetItemForNode(ANode), ATitle);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDrawSortIndicator(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn, ASortIndex: Integer;\r\n ASortKind: TTMSFNCTreeViewNodesSortKind);\r\nvar\r\n i: Integer;\r\n sk: TTMSFNCTableViewItemsSortKind;\r\nbegin\r\n if Assigned(OnAfterDrawSortIndicator) then\r\n begin\r\n i := Integer(ASortKind);\r\n sk := TTMSFNCTableViewItemsSortKind(i);\r\n OnAfterDrawSortIndicator(Self, AGraphics, ARect, ASortIndex, sk);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterDropItem(AFromItem: TTMSFNCTableViewItem; AToItem: TTMSFNCTableViewItem);\r\nbegin\r\n if Assigned(OnAfterDropItem) then\r\n OnAfterDropItem(Self, AFromItem, AToItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterPasteFromClipboard(Sender: TObject);\r\nbegin\r\n if Assigned(OnAfterPasteFromClipboard) then\r\n OnAfterPasteFromClipboard(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterReorderItem(AFromItem, AToItem: TTMSFNCTableViewItem);\r\nbegin\r\n if Assigned(OnAfterReorderItem) then\r\n OnAfterReorderItem(Self, AFromItem, AToItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterSelectNode(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnItemSelected) then\r\n OnItemSelected(Self, GetItemForNode(ANode));\r\n\r\n if Assigned(OnItemSelectionChanged) then\r\n OnItemSelectionChanged(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterUnCheckNode(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n begin\r\n dp.Item.Checked := False;\r\n if Assigned(FTreeView) then\r\n FTreeView.DoAfterUnSelectNode(ANode);\r\n DoItemCheckChanged(dp.Item);\r\n end;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoAfterUnSelectNode(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnItemUnSelected) then\r\n OnItemUnSelected(Self, GetItemForNode(ANode));\r\n\r\n if Assigned(OnItemSelectionChanged) then\r\n OnItemSelectionChanged(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBackButtonClicked(Sender: TObject);\r\nbegin\r\n HideDetailControl;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeApplyFilter(\r\n AFilter: TTMSFNCTableViewFilterData; AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeApplyFilter) then\r\n OnBeforeApplyFilter(Self, AFilter, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeCopyToClipboard(Sender: TObject;\r\n var ACanCopy: Boolean);\r\nbegin\r\n if Assigned(OnBeforeCopyToClipboard) then\r\n OnBeforeCopyToClipboard(Self, ACanCopy);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeCutToClipboard(Sender: TObject;\r\n var ACanCut: Boolean);\r\nbegin\r\n if Assigned(OnBeforeCutToClipboard) then\r\n OnBeforeCutToClipboard(Self, ACanCut);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDrawItemMoreOption(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem;\r\n AMoreOption: TTMSFNCTableViewMoreOption; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItemMoreOption) then\r\n OnBeforeDrawItemMoreOption(Self, AGraphics, ARect, AItem, AMoreOption, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDrawNode(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; ANode: TTMSFNCTreeViewVirtualNode;\r\n var AAllow, ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItem) then\r\n OnBeforeDrawItem(Self, AGraphics, ARect, GetItemForNode(ANode), AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDrawNodeCheck(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; ACheck: TTMSFNCBitmap; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItemCheck) then\r\n OnBeforeDrawItemCheck(Self, AGraphics, ARect, GetItemForNode(ANode), ACheck, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDrawNodeIcon(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; AIcon: TTMSFNCBitmap; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItemIcon) then\r\n OnBeforeDrawItemIcon(Self, AGraphics, ARect, GetItemForNode(ANode), AIcon, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDrawNodeTitle(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; ATitle: String; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItemTitle) then\r\n OnBeforeDrawItemTitle(Self, AGraphics, ARect, GetItemForNode(ANode), ATitle, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDrawNodeText(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode; AText: String; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItemText) then\r\n OnBeforeDrawItemText(Self, AGraphics, ARect, GetItemForNode(ANode), AText, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDrawSortIndicator(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn, ASortIndex: Integer;\r\n ASortKind: TTMSFNCTreeViewNodesSortKind; var ADefaultDraw: Boolean);\r\nvar\r\n i: Integer;\r\n sk: TTMSFNCTableViewItemsSortKind;\r\nbegin\r\n if Assigned(OnBeforeDrawSortIndicator) then\r\n begin\r\n i := Integer(ASortKind);\r\n sk := TTMSFNCTableViewItemsSortKind(i);\r\n OnBeforeDrawSortIndicator(Self, AGraphics, ARect, ASortIndex, sk, ADefaultDraw);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeDropItem(AFromItem: TTMSFNCTableViewItem; AToItem: TTMSFNCTableViewItem; var ACanDrop: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDropItem) then\r\n OnBeforeDropItem(Self, AFromItem, AToItem, ACanDrop);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeItemHideDetailControl(\r\n AItem: TTMSFNCTableViewItem; ADetailControl: TControl; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeItemHideDetailControl) then\r\n OnBeforeItemHideDetailControl(Self, AItem, ADetailControl, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeItemShowDetailControl(\r\n AItem: TTMSFNCTableViewItem; ADetailControl: TControl; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeItemShowDetailControl) then\r\n OnBeforeItemShowDetailControl(Self, AItem, ADetailControl, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforePasteFromClipboard(Sender: TObject;\r\n var ACanPaste: Boolean);\r\nbegin\r\n if Assigned(OnBeforePasteFromClipboard) then\r\n OnBeforePasteFromClipboard(Self, ACanPaste);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoBeforeReorderItem(AFromItem, AToItem: TTMSFNCTableViewItem; var ACanReorder: Boolean);\r\nbegin\r\n if Assigned(OnBeforeReorderItem) then\r\n OnBeforeReorderItem(Self, AFromItem, AToItem, ACanReorder);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoDoneButtonClicked(Sender: TObject);\r\nbegin\r\n StopEditMode;\r\n StopFiltering;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoCategoryCompare(ACategory1,\r\n ACategory2: TTMSFNCTableViewCategory; var ACompareResult: Integer);\r\nbegin\r\n if Assigned(OnCategoryCompare) then\r\n OnCategoryCompare(Self, ACategory1, ACategory2, ACompareResult);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoItemAccessoryClick(\r\n AItem: TTMSFNCTableViewItem);\r\nbegin\r\n if Assigned(OnItemAccessoryClick) then\r\n OnItemAccessoryClick(Self, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoColumnSort(Sender: TObject; AColumn: Integer;\r\n ASortMode: TTMSFNCTreeViewNodesSortMode);\r\nvar\r\n i: Integer;\r\nbegin\r\n i := Integer(ASortMode);\r\n Items.Sort(Interaction.Sorting in [tvcsNormalCaseSensitive], TTMSFNCTableViewItemsSortMode(i));\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoCopyToClipboard(Sender: TObject);\r\nbegin\r\n CopyToClipboard(Interaction.ClipboardMode = tvcmTextOnly);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoCustomDragDrop(Sender, Source: TObject;\r\n Point: TPointF);\r\nvar\r\n di, dragi, li, dic, newi: TTMSFNCTableViewItem;\r\n dragn: TTMSFNCTreeViewVirtualNode;\r\n b: Boolean;\r\n tv: TTMSFNCCustomTableViewOpen;\r\nbegin\r\n if FAccepted and Assigned(Source) and (Source is TTMSFNCCustomTreeView) and ((Source as TTMSFNCCustomTreeView).Parent is TTMSFNCCustomTableView)\r\n and (TTMSFNCCustomTreeViewOpen(Source).Interaction.DragDropMode <> tdmNone) then\r\n begin\r\n dragn := (Source as TTMSFNCCustomTreeView).DragNode;\r\n if Assigned(dragn) then\r\n begin\r\n dragi := TTMSFNCCustomTableViewOpen((Source as TTMSFNCCustomTreeView).Parent).GetItemForNode(dragn);\r\n di := XYToItem(Point.X, Point.Y);\r\n if (di <> dragi) and Assigned(dragi) and PtInRectEx(GetItemsRect, Point) then\r\n begin\r\n b := True;\r\n if Assigned(di) then\r\n DoBeforeDropItem(dragi, di, b)\r\n else\r\n begin\r\n Inc(FUpdateCount);\r\n newi := Items.Add;\r\n Dec(FUpdateCount);\r\n DoBeforeDropItem(dragi, newi, b);\r\n newi.Free;\r\n end;\r\n\r\n if b then\r\n begin\r\n dic := nil;\r\n BeginUpdate;\r\n tv := TTMSFNCCustomTableViewOpen((Source as TTMSFNCCustomTreeView).Parent);\r\n tv.BeginUpdate;\r\n if Assigned(di) then\r\n begin\r\n case tv.Interaction.DragDropMode of\r\n tvdmMove:\r\n begin\r\n if (Source as TTMSFNCCustomTreeView).Parent = Self then\r\n begin\r\n DragItemMove(dragi, di);\r\n dragi.Index := di.Index;\r\n dic := di;\r\n end\r\n else\r\n begin\r\n li := Items.Add;\r\n DragItemAdd(li, dragi, di);\r\n tv.DragItemDelete(dragi);\r\n li.Assign(dragi);\r\n li.Index := di.Index;\r\n tv.Items.Delete(dragi.Index);\r\n tv.ItemIndex := tv.ItemIndex;\r\n dic := li;\r\n dragi := nil;\r\n end;\r\n end;\r\n tvdmCopy:\r\n begin\r\n li := Items.Add;\r\n DragItemAdd(li, dragi, di);\r\n li.Assign(dragi);\r\n li.Index := di.Index;\r\n dic := li;\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n li := Items.Add;\r\n DragItemAdd(li, dragi, nil);\r\n li.Assign(dragi);\r\n case tv.Interaction.DragDropMode of\r\n tvdmMove:\r\n begin\r\n tv.DragItemDelete(dragi);\r\n tv.Items.Delete(dragi.Index);\r\n tv.ItemIndex := tv.ItemIndex;\r\n dragi := nil;\r\n end;\r\n end;\r\n dic := li;\r\n end;\r\n (Source as TTMSFNCCustomTreeView).DragNode := nil;\r\n if Assigned(dic) then\r\n FSaveSelectedItem := dic.Index;\r\n tv.EndUpdate;\r\n EndUpdate;\r\n DoAfterDropItem(dragi, dic);\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoCustomDragOver(Sender, Source: TObject;\r\n Point: TPointF; var Accept: Boolean);\r\nbegin\r\n Accept := (Interaction.DragDropMode <> tvdmNone) and (Source is TTMSFNCCustomTreeView) and Assigned((Source as TTMSFNCCustomTreeView).DragNode);\r\n Accept := Accept and PtInRectEx(GetItemsRect, Point);\r\n FAccepted := Accept;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.CustomizeButtons;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoCustomReorder(Sender: TObject; AFromNode,\r\n AToNode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n it, itt: TTMSFNCTableViewItem;\r\n b: Boolean;\r\nbegin\r\n if not Assigned(AFromNode) or not Assigned(AToNode) then\r\n Exit;\r\n\r\n b := True;\r\n it := GetItemForNode(AFromNode);\r\n itt := GetItemForNode(AToNode);\r\n DoBeforeReorderItem(it, itt, b);\r\n if b then\r\n begin\r\n BeginUpdate;\r\n it.Index := itt.Index;\r\n EndUpdate;\r\n DoAfterReorderItem(it, itt);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoCutToClipboard(Sender: TObject);\r\nbegin\r\n CutToClipboard(Interaction.ClipboardMode = tvcmTextOnly);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoDetailControlTimer(Sender: TObject);\r\nvar\r\n d: Double;\r\n p: Double;\r\n anim: Boolean;\r\n cr: TRectF;\r\nbegin\r\n if Assigned(FActiveDetailControl) and Assigned(FTreeView) then\r\n begin\r\n if not FShowDetailControl then\r\n p := 0\r\n else\r\n begin\r\n cr := FTreeView.GetContentRect;\r\n p := cr.Right - cr.Left;\r\n end;\r\n\r\n d := Abs(FDetailControlOffset - p) / ANIMATIONFACTOR;\r\n anim := AnimateDouble(FDetailControlOffset, p, d, 0.01);\r\n\r\n if not anim then\r\n begin\r\n FDetailControlOffset := p;\r\n FShowDetailControl := not FShowDetailControl;\r\n if not FShowDetailControl then\r\n begin\r\n DoItemHideDetailControl(FActiveDetailItem, FActiveDetailControl);\r\n FActiveDetailControl.Visible := False;\r\n FActiveDetailControl.Parent := nil;\r\n FActiveDetailControl := nil;\r\n FActiveDetailItem := nil;\r\n end\r\n else\r\n DoItemShowDetailControl(FActiveDetailItem, FActiveDetailControl);\r\n\r\n FDetailControlTimer.Enabled := False;\r\n end;\r\n\r\n UpdateTableView(True);\r\n UpdateActiveDetailControl;\r\n end\r\n else\r\n FDetailControlTimer.Enabled := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoDrawItemCustomAccessory(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem);\r\nbegin\r\n if Assigned(OnDrawItemCustomAccessory) then\r\n OnDrawItemCustomAccessory(Self, AGraphics, ARect, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoDrawNodeExtra(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\n bmp: TTMSFNCBitmap;\r\n r: TRectF;\r\n h: Single;\r\n I: Integer;\r\n mo: TTMSFNCTableViewMoreOption;\r\n sz: Single;\r\n w: Single;\r\n a: Boolean;\r\n c, fc: TTMSFNCGraphicsColor;\r\nbegin\r\n if not Assigned(FTreeView) then\r\n Exit;\r\n\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n begin\r\n if (FTreeView.FMoreOffsetItem = dp.Item) and (MoreOptions.Count > 0) then\r\n begin\r\n AGraphics.Font.Assign(MoreOptionAppearance.Font);\r\n AGraphics.Fill.Assign(MoreOptionAppearance.Fill);\r\n AGraphics.Stroke.Assign(MoreOptionAppearance.Stroke);\r\n\r\n sz := FTreeView.FMoreOffset;\r\n w := sz / MoreOptions.Count;\r\n\r\n for I := 0 to MoreOptions.Count - 1 do\r\n begin\r\n mo := MoreOptions[I];\r\n if mo.Color <> gcNull then\r\n AGraphics.Fill.Color := mo.Color;\r\n if mo.BorderColor <> gcNull then\r\n AGraphics.Stroke.Color := mo.BorderColor;\r\n if mo.FontColor <> gcNull then\r\n AGraphics.Font.Color := mo.FontColor;\r\n r := RectF(ARect.Right - 1 + w * I, ARect.Top, ARect.Right - 1 + w * (I + 1), ARect.Bottom);\r\n a := True;\r\n DoBeforeDrawItemMoreOption(AGraphics, r, dp.Item, mo, a);\r\n if a then\r\n begin\r\n if FTreeview.FDownMoreOption = mo then\r\n begin\r\n AGraphics.Fill.Color := Lighter(AGraphics.Fill.Color, 20);\r\n AGraphics.Stroke.Color := Lighter(AGraphics.Stroke.Color, 20);\r\n end;\r\n\r\n AGraphics.DrawRectangle(r, gcrmNone);\r\n InflateRectEx(r, -2, -2);\r\n AGraphics.DrawText(r, mo.Text, False, gtaCenter);\r\n DoAfterDrawItemMoreOption(AGraphics, r, dp.Item, mo);\r\n end;\r\n end;\r\n end;\r\n\r\n if (dp.Item.AccessoryWidth > 0) and (dp.Item.AccessoryHeight > 0) then\r\n begin\r\n r := ARect;\r\n if dp.Item = FTreeView.FMoreOffsetItem then\r\n r.Left := r.Left + FTreeView.FMoreOffset;\r\n\r\n InflateRectEx(r, -4, -4);\r\n h := dp.Item.AccessoryHeight;\r\n r := RectF(r.Left, r.Top + ((r.Bottom - r.Top) - h) / 2, r.Right, r.Top + ((r.Bottom - r.Top) - h) / 2 + h);\r\n\r\n AGraphics.Font.Assign(ItemAppearance.AccessoryFont);\r\n\r\n if dp.Item.AccessoryFontColor <> gcNull then\r\n AGraphics.Font.Color := dp.Item.AccessoryFontColor;\r\n\r\n case dp.Item.Accessory of\r\n tviaDetail:\r\n begin\r\n bmp := TTMSFNCGraphics.GetScaledBitmap(ItemAppearance.AccessoryDetailBitmaps, 0, BitmapContainer);\r\n if Assigned(bmp) and not IsBitmapEmpty(bmp) then\r\n AGraphics.DrawBitmap(r, BitmapToDrawBitmap(bmp));\r\n end;\r\n tviaProgress:\r\n begin\r\n c := ItemAppearance.AccessoryFill.Color;\r\n if dp.Item.AccessoryColor <> gcNull then\r\n c := dp.Item.AccessoryColor;\r\n fc := ItemAppearance.AccessoryFont.Color;\r\n if dp.Item.AccessoryFontColor <> gcNull then\r\n fc := dp.Item.AccessoryFontColor;\r\n AGraphics.DrawProgressBar(r, dp.Item.AccessoryProgress, '%.0f%%', 100, c, fc);\r\n end;\r\n tviaBadge: DrawBadge(AGraphics, r, dp.Item);\r\n tviaButton:\r\n begin\r\n AGraphics.DrawButton(r, dp.Item = FActiveAccessoryItem);\r\n AGraphics.DrawText(r, dp.Item.AccessoryText, True, gtaCenter);\r\n end;\r\n tviaCustom: DoDrawItemCustomAccessory(AGraphics, r, dp.Item);\r\n end;\r\n end;\r\n end;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoEditButtonClicked(Sender: TObject);\r\nbegin\r\n StartEditMode;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoEditChange(Sender: TObject);\r\nvar\r\n f: TTMSFNCTableViewFilterData;\r\n a: Boolean;\r\nbegin\r\n RemoveFilters;\r\n f := Filter.Add;\r\n f.CaseSensitive := False;\r\n f.Condition := '\"*'+FEdit.Text+'*\"';\r\n\r\n a := True;\r\n DoBeforeApplyFilter(f, a);\r\n if a then\r\n begin\r\n ApplyFilter;\r\n DoAfterApplyFilter(f);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoEnter;\r\nbegin\r\n inherited;\r\n if Assigned(FTreeView) and FTreeView.AllowFocus then\r\n FTreeView.SetFocus;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoFilterSelect(Sender: TObject; AColumn: integer;\r\n var ACondition: string);\r\nbegin\r\n if Assigned(OnFilterSelect) then\r\n OnFilterSelect(Self, ACondition);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetColumnHorizontalTextAlign(Sender: TObject;\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n case AKind of\r\n ikColumnTop: AHorizontalTextAlign := Header.HorizontalTextAlign;\r\n ikColumnBottom: AHorizontalTextAlign := Footer.HorizontalTextAlign;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetColumnText(Sender: TObject;\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind; var AText: String);\r\nbegin\r\n case AKind of\r\n ikColumnTop: AText := Header.Text;\r\n ikColumnBottom: AText := Footer.Text;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetColumnTrimming(Sender: TObject;\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind;\r\n var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n case AKind of\r\n ikColumnTop: ATrimming := Header.Trimming;\r\n ikColumnBottom: ATrimming := Footer.Trimming;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetColumnVerticalTextAlign(Sender: TObject;\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n case AKind of\r\n ikColumnTop: AVerticalTextAlign := Header.VerticalTextAlign;\r\n ikColumnBottom: AVerticalTextAlign := Footer.VerticalTextAlign;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetColumnWordWrapping(Sender: TObject;\r\n AColumn: Integer; AKind: TTMSFNCTreeViewCacheItemKind;\r\n var AWordWrapping: Boolean);\r\nbegin\r\n case AKind of\r\n ikColumnTop: AWordWrapping := Header.WordWrapping;\r\n ikColumnBottom: AWordWrapping := Footer.WordWrapping;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetHTMLTemplate(AItem: TTMSFNCTableViewItem;\r\n var AHTMLTemplate: string);\r\nbegin\r\n if Assigned(OnGetHTMLTemplate) then\r\n OnGetHTMLTemplate(Self, AItem, AHTMLTemplate);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetHTMLTemplateValue(\r\n AItem: TTMSFNCTableViewItem; AName: string; var AValue: string);\r\nbegin\r\n if Assigned(OnGetHTMLTemplateValue) then\r\n OnGetHTMLTemplateValue(Self, AItem, AName, AValue);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoIsNodeExtended(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; var AExtended: Boolean);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikCategory: AExtended := True;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeCheckType(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ACheckType: TTMSFNCTreeViewNodeCheckType);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\n i: Integer;\r\nbegin\r\n if FEditMode then\r\n begin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n begin\r\n i := Integer(dp.Item.CheckType);\r\n ACheckType := TTMSFNCTreeViewNodeCheckType(i);\r\n end;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeDisabledTextColor(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ADisabledTextColor: TTMSFNCGraphicsColor);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ADisabledTextColor := dp.Item.DisabledTextColor;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeDisabledTitleColor(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ADisabledTitleColor: TTMSFNCGraphicsColor);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ADisabledTitleColor := dp.Item.DisabledTitleColor;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeHeight(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AHeight: Double);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if ItemAppearance.Height > -1 then\r\n AHeight := ItemAppearance.Height;\r\n\r\n if Assigned(dp.Item) and (dp.Item.Height > -1) then\r\n AHeight := dp.Item.Height;\r\n end;\r\n tvikCategory:\r\n begin\r\n if CategoryAppearance.Height > -1 then\r\n AHeight := CategoryAppearance.Height;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeHorizontalTextAlign(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AHorizontalTextAlign := dp.Item.HorizontalTextAlign;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeVerticalTextAlign(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AVerticalTextAlign := dp.Item.VerticalTextAlign;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeIcon(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; ALarge: Boolean;\r\n var AIcon: TTMSFNCBitmap);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n begin\r\n if Assigned(BitmapContainer) and (dp.Item.BitmapName <> '') then\r\n AIcon := BitmapContainer.FindBitmap(dp.Item.BitmapName);\r\n\r\n if not Assigned(AIcon) then\r\n AIcon := dp.Item.Bitmap;\r\n end;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeSelectedTextColor(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ASelectedTextColor: TTMSFNCGraphicsColor);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ASelectedTextColor := dp.Item.SelectedTextColor;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeSelectedTitleColor(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ASelectedTitleColor: TTMSFNCGraphicsColor);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ASelectedTitleColor := dp.Item.SelectedTitleColor;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeSides(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; var ASides: TTMSFNCGraphicsSides);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n if not FTreeView.IsVirtualNodeSelected(ANode) and not (dp.Kind = tvikCategory) then\r\n begin\r\n if FTreeView.GetLastVirtualNode = ANode then\r\n ASides := []\r\n else\r\n begin\r\n n := FTreeView.GetNextVirtualNode(ANode);\r\n if Assigned(n) and (n.Row >= 0) and (n.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[n.Row];\r\n if dp.Kind = tvikItem then\r\n ASides := [gsBottom]\r\n else\r\n ASides := [];\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.HideDetailControl;\r\nvar\r\n a: Boolean;\r\nbegin\r\n if (Assigned(FTreeView) and FTreeView.FReloadActive) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FTreeView.StopAnimationTimer;\r\n\r\n a := True;\r\n DoBeforeItemHideDetailControl(FActiveDetailItem, FActiveDetailControl, a);\r\n\r\n if Assigned(FActiveDetailControl) and Assigned(FTreeView) and a then\r\n begin\r\n FShowDetailControl := True;\r\n UpdateActiveDetailControl;\r\n FDetailControlTimer.Enabled := True;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.HideMoreOptions;\r\nbegin\r\n if (Assigned(FTreeView) and (FTreeView.FReloadActive or FFilterActive or Assigned(FActiveDetailControl))) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FTreeView.FAnimateMoreOptions := False;\r\n FTreeView.FAnimateMoreOptionsClose := True;\r\n FTreeView.FMoreOffsetTo := 0;\r\n FTreeView.FAnimTimer.Enabled := True;\r\n FTreeView.BlockMouseClick := False;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.HTMLReplace(AValue: string; AItem: TTMSFNCTableViewItem): string;\r\nvar\r\n beforetag, aftertag, nm, vl: string;\r\n i, j: integer;\r\nbegin\r\n Result := '';\r\n if not Assigned(AItem) then\r\n Exit;\r\n\r\n beforetag := '';\r\n\r\n while Pos('<#', AValue) > 0 do\r\n begin\r\n i := pos('<#', AValue);\r\n beforetag := beforetag + copy(AValue, 1, i - 1); //part prior to the tag\r\n aftertag := copy(AValue, i, length(AValue)); //part after the tag\r\n j := pos('>', aftertag);\r\n nm := copy(aftertag, 1, j - 1);\r\n Delete(nm, 1, 2);\r\n Delete(AValue, 1, i + j - 1);\r\n vl := AItem.HTMLTemplateItems.Values[nm];\r\n DoGetHTMLTemplateValue(AItem, nm, vl);\r\n beforetag := beforetag + vl;\r\n end;\r\n\r\n Result := beforetag + AValue;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTitleExpanded(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; var AExpanded: Boolean);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AExpanded := dp.Item.TitleExpanded;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTitle(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var ATitle: String);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ATitle := dp.Item.GetTitle;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTitleColor(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATitleColor: TTMSFNCGraphicsColor);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ATitleColor := dp.Item.TitleColor;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTitleHorizontalTextAlign(\r\n Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AHorizontalTextAlign: TTMSFNCGraphicsTextAlign);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AHorizontalTextAlign := dp.Item.TitleHorizontalTextAlign;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTitleTrimming(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ATrimming := dp.Item.TitleTrimming;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTitleVerticalTextAlign(\r\n Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AVerticalTextAlign: TTMSFNCGraphicsTextAlign);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AVerticalTextAlign := dp.Item.TitleVerticalTextAlign;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTitleWordWrapping(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AWordWrapping: Boolean);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AWordWrapping := dp.Item.TitleWordWrapping;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeText(Sender: TObject; ANode: TTMSFNCTreeViewVirtualNode;\r\n AColumn: Integer; AMode: TTMSFNCTreeViewNodeTextMode; var AText: String);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AText := dp.Item.GetText;\r\n end;\r\n tvikCategory: AText := dp.Text;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTextColor(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATextColor: TTMSFNCGraphicsColor);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ATextColor := dp.Item.TextColor;\r\n end;\r\n tvikCategory: ATextColor := CategoryAppearance.Font.Color;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeTrimming(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var ATrimming: TTMSFNCGraphicsTextTrimming);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n ATrimming := dp.Item.Trimming;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeWordWrapping(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AWordWrapping: Boolean);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AWordWrapping := dp.Item.WordWrapping;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNodeExtraSize(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer;\r\n var AExtraSize: Single);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if not Assigned(FTreeView) then\r\n Exit;\r\n\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) and (dp.Item.AccessoryWidth > 0) then\r\n AExtraSize := dp.Item.AccessoryWidth + 8;\r\n\r\n if dp.Item = FTreeView.FMoreOffsetItem then\r\n AExtraSize := AExtraSize + FTreeView.FMoreOffset;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoGetNumberOfNodes(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; var ANumberOfNodes: Integer);\r\nbegin\r\n if ANode.Level = -1 then\r\n ANumberOfNodes := FDisplayList.Count;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoIsNodeChecked(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; var AIsChecked: Boolean);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AIsChecked := dp.Item.Checked;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoIsNodeEnabled(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; var AEnabled: Boolean);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n if (ANode.Row >= 0) and (ANode.Row <= FDisplayList.Count - 1) then\r\n begin\r\n dp := FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n AEnabled := dp.Item.Enabled;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoLookup(Sender: TObject; ALookupString: String);\r\nbegin\r\n LookupItem(ALookupString, Interaction.Lookup.CaseSensitive, Interaction.Lookup.AutoSelect)\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoItemMoreOptionClick(AItem: TTMSFNCTableViewItem; AMoreOption: TTMSFNCTableViewMoreOption);\r\nbegin\r\n if Assigned(OnItemMoreOptionClick) then\r\n OnItemMoreOptionClick(Self, AItem, AMoreOption);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoItemShowDetailControl(\r\n AItem: TTMSFNCTableViewItem; ADetailControl: TControl);\r\nbegin\r\n if Assigned(OnItemShowDetailControl) then\r\n OnItemShowDetailControl(Self, AItem, ADetailControl);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoNeedFilterDropDownData(Sender: TObject;\r\n AColumn: Integer; AValues: TStrings);\r\nbegin\r\n if Assigned(OnNeedFilterDropDownData) then\r\n OnNeedFilterDropDownData(Self, AValues);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoNodeAnchorClick(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AAnchor: String);\r\nbegin\r\n if Assigned(OnItemAnchorClick) then\r\n OnItemAnchorClick(Self, GetItemForNode(ANode), AAnchor)\r\n else if Interaction.AutoOpenURL then\r\n TTMSFNCUtils.OpenURL(AAnchor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoNodeClick(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n it := GetItemForNode(ANode);\r\n\r\n if Assigned(it) and (Interaction.ShowDetailMode = tvdtAfterSelectItem) and not FEditMode then\r\n begin\r\n FActiveDetailItem := it;\r\n it.ShowDetailControl;\r\n end;\r\n\r\n if Assigned(it) and FEditMode then\r\n begin\r\n if it.Checked then\r\n begin\r\n it.Checked := False;\r\n FTreeView.DoAfterUnSelectNode(ANode);\r\n end\r\n else\r\n begin\r\n it.Checked := True;\r\n FTreeView.DoAfterSelectNode(ANode);\r\n end;\r\n\r\n SelectAllCheckedItems;\r\n end;\r\n\r\n if Assigned(OnItemClick) then\r\n OnItemClick(Self, GetItemForNode(ANode));\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoItemCheckChanged(AItem: TTMSFNCTableViewItem);\r\nbegin\r\n if Assigned(OnItemCheckChanged) then\r\n OnItemCheckChanged(Self, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoItemCompare(AItem1: TTMSFNCTableViewItem; AItem2: TTMSFNCTableViewItem; var ACompareResult: Integer);\r\nbegin\r\n if Assigned(OnItemCompare) then\r\n OnItemCompare(Self, AItem1, AItem2, ACompareResult);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoItemHideDetailControl(\r\n AItem: TTMSFNCTableViewItem; ADetailControl: TControl);\r\nbegin\r\n if Assigned(OnItemHideDetailControl) then\r\n OnItemHideDetailControl(Self, AItem, ADetailControl);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoNodeDblClick(Sender: TObject;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n if Assigned(OnItemDblClick) then\r\n OnItemDblClick(Self, GetItemForNode(ANode));\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoPasteFromClipboard(Sender: TObject);\r\nbegin\r\n PasteFromClipboard;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoFilterButtonClicked(Sender: TObject);\r\nbegin\r\n StartFiltering;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoStartReload;\r\nbegin\r\n if Assigned(OnStartReload) then\r\n OnStartReload(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoStopReload;\r\nbegin\r\n if Assigned(OnStopReload) then\r\n OnStopReload(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DoVScroll(Sender: TObject; APosition: Single);\r\nbegin\r\n if Assigned(OnVScroll) then\r\n OnVScroll(Self, APosition);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DragItemAdd(ANewItem, AAssignItem, AInsertItem: TTMSFNCTableViewItem);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DragItemDelete(AItem: TTMSFNCTableViewItem);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DragItemMove(AFromItem,\r\n AToItem: TTMSFNCTableViewItem);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.DrawBadge(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItem: TTMSFNCTableViewItem);\r\nvar\r\n r: TRectF;\r\n sz: TSizeF;\r\n s: String;\r\n pth: TTMSFNCGraphicsPath;\r\n rnd: Single;\r\nbegin\r\n if (AItem.AccessoryText = '') then\r\n Exit;\r\n\r\n AGraphics.Font.Assign(ItemAppearance.AccessoryFont);\r\n AGraphics.Stroke.Assign(ItemAppearance.AccessoryStroke);\r\n AGraphics.Fill.Assign(ItemAppearance.AccessoryFill);\r\n\r\n if AItem.AccessoryFontColor <> gcNull then\r\n AGraphics.Font.Color := AItem.AccessoryFontColor;\r\n\r\n if AItem.AccessoryBorderColor <> gcNull then\r\n AGraphics.Stroke.Color := AItem.AccessoryBorderColor;\r\n\r\n if AItem.AccessoryColor <> gcNull then\r\n AGraphics.Fill.Color := AItem.AccessoryColor;\r\n\r\n s := AItem.AccessoryText;\r\n sz := AGraphics.CalculateTextSize(s);\r\n sz.cy := sz.cy + 4;\r\n sz.cx := Max(sz.cy, sz.cx + 6);\r\n\r\n r := ARect;\r\n\r\n r := RectF(r.Left + ((r.Right - r.Left) - sz.cx) / 2, r.Top + ((r.Bottom - r.Top) - sz.cy) / 2,\r\n r.Left + ((r.Right - r.Left) - sz.cx) / 2 + sz.cx, r.Top + ((r.Bottom - r.Top) - sz.cy) / 2 + sz.cy);\r\n\r\n rnd := (r.Bottom - r.Top) / 2;\r\n\r\n pth := TTMSFNCGraphicsPath.Create;\r\n try\r\n pth.AddArc(PointF(r.Left + rnd, r.Top + rnd), PointF(rnd, rnd), 180, 90);\r\n pth.AddArc(PointF(r.Right - rnd, r.Top + rnd), PointF(rnd, rnd), -90, 90);\r\n pth.AddArc(PointF(r.Right - rnd, r.Bottom - rnd), PointF(rnd, rnd), 0, 90);\r\n pth.AddArc(PointF(r.Left + rnd, r.Bottom - rnd), PointF(rnd, rnd), -270, 90);\r\n pth.ClosePath;\r\n AGraphics.DrawPath(pth);\r\n finally\r\n pth.Free;\r\n end;\r\n\r\n AGraphics.DrawText(r, s, False, gtaCenter, gtaCenter);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.StartEditMode;\r\nbegin\r\n if (Assigned(FTreeView) and FTreeView.FReloadActive) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FEditMode := True;\r\n UpdateTableView;\r\n SelectAllCheckedItems ;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.StartFiltering;\r\nbegin\r\n if (Assigned(FTreeView) and (FTreeView.FReloadActive or FFilterActive)) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FFilterActive := True;\r\n RemoveFilters;\r\n UpdateTableView;\r\n FEdit.Text := '';\r\n FEdit.SetFocus;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.StartReload;\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.StartReload;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.EnableInteraction;\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.BlockUserInput := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.EndUpdate;\r\nbegin\r\n inherited;\r\n Dec(FUpdateCount);\r\n if FUpdateCount = 0 then\r\n UpdateTableView;\r\n\r\n if Assigned(FTreeView) then\r\n FTreeView.EndUpdate;\r\n\r\n SelectItem(FSaveSelectedItem);\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.FindCategoryWithCharacter(\r\n ACategory: String): TTMSFNCTableViewDisplayItem;\r\nvar\r\n I: Integer;\r\n cat: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n Result.Kind := tvikNone;\r\n Result.Item := nil;\r\n Result.CategoryID := -1;\r\n Result.Text := '';\r\n for I := 0 to FCategoryList.Count - 1 do\r\n begin\r\n cat := FCategoryList[I];\r\n if cat.Text = ACategory then\r\n begin\r\n Result := cat;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.FindCategoryWithCharacterID(\r\n ACategoryID: Integer): TTMSFNCTableViewDisplayItem;\r\nvar\r\n I: Integer;\r\n cat: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n Result.Kind := tvikNone;\r\n Result.Item := nil;\r\n Result.CategoryID := -1;\r\n Result.Text := '';\r\n for I := 0 to FCategoryList.Count - 1 do\r\n begin\r\n cat := FCategoryList[I];\r\n if cat.CategoryID = ACategoryID then\r\n begin\r\n Result := cat;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.FindFirstItemWithCategory(\r\n ACategory: String): TTMSFNCTableViewItem;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if GetCharacterForItem(Items[I]) = ACategory then\r\n begin\r\n Result := Items[I];\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.FindFirstItemWithCategoryID(\r\n ACategoryID: Integer): TTMSFNCTableViewItem;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if Items[I].CategoryID = ACategoryID then\r\n begin\r\n Result := Items[I];\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.BitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetCharacter(Idx: Integer): String;\r\nbegin\r\n Result := '';\r\n if (CategoryType = tvctAlphaNumericLast) or (CategoryType = tvctAlphaBetic) then\r\n begin\r\n if Idx < 27 then\r\n Result := chr(ord('A') + (Idx - 1))\r\n else\r\n Result := chr(ord('0') + (Idx - 27));\r\n end\r\n else\r\n begin\r\n if Idx < 11 then\r\n Result := chr(ord('0') + (Idx - 1))\r\n else\r\n Result := chr(ord('A') + (Idx - 11));\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetCharacterCount: Integer;\r\nbegin\r\n Result := 26;\r\n if (CategoryType = tvctAlphaNumericFirst) or (CategoryType = tvctAlphaNumericLast) then\r\n Result := 36;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetCharacterForItem(\r\n AItem: TTMSFNCTableViewItem): String;\r\nvar\r\n cat: TTMSFNCTableViewCategory;\r\n s: string;\r\n idx: Integer;\r\nbegin\r\n Result := '';\r\n case CategoryType of\r\n tvctAlphaNumericFirst, tvctAlphaNumericLast, tvctAlphaBetic:\r\n begin\r\n s := AItem.StrippedHTMLText;\r\n if Length(s) > 0 then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n Result := s[0]\r\n {$ELSE}\r\n Result := s[1]\r\n {$ENDIF}\r\n end\r\n else\r\n Result := '';\r\n end;\r\n tvctCustom:\r\n begin\r\n idx := Categories.ItemIndexByID(AItem.CategoryID);\r\n if (idx >= 0) and (idx <= Categories.Count - 1) then\r\n begin\r\n cat := Categories[idx];\r\n Result := cat.Text;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetChecked(AItemIndex: Integer): Boolean;\r\nbegin\r\n Result := False;\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) then\r\n Result := Items[AItemIndex].Checked;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetCheckedItem(\r\n AItem: TTMSFNCTableViewItem): Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(AItem) then\r\n Result := AItem.Checked;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetDisplayCategoryIndex(AIndex: Integer): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n for I := FDisplayList.Count - 1 downto 0 do\r\n begin\r\n if (FDisplayList[I].Kind = tvikCategory) and (I <= AIndex) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetDisplayItemIndex(AIndex: Integer): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n for I := FDisplayList.Count - 1 downto 0 do\r\n begin\r\n if (FDisplayList[I].Kind = tvikItem) and (I <= AIndex) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetFill: TTMSFNCGraphicsFill;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := TTMSFNCTreeViewOpen(FTreeView).Fill;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetItemForNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): TTMSFNCTableViewItem;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := nil;\r\n i := GetItemIndexForNode(ANode);\r\n if (i >= 0) and (i <= Items.Count - 1) then\r\n Result := Items[i];\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetItemIndex: Integer;\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n Result := -1;\r\n if Assigned(FTreeView) and (FTreeView.SelectedVirtualNodeCount > 0) and Assigned(FTreeView.SelectedVirtualNodes[0]) then\r\n begin\r\n it := GetItemForNode(FTreeView.SelectedVirtualNode);\r\n if Assigned(it) then\r\n Result := it.Index;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetItemIndexForNode(\r\n ANode: TTMSFNCTreeViewVirtualNode): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(ANode) then\r\n begin\r\n for I := 0 to FDisplayList.Count - 1 do\r\n begin\r\n if (FDisplayList[I].Row = ANode.Row) and Assigned(FDisplayList[I].Item) then\r\n begin\r\n Result := FDisplayList[I].Item.Index;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetItemsFromClipboard: TTMSFNCTableViewCopyItems;\r\nvar\r\n s: String;\r\n a: TStringList;\r\n AItem: TTMSFNCTableViewItem;\r\n I: Integer;\r\n CurrStr: String;\r\n templ: TTMSFNCCustomTableView;\r\nbegin\r\n if TTMSFNCClipBoard.HasFormat(TTMSFNCClipBoardFormat.cfText) then\r\n begin\r\n s := TTMSFNCClipBoard.GetText;\r\n if (Pos(CLP_FMT, s) > 0) then\r\n begin\r\n templ := TTMSFNCCustomTableView.Create(nil);\r\n a := TStringList.Create;\r\n try\r\n s := StringReplace(s, CLP_FMT, '', [rfReplaceAll]);\r\n a.Text := s;\r\n try\r\n for I := 0 to a.Count - 1 do\r\n begin\r\n CurrStr := a[i];\r\n AItem := templ.AddItem;\r\n AItem.LoadFromString(CurrStr);\r\n end;\r\n finally\r\n end;\r\n finally\r\n FCopyItems.Assign(templ.Items);\r\n a.Free;\r\n templ.Free;\r\n end;\r\n end;\r\n end;\r\n\r\n Result := FCopyItems;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetItemsRect: TRectF;\r\nbegin\r\n Result := EmptyRect;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.GetNodesRect;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetMoreOptionsSize: Single;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := 0;\r\n for I := 0 to MoreOptions.Count - 1 do\r\n Result := Result + MoreOptions[I].Width;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetNextDisplayCategoryIndex(\r\n AIndex: Integer): Integer;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := -1;\r\n for I := AIndex + 1 to FDisplayList.Count - 1 do\r\n begin\r\n if FDisplayList[I].Kind = tvikCategory then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetNodeForItemIndex(\r\n AItemIndex: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := TTMSFNCTreeViewOpen(FTreeView).GetNodeForRow(GetRowForItemIndex(AItemIndex));\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetRowForItemIndex(\r\n AItemIndex: Integer): Integer;\r\nvar\r\n I: Integer;\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n Result := -1;\r\n for I := 0 to FDisplayList.Count - 1 do\r\n begin\r\n dp := FDisplayList[I];\r\n if Assigned(dp.Item) and (dp.Item.Index = AItemIndex) and (dp.Kind = tvikItem) then\r\n begin\r\n Result := dp.Item.FRow;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetSelectedItem: TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n if (ItemIndex >= 0) and (ItemIndex <= Items.Count - 1) then\r\n Result := Items[ItemIndex];\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetSelectedItems: TTMSFNCTableViewSelectedItems;\r\nvar\r\n I: Integer;\r\n n: TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n for I := 0 to SelectedItemCount - 1 do\r\n begin\r\n n := SelectedItems[I] as TTMSFNCTableViewItem;\r\n SetLength(Result, Length(Result) + 1);\r\n Result[Length(Result) - 1] := n;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetSelItem(AIndex: Integer): TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := GetItemForNode(FTreeView.SelectedVirtualNodes[AIndex]);\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetStroke: TTMSFNCGraphicsStroke;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n Result := TTMSFNCTreeViewOpen(FTreeView).Stroke;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetVersion: string;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.GetVerticalScrollBarVisible: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.VerticalScrollBarVisible;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.InitSample;\r\nbegin\r\n BeginUpdate;\r\n Header.Text := 'Item List';\r\n Footer.Text := '';\r\n Items.Clear;\r\n AddItem('Mercedes');\r\n AddItem('Audi');\r\n AddItem('BMW');\r\n AddItem('Land Rover');\r\n AddItem('Bugatti');\r\n EndUpdate;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.IsItemSelectable(AItem: TTMSFNCTableViewItem): Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(AItem) then\r\n begin\r\n Result := AItem.Enabled;\r\n if not (TTMSFNCTreeViewOpen(FTreeView).VisibleNodes.IndexOf(GetNodeForItemIndex(AItem.Index)) > -1) then\r\n Result := False;\r\n end\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.ItemFromDifferentCategory(AItem1,\r\n AItem2: TTMSFNCTableViewItem): Boolean;\r\nvar\r\n s1, s2: string;\r\nbegin\r\n Result := False;\r\n if (AItem1 = nil) or (AItem2 = nil) then\r\n begin\r\n Result := true\r\n end\r\n else\r\n begin\r\n case CategoryType of\r\n tvctAlphaBetic, tvctAlphaNumericFirst, tvctAlphaNumericLast:\r\n begin\r\n s1 := AItem1.StrippedHTMLText;\r\n s2 := AItem2.StrippedHTMLText;\r\n if (Length(s1) > 0) and (Length(s2) > 0) then\r\n begin\r\n {$IFDEF FMXMOBILE}\r\n Result := (s1[0] <> s2[0]);\r\n {$ELSE}\r\n Result := (s1[1] <> s2[1]);\r\n {$ENDIF}\r\n end\r\n else\r\n begin\r\n if (Length(s1) = 0) and (Length(s2) = 0) then\r\n Result := false\r\n else\r\n Result := true;\r\n end;\r\n end;\r\n tvctCustom:\r\n begin\r\n if (AItem1.CategoryID > -1) and (AItem2.CategoryID > -1) then\r\n Result := (AItem1.CategoryID <> AItem2.CategoryID)\r\n else\r\n Result := not ((AItem1.CategoryID = -1) and (AItem2.CategoryID = -1));\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomTableView.LoadFromFile(AFileName: string);\r\nvar\r\n Stream: TStream;\r\nbegin\r\n Stream := TFileStream.Create(AFileName, fmOpenRead);\r\n try\r\n LoadFromStream(Stream);\r\n finally\r\n Stream.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.LoadFromStream(AStream: TStream);\r\nvar\r\n List: TStringList;\r\n AItem: TTMSFNCTableViewItem;\r\n i: Integer;\r\n CurrStr: string;\r\nbegin\r\n List := TStringList.Create;\r\n BeginUpdate;\r\n try\r\n try\r\n Items.Clear;\r\n List.LoadFromStream(AStream);\r\n for i := 0 to List.Count - 1 do\r\n begin\r\n CurrStr := List[i];\r\n AItem := AddItem;\r\n if Assigned(AItem) then\r\n AItem.LoadFromString(CurrStr);\r\n end;\r\n finally\r\n EndUpdate;\r\n List.Free;\r\n end;\r\n except\r\n end;\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomTableView.LoadFromStrings(AStrings: TStrings);\r\nvar\r\n I: Integer;\r\nbegin\r\n BeginUpdate;\r\n Items.Clear;\r\n for I := 0 to AStrings.Count - 1 do\r\n Items.Add.Text := AStrings[I];\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.LookupCategory(ACategory: String);\r\nbegin\r\n if LookupBar.AutoLookup then\r\n ScrollToCategoryCharacter(ACategory)\r\n else\r\n begin\r\n if Assigned(OnManualLookupCategory) then\r\n OnManualLookupCategory(Self, ACategory, -1);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.LookupCustomCategory(ACategoryID: Integer);\r\nbegin\r\n if LookupBar.AutoLookup then\r\n ScrollToCategoryID(ACategoryID)\r\n else\r\n begin\r\n if Assigned(OnManualLookupCategory) then\r\n OnManualLookupCategory(Self, '', ACategoryID);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.LookupItem(ALookupString: String; ACaseSensitive,\r\n AAutoSelect: Boolean): TTMSFNCTableViewItem;\r\nvar\r\n v: String;\r\n it: TTMSFNCTableViewItem;\r\n i: Integer;\r\n s: String;\r\nbegin\r\n Result := nil;\r\n v := ALookupString;\r\n if not ACaseSensitive then\r\n v := Uppercase(v);\r\n\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n it := Items[I];\r\n s := it.StrippedHTMLText;\r\n\r\n if not ACaseSensitive then\r\n s := UpperCase(s);\r\n\r\n if Pos(v, s) = 1 then\r\n begin\r\n Result := it;\r\n Break;\r\n end;\r\n end;\r\n\r\n if Assigned(Result) and IsItemSelectable(Result) and AAutoSelect then\r\n begin\r\n SelectItem(Result.Index);\r\n ScrollToItem(Result.Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.MatchFilter(\r\n AItem: TTMSFNCTableViewItem): Boolean;\r\nvar\r\n i: Integer;\r\n s:string;\r\n temp: Boolean;\r\nbegin\r\n Result := True;\r\n for i := 1 to FFilter.Count do\r\n begin\r\n with FFilter.Items[i - 1] do\r\n begin\r\n s := AItem.StrippedHTMLText;\r\n s := Trim(s);\r\n\r\n if Prefix <> '' then\r\n if Pos(Prefix,s) = 1 then\r\n Delete(s,1,Length(FFilter.Items[i - 1].Prefix));\r\n\r\n if Suffix <> '' then\r\n if Pos(Suffix,s) = 1 + Length(s) - Length(Suffix) then\r\n Delete(s,1 + Length(s) - Length(Suffix),Length(s));\r\n\r\n temp := true;\r\n try\r\n if FFilter.Items[i - 1].Condition <> '' then\r\n temp := TTMSFNCUtils.MatchStrEx(Condition,s,CaseSensitive);\r\n except\r\n temp := false;\r\n end;\r\n\r\n case FFilter.Items[i - 1].Operation of\r\n tvfoSHORT:\r\n begin\r\n Result := temp;\r\n if not Result then\r\n Break;\r\n end;\r\n tvfoNONE: Result := temp;\r\n tvfoAND: Result := Result AND temp;\r\n tvfoOR: Result := Result OR temp;\r\n tvfoXOR: Result := Result XOR temp;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nvar\r\n i: Integer;\r\nbegin\r\n inherited;\r\n if not (csDestroying in ComponentState) and (Operation = opRemove) then\r\n begin\r\n for i := 0 to Items.Count - 1 do\r\n begin\r\n if AComponent = Items[i].FDetailControl then\r\n Items[i].FDetailControl := nil;\r\n end;\r\n\r\n if Assigned(DefaultItem) and (AComponent = DefaultItem.FDetailControl) then\r\n DefaultItem.FDetailControl := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.PasteFromClipboard;\r\nvar\r\n s: String;\r\n a: TStringList;\r\n AItem: TTMSFNCTableViewItem;\r\n I: Integer;\r\n CurrStr: String;\r\nbegin\r\n if TTMSFNCClipBoard.HasFormat(TTMSFNCClipBoardFormat.cfText) then\r\n begin\r\n s := TTMSFNCClipBoard.GetText;\r\n if (Pos(CLP_FMT, s) > 0) then\r\n begin\r\n a := TStringList.Create;\r\n try\r\n s := StringReplace(s, CLP_FMT, '', [rfReplaceAll]);\r\n a.Text := s;\r\n try\r\n for I := 0 to a.Count - 1 do\r\n begin\r\n CurrStr := a[i];\r\n AItem := AddItem;\r\n AItem.LoadFromString(CurrStr);\r\n end;\r\n finally\r\n end;\r\n finally\r\n a.Free;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.ReloadProgress: Single;\r\nbegin\r\n Result := 0;\r\n if Assigned(FTreeView) and (Reload.ProgressMode = tvrpmManual) then\r\n Result := FTreeView.FManualProgressSweepAngle / 360 * 100;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCCustomTableView);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.RemoveFilter;\r\nbegin\r\n FFilterApplied := False;\r\n UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.RemoveFilters;\r\nbegin\r\n FFilterApplied := False;\r\n Filter.Clear;\r\n UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.RemoveItem(AItem: TTMSFNCTableViewItem);\r\nbegin\r\n if Assigned(AItem) then\r\n Items.Delete(AItem.Index);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ResetToDefaultStyle;\r\nvar\r\n I: Integer;\r\nbegin\r\n inherited;\r\n Stroke.Color := MakeGraphicsColor(178, 178, 178);\r\n Header.Fill.Color := MakeGraphicsColor(249, 249, 249);\r\n Header.Fill.Kind := gfkSolid;\r\n Header.Stroke.Color := MakeGraphicsColor(178, 178, 178);\r\n Footer.Fill.Color := MakeGraphicsColor(249, 249, 249);\r\n Footer.Fill.Kind := gfkSolid;\r\n Footer.Stroke.Color := MakeGraphicsColor(178, 178, 178);\r\n ItemAppearance.SelectedFill.Color := MakeGraphicsColor(217, 217, 217);\r\n ItemAppearance.SelectedStroke.Color := MakeGraphicsColor(217, 217, 217);\r\n\r\n TTMSFNCUtils.SetFontSize(Header.Font, 16);\r\n TTMSFNCUtils.SetFontSize(Footer.Font, 16);\r\n\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n Items[I].TextColor := gcBlack;\r\n Items[I].SelectedTextColor := gcBlack;\r\n Items[I].TitleColor := gcBlack;\r\n Items[I].SelectedTitleColor := gcBlack;\r\n end;\r\nend;\r\n\r\n{$IFNDEF WEBLIB}\r\nprocedure TTMSFNCCustomTableView.SaveToFile(AFileName: string; ATextOnly: Boolean = True);\r\nvar\r\n Stream: TStream;\r\nbegin\r\n Stream := TFileStream.Create(AFileName, fmCreate);\r\n try\r\n SaveToStream(Stream, ATextOnly);\r\n finally\r\n Stream.Free;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SaveToStream(AStream: TStream; ATextOnly: Boolean = True);\r\nvar\r\n AItem: TTMSFNCTableViewItem;\r\n ItemStr: string;\r\n Buffer: TBytes;\r\n K: Integer;\r\n {$IFDEF LCLLIB}\r\n I: Integer;\r\n {$ENDIF}\r\nbegin\r\n for K := 0 to Items.Count - 1 do\r\n begin\r\n AItem := Items[K];\r\n ItemStr := AItem.SaveToString(ATextOnly);\r\n ItemStr := ItemStr + EndOfLine;\r\n {$IFNDEF LCLLIB}\r\n Buffer := TEncoding.Default.GetBytes(ItemStr);\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n SetLength(Buffer, Length(ItemStr));\r\n for I := 1 to Length(ItemStr) do\r\n Buffer[I - 1] := Ord(ItemStr[I]);\r\n {$ENDIF}\r\n\r\n {$IFDEF CMNLIB}\r\n AStream.Write(Buffer[0], Length(Buffer));\r\n {$ELSE}\r\n AStream.Write(Buffer, Length(Buffer));\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SaveToStrings(AStrings: TStrings);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Items.Count - 1 do\r\n AStrings.Add(Items[I].Text);\r\nend;\r\n{$ENDIF}\r\n\r\nprocedure TTMSFNCCustomTableView.ScrollToCategoryCharacter(ACharacter: String);\r\nvar\r\n cat: TTMSFNCTableViewDisplayItem;\r\n t: TTMSFNCTreeViewOpen;\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n cat := FindCategoryWithCharacter(ACharacter);\r\n if (cat.Row >= 0) and (cat.Row <= FDisplayList.Count - 1) then\r\n begin\r\n t := TTMSFNCTreeViewOpen(FTreeView);\r\n t.ScrollToVirtualNode(t.GetNodeForRow(cat.Row), True, tvnspTop, True);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ScrollToCategoryId(ACategoryID: Integer);\r\nvar\r\n cat: TTMSFNCTableViewDisplayItem;\r\n t: TTMSFNCTreeViewOpen;\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n cat := FindCategoryWithCharacterID(ACategoryID);\r\n if (cat.Row >= 0) and (cat.Row <= FDisplayList.Count - 1) then\r\n begin\r\n t := TTMSFNCTreeViewOpen(FTreeView);\r\n t.ScrollToVirtualNode(t.GetNodeForRow(cat.Row), True, tvnspTop, True);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ScrollToItem(AItemIndex: Integer);\r\nvar\r\n t: TTMSFNCTreeViewOpen;\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) then\r\n begin\r\n t := TTMSFNCTreeViewOpen(FTreeView);\r\n t.ScrollToVirtualNode(t.GetNodeForRow(GetRowForItemIndex(AItemIndex)), True, tvnspTop, True);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SelectAllCheckedItems;\r\nvar\r\n I: Integer;\r\n arr: TTMSFNCTableViewIntegerArray;\r\nbegin\r\n SetLength(arr, 0);\r\n for I := 0 to Items.Count - 1 do\r\n begin\r\n if Items[I].Checked then\r\n begin\r\n SetLength(arr, Length(arr) + 1);\r\n arr[Length(arr) - 1] := I;\r\n end;\r\n end;\r\n\r\n SelectItems(arr);\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.SelectedItemCount: Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(FTreeView) then\r\n Result := FTreeView.SelectedVirtualNodeCount;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SelectItem(AItemIndex: Integer);\r\nvar\r\n t: TTMSFNCTreeViewOpen;\r\n i: Integer;\r\nbegin\r\n if Assigned(FTreeView) and (AItemIndex <> -1) then\r\n begin\r\n i := Max(0, Min(AItemIndex, Items.Count - 1));\r\n if (i >= 0) and (i <= Items.Count - 1) then\r\n begin\r\n t := TTMSFNCTreeViewOpen(FTreeView);\r\n t.SelectVirtualNode(t.GetNodeForRow(GetRowForItemIndex(i)));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SelectItems(\r\n AItemIndexes: TTMSFNCTableViewIntegerArray);\r\nvar\r\n t: TTMSFNCTreeViewOpen;\r\n I: Integer;\r\n na: TTMSFNCTreeViewVirtualNodeArray;\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n t := TTMSFNCTreeViewOpen(FTreeView);\r\n SetLength(na, Length(AItemIndexes));\r\n for I := 0 to Length(AItemIndexes) - 1 do\r\n na[I] := t.GetNodeForRow(GetRowForItemIndex(AItemIndexes[I]));\r\n\r\n t.SelectVirtualNodes(na);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetItemAppearance(\r\n const Value: TTMSFNCTableViewItemAppearance);\r\nbegin\r\n FItemAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetLookupBar(const Value: TTMSFNCTableViewLookupBar);\r\nbegin\r\n FLookupBar.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetMoreOptionAppearance(\r\n const Value: TTMSFNCTableViewMoreOptionAppearance);\r\nbegin\r\n FMoreOptionAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetMoreOptions(\r\n const Value: TTMSFNCTableViewMoreOptions);\r\nbegin\r\n FMoreOptions.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetReload(\r\n const Value: TTMSFNCTableViewReload);\r\nbegin\r\n FReload.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetSelectedItem(const Value: TTMSFNCTableViewItem);\r\nbegin\r\n if Assigned(Value) then\r\n ItemIndex := Value.Index;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if Assigned(FTreeView) then\r\n TTMSFNCTreeViewOpen(FTreeView).Stroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetVerticalScrollBarVisible(\r\n const Value: Boolean);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.VerticalScrollBarVisible := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ShowDetailControl(AItemIndex: Integer);\r\nvar\r\n a: Boolean;\r\n cr: TRectF;\r\nbegin\r\n if (Assigned(FTreeView) and FTreeView.FReloadActive) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FTreeView.StopAnimationTimer;\r\n\r\n HideDetailControl;\r\n\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) then\r\n FActiveDetailControl := Items[AItemIndex].DetailControl;\r\n\r\n if not Assigned(FActiveDetailControl) then\r\n FActiveDetailControl := DefaultItem.DetailControl;\r\n\r\n a := True;\r\n DoBeforeItemShowDetailControl(FActiveDetailItem, FActiveDetailControl, a);\r\n\r\n if Assigned(FActiveDetailControl) and Assigned(FTreeView) and a then\r\n begin\r\n FShowDetailControl := False;\r\n FActiveDetailControl.Parent := Self;\r\n cr := FTreeView.GetContentRect;\r\n FDetailControlOffset := cr.Right - cr.Left;\r\n UpdateActiveDetailControl;\r\n FActiveDetailControl.Visible := True;\r\n FDetailControlTimer.Enabled := True;\r\n end\r\n else\r\n begin\r\n FActiveDetailControl := nil;\r\n FActiveDetailItem := nil;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ShowMoreOptions(AItem: TTMSFNCTableViewItem);\r\nbegin\r\n if (Assigned(FTreeView) and (FTreeView.FReloadActive or FFilterActive or Assigned(FActiveDetailControl))) or not Assigned(FTreeView) then\r\n Exit;\r\n\r\n FTreeView.FMoreOffsetItem := AItem;\r\n FTreeView.FMoreOffsetTo := GetMoreOptionsSize;\r\n FTreeView.BlockMouseClick := True;\r\n FTreeView.FAnimateMoreOptions := True;\r\n FTreeView.FAnimTimer.Enabled := True;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.Sort(ACaseSensitive: Boolean;\r\n ASortingMode: TTMSFNCTableViewItemsSortMode);\r\nbegin\r\n Items.Sort(ACaseSensitive, ASortingMode);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.StopReload;\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n FTreeView.FManualProgressSweepAngle := 0;\r\n FTreeView.FManualProgressStartAngle := 0;\r\n FTreeView.FAnimTimer.Enabled := False;\r\n FTreeView.BlockUserInput := False;\r\n FTreeView.FReloadActive := False;\r\n FTreeView.SetVerticalOffset(0);\r\n FTreeView.StartVerticalOffsetAnimation;\r\n DoStopReload;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.ToggleEditMode;\r\nbegin\r\n if FEditMode then\r\n StopEditMode\r\n else\r\n StartEditMode;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetAdaptToStyle(const Value: Boolean);\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.AdaptToStyle := AdaptToStyle;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nbegin\r\n FTreeView.BitmapContainer := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetCategories(\r\n const Value: TTMSFNCTableViewCategories);\r\nbegin\r\n FCategories.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetCategoryAppearance(\r\n const Value: TTMSFNCTableViewCategoryAppearance);\r\nbegin\r\n FCategoryAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetCategoryType(\r\n const Value: TTMSFNCTableViewCategoryType);\r\nbegin\r\n if FCategoryType <> Value then\r\n begin\r\n FCategoryType := Value;\r\n UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetChecked(AItemIndex: Integer;\r\n const Value: Boolean);\r\nbegin\r\n if (AItemIndex >= 0) and (AItemIndex <= Items.Count - 1) then\r\n Items[AItemIndex].Checked := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetCheckedItem(\r\n AItem: TTMSFNCTableViewItem; const Value: Boolean);\r\nbegin\r\n if Assigned(AItem) then\r\n AItem.Checked := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetDefaultItem(const Value: TTMSFNCTableViewItem);\r\nbegin\r\n FDefaultItem.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if Assigned(FTreeView) then\r\n TTMSFNCTreeViewOpen(FTreeView).Fill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetFooter(const Value: TTMSFNCTableViewFooter);\r\nbegin\r\n FFooter.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetHeader(const Value: TTMSFNCTableViewHeader);\r\nbegin\r\n FHeader.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetInteraction(\r\n const Value: TTMSFNCTableViewInteraction);\r\nbegin\r\n FInteraction.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetItemIndex(const Value: Integer);\r\nbegin\r\n SelectItem(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.SetItems(const Value: TTMSFNCTableViewItems);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.UnCheckAllItems;\r\nvar\r\n I: Integer;\r\nbegin\r\n BeginUpdate;\r\n for I := 0 to Items.Count - 1 do\r\n Items[I].Checked := False;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.UnSelectAllItems;\r\nbegin\r\n if Assigned(FTreeView) then\r\n FTreeView.UnSelectAllNodes;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.UpdateActiveDetailControl;\r\nvar\r\n r: TRectF;\r\nbegin\r\n if Assigned(FActiveDetailControl) and Assigned(FTreeView) then\r\n begin\r\n r := FTreeView.GetContentRect;\r\n InflateRectEx(r, -1, -1);\r\n r := RectF(r.Left + FDetailControlOffset, r.Top, r.Right + FDetailControlOffset, r.Bottom);\r\n FActiveDetailControl.SetBounds(Round(r.Left), Round(R.Top), Round((r.Right - r.Left)), Round((r.Bottom - r.Top)));\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n if Assigned(FTreeView) then\r\n FTreeView.SetBounds(0, 0, Width, Height);\r\n UpdateTableView(False);\r\n UpdateActiveDetailControl;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.UpdateReloadProgress(AProgress: Single; AAutoStopReload: Boolean = True);\r\nbegin\r\n if Assigned(FTreeView) then\r\n begin\r\n FTreeView.FManualProgressStartAngle := 0;\r\n FTreeView.FManualProgressSweepAngle := AProgress / 100 * 360;\r\n\r\n if AAutoStopReload and (AProgress >= 100) then\r\n StopReload\r\n else\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomTableView.UpdateTableView(ADisplayOnly: Boolean = False);\r\nvar\r\n sel: TTMSFNCTableViewItem;\r\n cr, hr: TRectF;\r\n szd: Single;\r\n szr: Single;\r\n szt: Single;\r\n b: Boolean;\r\nbegin\r\n if (FUpdateCount > 0) or IsDestroying then\r\n Exit;\r\n\r\n if Assigned(FTreeView) then\r\n begin\r\n if not ADisplayOnly then\r\n CalculateItems;\r\n\r\n sel := SelectedItem;\r\n\r\n if not FDetailControlTimer.Enabled then\r\n begin\r\n if FShowDetailControl then\r\n FDetailControlOffset := 0\r\n else\r\n begin\r\n cr := FTreeView.GetContentRect;\r\n FDetailControlOffset := cr.Right - cr.Left;\r\n end;\r\n end;\r\n\r\n if ADisplayOnly then\r\n FTreeView.UpdateTreeViewDisplay\r\n else\r\n begin\r\n FTreeView.BeginUpdate;\r\n FTreeView.ClearNodeList;\r\n FTreeView.EndUpdate;\r\n end;\r\n\r\n CalculateLookupBar;\r\n SelectedItem := sel;\r\n\r\n hr := FTreeView.GetColumnsTopRect; \r\n\r\n b := False;\r\n if Assigned(FColumn) then\r\n b := FColumn.Expanded;\r\n\r\n if not IsDesignTime and FFilterActive and b then\r\n FEdit.Parent := Self\r\n else\r\n FEdit.Parent := nil;\r\n\r\n FDoneButton.Visible := FEditMode or FFilterActive and not Assigned(FActiveDetailControl) and b;\r\n if not IsDesignTime and ((Header.Height > 0) and Header.Visible) then\r\n FDoneButton.Parent := Self\r\n else\r\n FDoneButton.Parent := nil;\r\n\r\n FBackButton.Visible := Assigned(FActiveDetailControl) and ((FShowDetailControl and not FDetailControlTimer.Enabled) or not FShowDetailControl) and b;\r\n if not IsDesignTime and ((Header.Height > 0) and Header.Visible) then\r\n FBackButton.Parent := Self\r\n else\r\n FBackButton.Parent := nil;\r\n\r\n FEditButton.Visible := not FEditMode and not FFilterActive and Interaction.ShowEditButton and not Assigned(FActiveDetailControl) and b;\r\n if not IsDesignTime and ((Header.Height > 0) and Header.Visible) then\r\n FEditButton.Parent := Self\r\n else\r\n FEditButton.Parent := nil;\r\n\r\n FFilterButton.Visible := Interaction.ShowFilterButton and not FFilterActive and not Assigned(FActiveDetailControl) and b;\r\n if not IsDesignTime and ((Header.Height > 0) and Header.Visible) then\r\n FFilterButton.Parent := Self\r\n else\r\n FFilterButton.Parent := nil;\r\n\r\n FBackButton.Height := Round((hr.Bottom - hr.Top) - 4);\r\n FDoneButton.Height := Round((hr.Bottom - hr.Top) - 4);\r\n FEditButton.Height := Round((hr.Bottom - hr.Top) - 4);\r\n FFilterButton.Height := Round((hr.Bottom - hr.Top) - 4);\r\n\r\n CustomizeButtons;\r\n\r\n szt := 0;\r\n if Assigned(FColumn) then\r\n begin\r\n if FColumn.Filtering.Enabled then\r\n begin\r\n szd := FColumn.Filtering.ButtonSize;\r\n szt := szt + szd + 4;\r\n end;\r\n\r\n if FColumn.Expandable then\r\n begin\r\n szr := FColumn.ExpandingButtonSize;\r\n szt := szt + szr + 6;\r\n end;\r\n\r\n if (TTMSFNCTreeViewColumnOpen(FColumn).SortKind <> nskNone) then\r\n begin\r\n szr := 8;\r\n szt := szt + szr + 6;\r\n end;\r\n end;\r\n\r\n FBackButton.SetBounds(Round(hr.Left + 3), Round(hr.Top + ((hr.Bottom - hr.Top) - FBackButton.Height) / 2), FBackButton.Width, FBackButton.Height);\r\n if FFilterButton.Visible then\r\n begin\r\n FFilterButton.SetBounds(Round(hr.Right - 3 - FFilterButton.Width - szt), Round(hr.Top + ((hr.Bottom - hr.Top) - FFilterButton.Height) / 2), FFilterButton.Width, FFilterButton.Height);\r\n FDoneButton.SetBounds(Round(hr.Right - 6 - FDoneButton.Width - FFilterButton.Width - szt), Round(hr.Top + Round(((hr.Bottom - hr.Top) - FDoneButton.Height) / 2)), FDoneButton.Width, FDoneButton.Height);\r\n FEditButton.SetBounds(Round(hr.Right - 6 - FEditButton.Width - FFilterButton.Width - szt), Round(hr.Top + Round(((hr.Bottom - hr.Top) - FEditButton.Height) / 2)), FEditButton.Width, FEditButton.Height);\r\n end\r\n else\r\n begin\r\n FDoneButton.SetBounds(Round(hr.Right - 3 - FDoneButton.Width - szt), Round(hr.Top + ((hr.Bottom - hr.Top) - FDoneButton.Height) / 2), FDoneButton.Width, FDoneButton.Height);\r\n FEditButton.SetBounds(Round(hr.Right - 3 - FEditButton.Width - szt), Round(hr.Top + ((hr.Bottom - hr.Top) - FEditButton.Height) / 2), FEditButton.Width, FEditButton.Height);\r\n end;\r\n\r\n if LookupBar.Visible and (CategoryType <> tvctNone) then\r\n begin\r\n case LookupBar.Position of\r\n tvlbpLeft: FEdit.SetBounds(Round(hr.Left + 1 + LookupBar.Width), Round(hr.Bottom), Round((hr.Right - hr.Left) - LookupBar.Width - 2), FEdit.Height);\r\n tvlbpRight: FEdit.SetBounds(Round(hr.Left + 1), Round(hr.Bottom + 1), Round((hr.Right - hr.Left) - LookupBar.Width - 2), FEdit.Height);\r\n end;\r\n end\r\n else\r\n FEdit.SetBounds(Round(hr.Left + 1), Round(hr.Bottom), Round((hr.Right - hr.Left) - 2), FEdit.Height);\r\n\r\n FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.XYToAccessoryItem(X,\r\n Y: Single): TTMSFNCTableViewItem;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\n r: TRectF;\r\n it: TTMSFNCTableViewItem;\r\n h: Single;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n begin\r\n n := FTreeView.XYToNode(X, Y);\r\n if Assigned(n) and (n.Row >= 0) and (n.Row <= Items.Count - 1) then\r\n begin\r\n it := GetItemForNode(n);\r\n if Assigned(it) and (it.Accessory in Interaction.AccessoryClickDetection) then\r\n begin\r\n r := n.ExtraRects[0];\r\n InflateRectEx(r, 0, -4);\r\n h := it.AccessoryHeight;\r\n r := RectF(r.Left, r.Top + ((r.Bottom - r.Top) - h) / 2, r.Right, r.Top + ((r.Bottom - r.Top) - h) / 2 + h);\r\n if PtInRectEx(r, PointF(X, Y)) then\r\n Result := it;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.XYToItem(X, Y: Single): TTMSFNCTableViewItem;\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTreeView) then\r\n begin\r\n n := FTreeView.XYToNode(X, Y);\r\n if Assigned(n) and (n.Row >= 0) and (n.Row <= FDisplayList.Count - 1) then\r\n Result := GetItemForNode(n);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.XYToItemIndex(X, Y: Single): Integer;\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n Result := - 1;\r\n it := XYToItem(X, Y);\r\n if Assigned(it) then\r\n Result := it.Index;\r\nend;\r\n\r\nfunction TTMSFNCCustomTableView.XYToMoreOption(X,\r\n Y: Single): TTMSFNCTableViewMoreOption;\r\nvar\r\n sz: Single;\r\n w: Single;\r\n r, rt: TRectF;\r\n n: TTMSFNCTreeViewVirtualNode;\r\n I: Integer;\r\n mo: TTMSFNCTableViewMoreOption;\r\nbegin\r\n Result := nil;\r\n\r\n if not Assigned(FTreeView) then\r\n Exit;\r\n\r\n n := FTreeView.XYToNode(X, Y, FTreeView.FMoreOffset);\r\n\r\n if not Assigned(n) or (GetItemForNode(n) <> FTreeView.FMoreOffsetItem) then\r\n Exit;\r\n\r\n if MoreOptions.Count > 0 then\r\n begin\r\n rt := n.ExtraRects[0];\r\n sz := FTreeView.FMoreOffset;\r\n w := sz / MoreOptions.Count;\r\n\r\n for I := 0 to MoreOptions.Count - 1 do\r\n begin\r\n mo := MoreOptions[I];\r\n r := RectF(rt.Right + w * I, rt.Top, rt.Right + w * (I + 1), rt.Bottom);\r\n if PtInRectEx(r, PointF(X, Y)) then\r\n begin\r\n Result := mo;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTableViewItems }\r\n\r\nfunction TTMSFNCTableViewItems.Add: TTMSFNCTableViewItem;\r\nbegin\r\n Result := TTMSFNCTableViewItem(inherited Add);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItems.Clear;\r\nvar\r\n l: TTMSFNCCustomTableView;\r\nbegin\r\n l := TableView;\r\n if Assigned(l) then\r\n l.BeginUpdate;\r\n inherited Clear;\r\n if Assigned(l) then\r\n l.EndUpdate;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItems.Compare(AItem1, AItem2: TTMSFNCTableViewItem;\r\n ACaseSensitive: Boolean; ASortingMode: TTMSFNCTableViewItemsSortMode): Integer;\r\nvar\r\n cIdx1, cIdx2: integer;\r\n itemcap1, itemcap2: String;\r\n l: TTMSFNCCustomTableView;\r\nbegin\r\n Result := 0;\r\n\r\n l := FTableView;\r\n if Assigned(l) then\r\n begin\r\n case l.CategoryType of\r\n tvctNone, tvctAlphaBetic, tvctAlphaNumericFirst, tvctAlphaNumericLast:\r\n begin\r\n if not ACaseSensitive then\r\n Result := AnsiCompareStr(UpperCase(AItem1.StrippedHTMLText), UpperCase(AItem2.StrippedHTMLText))\r\n else\r\n Result := AnsiCompareStr(AItem1.StrippedHTMLText, AItem2.StrippedHTMLText)\r\n end;\r\n tvctCustom:\r\n begin\r\n cIdx1 := l.Categories.ItemIndexById(AItem1.CategoryID);\r\n cIdx2 := l.Categories.ItemIndexById(AItem2.CategoryID);\r\n\r\n if cIdx1 < cIdx2 then\r\n result := -1\r\n else if cIdx1 > cIdx2 then\r\n result := 1\r\n else\r\n begin\r\n itemcap1 := AItem1.StrippedHTMLText;\r\n itemcap2 := AItem2.StrippedHTMLText;\r\n if not ACaseSensitive then\r\n begin\r\n itemcap1 := UpperCase(itemcap1);\r\n itemcap2 := UpperCase(itemcap2);\r\n end;\r\n\r\n if itemcap1 < itemcap2 then\r\n result := -1\r\n else if itemcap1 > itemcap2 then\r\n result := 1\r\n else\r\n result := 0\r\n end;\r\n end;\r\n end;\r\n\r\n case ASortingMode of\r\n tvismDescending: Result := Result * -1;\r\n end;\r\n\r\n l.DoItemCompare(AItem1, AItem1, Result);\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewItems.Create(ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n inherited Create(ATableView, GetItemClass);\r\n FTableView := ATableView;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItems.GetItem(Index: Integer): TTMSFNCTableViewItem;\r\nbegin\r\n Result := TTMSFNCTableViewItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTableViewItems.GetItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCTableViewItem;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItems.Insert(Index: Integer): TTMSFNCTableViewItem;\r\nbegin\r\n Result := TTMSFNCTableViewItem(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCTableViewItems.TableView: TTMSFNCCustomTableView;\r\nbegin\r\n Result := FTableView;\r\nend;\r\n\r\ntype\r\n {$HINTS OFF}\r\n TShadowedCollection = class(TPersistent)\r\n private\r\n {%H-}FItemClass: TCollectionItemClass;\r\n {$IFDEF LCLWEBLIB}\r\n FItems: TFPList;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n FItems: TList;\r\n {$ENDIF}\r\n end;\r\n {$HINTS ON}\r\n\r\nprocedure TTMSFNCTableViewItems.QuickSort(L, R: Integer; ACaseSensitive: Boolean;\r\n ASortingMode: TTMSFNCTableViewItemsSortMode);\r\nvar\r\n I, J, p: Integer;\r\n {$IFDEF LCLWEBLIB}\r\n SortList: TFPList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n {$IFDEF WEBLIB}\r\n Save: JSValue;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Save: Pointer;\r\n {$ENDIF}\r\n begin\r\n Save := SortList.Items[Index1];\r\n SortList.Items[Index1] := SortList.Items[Index2];\r\n SortList.Items[Index2] := Save;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n SortList: TList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n Save: TCollectionItem;\r\n begin\r\n Save := SortList[Index1];\r\n SortList[Index1] := SortList[Index2];\r\n SortList[Index2] := Save;\r\n Save.Index := Index2;\r\n end;\r\n {$ENDIF}\r\nbegin\r\n //This cast allows us to get at the private elements in the base class\r\n {$IFNDEF WEBLIB}\r\n SortList := {%H-}TShadowedCollection(Self).FItems;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n SortList := Self.FPList;\r\n {$ENDIF}\r\n\r\n repeat\r\n I := L;\r\n J := R;\r\n P := (L + R) shr 1;\r\n repeat\r\n while Compare(Items[I], Items[P], ACaseSensitive, ASortingMode) < 0 do\r\n Inc(I);\r\n while Compare(Items[J], Items[P], ACaseSensitive, ASortingMode) > 0 do\r\n Dec(J);\r\n if I <= J then\r\n begin\r\n ExchangeItems(I, J);\r\n if P = I then\r\n P := J\r\n else if P = J then\r\n P := I;\r\n Inc(I);\r\n Dec(J);\r\n end;\r\n until I > J;\r\n if L < J then\r\n QuickSort(L, J, ACaseSensitive, ASortingMode);\r\n L := I;\r\n until I >= R;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItems.SetItem(Index: Integer;\r\n const Value: TTMSFNCTableViewItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItems.Sort(ACaseSensitive: Boolean;\r\n ASortingMode: TTMSFNCTableViewItemsSortMode);\r\nvar\r\n l: TTMSFNCCustomTableView;\r\nbegin\r\n l := TableView;\r\n if Assigned(l) then\r\n begin\r\n l.BeginUpdate;\r\n BeginUpdate;\r\n if Count > 1 then\r\n QuickSort(0, Pred(Count), ACaseSensitive, ASortingMode);\r\n EndUpdate;\r\n l.EndUpdate;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTableViewItem }\r\n\r\nprocedure TTMSFNCTableViewItem.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewItem then\r\n begin\r\n FTag := (Source as TTMSFNCTableViewItem).Tag;\r\n FHTMLTemplateItems.Assign((Source as TTMSFNCTableViewItem).HTMLTemplateItems);\r\n FText := (Source as TTMSFNCTableViewItem).Text;\r\n FTrimming := (Source as TTMSFNCTableViewItem).Trimming;\r\n FWordWrapping := (Source as TTMSFNCTableViewItem).WordWrapping;\r\n FHorizontalTextAlign := (Source as TTMSFNCTableViewItem).HorizontalTextAlign;\r\n FVerticalTextAlign := (Source as TTMSFNCTableViewItem).VerticalTextAlign;\r\n FTextColor := (Source as TTMSFNCTableViewItem).TextColor;\r\n FSelectedTextColor := (Source as TTMSFNCTableViewItem).SelectedTextColor;\r\n FDisabledTextColor := (Source as TTMSFNCTableViewItem).DisabledTextColor;\r\n FTitle := (Source as TTMSFNCTableViewItem).Title;\r\n FTitleTrimming := (Source as TTMSFNCTableViewItem).TitleTrimming;\r\n FTitleWordWrapping := (Source as TTMSFNCTableViewItem).TitleWordWrapping;\r\n FTitleHorizontalTextAlign := (Source as TTMSFNCTableViewItem).TitleHorizontalTextAlign;\r\n FTitleVerticalTextAlign := (Source as TTMSFNCTableViewItem).TitleVerticalTextAlign;\r\n FTitleColor := (Source as TTMSFNCTableViewItem).TitleColor;\r\n FSelectedTitleColor := (Source as TTMSFNCTableViewItem).SelectedTitleColor;\r\n FDisabledTitleColor := (Source as TTMSFNCTableViewItem).DisabledTitleColor;\r\n FEnabled := (Source as TTMSFNCTableViewItem).Enabled;\r\n FAccessory := (Source as TTMSFNCTableViewItem).Accessory;\r\n FVisible := (Source as TTMSFNCTableViewItem).Visible;\r\n FBitmapName := (Source as TTMSFNCTableViewItem).BitmapName;\r\n FBitmap.Assign((Source as TTMSFNCTableViewItem).Bitmap);\r\n FHeight := (Source as TTMSFNCTableViewItem).Height;\r\n FCategoryID := (Source as TTMSFNCTableViewItem).CategoryID;\r\n FAccessoryWidth := (Source as TTMSFNCTableViewItem).AccessoryWidth;\r\n FAccessoryHeight := (Source as TTMSFNCTableViewItem).AccessoryHeight;\r\n FAccessoryProgress := (Source as TTMSFNCTableViewItem).AccessoryProgress;\r\n FAccessoryText := (Source as TTMSFNCTableViewItem).AccessoryText;\r\n FChecked := (Source as TTMSFNCTableViewItem).Checked;\r\n FCheckType := (Source as TTMSFNCTableViewItem).CheckType;\r\n FAccessoryFontColor := (Source as TTMSFNCTableViewItem).AccessoryFontColor;\r\n FAccessoryBorderColor := (Source as TTMSFNCTableViewItem).AccessoryBorderColor;\r\n FAccessoryColor := (Source as TTMSFNCTableViewItem).AccessoryColor;\r\n FEnableMoreOptions := (Source as TTMSFNCTableViewItem).EnableMoreOptions;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.AssignData(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewItem then\r\n begin\r\n FDataString := (Source as TTMSFNCTableViewItem).DataString;\r\n FDataBoolean := (Source as TTMSFNCTableViewItem).DataBoolean;\r\n FDataObject := (Source as TTMSFNCTableViewItem).DataObject;\r\n FDataInteger := (Source as TTMSFNCTableViewItem).DataInteger;\r\n FDBKey := (Source as TTMSFNCTableViewItem).DBKey;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.BitmapChanged(Sender: TObject);\r\nbegin\r\n UpdateItem;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.Changed(Sender: TObject);\r\nbegin\r\n UpdateItem;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewItem.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FTableView := (Collection as TTMSFNCTableViewItems).TableView;\r\n\r\n FTextColor := gcBlack;\r\n FEnableMoreOptions := True;\r\n FTitleExpanded := True;\r\n FChecked := False;\r\n FCheckType := tvictNone;\r\n FCategoryID := -1;\r\n FAccessoryFontColor := gcNull;\r\n FAccessoryColor := gcNull;\r\n FAccessoryBorderColor := gcNull;\r\n FHeight := -1;\r\n FEnabled := True;\r\n FAccessory := tviaNone;\r\n FAccessoryWidth := 24;\r\n FAccessoryHeight := 24;\r\n FAccessoryProgress := 0;\r\n if Assigned(FTableView) and FTableView.IsDesignTime then\r\n FAccessoryText := 'Button';\r\n FVisible := True;\r\n FHTMLTemplateItems := TStringList.Create;\r\n FHTMLTemplateItems.OnChange := @TemplateItemsChanged;\r\n FTitleColor := gcBlack;\r\n FSelectedTextColor := gcBlack;\r\n FDisabledTextColor := gcSilver;\r\n FWordWrapping := true;\r\n FHorizontalTextAlign := gtaLeading;\r\n FVerticalTextAlign := gtaCenter;\r\n FTrimming := gttNone;\r\n FSelectedTitleColor := gcBlack;\r\n FDisabledTitleColor := gcSilver;\r\n FTitleWordWrapping := true;\r\n FTitleHorizontalTextAlign := gtaLeading;\r\n FTitleVerticalTextAlign := gtaCenter;\r\n FTitleTrimming := gttNone;\r\n FBitmap := TTMSFNCBitmap.Create;\r\n FBitmap.OnChange := @BitmapChanged;\r\n if Assigned(FTableView) then\r\n Self.Assign(FTableView.DefaultItem);\r\n UpdateItem;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewItem.Destroy;\r\nbegin\r\n FBitmap.Free;\r\n FHTMLTemplateItems.Free;\r\n inherited;\r\n UpdateItem;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetHeight(const Value: Double);\r\nbegin\r\n if FHeight <> Value then\r\n begin\r\n FHeight := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetHTMLTemplateItems(const Value: TStringList);\r\nbegin\r\n if FHTMLTemplateItems <> Value then\r\n begin\r\n FHTMLTemplateItems.Assign(Value);\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nvar\r\n l: TTMSFNCCustomTableView;\r\nbegin\r\n Result := nil;\r\n l := TableView;\r\n if Assigned(l) then\r\n Result := l.BitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.GetTableView: TTMSFNCCustomTableView;\r\nbegin\r\n Result := FTableView;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.TemplateItemsChanged(Sender: TObject);\r\nbegin\r\n UpdateItem;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.LoadFromString(AString: String);\r\nvar\r\n k: Integer;\r\n a: TStringList;\r\n s: TStringList;\r\n y: Integer;\r\n st: string;\r\n ps: Integer;\r\n subst: string;\r\nbegin\r\n a := TStringList.Create;\r\n try\r\n st := AString;\r\n while st <> '' do\r\n begin\r\n ps := Pos('{0}', st);\r\n if ps = 0 then\r\n begin\r\n a.Add(st);\r\n Break;\r\n end;\r\n subst := Copy(st, 1, ps - 1);\r\n a.Add(subst);\r\n Delete(st, 1, ps - 1 + Length('{0}'));\r\n end;\r\n\r\n for K := 0 to a.Count - 1 do\r\n begin\r\n if a[K] <> '' then\r\n begin\r\n if K = 0 then\r\n Text := a[K]\r\n else if K = 1 then\r\n begin\r\n s := TStringList.Create;\r\n try\r\n TTMSFNCUtils.Split(';', a[K], s);\r\n for y := 0 to s.Count - 1 do\r\n begin\r\n if s[y] <> '' then\r\n begin\r\n if y = 0 then\r\n Checked := StrToBool(s[y])\r\n else if y = 1 then\r\n BitmapName := s[y]\r\n else if y = 2 then\r\n TTMSFNCUtils.LoadBitmapFromHexStr(s[y], Bitmap);\r\n end;\r\n end;\r\n finally\r\n s.Free;\r\n end;\r\n end\r\n else if K = 2 then\r\n Enabled := StrToBool(a[K]);\r\n end;\r\n end;\r\n finally\r\n a.Free;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.GetStrippedHTMLText: String;\r\nbegin\r\n Result := TTMSFNCUtils.HTMLStrip(GetText);\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.GetText: string;\r\nvar\r\n ht: string;\r\n s: string;\r\nbegin\r\n s := '';\r\n if Assigned(FTableView) then\r\n begin\r\n ht := FTableView.ItemAppearance.HTMLTemplate;\r\n if ht = '' then\r\n s := Text\r\n else\r\n begin\r\n FTableView.DoGetHTMLTemplate(Self, ht);\r\n s := FTableView.HTMLReplace(ht, Self);\r\n end;\r\n end;\r\n\r\n Result := s;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.GetTitle: string;\r\nbegin\r\n Result := Title;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.HideDetailControl;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.HideDetailControl;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.IsAccessoryHeightStored: Boolean;\r\nbegin\r\n Result := AccessoryHeight <> 24;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.IsAccessoryProgressStored: Boolean;\r\nbegin\r\n Result := AccessoryProgress <> 0;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.IsAccessoryWidthStored: Boolean;\r\nbegin\r\n Result := AccessoryWidth <> 24;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.IsHeightStored: Boolean;\r\nbegin\r\n Result := Height <> -1;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.IsSelected: Boolean;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := False;\r\n if Assigned(FTableView) then\r\n begin\r\n for I := 0 to FTableView.SelectedItemCount - 1 do\r\n begin\r\n if FTableView.SelectedItems[I] = Self then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItem.SaveToString(ATextOnly: Boolean): String;\r\nvar\r\n s: String;\r\nbegin\r\n if not Assigned(FTableView) then\r\n Exit;\r\n\r\n Result := '';\r\n Result := Result + Text;\r\n\r\n if not ATextOnly then\r\n Result := Result + '{0}';\r\n\r\n if not ATextOnly then\r\n begin\r\n Result := Result + BoolToStr(Checked) + ';';\r\n Result := Result + BitmapName + ';';\r\n Result := Result + TTMSFNCUtils.SaveBitmapToHexStr(Bitmap) + ';';\r\n Result := Result + s;\r\n end;\r\n\r\n if not ATextOnly then\r\n begin\r\n Result := Result + '{0}';\r\n Result := Result + BoolToStr(Enabled);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetCategoryID(const Value: integer);\r\nbegin\r\n if FCategoryID <> Value then\r\n begin\r\n FCategoryID := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetChecked(const Value: Boolean);\r\nvar\r\n l: TTMSFNCCustomTableView;\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if FChecked <> Value then\r\n begin\r\n FChecked := Value;\r\n l := TableView;\r\n if Assigned(l) then\r\n begin\r\n n := TTMSFNCCustomTableViewOpen(l).GetNodeForItemIndex(Index);\r\n if Assigned(n) and (n.CheckStates[0] <> FChecked) then\r\n begin\r\n if FChecked then\r\n TTMSFNCCustomTableViewOpen(l).TreeView.CheckVirtualNode(n, 0)\r\n else\r\n TTMSFNCCustomTableViewOpen(l).TreeView.UnCheckVirtualNode(n, 0);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetCheckType(\r\n const Value: TTMSFNCTableViewItemCheckType);\r\nbegin\r\n if FCheckType <> Value then\r\n begin\r\n FCheckType := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTitleExpanded(const Value: Boolean);\r\nbegin\r\n if FTitleExpanded <> Value then\r\n begin\r\n FTitleExpanded := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessory(\r\n const Value: TTMSFNCTableViewItemAccessory);\r\nbegin\r\n if FAccessory <> Value then\r\n begin\r\n FAccessory := Value;\r\n case FAccessory of\r\n tviaDetail:\r\n begin\r\n AccessoryWidth := 32;\r\n AccessoryHeight := 24;\r\n end;\r\n tviaProgress:\r\n begin\r\n AccessoryWidth := 75;\r\n AccessoryHeight := 20;\r\n end;\r\n tviaButton:\r\n begin\r\n AccessoryWidth := 75;\r\n AccessoryHeight := 20;\r\n end;\r\n tviaBadge:\r\n begin\r\n AccessoryWidth := 32;\r\n AccessoryHeight := 24;\r\n end;\r\n tviaCustom: ;\r\n end;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessoryBorderColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FAccessoryBorderColor <> Value then\r\n begin\r\n FAccessoryBorderColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessoryColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FAccessoryColor <> Value then\r\n begin\r\n FAccessoryColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessoryFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FAccessoryFontColor <> Value then\r\n begin\r\n FAccessoryFontColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessoryHeight(const Value: Single);\r\nbegin\r\n if FAccessoryHeight <> Value then\r\n begin\r\n FAccessoryHeight := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessoryProgress(const Value: Single);\r\nbegin\r\n if FAccessoryProgress <> Value then\r\n begin\r\n FAccessoryProgress := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessoryText(const Value: String);\r\nbegin\r\n if FAccessoryText <> Value then\r\n begin\r\n FAccessoryText := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetAccessoryWidth(const Value: Single);\r\nbegin\r\n if FAccessoryWidth <> Value then\r\n begin\r\n FAccessoryWidth := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetBitmap(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FBitmap <> Value then\r\n begin\r\n FBitmap.Assign(Value);\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetBitmapName(const Value: string);\r\nbegin\r\n if FBitmapName <> Value then\r\n begin\r\n FBitmapName := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetDetailControl(const Value: TControl);\r\nbegin\r\n if Value = nil then\r\n begin\r\n if Assigned(FDetailControl) then\r\n FDetailControl.Visible := True;\r\n end;\r\n\r\n FDetailControl := Value;\r\n if Assigned(FDetailControl) then\r\n FDetailControl.Visible := False;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetDisabledTextColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledTextColor <> Value then\r\n begin\r\n FDisabledTextColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetDisabledTitleColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledTitleColor <> Value then\r\n begin\r\n FDisabledTitleColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetEnabled(const Value: Boolean);\r\nbegin\r\n if FEnabled <> Value then\r\n begin\r\n FEnabled := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetSelectedTextColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedTextColor <> Value then\r\n begin\r\n FSelectedTextColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetSelectedTitleColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedTitleColor <> Value then\r\n begin\r\n FSelectedTitleColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTextColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FTextColor <> Value then\r\n begin\r\n FTextColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTitle(const Value: String);\r\nbegin\r\n if FTitle <> Value then\r\n begin\r\n FTitle := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTitleColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FTitleColor <> Value then\r\n begin\r\n FTitleColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTitleHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTitleHorizontalTextAlign <> Value then\r\n begin\r\n FTitleHorizontalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTitleTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTitleTrimming <> Value then\r\n begin\r\n FTitleTrimming := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTitleVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTitleVerticalTextAlign <> Value then\r\n begin\r\n FTitleVerticalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTitleWordWrapping(const Value: Boolean);\r\nbegin\r\n if FTitleWordWrapping <> Value then\r\n begin\r\n FTitleWordWrapping := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetVisible(const Value: Boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.ShowDetailControl;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.ShowDetailControl(Index);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItem.UpdateItem;\r\nvar\r\n l: TTMSFNCCustomTableView;\r\nbegin\r\n l := TableView;\r\n if Assigned(l) then\r\n l.UpdateTableView;\r\nend;\r\n\r\n{ TTMSFNCTableViewItemAppearance }\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewItemAppearance then\r\n begin\r\n Font.Assign((Source as TTMSFNCTableViewItemAppearance).Font);\r\n Fill.Assign((Source as TTMSFNCTableViewItemAppearance).Fill);\r\n Stroke.Assign((Source as TTMSFNCTableViewItemAppearance).Stroke);\r\n SelectedFill.Assign((Source as TTMSFNCTableViewItemAppearance).SelectedFill);\r\n SelectedStroke.Assign((Source as TTMSFNCTableViewItemAppearance).SelectedStroke);\r\n DisabledFill.Assign((Source as TTMSFNCTableViewItemAppearance).DisabledFill);\r\n DisabledStroke.Assign((Source as TTMSFNCTableViewItemAppearance).DisabledStroke);\r\n HeightMode := (Source as TTMSFNCTableViewItemAppearance).HeightMode;\r\n FixedHeight := (Source as TTMSFNCTableViewItemAppearance).FixedHeight;\r\n FHTMLTemplate := (Source as TTMSFNCTableViewItemAppearance).HTMLTemplate;\r\n FAccessoryDetailBitmaps.Assign((Source as TTMSFNCTableViewItemAppearance).AccessoryDetailBitmaps);\r\n FAccessoryFont.Assign((Source as TTMSFNCTableViewItemAppearance).AccessoryFont);\r\n FAccessoryStroke.Assign((Source as TTMSFNCTableViewItemAppearance).AccessoryStroke);\r\n FAccessoryFill.Assign((Source as TTMSFNCTableViewItemAppearance).AccessoryFill);\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewItemAppearance.Create(\r\n ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n FTableView := ATableView;\r\n\r\n FAccessoryFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcYellowgreen);\r\n FAccessoryFill.OnChanged := @FillChanged;\r\n FAccessoryStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcBlack);\r\n FAccessoryStroke.OnChanged := @StrokeChanged;\r\n FAccessoryFont := TTMSFNCGraphicsFont.Create;\r\n if Assigned(FTableView) and FTableView.IsDesignTime then\r\n begin\r\n FAccessoryFont.Color := gcDarkred;\r\n FAccessoryFont.Style := [TFontStyle.fsBold];\r\n end;\r\n FAccessoryFont.OnChanged := @FontChanged;\r\n\r\n FAccessoryDetailBitmaps := TTMSFNCScaledBitmaps.Create(Self);\r\n FAccessoryDetailBitmaps.OnChange := @DoAccessoryDetailBitmapsChanged;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) and FTableView.IsDesignTime then\r\n begin\r\n FTableView.FTreeView.NodesAppearance.DisabledFill.Kind := gfkNone;\r\n FTableView.FTreeView.NodesAppearance.DisabledStroke.Kind := gskNone;\r\n FTableView.FTreeView.NodesAppearance.SelectedStroke.Assign(FTableView.FTreeView.NodesAppearance.SelectedFill);\r\n end;\r\n HeightMode := tvhmVariable;\r\n FHeight := -1;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewItemAppearance.Destroy;\r\nbegin\r\n FAccessoryFill.Free;\r\n FAccessoryStroke.Free;\r\n FAccessoryFont.Free;\r\n FAccessoryDetailBitmaps.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.DoAccessoryDetailBitmapsChanged(\r\n Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.FontChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetDisabledFill: TTMSFNCGraphicsFill;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.DisabledFill;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetDisabledStroke: TTMSFNCGraphicsStroke;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.DisabledStroke;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetFill: TTMSFNCGraphicsFill;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.Fill;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetFixedHeight: Double;\r\nbegin\r\n Result := 0;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.FixedHeight;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetFont: TTMSFNCGraphicsFont;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.Font;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetHeightMode: TTMSFNCTableViewItemHeightMode;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := tvhmVariable;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n i := Integer(FTableView.FTreeView.NodesAppearance.HeightMode);\r\n Result := TTMSFNCTableViewItemHeightMode(i);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetOwner: TPersistent;\r\nbegin\r\n Result := FTableView;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetSelectedFill: TTMSFNCGraphicsFill;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.SelectedFill;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetSelectedStroke: TTMSFNCGraphicsStroke;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.SelectedStroke;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetShowFocus: Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.ShowFocus;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.GetStroke: TTMSFNCGraphicsStroke;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.Stroke;\r\nend;\r\n\r\nfunction TTMSFNCTableViewItemAppearance.IsHeightStored: Boolean;\r\nbegin\r\n Result := Height <> -1;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetAccessoryDetailBitmaps(\r\n const Value: TTMSFNCScaledBitmaps);\r\nbegin\r\n FAccessoryDetailBitmaps.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetAccessoryFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FAccessoryFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetAccessoryFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FAccessoryFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetAccessoryStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FAccessoryStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetDisabledFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.DisabledFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetDisabledStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.DisabledStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.Fill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetFixedHeight(const Value: Double);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.FixedHeight := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.Font.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetHeight(const Value: Double);\r\nbegin\r\n if FHeight <> Value then\r\n begin\r\n FHeight := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetHeightMode(\r\n const Value: TTMSFNCTableViewItemHeightMode);\r\nvar\r\n i: Integer;\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n i := Integer(Value);\r\n FTableView.FTreeView.NodesAppearance.HeightMode := TTMSFNCTreeViewNodeHeightMode(i);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetHTMLTemplate(const Value: string);\r\nbegin\r\n if FHTMLTemplate <> Value then\r\n begin\r\n FHTMLTemplate := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetSelectedFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.SelectedFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetSelectedStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.SelectedStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetShowFocus(const Value: Boolean);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.ShowFocus := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewItemAppearance.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.Stroke.Assign(Value);\r\nend;\r\n\r\n{ TTMSFNCTableViewCategoryAppearance }\r\n\r\nprocedure TTMSFNCTableViewCategoryAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewCategoryAppearance then\r\n begin\r\n Font.Assign((Source as TTMSFNCTableViewCategoryAppearance).Font);\r\n Fill.Assign((Source as TTMSFNCTableViewCategoryAppearance).Fill);\r\n Stroke.Assign((Source as TTMSFNCTableViewCategoryAppearance).Stroke);\r\n FHeight := (Source as TTMSFNCTableViewCategoryAppearance).Height;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewCategoryAppearance.Create(\r\n ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n FTableView := ATableView;\r\n FHeight := -1;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewCategoryAppearance.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategoryAppearance.GetFill: TTMSFNCGraphicsFill;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.ExtendedFill;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategoryAppearance.GetFont: TTMSFNCGraphicsFont;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.ExtendedFont;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategoryAppearance.GetStroke: TTMSFNCGraphicsStroke;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.NodesAppearance.ExtendedStroke;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategoryAppearance.IsHeightStored: Boolean;\r\nbegin\r\n Result := Height <> -1;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategoryAppearance.SetFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.ExtendedFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategoryAppearance.SetFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.ExtendedFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategoryAppearance.SetHeight(const Value: Single);\r\nbegin\r\n if FHeight <> Value then\r\n begin\r\n FHeight := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategoryAppearance.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.NodesAppearance.ExtendedStroke.Assign(Value);\r\nend;\r\n\r\n{ TTMSFNCTableViewMoreOptionAppearance }\r\n\r\nprocedure TTMSFNCTableViewMoreOptionAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewMoreOptionAppearance then\r\n begin\r\n FFont.Assign((Source as TTMSFNCTableViewMoreOptionAppearance).Font);\r\n FFill.Assign((Source as TTMSFNCTableViewMoreOptionAppearance).Fill);\r\n FStroke.Assign((Source as TTMSFNCTableViewMoreOptionAppearance).Stroke);\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewMoreOptionAppearance.Create(\r\n ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n FTableView := ATableView;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n if Assigned(FTableView) and FTableView.IsDesignTime then\r\n FFont.Color := gcWhite;\r\n FFont.OnChanged := @FontChanged;\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcSteelblue);\r\n FFill.OnChanged := @FillChanged;\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcSteelblue);\r\n FStroke.OnChanged := @StrokeChanged;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewMoreOptionAppearance.Destroy;\r\nbegin\r\n FFont.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptionAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptionAppearance.FontChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptionAppearance.SetFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptionAppearance.SetFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptionAppearance.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptionAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.Invalidate;\r\nend;\r\n\r\n{ TTMSFNCTableViewInteraction }\r\n\r\nprocedure TTMSFNCTableViewInteraction.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCTableViewInteraction) then\r\n begin\r\n FLookup.Assign((Source as TTMSFNCTableViewInteraction).Lookup);\r\n Filtering.Assign((Source as TTMSFNCTableViewInteraction).Filtering);\r\n Sorting := (Source as TTMSFNCTableViewInteraction).Sorting;\r\n FShowDetailMode := (Source as TTMSFNCTableViewInteraction).ShowDetailMode;\r\n DragDropMode := (Source as TTMSFNCTableViewInteraction).DragDropMode;\r\n MultiSelect := (Source as TTMSFNCTableViewInteraction).MultiSelect;\r\n TouchScrolling := (Source as TTMSFNCTableViewInteraction).TouchScrolling;\r\n ClipboardMode := (Source as TTMSFNCTableViewInteraction).ClipboardMode;\r\n Reorder := (Source as TTMSFNCTableViewInteraction).Reorder;\r\n FShowEditButton := (Source as TTMSFNCTableViewInteraction).ShowEditButton;\r\n FShowFilterButton := (Source as TTMSFNCTableViewInteraction).ShowFilterButton;\r\n FAccessoryClickDetection := (Source as TTMSFNCTableViewInteraction).AccessoryClickDetection;\r\n FLongPressToEdit := (Source as TTMSFNCTableViewInteraction).LongPressToEdit;\r\n FSwipeToShowMoreOptions := (Source as TTMSFNCTableViewInteraction).SwipeToShowMoreOptions;\r\n FSwipeBounceGesture := (Source as TTMSFNCTableViewInteraction).SwipeBounceGesture;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewInteraction.Create(ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n FTableView := ATableView;\r\n FLongPressToEdit := True;\r\n FSwipeToShowMoreOptions := True;\r\n FAccessoryClickDetection := ClickAccessories;\r\n FLookup := TTMSFNCTableViewLookup.Create(Self);\r\n FFiltering := TTMSFNCTableViewFiltering.Create(Self);\r\n FShowDetailMode := tvdtAfterSelectItem;\r\n FShowEditButton := False;\r\n FShowFilterButton := False;\r\n FSwipeBounceGesture := True;\r\n FKeyboardEscapeMode := tvkeStopFilter;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewInteraction.Destroy;\r\nbegin\r\n FLookup.Free;\r\n FFiltering.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCTableViewInteraction.GetAutoOpenURL: Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.Interaction.AutoOpenURL;\r\nend;\r\n\r\nfunction TTMSFNCTableViewInteraction.GetClipboardMode: TTMSFNCTableViewClipboardMode;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := tvcmNone;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n i := Integer(FTableView.FTreeView.Interaction.ClipboardMode);\r\n Result := TTMSFNCTableViewClipboardMode(i);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewInteraction.GetDragDropMode: TTMSFNCTableViewDragDropMode;\r\nvar\r\n i: Integer;\r\nbegin\r\n Result := tvdmNone;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n i := Integer(FTableView.FTreeView.Interaction.DragDropMode);\r\n Result := TTMSFNCTableViewDragDropMode(i);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewInteraction.GetMultiSelect: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.Interaction.MultiSelect;\r\nend;\r\n\r\nfunction TTMSFNCTableViewInteraction.GetReorder: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.Interaction.Reorder;\r\nend;\r\n\r\nfunction TTMSFNCTableViewInteraction.GetSorting: TTMSFNCTableViewSorting;\r\nbegin\r\n Result := tvcsNone;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) and (FTableView.FTreeView.Columns.Count > 0) then\r\n begin\r\n case FTableView.FTreeView.Columns[0].Sorting of\r\n tcsNone: Result := tvcsNone;\r\n tcsNormal: Result := tvcsNormal;\r\n tcsNormalCaseSensitive: Result := tvcsNormalCaseSensitive;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewInteraction.GetTouchScrolling: Boolean;\r\nbegin\r\n Result := True;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.Interaction.TouchScrolling;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetAccessoryClickDetection(\r\n const Value: TTMSFNCTableViewItemAccessories);\r\nbegin\r\n FAccessoryClickDetection := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetAutoOpenURL(const Value: Boolean);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Interaction.AutoOpenURL := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetClipboardMode(\r\n const Value: TTMSFNCTableViewClipboardMode);\r\nvar\r\n i: Integer;\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n i := Integer(Value);\r\n FTableView.FTreeView.Interaction.ClipboardMode := TTMSFNCTreeViewClipboardMode(i);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetShowDetailMode(\r\n const Value: TTMSFNCTableViewShowDetailMode);\r\nbegin\r\n if FShowDetailMode <> Value then\r\n FShowDetailMode := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetShowEditButton(const Value: Boolean);\r\nbegin\r\n if FShowEditButton <> Value then\r\n begin\r\n FShowEditButton := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetShowFilterButton(const Value: Boolean);\r\nbegin\r\n if FShowFilterButton <> Value then\r\n begin\r\n FShowFilterButton := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetDragDropMode(\r\n const Value: TTMSFNCTableViewDragDropMode);\r\nvar\r\n i: Integer;\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n i := Integer(Value);\r\n FTableView.FTreeView.Interaction.DragDropMode := TTMSFNCTreeViewDragDropMode(i);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetFiltering(\r\n const Value: TTMSFNCTableViewFiltering);\r\nbegin\r\n FFiltering.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetLookup(\r\n const Value: TTMSFNCTableViewLookup);\r\nbegin\r\n FLookup.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetMultiSelect(const Value: Boolean);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Interaction.MultiSelect := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetReorder(const Value: Boolean);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Interaction.Reorder := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetSorting(\r\n const Value: TTMSFNCTableViewSorting);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) and (FTableView.FTreeView.Columns.Count > 0) then\r\n begin\r\n case Value of\r\n tvcsNone: FTableView.FTreeView.Columns[0].Sorting := tcsNone;\r\n tvcsNormal: FTableView.FTreeView.Columns[0].Sorting := tcsNormal;\r\n tvcsNormalCaseSensitive: FTableView.FTreeView.Columns[0].Sorting := tcsNormalCaseSensitive;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewInteraction.SetTouchScrolling(const Value: Boolean);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Interaction.TouchScrolling := Value;\r\nend;\r\n\r\n{ TTMSFNCTableViewLookup }\r\n\r\nprocedure TTMSFNCTableViewLookup.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewLookup then\r\n begin\r\n CaseSensitive := (Source as TTMSFNCTableViewLookup).CaseSensitive;\r\n Enabled := (Source as TTMSFNCTableViewLookup).Enabled;\r\n Incremental := (Source as TTMSFNCTableViewLookup).Incremental;\r\n AutoSelect := (Source as TTMSFNCTableViewLookup).AutoSelect;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewLookup.Create(AOwner: TTMSFNCTableViewInteraction);\r\nbegin\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCTableViewLookup.GetAutoSelect: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n Result := FOwner.FTableView.FTreeView.Interaction.Lookup.AutoSelect;\r\nend;\r\n\r\nfunction TTMSFNCTableViewLookup.GetCaseSensitive: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n Result := FOwner.FTableView.FTreeView.Interaction.Lookup.CaseSensitive;\r\nend;\r\n\r\nfunction TTMSFNCTableViewLookup.GetEnabled: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n Result := FOwner.FTableView.FTreeView.Interaction.Lookup.Enabled;\r\nend;\r\n\r\nfunction TTMSFNCTableViewLookup.GetIncremental: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n Result := FOwner.FTableView.FTreeView.Interaction.Lookup.Incremental;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookup.SetAutoSelect(const Value: Boolean);\r\nbegin\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n FOwner.FTableView.FTreeView.Interaction.Lookup.AutoSelect := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookup.SetCaseSensitive(const Value: Boolean);\r\nbegin\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n FOwner.FTableView.FTreeView.Interaction.Lookup.CaseSensitive := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookup.SetEnabled(const Value: Boolean);\r\nbegin\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n FOwner.FTableView.FTreeView.Interaction.Lookup.Enabled := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookup.SetIncremental(const Value: Boolean);\r\nbegin\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) then\r\n FOwner.FTableView.FTreeView.Interaction.Lookup.Incremental := Value;\r\nend;\r\n\r\n{ TTMSFNCTableViewFiltering }\r\n\r\nprocedure TTMSFNCTableViewFiltering.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewFiltering then\r\n begin\r\n Enabled := (Source as TTMSFNCTableViewFiltering).Enabled;\r\n DropDownWidth := (Source as TTMSFNCTableViewFiltering).DropDownWidth;\r\n DropDownHeight := (Source as TTMSFNCTableViewFiltering).DropDownHeight;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewFiltering.Create(\r\n AOwner: TTMSFNCTableViewInteraction);\r\nbegin\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCTableViewFiltering.GetDropDownHeight: integer;\r\nbegin\r\n Result := 120;\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) and (FOwner.FTableView.FTreeView.Columns.Count > 0) then\r\n Result := FOwner.FTableView.FTreeView.Columns[0].Filtering.DropDownHeight;\r\nend;\r\n\r\nfunction TTMSFNCTableViewFiltering.GetDropDownWidth: integer;\r\nbegin\r\n Result := 100;\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) and (FOwner.FTableView.FTreeView.Columns.Count > 0) then\r\n Result := FOwner.FTableView.FTreeView.Columns[0].Filtering.DropDownWidth;\r\nend;\r\n\r\nfunction TTMSFNCTableViewFiltering.GetEnabled: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) and (FOwner.FTableView.FTreeView.Columns.Count > 0) then\r\n Result := FOwner.FTableView.FTreeView.Columns[0].Filtering.Enabled;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewFiltering.SetDropDownHeight(const Value: integer);\r\nbegin\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) and (FOwner.FTableView.FTreeView.Columns.Count > 0) then\r\n FOwner.FTableView.FTreeView.Columns[0].Filtering.DropDownHeight := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewFiltering.SetDropDownWidth(const Value: integer);\r\nbegin\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) and (FOwner.FTableView.FTreeView.Columns.Count > 0) then\r\n FOwner.FTableView.FTreeView.Columns[0].Filtering.DropDownWidth := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewFiltering.SetEnabled(const Value: Boolean);\r\nbegin\r\n if Assigned(FOwner) and Assigned(FOwner.FTableView) and Assigned(FOwner.FTableView.FTreeView) and (FOwner.FTableView.FTreeView.Columns.Count > 0) then\r\n FOwner.FTableView.FTreeView.Columns[0].Filtering.Enabled := Value;\r\nend;\r\n\r\n{ TTMSFNCTableViewHeaderFooter }\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewHeaderFooter then\r\n begin\r\n Visible := (Source as TTMSFNCTableViewHeaderFooter).Visible;\r\n Text := (Source as TTMSFNCTableViewHeaderFooter).Text;\r\n Fill.Assign((Source as TTMSFNCTableViewHeaderFooter).Fill);\r\n Font.Assign((Source as TTMSFNCTableViewHeaderFooter).Font);\r\n Stroke.Assign((Source as TTMSFNCTableViewHeaderFooter).Stroke);\r\n HorizontalTextAlign := (Source as TTMSFNCTableViewHeaderFooter).HorizontalTextAlign;\r\n VerticalTextAlign := (Source as TTMSFNCTableViewHeaderFooter).VerticalTextAlign;\r\n WordWrapping := (Source as TTMSFNCTableViewHeaderFooter).WordWrapping;\r\n Trimming := (Source as TTMSFNCTableViewHeaderFooter).Trimming;\r\n Height := (Source as TTMSFNCTableViewHeaderFooter).Height;\r\n SortIndicatorColor := (Source as TTMSFNCTableViewHeaderFooter).SortIndicatorColor;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewHeaderFooter.Create(ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n FTableView := ATableView;\r\n if Assigned(FTableView) and FTableView.IsDesignTime then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n FText := 'Header'\r\n else\r\n FText := 'Footer';\r\n\r\n Fill.Color := MakeGraphicsColor(249, 249, 249);\r\n Fill.Kind := gfkSolid;\r\n Stroke.Color := MakeGraphicsColor(178, 178, 178);\r\n Stroke.Kind := gskSolid;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewHeaderFooter.GetFill: TTMSFNCGraphicsFill;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n Result := FTableView.FTreeView.ColumnsAppearance.TopFill\r\n else\r\n Result := FTableView.FTreeView.ColumnsAppearance.BottomFill\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewHeaderFooter.GetFont: TTMSFNCGraphicsFont;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n Result := FTableView.FTreeView.ColumnsAppearance.TopFont\r\n else\r\n Result := FTableView.FTreeView.ColumnsAppearance.BottomFont\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewHeaderFooter.GetHeight: Single;\r\nbegin\r\n Result := 30;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n Result := FTableView.FTreeView.ColumnsAppearance.TopSize\r\n else\r\n Result := FTableView.FTreeView.ColumnsAppearance.BottomSize\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewHeaderFooter.GetSortIndicatorColor: TTMSFNCGraphicsColor;\r\nbegin\r\n Result := TTMSFNCTreeViewColorSelection;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n Result := FTableView.FTreeView.ColumnsAppearance.SortIndicatorColor;\r\nend;\r\n\r\nfunction TTMSFNCTableViewHeaderFooter.GetStroke: TTMSFNCGraphicsStroke;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n Result := FTableView.FTreeView.ColumnsAppearance.TopStroke\r\n else\r\n Result := FTableView.FTreeView.ColumnsAppearance.BottomStroke\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewHeaderFooter.GetVisible: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n Result := tclTop in FTableView.FTreeView.ColumnsAppearance.Layouts\r\n else\r\n Result := tclBottom in FTableView.FTreeView.ColumnsAppearance.Layouts;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n FTableView.FTreeView.ColumnsAppearance.TopFill.Assign(Value)\r\n else\r\n FTableView.FTreeView.ColumnsAppearance.BottomFill.Assign(Value);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n FTableView.FTreeView.ColumnsAppearance.TopFill.Assign(Value)\r\n else\r\n FTableView.FTreeView.ColumnsAppearance.BottomFill.Assign(Value);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetHeight(const Value: Single);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n FTableView.FTreeView.ColumnsAppearance.TopSize := Value\r\n else\r\n FTableView.FTreeView.ColumnsAppearance.BottomSize := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetSortIndicatorColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.ColumnsAppearance.SortIndicatorColor := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.ColumnsAppearance.TopStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetVisible(const Value: Boolean);\r\nbegin\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n begin\r\n if Self is TTMSFNCTableViewHeader then\r\n begin\r\n if Value then\r\n FTableView.FTreeView.ColumnsAppearance.Layouts := FTableView.FTreeView.ColumnsAppearance.Layouts + [tclTop]\r\n else\r\n FTableView.FTreeView.ColumnsAppearance.Layouts := FTableView.FTreeView.ColumnsAppearance.Layouts - [tclTop];\r\n end\r\n else\r\n begin\r\n if Value then\r\n FTableView.FTreeView.ColumnsAppearance.Layouts := FTableView.FTreeView.ColumnsAppearance.Layouts + [tclBottom]\r\n else\r\n FTableView.FTreeView.ColumnsAppearance.Layouts := FTableView.FTreeView.ColumnsAppearance.Layouts - [tclBottom];\r\n end;\r\n\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewHeaderFooter.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n if Assigned(FTableView) and Assigned(FTableView.FTreeView) then\r\n FTableView.FTreeView.Invalidate;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTableViewFilterData }\r\n\r\nprocedure TTMSFNCTableViewFilterData.Assign(Source: TPersistent);\r\nvar\r\n ASrcFilterData: TTMSFNCTableViewFilterData;\r\nbegin\r\n ASrcFilterData := Source as TTMSFNCTableViewFilterData;\r\n if Assigned(ASrcFilterData) then\r\n begin\r\n FCondition := ASrcFilterData.Condition;\r\n FCaseSensitive := ASrcFilterData.CaseSensitive;\r\n FPrefix := ASrcFilterData.Prefix;\r\n FSuffix := ASrcFilterData.Suffix;\r\n FOperation := ASrcFilterData.Operation;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewFilterData.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FCaseSensitive := True;\r\nend;\r\n\r\n{ TTMSFNCTableViewFilter }\r\n\r\nfunction TTMSFNCTableViewFilter.Add: TTMSFNCTableViewFilterData;\r\nbegin\r\n Result := TTMSFNCTableViewFilterData(inherited Add);\r\n if Count = 1 then\r\n Result.Operation := tvfoNone\r\n else\r\n Result.Operation := tvfoAND;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewFilter.Create(AOwner: TTMSFNCCustomTableView);\r\nbegin\r\n inherited Create(AOwner, TTMSFNCTableViewFilterData);\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCTableViewFilter.GetItem(Index: Integer): TTMSFNCTableViewFilterData;\r\nbegin\r\n Result := TTMSFNCTableViewFilterData(inherited GetItem(Index));\r\nend;\r\n\r\nfunction TTMSFNCTableViewFilter.Insert(index: Integer): TTMSFNCTableViewFilterData;\r\nbegin\r\n Result := TTMSFNCTableViewFilterData(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TTMSFNCTableViewFilter.SetItem(Index: Integer; const Value: TTMSFNCTableViewFilterData);\r\nbegin\r\n inherited SetItem(Index, Value);\r\nend;\r\n\r\n{ TTMSFNCTableView }\r\n\r\nprocedure TTMSFNCTableView.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n {$IFNDEF WEBLIB}\r\n RegisterClasses([TTMSFNCTableView, TTMSFNCTableViewItem]);\r\n {$ENDIF}\r\nend;\r\n\r\n{ TTMSFNCTreeViewTableView }\r\n\r\nprocedure TTMSFNCTreeViewTableView.AnimateTimerChanged(Sender: TObject);\r\nvar\r\n d, pos: Double;\r\n anim: Boolean;\r\nbegin\r\n if FAnimateMoreOptions or FAnimateMoreOptionsClose then\r\n begin\r\n pos := FMoreOffset;\r\n d := Abs(FMoreOffsetTo - pos) / ANIMATIONFACTOR;\r\n anim := AnimateDouble(pos, FMoreOffsetTo, d, 0.01);\r\n\r\n if anim then\r\n FMoreOffset := pos\r\n else\r\n begin\r\n FMoreOffset := FMoreOffsetTo;\r\n FAnimTimer.Enabled := False;\r\n if FAnimateMoreOptionsClose then\r\n begin\r\n FMoreOffsetItem := nil;\r\n FAnimateMoreOptionsClose := False;\r\n end;\r\n end;\r\n\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView(True);\r\n end\r\n else\r\n begin\r\n if FDownTimer then\r\n begin\r\n Inc(FDownCount);\r\n if FDownCount = 50 then\r\n begin\r\n FDownAction := True;\r\n FAnimTimer.Enabled := False;\r\n if Assigned(FTableView) then\r\n FTableView.ToggleEditMode;\r\n end;\r\n end\r\n else\r\n begin\r\n FAnimShiftAngle := FAnimShiftAngle + 5;\r\n if FAnimShiftAngle = 360 then\r\n FAnimShiftAngle := 0;\r\n\r\n if not FAnimMarqueeSwitch then\r\n FAnimMarqueeSweepAngle := FAnimMarqueeSweepAngle + 10\r\n else\r\n begin\r\n FAnimMarqueeStartAngle := FAnimMarqueeStartAngle + 10;\r\n FAnimMarqueeSweepAngle := FAnimMarqueeSweepAngle - 10;\r\n end;\r\n\r\n if (FAnimMarqueeSweepAngle = 360) and (FAnimMarqueeStartAngle = 0) then\r\n FAnimMarqueeSwitch := True\r\n else if ((FAnimMarqueeStartAngle = 360) and (FAnimMarqueeSweepAngle = 0)) then\r\n begin\r\n FAnimMarqueeSwitch := False;\r\n FAnimMarqueeStartAngle := 0;\r\n end;\r\n\r\n Invalidate;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.CanApplyVerticalOffset: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FTableView) and Assigned(FTableView.Interaction) then\r\n Result := FTableView.Interaction.SwipeBounceGesture;\r\nend;\r\n\r\nconstructor TTMSFNCTreeViewTableView.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FAnimMarqueeStartAngle := 0;\r\n FManualProgressSweepAngle := 0;\r\n FManualProgressStartAngle := 0;\r\n FAnimMarqueeSweepAngle := 0;\r\n FMoreOffset := 0;\r\n FMoreOffsetTo := 0;\r\n FAnimMarqueeSwitch := False;\r\n FFloatingNodes := TTMSFNCTreeViewTableViewFloatingNodes.Create;\r\n FAnimTimer := TTimer.Create(Self);\r\n FAnimTimer.Enabled := False;\r\n FAnimTimer.Interval := 1;\r\n FAnimTimer.OnTimer := AnimateTimerChanged;\r\nend;\r\n\r\ndestructor TTMSFNCTreeViewTableView.Destroy;\r\nbegin\r\n FAnimTimer.Free;\r\n FFloatingNodes.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.Draw(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nbegin\r\n inherited;\r\n DrawLookupBar(AGraphics, ARect);\r\n DrawReload(AGraphics, ARect);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.DrawLookupBar(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nvar\r\n I: Integer;\r\n ldp: TTMSFNCTableViewLookupBarDisplayItem;\r\n cr: TRectF;\r\nbegin\r\n if Assigned(FTableView) and (FTableView.LookupBar.Visible and (FTableView.CategoryType <> tvctNone)) then\r\n begin\r\n cr := GetLookupBarRect;\r\n if FMouseDownOnLookupBar then\r\n begin\r\n AGraphics.Fill.Assign(FTableView.LookupBar.DownFill);\r\n AGraphics.Stroke.Assign(FTableView.LookupBar.DownStroke);\r\n end\r\n else\r\n begin\r\n AGraphics.Fill.Assign(FTableView.LookupBar.Fill);\r\n AGraphics.Stroke.Assign(FTableView.LookupBar.Stroke);\r\n end;\r\n\r\n AGraphics.DrawRectangle(cr);\r\n\r\n for I := 0 to FTableView.FLookupBarDisplayList.Count - 1 do\r\n begin\r\n ldp := FTableView.FLookupBarDisplayList[I];\r\n if ldp.Active then\r\n AGraphics.Font.Assign(FTableView.LookupBar.Font)\r\n else\r\n AGraphics.Font.Assign(FTableView.LookupBar.InActiveFont);\r\n AGraphics.DrawText(ldp.Rect, ldp.Text, False, gtaCenter, gtaCenter);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.DrawReload(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nvar\r\n r: TRectF;\r\n sz: Single;\r\nbegin\r\n if Assigned(FTableView) and FTableView.Reload.Enabled and FReloadActive then\r\n begin\r\n r := GetNodesRect;\r\n sz := FTableView.Reload.Size;\r\n r := RectF(r.Left + ((r.Right - r.Left) - sz) / 2, r.Top + (FTableView.Reload.Offset - sz) / 2, r.Left + ((r.Right - r.Left) - sz) / 2 + sz, r.Top + (FTableView.Reload.Offset - sz) / 2 + sz);\r\n AGraphics.Stroke.Assign(FTableView.Reload.Stroke);\r\n case FTableView.Reload.ProgressMode of\r\n tvrpmMarquee: AGraphics.DrawArc(CenterPointEx(r), PointF((r.Right - r.Left) / 2, (r.Bottom - r.Top) / 2), FAnimMarqueeStartAngle, FAnimMarqueeSweepAngle);\r\n tvrpmMarqueeAlternate: AGraphics.DrawArc(CenterPointEx(r), PointF((r.Right - r.Left) / 2, (r.Bottom - r.Top) / 2), FAnimShiftAngle + FAnimMarqueeStartAngle, FAnimMarqueeSweepAngle);\r\n tvrpmManual: AGraphics.DrawArc(CenterPointEx(r), PointF((r.Right - r.Left) / 2, (r.Bottom - r.Top) / 2), FManualProgressStartAngle, FManualProgressSweepAngle);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.CustomizeNodeCache(\r\n AGraphics: TTMSFNCGraphics; AStartY: Single);\r\nvar\r\n n: TTMSFNCTreeViewVirtualNode;\r\n s: Single;\r\n dp: Integer;\r\nbegin\r\n inherited;\r\n if Assigned(FTableView) and (FTableView.FUpdateCount = 0) and (FTableView.CategoryType <> tvctNone) then\r\n begin\r\n dp := FTableView.GetDisplayCategoryIndex(StartRow);\r\n if (dp > -1) then\r\n begin\r\n FFloatingNodes.Clear;\r\n n := TTMSFNCTreeViewVirtualNode.Create(Self);\r\n n.CopyFrom(GetNodeForRow(dp));\r\n s := 0;\r\n ConfigureNode(AGraphics, 0, n, s);\r\n FFloatingNodes.Add(n);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.CustomizeScrollPosition(\r\n ANode: TTMSFNCTreeViewVirtualNode; var APosition, ATopPosition: Double);\r\nbegin\r\n inherited;\r\n if (FFloatingNodes.Count > 0) and not ANode.Extended and (CompareValue(APosition, GetVerticalScrollPosition) = LessThanValue) then\r\n begin\r\n APosition := APosition - FFloatingNodes[0].Height;\r\n ATopPosition := ATopPosition - FFloatingNodes[0].Height;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetCategoryAtXY(X, Y: Single): Integer;\r\nvar\r\n i, s: Integer;\r\n r: TRectF;\r\n str: String;\r\n ypos: Single;\r\n g: TTMSFNCGraphics;\r\n cr: TRectF;\r\nbegin\r\n Result := -1;\r\n\r\n if not Assigned(FTableView) then\r\n Exit;\r\n\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n try\r\n g.Font.Assign(FTableView.LookupBar.Font);\r\n s := FTableView.Categories.Count - 1;\r\n cr := GetLookupBarRect;\r\n ypos := cr.Top + 3;\r\n for I := 0 to s do\r\n begin\r\n str := FTableView.Categories[I].LookupText;\r\n r.Left := cr.Left;\r\n r.Right := cr.Right;\r\n r.Top := ypos;\r\n r.Bottom := r.Top + g.CalculateTextHeight(str);\r\n ypos := ypos + (r.Bottom - r.Top) + 3;\r\n\r\n if PtInRectEx(r, PointF(X, Y)) then\r\n begin\r\n Result := I;\r\n Break;\r\n end;\r\n end;\r\n finally\r\n g.Free;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetColumnWidth(AColumn: Integer): Double;\r\nbegin\r\n Result := inherited GetColumnWidth(AColumn);\r\n if Assigned(FTableView) and (FTableView.LookupBar.Visible and (FTableView.CategoryType <> tvctNone)) then\r\n Result := Result - FTableView.LookupBar.Width;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetContentClipRect: TRectF;\r\nbegin\r\n Result := inherited GetContentRect;\r\n Result.Left := Result.Left + 1;\r\n Result.Right := Result.Right - 1;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetContentRect: TRectF;\r\nbegin\r\n Result := inherited GetContentRect;\r\n if Assigned(FTableView) and FTableView.FFilterActive then\r\n Result.Top := Result.Top + FTableView.FEdit.Height;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetNodesRect: TRectF;\r\nvar\r\n d: Double;\r\nbegin\r\n Result := inherited GetNodesRect;\r\n if Assigned(FTableView) then\r\n begin\r\n d := (Result.Right - Result.Left) - FTableView.FDetailControlOffset;\r\n if (FTableView.LookupBar.Visible and (FTableView.CategoryType <> tvctNone)) then\r\n begin\r\n case FTableView.LookupBar.Position of\r\n tvlbpLeft:\r\n begin\r\n Result.Left := Result.Left + FTableView.LookupBar.Width - 1;\r\n Result.Right := Result.Right - FTableView.LookupBar.Width - 1;\r\n end;\r\n tvlbpRight: Result.Right := Result.Right - FTableView.LookupBar.Width;\r\n end;\r\n end;\r\n\r\n Result.Left := Result.Left - d;\r\n Result.Right := Result.Right - d;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetReloadOffset: Single;\r\nbegin\r\n Result := inherited GetReloadOffset;\r\n if Assigned(FTableView) then\r\n begin\r\n if FTableView.Reload.Enabled then\r\n Result := Result + FTableView.Reload.Offset;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetTotalColumnNodeWidth: Double;\r\nbegin\r\n Result := inherited GetTotalColumnNodeWidth;\r\n if Assigned(FTableView) and (FTableView.LookupBar.Visible and (FTableView.CategoryType <> tvctNone)) then\r\n Result := Result - FTableView.LookupBar.Width;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.GetLookupBarRect: TRectF;\r\nvar\r\n sz: Single;\r\n d: Single;\r\nbegin\r\n if Assigned(FTableView) and (FTableView.LookupBar.Visible and (FTableView.CategoryType <> tvctNone)) then\r\n begin\r\n sz := FTableView.LookupBar.Width;\r\n Result := GetContentRect;\r\n d := (Result.Right - Result.Left) - FTableView.FDetailControlOffset;\r\n case FTableView.LookupBar.Position of\r\n tvlbpLeft:\r\n begin\r\n Result.Right := Result.Left + sz;\r\n Result.Left := Result.Left + 1;\r\n Result.Top := Result.Top + 1;\r\n Result.Bottom := Result.Bottom - 1;\r\n end;\r\n tvlbpRight:\r\n begin\r\n Result.Left := Result.Right - sz;\r\n Result.Top := Result.Top + 1;\r\n Result.Bottom := Result.Bottom - 1;\r\n Result.Right := Result.Right - 1;\r\n end;\r\n end;\r\n\r\n Result.Left := Result.Left - d;\r\n Result.Right := Result.Right - d;\r\n end;\r\nend;\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCTableViewEdit.KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCTableViewEdit.KeyDown(var Key: Word; Shift: TShiftState);\r\n{$ENDIF}\r\nbegin\r\n inherited;\r\n if not Assigned(FTableView) then\r\n Exit;\r\n\r\n if (Key in [KEY_ESCAPE]) and FTableView.FFilterActive then\r\n begin\r\n case FTableView.Interaction.KeyboardEscapeMode of\r\n tvkeNone: ;\r\n tvkeClearEdit:\r\n begin\r\n FTableView.FFilterActive := False;\r\n FTableView.StartFiltering;\r\n end;\r\n tvkeStopFilter: FTableView.StopFiltering;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.HandleKeyDown(var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if BlockUserInput or not Assigned(FTableView) then\r\n Exit;\r\n\r\n if (Key in [KEY_ESCAPE]) and FTableView.FFilterActive then\r\n begin\r\n case FTableView.Interaction.KeyboardEscapeMode of\r\n tvkeNone: ;\r\n tvkeClearEdit:\r\n begin\r\n FTableView.FFilterActive := False;\r\n FTableView.StartFiltering;\r\n end;\r\n tvkeStopFilter: FTableView.StopFiltering;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n if Assigned(FTableView) then\r\n begin\r\n FDownMoreOption := FTableView.XYToMoreOption(X, Y);\r\n if Assigned(FDownMoreOption) then\r\n begin\r\n BlockUserInput := True;\r\n inherited;\r\n BlockUserInput := False;\r\n Invalidate;\r\n Exit;\r\n end;\r\n end;\r\n\r\n if FAnimateMoreOptions then\r\n begin\r\n FAnimateMoreOptions := False;\r\n FAnimateMoreOptionsClose := True;\r\n FMoreOffsetTo := 0;\r\n FAnimTimer.Enabled := True;\r\n inherited;\r\n BlockMouseClick := False;\r\n Exit;\r\n end;\r\n\r\n if BlockUserInput then\r\n begin\r\n inherited;\r\n Exit;\r\n end;\r\n\r\n it := nil;\r\n FMouseDownOnLookupBar := PtInRectEx(GetLookupBarRect, PointF(X, Y));\r\n if not FMouseDownOnLookupBar and Assigned(FTableView) and not IsAnimating then\r\n begin\r\n it := FTableView.XYToAccessoryItem(X, Y);\r\n FMouseDownOnAccessory := Assigned(it);\r\n end;\r\n\r\n BlockUserInput := FMouseDownOnLookupBar or FMouseDownOnAccessory;\r\n inherited;\r\n\r\n if FMouseDownOnLookupBar then\r\n begin\r\n CaptureEx;\r\n StopAnimationTimer;\r\n ProcessLookup(X, Y);\r\n Invalidate;\r\n end;\r\n\r\n if FMouseDownOnAccessory then\r\n begin\r\n CaptureEx;\r\n StopAnimationTimer;\r\n if Assigned(FTableView) then\r\n FTableView.FActiveAccessoryItem := it;\r\n Invalidate;\r\n end;\r\n\r\n if not FMouseDownOnAccessory and not FMouseDownOnLookupBar and (Assigned(FTableView) and FTableView.Interaction.LongPressToEdit) then\r\n begin\r\n FDownAction := False;\r\n FDownTimer := True;\r\n FDownX := X;\r\n FDownY := Y;\r\n FDownCount := 0;\r\n FAnimTimer.Enabled := True;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.HandleMouseMove(Shift: TShiftState; X,\r\n Y: Single);\r\nbegin\r\n inherited;\r\n if FDownTimer and not (FAnimateMoreOptions or FAnimateMoreOptionsClose) then\r\n begin\r\n if (Abs(X - FDownX) > 5) or (Abs(Y - FDownY) > 5) then\r\n begin\r\n FDownAction := False;\r\n FDownCount := 0;\r\n FDownTimer := False;\r\n FAnimTimer.Enabled := False;\r\n end;\r\n end;\r\n\r\n if Assigned(FTableView) and (FTableView.MoreOptions.Count > 0) and FTableView.Interaction.SwipeToShowMoreOptions and not Assigned(FMoreOffsetItem) and IsMouseDown and\r\n not BlockUserInput and not BlockMouseClick and (Abs(X - FDownX) > SWIPEOFFSET) and (Abs(Y - FDownY) <= 5) then\r\n begin\r\n FMoreOffsetItem := FTableView.XYToItem(X, Y);\r\n if Assigned(FMoreOffsetItem) then\r\n begin\r\n if FMoreOffsetItem.EnableMoreOptions then\r\n begin\r\n FMoreOffsetTo := FTableView.GetMoreOptionsSize;\r\n BlockMouseClick := True;\r\n FAnimateMoreOptions := True;\r\n FAnimTimer.Enabled := True;\r\n end;\r\n end;\r\n end;\r\n\r\n if FMouseDownOnLookupBar then\r\n ProcessLookup(X, Y);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.HandleMouseUp(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nvar\r\n rp: Boolean;\r\n mo: TTMSFNCTableViewMoreOption;\r\nbegin\r\n if Assigned(FDownMoreOption) then\r\n begin\r\n mo := FDownMoreOption;\r\n FDownMoreOption := nil;\r\n Invalidate;\r\n if FAnimateMoreOptions then\r\n begin\r\n FAnimateMoreOptions := False;\r\n FAnimateMoreOptionsClose := True;\r\n FMoreOffsetTo := 0;\r\n FAnimTimer.Enabled := True;\r\n inherited;\r\n BlockMouseClick := False;\r\n if Assigned(FTableView) and Assigned(FMoreOffsetItem) and Assigned(mo) then\r\n FTableView.DoItemMoreOptionClick(FMoreOffsetItem, mo);\r\n Exit;\r\n end;\r\n end;\r\n\r\n if FDownTimer and not (FAnimateMoreOptions or FAnimateMoreOptionsClose) then\r\n begin\r\n FDownCount := 0;\r\n FDownTimer := False;\r\n FAnimTimer.Enabled := False;\r\n if FDownAction then\r\n begin\r\n FDownAction := False;\r\n BlockUserInput := True;\r\n inherited;\r\n IsMouseDown := False;\r\n BlockUserInput := False;\r\n Exit;\r\n end;\r\n end;\r\n\r\n inherited;\r\n\r\n rp := False;\r\n if FMouseDownOnLookupBar then\r\n begin\r\n ReleaseCaptureEx;\r\n ProcessLookup(X, Y, False);\r\n rp := True;\r\n end;\r\n\r\n if FMouseDownOnAccessory then\r\n begin\r\n ReleaseCaptureEx;\r\n if Assigned(FTableView) then\r\n begin\r\n if Assigned(FTableView.FActiveAccessoryItem) then\r\n FTableView.DoItemAccessoryClick(FTableView.FActiveAccessoryItem);\r\n FTableView.FActiveAccessoryItem := nil;\r\n end;\r\n rp := True;\r\n end;\r\n\r\n if rp then\r\n begin\r\n FMouseDownOnAccessory := False;\r\n FMouseDownOnLookupBar := False;\r\n BlockUserInput := False;\r\n end;\r\n\r\n if rp then\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.NeedsReload(AVerticalOffset: Single): Boolean;\r\nbegin\r\n Result := inherited NeedsReload(AVerticalOffset);\r\n if Assigned(FTableView) and FTableView.Reload.Enabled and not Assigned(FTableView.FActiveDetailControl) and not FTableView.FEditMode and not FTableView.FFilterActive then\r\n Result := AVerticalOffset >= FTableView.Reload.Offset;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.OffsetNodeRects(\r\n ANode: TTMSFNCTreeViewVirtualNode; AX, AY: Single; var ARect: TRectF);\r\nvar\r\n i: Integer;\r\nbegin\r\n if not Assigned(FFloatingNodes) then\r\n begin\r\n inherited;\r\n Exit;\r\n end;\r\n\r\n i := FFloatingNodes.IndexOf(ANode);\r\n if i > -1 then\r\n inherited OffsetNodeRects(ANode, AX, Max(0, AY), ARect)\r\n else\r\n begin\r\n if (FMoreOffsetItem = FTableView.GetItemForNode(ANode)) then\r\n inherited OffsetNodeRects(ANode, AX - FMoreOffset, AY, ARect)\r\n else\r\n inherited;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.ProcessLookup(X, Y: Single;\r\n DoLookup: Boolean);\r\nvar\r\n l: Integer;\r\n ch: String;\r\n catid: Integer;\r\n I: Integer;\r\nbegin\r\n if Assigned(FTableView) then\r\n begin\r\n case FTableView.CategoryType of\r\n tvctCustom:\r\n begin\r\n l := GetCategoryAtXY(X, Y);\r\n if (l > -1) and (l < FTableView.Categories.Count) then\r\n begin\r\n catid := FTableView.Categories[l].Id;\r\n if FTableView.FCustomChar.IsIDActive(catID) then\r\n begin\r\n if DoLookup then\r\n FTableView.LookupCustomCategory(catid)\r\n else if Assigned(FTableView.OnCategoryClick) then\r\n FTableView.OnCategoryClick(Self, '', catid);\r\n end;\r\n end;\r\n end;\r\n tvctAlphaBetic, tvctAlphaNumericFirst, tvctAlphaNumericLast:\r\n begin\r\n l := 0;\r\n for I := 0 to FTableView.FLookupBarDisplayList.Count - 1 do\r\n begin\r\n if PtInRectEx(FTableView.FLookupBarDisplayList[I].Rect, PointF(X, Y)) then\r\n begin\r\n l := I + 1;\r\n Break;\r\n end;\r\n end;\r\n\r\n if (l >= 1) and (l <= FTableView.GetCharacterCount) then\r\n begin\r\n if Assigned(FTableView) then\r\n begin\r\n ch := FTableView.GetCharacter(l);\r\n if (ch <> '') then\r\n begin\r\n if DoLookup then\r\n FTableView.LookupCategory(ch)\r\n else if Assigned(FTableView.OnCategoryClick) then\r\n FTableView.OnCategoryClick(Self, ch, -1);\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTreeViewTableView.ScrollLimitation: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.StartReload;\r\nbegin\r\n inherited;\r\n FReloadActive := True;\r\n BlockUserInput := True;\r\n if Assigned(FTableView) then\r\n begin\r\n FManualProgressSweepAngle := 0;\r\n FManualProgressStartAngle := 0;\r\n FAnimTimer.Enabled := (FTableView.Reload.ProgressMode <> tvrpmManual);\r\n FTableView.DoStartReload;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableView.UpdateCheckState(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AChecked: Boolean);\r\nvar\r\n dp: TTMSFNCTableViewDisplayItem;\r\nbegin\r\n inherited;\r\n if not Assigned(FTableView) then\r\n Exit;\r\n\r\n if (ANode.Row >= 0) and (ANode.Row <= FTableView.FDisplayList.Count - 1) then\r\n begin\r\n dp := FTableView.FDisplayList[ANode.Row];\r\n case dp.Kind of\r\n tvikItem:\r\n begin\r\n if Assigned(dp.Item) then\r\n dp.Item.FChecked := AChecked;\r\n\r\n FTableView.SelectAllCheckedItems;\r\n end;\r\n tvikCategory: ;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTableViewCategory }\r\n\r\nprocedure TTMSFNCTableViewCategory.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCTableViewCategory) then\r\n begin\r\n FText := (Source as TTMSFNCTableViewCategory).Text;\r\n FLookupText := (Source as TTMSFNCTableViewCategory).LookupText;\r\n FId := (Source as TTMSFNCTableViewCategory).Id;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategory.Changed;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewCategory.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FTableView := (Collection as TTMSFNCTableViewCategories).FTableView;\r\n FID := (Collection as TTMSFNCTableViewCategories).Count - 1;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewCategory.Destroy;\r\nbegin\r\n inherited;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategory.GetStrippedHTMLText: String;\r\nbegin\r\n Result := TTMSFNCUtils.HTMLStrip(Text);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategory.SetId(const Value: integer);\r\nbegin\r\n if FId <> Value then\r\n begin\r\n FId := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategory.SetLookupText(const Value: String);\r\nbegin\r\n if FLookupText <> value then\r\n begin\r\n FLookupText := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategory.SetText(const Value: String);\r\nbegin\r\n if FText <> value then\r\n begin\r\n FText := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTableViewCategories }\r\n\r\nfunction TTMSFNCTableViewCategories.Add: TTMSFNCTableViewCategory;\r\nbegin\r\n Result := TTMSFNCTableViewCategory(inherited Add);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategories.Clear;\r\nvar\r\n it: TTMSFNCTableViewCategory;\r\nbegin\r\n if Count > 0 then\r\n begin\r\n {$IFNDEF LCLWEBLIB}\r\n while Count > 0 do\r\n begin\r\n it := Items[Count - 1];\r\n it.DisposeOf;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n while Count > 0 do\r\n begin\r\n it := Items[Count - 1];\r\n it.Free;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategories.Compare(AItem1,\r\n AItem2: TTMSFNCTableViewCategory; ACaseSensitive: Boolean;\r\n ASortingMode: TTMSFNCTableViewCategoriesSortMode): Integer;\r\nvar\r\n l: TTMSFNCCustomTableView;\r\nbegin\r\n Result := 0;\r\n\r\n l := FTableView;\r\n if not Assigned(l) then\r\n Exit;\r\n\r\n if not ACaseSensitive then\r\n Result := AnsiCompareStr(UpperCase(AItem1.StrippedHTMLText), UpperCase(AItem2.StrippedHTMLText))\r\n else\r\n Result := AnsiCompareStr(AItem1.StrippedHTMLText, AItem2.StrippedHTMLText);\r\n\r\n case ASortingMode of\r\n tvcsmDescending: Result := Result * -1;\r\n end;\r\n\r\n l.DoCategoryCompare(AItem1, AItem2, Result);\r\nend;\r\n\r\nconstructor TTMSFNCTableViewCategories.Create(ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n inherited Create(ATableView, TTMSFNCTableViewCategory);\r\n FTableView := ATableView;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategories.Delete(Index: Integer);\r\nvar\r\n it: TTMSFNCTableViewCategory;\r\nbegin\r\n it := Items[Index];\r\n it.Free;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategories.GetItem(\r\n Index: Integer): TTMSFNCTableViewCategory;\r\nbegin\r\n Result := TTMSFNCTableViewCategory(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategories.Insert(\r\n Index: Integer): TTMSFNCTableViewCategory;\r\nbegin\r\n Result := TTMSFNCTableViewCategory(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategories.ItemById(\r\n id: integer): TTMSFNCTableViewCategory;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Count - 1 do\r\n begin\r\n Result := Items[I];\r\n if Result.ID = id then\r\n break;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCategories.ItemIndexByID(id: integer): integer;\r\nvar\r\n ci: TTMSFNCTableViewCategory;\r\nbegin\r\n ci := ItemByID(id);\r\n if Assigned(ci) then\r\n result := ci.Index\r\n else\r\n result := -1;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategories.QuickSort(L: Integer; R: Integer; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewCategoriesSortMode = tvcsmAscending);\r\nvar\r\n I, J, p: Integer;\r\n {$IFDEF LCLWEBLIB}\r\n SortList: TFPList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n {$IFDEF WEBLIB}\r\n Save: JSValue;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Save: Pointer;\r\n {$ENDIF}\r\n begin\r\n Save := SortList.Items[Index1];\r\n SortList.Items[Index1] := SortList.Items[Index2];\r\n SortList.Items[Index2] := Save;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n SortList: TList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n Save: TCollectionItem;\r\n begin\r\n Save := SortList[Index1];\r\n SortList[Index1] := SortList[Index2];\r\n SortList[Index2] := Save;\r\n Save.Index := Index2;\r\n end;\r\n {$ENDIF}\r\nbegin\r\n //This cast allows us to get at the private elements in the base class\r\n {$IFNDEF WEBLIB}\r\n SortList := {%H-}TShadowedCollection(Self).FItems;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n SortList := Self.FPList;\r\n {$ENDIF}\r\n\r\n repeat\r\n I := L;\r\n J := R;\r\n P := (L + R) shr 1;\r\n repeat\r\n while Compare(Items[I], Items[P], ACaseSensitive, ASortingMode) < 0 do\r\n Inc(I);\r\n while Compare(Items[J], Items[P], ACaseSensitive, ASortingMode) > 0 do\r\n Dec(J);\r\n if I <= J then\r\n begin\r\n ExchangeItems(I, J);\r\n if P = I then\r\n P := J\r\n else if P = J then\r\n P := I;\r\n Inc(I);\r\n Dec(J);\r\n end;\r\n until I > J;\r\n if L < J then\r\n QuickSort(L, J, ACaseSensitive, ASortingMode);\r\n L := I;\r\n until I >= R;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategories.SetItem(Index: Integer;\r\n const Value: TTMSFNCTableViewCategory);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCategories.Sort(ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCTableViewCategoriesSortMode = tvcsmAscending);\r\nvar\r\n l: TTMSFNCCustomTableView;\r\nbegin\r\n l := FTableView;\r\n if Assigned(l) then\r\n begin\r\n l.BeginUpdate;\r\n BeginUpdate;\r\n if Count > 1 then\r\n QuickSort(0, Pred(Count), ACaseSensitive, ASortingMode);\r\n EndUpdate;\r\n l.EndUpdate;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTableViewMoreOption }\r\n\r\nprocedure TTMSFNCTableViewMoreOption.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCTableViewMoreOption) then\r\n begin\r\n FText := (Source as TTMSFNCTableViewMoreOption).Text;\r\n FWidth := (Source as TTMSFNCTableViewMoreOption).Width;\r\n FColor := (Source as TTMSFNCTableViewMoreOption).Color;\r\n FBorderColor := (Source as TTMSFNCTableViewMoreOption).BorderColor;\r\n FFontColor := (Source as TTMSFNCTableViewMoreOption).FontColor;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOption.Changed;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewMoreOption.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n FTableView := (Collection as TTMSFNCTableViewMoreOptions).FTableView;\r\n FWidth := 60;\r\n FColor := gcNull;\r\n FBorderColor := gcNull;\r\n FFontColor := gcNull;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewMoreOption.Destroy;\r\nbegin\r\n inherited;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nfunction TTMSFNCTableViewMoreOption.GetStrippedHTMLText: String;\r\nbegin\r\n Result := TTMSFNCUtils.HTMLStrip(Text);\r\nend;\r\n\r\nfunction TTMSFNCTableViewMoreOption.IsWidthStored: Boolean;\r\nbegin\r\n Result := Width <> 60;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOption.SetBorderColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FBorderColor <> Value then\r\n begin\r\n FBorderColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOption.SetColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColor <> Value then\r\n begin\r\n FColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOption.SetFontColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FFontColor <> Value then\r\n begin\r\n FFontColor := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOption.SetText(const Value: String);\r\nbegin\r\n if FText <> value then\r\n begin\r\n FText := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOption.SetWidth(const Value: Single);\r\nbegin\r\n if FWidth <> Value then\r\n begin\r\n FWidth := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCTableViewMoreOptions }\r\n\r\nfunction TTMSFNCTableViewMoreOptions.Add: TTMSFNCTableViewMoreOption;\r\nbegin\r\n Result := TTMSFNCTableViewMoreOption(inherited Add);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptions.Clear;\r\nvar\r\n it: TTMSFNCTableViewMoreOption;\r\nbegin\r\n if Count > 0 then\r\n begin\r\n {$IFNDEF LCLWEBLIB}\r\n while Count > 0 do\r\n begin\r\n it := Items[Count - 1];\r\n it.DisposeOf;\r\n end;\r\n {$ENDIF}\r\n {$IFDEF LCLWEBLIB}\r\n while Count > 0 do\r\n begin\r\n it := Items[Count - 1];\r\n it.Free;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewMoreOptions.Create(ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n inherited Create(ATableView, TTMSFNCTableViewMoreOption);\r\n FTableView := ATableView;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptions.Delete(Index: Integer);\r\nvar\r\n it: TTMSFNCTableViewMoreOption;\r\nbegin\r\n it := Items[Index];\r\n it.Free;\r\nend;\r\n\r\nfunction TTMSFNCTableViewMoreOptions.GetItem(\r\n Index: Integer): TTMSFNCTableViewMoreOption;\r\nbegin\r\n Result := TTMSFNCTableViewMoreOption(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCTableViewMoreOptions.Insert(\r\n Index: Integer): TTMSFNCTableViewMoreOption;\r\nbegin\r\n Result := TTMSFNCTableViewMoreOption(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCTableViewMoreOptions.ItemById(\r\n id: integer): TTMSFNCTableViewMoreOption;\r\nvar\r\n i: integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Count - 1 do\r\n begin\r\n Result := Items[I];\r\n if Result.ID = id then\r\n break;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewMoreOptions.ItemIndexByID(id: integer): integer;\r\nvar\r\n ci: TTMSFNCTableViewMoreOption;\r\nbegin\r\n ci := ItemByID(id);\r\n if Assigned(ci) then\r\n Result := ci.Index\r\n else\r\n Result := -1;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewMoreOptions.SetItem(Index: Integer;\r\n const Value: TTMSFNCTableViewMoreOption);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{$IFDEF LCLLIB}\r\nclass operator TTMSFNCTableViewDisplayItem.=(z1, z2: TTMSFNCTableViewDisplayItem)b: boolean;\r\nbegin\r\n Result := z1 = z2;\r\nend;\r\n\r\nclass operator TTMSFNCTableViewLookupBarDisplayItem.=(z1, z2: TTMSFNCTableViewLookupBarDisplayItem)b: boolean;\r\nbegin\r\n Result := z1 = z2;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCTableViewLookupBar }\r\n\r\nprocedure TTMSFNCTableViewLookupBar.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCTableViewLookupBar) then\r\n begin\r\n FVisible := (Source as TTMSFNCTableViewLookupBar).Visible;\r\n FFont.Assign((Source as TTMSFNCTableViewLookupBar).Font);\r\n FInActiveFont.Assign((Source as TTMSFNCTableViewLookupBar).InActiveFont);\r\n FStroke.Assign((Source as TTMSFNCTableViewLookupBar).Stroke);\r\n FFill.Assign((Source as TTMSFNCTableViewLookupBar).Fill);\r\n FAutoLookup := (Source as TTMSFNCTableViewLookupBar).AutoLookup;\r\n FWidth := (Source as TTMSFNCTableViewLookupBar).Width;\r\n FPosition := (Source as TTMSFNCTableViewLookupBar).Position;\r\n FDownFill.Assign((Source as TTMSFNCTableViewLookupBar).DownFill);\r\n FDownStroke.Assign((Source as TTMSFNCTableViewLookupBar).DownStroke);\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewLookupBar.Create(\r\n ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n FTableView := ATableView;\r\n FWidth := 25;\r\n FVisible := True;\r\n FPosition := tvlbpRight;\r\n FAutoLookup := True;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @FontChanged;\r\n FInActiveFont := TTMSFNCGraphicsFont.Create;\r\n if Assigned(FTableView) and FTableView.IsDesignTime then\r\n FInActiveFont.Color := gcSilver;\r\n FInActiveFont.OnChanged := @FontChanged;\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FFill.OnChanged := @FillChanged;\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcWhite);\r\n FStroke.OnChanged := @StrokeChanged;\r\n\r\n FDownFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(249, 249, 249));\r\n FDownFill.OnChanged := @FillChanged;\r\n FDownStroke := TTMSFNCGraphicsStroke.Create(gskSolid, MakeGraphicsColor(249, 249, 249));\r\n FDownStroke.OnChanged := @StrokeChanged;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewLookupBar.Destroy;\r\nbegin\r\n FFont.Free;\r\n FInActiveFont.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n FDownFill.Free;\r\n FDownStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.FillChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.FontChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\nfunction TTMSFNCTableViewLookupBar.IsWidthStored: Boolean;\r\nbegin\r\n Result := Width <> 25;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetAutoLookup(const Value: Boolean);\r\nbegin\r\n FAutoLookup := Value;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetDownFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FDownFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetDownStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FDownStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetInActiveFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FInActiveFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetPosition(\r\n const Value: TTMSFNCTableViewLookupBarPosition);\r\nbegin\r\n if FPosition <> Value then\r\n begin\r\n FPosition := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetVisible(const Value: Boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.SetWidth(const Value: Single);\r\nbegin\r\n if FWidth <> Value then\r\n begin\r\n FWidth := Value;\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBar.StrokeChanged(Sender: TObject);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.UpdateTableView;\r\nend;\r\n\r\n{ TTMSFNCTableViewReload }\r\n\r\nprocedure TTMSFNCTableViewReload.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCTableViewReload then\r\n begin\r\n FOffset := (Source as TTMSFNCTableViewReload).Offset;\r\n FSize := (Source as TTMSFNCTableViewReload).Size;\r\n FEnabled := (Source as TTMSFNCTableViewReload).Enabled;\r\n FStroke.Assign((Source as TTMSFNCTableViewReload).Stroke);\r\n FProgressMode := (Source as TTMSFNCTableViewReload).ProgressMode;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCTableViewReload.Create(ATableView: TTMSFNCCustomTableView);\r\nbegin\r\n FTableView := ATableView;\r\n FOffset := 40;\r\n FSize := 20;\r\n FEnabled := False;\r\n FProgressMode := tvrpmMarquee;\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkgray);\r\n if Assigned(FTableView) and FTableView.IsDesignTime then\r\n FStroke.Width := 2;\r\nend;\r\n\r\ndestructor TTMSFNCTableViewReload.Destroy;\r\nbegin\r\n FStroke.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCTableViewReload.IsOffsetStored: Boolean;\r\nbegin\r\n Result := Offset <> 40;\r\nend;\r\n\r\nfunction TTMSFNCTableViewReload.IsSizeStored: Boolean;\r\nbegin\r\n Result := Size <> 20;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewReload.SetEnabled(const Value: Boolean);\r\nbegin\r\n if FEnabled <> Value then\r\n begin\r\n FEnabled := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewReload.SetOffset(const Value: Single);\r\nbegin\r\n if FOffset <> Value then\r\n begin\r\n FOffset := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewReload.SetProgressMode(\r\n const Value: TTMSFNCTableViewReloadProgressMode);\r\nbegin\r\n if FProgressMode <> Value then\r\n begin\r\n FProgressMode := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewReload.SetSize(const Value: Single);\r\nbegin\r\n if FSize <> Value then\r\n begin\r\n FSize := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCTableViewReload.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCTreeViewTableViewFloatingNodes.GetItem(Index: Integer): TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n Result := TTMSFNCTreeViewVirtualNode(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTreeViewTableViewFloatingNodes.SetItem(Index: Integer; const Value: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTableViewLookupBarDisplayList.GetItem(Index: Integer): TTMSFNCTableViewLookupBarDisplayItem;\r\nbegin\r\n Result := TTMSFNCTableViewLookupBarDisplayItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewLookupBarDisplayList.SetItem(Index: Integer; const Value: TTMSFNCTableViewLookupBarDisplayItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTableViewDisplayList.GetItem(Index: Integer): TTMSFNCTableViewDisplayItem;\r\nbegin\r\n Result := TTMSFNCTableViewDisplayItem(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewDisplayList.SetItem(Index: Integer; const Value: TTMSFNCTableViewDisplayItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCustomCharList.GetItem(Index: Integer): TTMSFNCTableViewCustomChar;\r\nbegin\r\n Result := TTMSFNCTableViewCustomChar(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCTableViewCustomCharList.SetItem(Index: Integer; const Value: TTMSFNCTableViewCustomChar);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n{$ENDIF}\r\n\r\n{ TTMSFNCTableViewCustomChar }\r\n\r\nconstructor TTMSFNCTableViewCustomChar.Create(AID: Integer; AActive: Boolean);\r\nbegin\r\n FID := AID;\r\n FActive := AActive;\r\nend;\r\n\r\n{ TTMSFNCTableViewCustomCharList }\r\n\r\nprocedure TTMSFNCTableViewCustomCharList.ActivateID(AID: Integer);\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Count - 1 do\r\n begin\r\n if Items[I].ID = AID then\r\n begin\r\n Items[I].Active := True;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCTableViewCustomCharList.IsIDActive(AID: Integer): Boolean;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := False;\r\n for I := 0 to Count - 1 do\r\n begin\r\n if Items[I].ID = AID then\r\n begin\r\n Result := Items[I].Active;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCKanbanBoard;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF WEBLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomControl, WEBLib.TMSFNCCustomScrollControl, WEBLib.TMSFNCBitmapContainer, WEBLib.TMSFNCCustomComponent,\r\n WEBLib.TMSFNCTypes, WEBLib.Controls, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCTableView, WEBLib.TMSFNCTreeViewData, WEBLib.ExtCtrls, WEBLib.TMSFNCToolBar\r\n {$IFDEF FMXLIB}\r\n ,FMX.Types\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n ,UITypes, Types, Generics.Collections\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n ,Contnrs\r\n {$ENDIF}\r\n ,WEBLib.TMSFNCGraphicsTypes\r\n ;\r\n\r\n\r\nresourcestring\r\n sTMSFNCKanbanBoardHeader = 'Header';\r\n sTMSFNCKanbanBoardFooter = 'Footer';\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr.\r\n\r\n //version history\r\n //v1.0.0.0 : First Release\r\n\r\ntype\r\n TTMSFNCCustomKanbanBoard = class;\r\n\r\n TTMSFNCKanbanBoardColumn = class;\r\n\r\n TTMSFNCKanbanBoardItemCheckType = (kbictNone, kbictCheckBox, kbictRadioButton);\r\n\r\n TTMSFNCKanbanBoardMarkType = (kbmtLeft, kbmtTop, kbmtRight, kbmtBottom);\r\n\r\n TTMSFNCKanbanBoardMarkTypes = set of TTMSFNCKanbanBoardMarkType;\r\n\r\n TTMSFNCKanbanBoardTableView = class(TTMSFNCTableView)\r\n private\r\n FOriginalBoundsRect: TRectF;\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n FColumn: TTMSFNCKanbanBoardColumn;\r\n protected\r\n procedure DoAfterDropItem(AFromItem, AToItem: TTMSFNCTableViewItem); override;\r\n procedure DragItemMove(AFromItem, AToItem: TTMSFNCTableViewItem); override;\r\n procedure DragItemAdd(ANewItem, AAssignItem, AInsertItem: TTMSFNCTableViewItem); override;\r\n procedure DragItemDelete(AItem: TTMSFNCTableViewItem); override;\r\n procedure DoBeforeApplyFilter(AFilter: TTMSFNCTableViewFilterData; AAllow: Boolean); override;\r\n procedure DoAfterApplyFilter(AFilter: TTMSFNCTableViewFilterData); override;\r\n procedure DoDoneButtonClicked(Sender: TObject); override;\r\n procedure CustomizeButtons; override;\r\n procedure DoColumnSort(Sender: TObject; {%H-}AColumn: Integer; ASortMode: TTMSFNCTreeViewNodesSortMode); override;\r\n function CreateTreeView: TTMSFNCTreeViewTableView; override;\r\n end;\r\n\r\n TTMSFNCKanbanBoardItem = class(TCollectionItem)\r\n private\r\n FTag: NativeInt;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FColumn: TTMSFNCKanbanBoardColumn;\r\n FText: String;\r\n FDBKey: String;\r\n FChecked: Boolean;\r\n FDataBoolean: Boolean;\r\n FWordWrapping: Boolean;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FSelectedTextColor: TTMSFNCGraphicsColor;\r\n FTextColor: TTMSFNCGraphicsColor;\r\n FDisabledTextColor: TTMSFNCGraphicsColor;\r\n FEnabled: Boolean;\r\n FBitmapName: string;\r\n FBitmap: TTMSFNCBitmap;\r\n FHeight: Double;\r\n FDataPointer: Pointer;\r\n FHTMLTemplateItems: TStringList;\r\n FVisible: Boolean;\r\n FCheckType: TTMSFNCKanbanBoardItemCheckType;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTitle: String;\r\n FMarkType: TTMSFNCKanbanBoardMarkTypes;\r\n FMarkColor: TTMSFNCGraphicsColor;\r\n FMarkSizeLeft: Single;\r\n FMarkSizeTop: Single;\r\n FMarkSizeRight: Single;\r\n FMarkSizeBottom: Single;\r\n FTitleTrimming: TTMSFNCGraphicsTextTrimming;\r\n FTitleHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FDisabledTitleColor: TTMSFNCGraphicsColor;\r\n FTitleWordWrapping: Boolean;\r\n FSelectedTitleColor: TTMSFNCGraphicsColor;\r\n FTitleColor: TTMSFNCGraphicsColor;\r\n FTitleVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FExpanded: Boolean;\r\n FUseDefaultAppearance: Boolean;\r\n FColor: TTMSFNCGraphicsColor;\r\n FExpandable: Boolean;\r\n FMarkColorBottom: TTMSFNCGraphicsColor;\r\n FMarkColorTop: TTMSFNCGraphicsColor;\r\n FMarkColorLeft: TTMSFNCGraphicsColor;\r\n FMarkColorRight: TTMSFNCGraphicsColor;\r\n procedure SetText(const Value: String);\r\n procedure SetHeight(const Value: Double);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetSelectedTextColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTextColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetDisabledTextColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetEnabled(const Value: Boolean);\r\n procedure SetBitmapName(const Value: string);\r\n procedure SetBitmap(const Value: TTMSFNCBitmap);\r\n procedure SetChecked(const Value: Boolean);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n function GetStrippedHTMLText: string;\r\n function IsHeightStored: Boolean;\r\n procedure SetHTMLTemplateItems(const Value: TStringList);\r\n procedure SetVisible(const Value: Boolean);\r\n procedure SetCheckType(const Value: TTMSFNCKanbanBoardItemCheckType);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTitle(const Value: String);\r\n procedure SetMarkType(const Value: TTMSFNCKanbanBoardMarkTypes);\r\n procedure SetMarkColor(const Value: TTMSFNCGraphicsColor);\r\n function IsMarkSizeLeftStored: Boolean;\r\n procedure SetMarkSizeLeft(const Value: Single);\r\n procedure SetDisabledTitleColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetSelectedTitleColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTitleColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetTitleHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTitleTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetTitleVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetTitleWordWrapping(const Value: Boolean);\r\n procedure SetExpanded(const Value: Boolean);\r\n procedure SetColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetUseDefaultAppearance(const Value: Boolean);\r\n procedure SetExpandable(const Value: Boolean);\r\n procedure SetMarkColorBottom(const Value: TTMSFNCGraphicsColor);\r\n procedure SetMarkColorLeft(const Value: TTMSFNCGraphicsColor);\r\n procedure SetMarkColorRight(const Value: TTMSFNCGraphicsColor);\r\n procedure SetMarkColorTop(const Value: TTMSFNCGraphicsColor);\r\n function IsMarkSizeBottomStored: Boolean;\r\n function IsMarkSizeRightStored: Boolean;\r\n function IsMarkSizeTopStored: Boolean;\r\n procedure SetMarkSizeBottom(const Value: Single);\r\n procedure SetMarkSizeRight(const Value: Single);\r\n procedure SetMarkSizeTop(const Value: Single);\r\n protected\r\n procedure UpdateItem;\r\n procedure Changed(Sender: TObject);\r\n procedure BitmapChanged(Sender: TObject);\r\n procedure TemplateItemsChanged(Sender: TObject);\r\n property Checked: Boolean read FChecked write SetChecked default False;\r\n property CheckType: TTMSFNCKanbanBoardItemCheckType read FCheckType write SetCheckType default kbictNone;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n function GetColumn: TTMSFNCKanbanBoardColumn;\r\n function GetTableView: TTMSFNCKanbanBoardTableView;\r\n function GetText: string;\r\n function GetTableViewItem(AIndex: Integer): TTMSFNCTableViewItem;\r\n function SaveToString(ATextOnly: Boolean = True): String; virtual;\r\n function IsSelected: Boolean; virtual;\r\n function MoveItem(AToColumn: TTMSFNCKanbanBoardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem; virtual;\r\n function CopyItem(AToColumn: TTMSFNCKanbanBoardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem; virtual;\r\n procedure SelectItem;\r\n procedure LoadFromString(AString: String); virtual;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure AssignData(Source: TPersistent); virtual;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer;\r\n property StrippedHTMLText: String read GetStrippedHTMLText;\r\n property Column: TTMSFNCKanbanBoardColumn read GetColumn;\r\n property TableView: TTMSFNCKanbanBoardTableView read GetTableView;\r\n published\r\n property Text: String read FText write SetText;\r\n property Title: String read FTitle write SetTitle;\r\n property Expanded: Boolean read FExpanded write SetExpanded default True;\r\n property Expandable: Boolean read FExpandable write SetExpandable default False;\r\n property HTMLTemplateItems: TStringList read FHTMLTemplateItems write SetHTMLTemplateItems;\r\n property Bitmap: TTMSFNCBitmap read FBitmap write SetBitmap;\r\n property BitmapName: string read FBitmapName write SetBitmapName;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping default True;\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming default gttNone;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaLeading;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaLeading;\r\n property TextColor: TTMSFNCGraphicsColor read FTextColor write SetTextColor default gcBlack;\r\n property SelectedTextColor: TTMSFNCGraphicsColor read FSelectedTextColor write SetSelectedTextColor default gcWhite;\r\n property DisabledTextColor: TTMSFNCGraphicsColor read FDisabledTextColor write SetDisabledTextColor default gcSilver;\r\n property Enabled: Boolean read FEnabled write SetEnabled default True;\r\n property Height: Double read FHeight write SetHeight stored IsHeightStored nodefault;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property Tag: NativeInt read FTag write FTag default 0;\r\n property UseDefaultAppearance: Boolean read FUseDefaultAppearance write SetUseDefaultAppearance default True;\r\n property Color: TTMSFNCGraphicsColor read FColor write SetColor default gcWhite;\r\n property MarkType: TTMSFNCKanbanBoardMarkTypes read FMarkType write SetMarkType default [];\r\n property MarkColor: TTMSFNCGraphicsColor read FMarkColor write SetMarkColor default gcRed;\r\n property MarkColorLeft: TTMSFNCGraphicsColor read FMarkColorLeft write SetMarkColorLeft default gcNull;\r\n property MarkColorRight: TTMSFNCGraphicsColor read FMarkColorRight write SetMarkColorRight default gcNull;\r\n property MarkColorTop: TTMSFNCGraphicsColor read FMarkColorTop write SetMarkColorTop default gcNull;\r\n property MarkColorBottom: TTMSFNCGraphicsColor read FMarkColorBottom write SetMarkColorBottom default gcNull;\r\n property MarkSizeLeft: Single read FMarkSizeLeft write SetMarkSizeLeft stored IsMarkSizeLeftStored nodefault;\r\n property MarkSizeTop: Single read FMarkSizeTop write SetMarkSizeTop stored IsMarkSizeTopStored nodefault;\r\n property MarkSizeRight: Single read FMarkSizeRight write SetMarkSizeRight stored IsMarkSizeRightStored nodefault;\r\n property MarkSizeBottom: Single read FMarkSizeBottom write SetMarkSizeBottom stored IsMarkSizeBottomStored nodefault;\r\n property TitleWordWrapping: Boolean read FTitleWordWrapping write SetTitleWordWrapping default True;\r\n property TitleTrimming: TTMSFNCGraphicsTextTrimming read FTitleTrimming write SetTitleTrimming default gttNone;\r\n property TitleHorizontalTextAlign: TTMSFNCGraphicsTextAlign read FTitleHorizontalTextAlign write SetTitleHorizontalTextAlign default gtaLeading;\r\n property TitleVerticalTextAlign: TTMSFNCGraphicsTextAlign read FTitleVerticalTextAlign write SetTitleVerticalTextAlign default gtaLeading;\r\n property TitleColor: TTMSFNCGraphicsColor read FTitleColor write SetTitleColor default gcBlack;\r\n property SelectedTitleColor: TTMSFNCGraphicsColor read FSelectedTitleColor write SetSelectedTitleColor default gcWhite;\r\n property DisabledTitleColor: TTMSFNCGraphicsColor read FDisabledTitleColor write SetDisabledTitleColor default gcSilver;\r\n end;\r\n\r\n TTMSFNCKanbanBoardItemsSortMode = (kbismAscending, kbismDescending);\r\n TTMSFNCKanbanBoardItemsSortKind = (kbiskNone, kbiskAscending, kbiskDescending);\r\n TTMSFNCKanbanBoardSorting = (kbsNone, kbsNormal, kbsNormalCaseSensitive);\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCKanbanBoardItems = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCKanbanBoardItems = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FColumn: TTMSFNCKanbanBoardColumn;\r\n function GetItem(Index: Integer): TTMSFNCKanbanBoardItem;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCKanbanBoardItem);\r\n protected\r\n function GetItemClass: TCollectionItemClass; virtual;\r\n function Compare(AItem1, AItem2: TTMSFNCKanbanBoardItem; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCKanbanBoardItemsSortMode = kbismAscending): Integer; virtual;\r\n procedure QuickSort(L, R: Integer; ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCKanbanBoardItemsSortMode = kbismAscending); virtual;\r\n public\r\n function GetColumn: TTMSFNCKanbanBoardColumn;\r\n function GetTableView: TTMSFNCKanbanBoardTableView;\r\n constructor Create(AColumn: TTMSFNCKanbanBoardColumn);\r\n function Add: TTMSFNCKanbanBoardItem; virtual;\r\n function Insert(Index: Integer): TTMSFNCKanbanBoardItem;\r\n procedure Clear; virtual;\r\n procedure Sort(ACaseSensitive: Boolean = True; ASortingMode: TTMSFNCKanbanBoardItemsSortMode = kbismAscending);\r\n property Items[Index: Integer]: TTMSFNCKanbanBoardItem read GetItem write SetItem; default;\r\n property Column: TTMSFNCKanbanBoardColumn read GetColumn;\r\n property TableView: TTMSFNCKanbanBoardTableView read GetTableView;\r\n end;\r\n\r\n TTMSFNCKanbanBoardIntegerArray = array of Integer;\r\n TTMSFNCKanbanBoardItemArray = array of TTMSFNCKanbanBoardItem;\r\n TTMSFNCKanbanBoardSelectedItems = TTMSFNCKanbanBoardItemArray;\r\n\r\n TTMSFNCKanbanBoardColumn = class(TCollectionItem)\r\n private\r\n FBlockUpdate: Boolean;\r\n FTag: NativeInt;\r\n FDataString: String;\r\n FDataObject: TObject;\r\n FDataInteger: NativeInt;\r\n FTableView: TTMSFNCKanbanBoardTableView;\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n FHeaderText: String;\r\n FName: String;\r\n FDBKey: String;\r\n FDataBoolean: Boolean;\r\n FHeaderWordWrapping: Boolean;\r\n FHeaderVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FHeaderTrimming: TTMSFNCGraphicsTextTrimming;\r\n FHeaderHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FWidth: Double;\r\n FVisible: Boolean;\r\n FUseDefaultAppearance: Boolean;\r\n FFooterFill: TTMSFNCGraphicsFill;\r\n FFooterStroke: TTMSFNCGraphicsStroke;\r\n FHeaderFill: TTMSFNCGraphicsFill;\r\n FHeaderStroke: TTMSFNCGraphicsStroke;\r\n FHeaderFont: TTMSFNCGraphicsFont;\r\n FFooterFont: TTMSFNCGraphicsFont;\r\n FFont: TTMSFNCGraphicsFont;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FDataPointer: Pointer;\r\n FItems: TTMSFNCKanbanBoardItems;\r\n FFooterVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FFooterTrimming: TTMSFNCGraphicsTextTrimming;\r\n FFooterHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FFooterText: String;\r\n FFooterWordWrapping: Boolean;\r\n FFooterVisible: Boolean;\r\n FHeaderVisible: Boolean;\r\n FExpanded: Boolean;\r\n FExpandable: Boolean;\r\n FCollapsedWidth: Double;\r\n procedure SetHeaderText(const Value: String);\r\n procedure SetName(const Value: String);\r\n procedure SetHeaderHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetHeaderTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetHeaderVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetHeaderWordWrapping(const Value: Boolean);\r\n procedure SetWidth(const Value: Double);\r\n procedure SetVisible(const Value: Boolean);\r\n procedure SetUseDefaultAppearance(const Value: Boolean);\r\n procedure SetFooterFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFooterStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetHeaderFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetHeaderStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetFooterFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetHeaderFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetItems(const Value: TTMSFNCKanbanBoardItems);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n function GetSelectedItem: TTMSFNCKanbanBoardItem;\r\n function GetSelItem(AIndex: Integer): TTMSFNCKanbanBoardItem;\r\n procedure SetSelectedItem(const Value: TTMSFNCKanbanBoardItem);\r\n function GetItemIndex: Integer;\r\n procedure SetItemIndex(const Value: Integer);\r\n procedure SetFooterHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetFooterText(const Value: String);\r\n procedure SetFooterTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetFooterVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetFooterWordWrapping(const Value: Boolean);\r\n procedure SetFooterVisible(const Value: Boolean);\r\n procedure SetHeaderVisible(const Value: Boolean);\r\n procedure SetExpandable(const Value: Boolean);\r\n procedure SetExpanded(const Value: Boolean);\r\n procedure SetCollapsedWidth(const Value: Double);\r\n function IsCollapsedWidthStored: Boolean;\r\n function GetFilter: TTMSFNCTableViewFilter;\r\n function GetShowFilterButton: Boolean;\r\n procedure SetFilter(const Value: TTMSFNCTableViewFilter);\r\n procedure SetShowFilterButton(const Value: Boolean);\r\n function GetSorting: TTMSFNCKanbanBoardSorting;\r\n procedure SetSorting(const Value: TTMSFNCKanbanBoardSorting);\r\n function GetDoneButton: TTMSFNCToolBarButton;\r\n function GetFilterButton: TTMSFNCToolBarButton;\r\n protected\r\n procedure UpdateColumn(AUpdate: Boolean = True; ARealign: Boolean = True);\r\n procedure Changed(Sender: TObject);\r\n function GetHeaderText: String; virtual;\r\n function GetHeaderColumnText: String; virtual;\r\n function GetFooterText: String; virtual;\r\n function GetFooterColumnText: String; virtual;\r\n function CreateTableView: TTMSFNCKanbanBoardTableView; virtual;\r\n function CreateItems: TTMSFNCKanbanBoardItems; virtual;\r\n procedure DoAfterDrawItem(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem); virtual;\r\n procedure DoBeforeDrawItem(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawItemText(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AText: string); virtual;\r\n procedure DoBeforeDrawItemText(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AText: string; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawItemTitle(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ATitle: string); virtual;\r\n procedure DoBeforeDrawItemTitle(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ATitle: string; var AAllow: Boolean); virtual;\r\n procedure DoBeforeDropItem(Sender: TObject; AFromItem, AToItem: TTMSFNCTableViewItem; var ACanDrop: Boolean); virtual;\r\n procedure DoAfterDropItem(Sender: TObject; AFromItem, AToItem: TTMSFNCTableViewItem); virtual;\r\n public\r\n function GetKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n function GetTableView: TTMSFNCKanbanBoardTableView;\r\n function FindItem(AIndex: Integer): TTMSFNCKanbanBoardItem;\r\n constructor Create(ACollection: TCollection); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure UpdateWidth(AWidth: Double); virtual;\r\n property DataPointer: Pointer read FDataPointer write FDataPointer;\r\n property DataBoolean: Boolean read FDataBoolean write FDataBoolean;\r\n property DataObject: TObject read FDataObject write FDataObject;\r\n property DataString: String read FDataString write FDataString;\r\n property DataInteger: NativeInt read FDataInteger write FDataInteger;\r\n property DBKey: String read FDBKey write FDBKey;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer;\r\n property KanbanBoard: TTMSFNCCustomKanbanBoard read GetKanbanBoard;\r\n property TableView: TTMSFNCKanbanBoardTableView read GetTableView;\r\n\r\n function AddItem(AText: string = ''): TTMSFNCKanbanBoardItem; virtual;\r\n function XYToItem(X, Y: Single): TTMSFNCKanbanBoardItem; virtual;\r\n function XYToItemIndex(X, Y: Single): Integer; virtual;\r\n function SelectedItemCount: Integer; virtual;\r\n function LookupItem(ALookupString: String; ACaseSensitive: Boolean = False; AAutoSelect: Boolean = False): TTMSFNCKanbanBoardItem; virtual;\r\n function GetSelectedItems: TTMSFNCKanbanBoardItemArray; virtual;\r\n function MoveItem(AItem: TTMSFNCKanbanBoardItem; AToColumn: TTMSFNCKanbanboardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem; virtual;\r\n function CopyItem(AItem: TTMSFNCKanbanBoardItem; AToColumn: TTMSFNCKanbanboardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem; virtual;\r\n procedure StartFiltering; virtual;\r\n procedure StopFiltering; virtual;\r\n procedure RemoveItem(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure EnableInteraction; virtual;\r\n procedure DisableInteraction; virtual;\r\n procedure ScrollToItem(AItemIndex: Integer); virtual;\r\n procedure ClearSelection; virtual;\r\n procedure StartEditMode; virtual;\r\n procedure StopEditMode; virtual;\r\n procedure ToggleEditMode; virtual;\r\n procedure ApplyFilter; virtual;\r\n procedure RemoveFilter; virtual;\r\n procedure RemoveFilters; virtual;\r\n procedure SelectItem(AItemIndex: Integer); virtual;\r\n procedure SelectItems(AItemIndexes: TTMSFNCKanbanBoardIntegerArray); virtual;\r\n property SelectedItem: TTMSFNCKanbanBoardItem read GetSelectedItem write SetSelectedItem;\r\n property SelectedItems[AIndex: Integer]: TTMSFNCKanbanBoardItem read GetSelItem;\r\n property ItemIndex: Integer read GetItemIndex write SetItemIndex;\r\n property DoneButton: TTMSFNCToolBarButton read GetDoneButton;\r\n property FilterButton: TTMSFNCToolBarButton read GetFilterButton;\r\n published\r\n property Name: String read FName write SetName;\r\n property HeaderText: String read FHeaderText write SetHeaderText;\r\n property FooterText: String read FFooterText write SetFooterText;\r\n property Tag: NativeInt read FTag write FTag default 0;\r\n property HeaderHorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHeaderHorizontalTextAlign write SetHeaderHorizontalTextAlign default gtaCenter;\r\n property HeaderVerticalTextAlign: TTMSFNCGraphicsTextAlign read FHeaderVerticalTextAlign write SetHeaderVerticalTextAlign default gtaCenter;\r\n property HeaderWordWrapping: Boolean read FHeaderWordWrapping write SetHeaderWordWrapping default False;\r\n property HeaderTrimming: TTMSFNCGraphicsTextTrimming read FHeaderTrimming write SetHeaderTrimming default gttCharacter;\r\n property FooterHorizontalTextAlign: TTMSFNCGraphicsTextAlign read FFooterHorizontalTextAlign write SetFooterHorizontalTextAlign default gtaCenter;\r\n property FooterVerticalTextAlign: TTMSFNCGraphicsTextAlign read FFooterVerticalTextAlign write SetFooterVerticalTextAlign default gtaCenter;\r\n property FooterWordWrapping: Boolean read FFooterWordWrapping write SetFooterWordWrapping default False;\r\n property FooterTrimming: TTMSFNCGraphicsTextTrimming read FFooterTrimming write SetFooterTrimming default gttCharacter;\r\n property Width: Double read FWidth write SetWidth;\r\n property CollapsedWidth: Double read FCollapsedWidth write SetCollapsedWidth stored IsCollapsedWidthStored nodefault;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property FooterVisible: Boolean read FFooterVisible write SetFooterVisible default False;\r\n property HeaderVisible: Boolean read FHeaderVisible write SetHeaderVisible default True;\r\n property UseDefaultAppearance: Boolean read FUseDefaultAppearance write SetUseDefaultAppearance default True;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property HeaderFill: TTMSFNCGraphicsFill read FHeaderFill write SetHeaderFill;\r\n property HeaderStroke: TTMSFNCGraphicsStroke read FHeaderStroke write SetHeaderStroke;\r\n property HeaderFont: TTMSFNCGraphicsFont read FHeaderFont write SetHeaderFont;\r\n property FooterFill: TTMSFNCGraphicsFill read FFooterFill write SetFooterFill;\r\n property FooterStroke: TTMSFNCGraphicsStroke read FFooterStroke write SetFooterStroke;\r\n property FooterFont: TTMSFNCGraphicsFont read FFooterFont write SetFooterFont;\r\n property Items: TTMSFNCKanbanBoardItems read FItems write SetItems;\r\n property Expanded: Boolean read FExpanded write SetExpanded default True;\r\n property Expandable: Boolean read FExpandable write SetExpandable default False;\r\n property ShowFilterButton: Boolean read GetShowFilterButton write SetShowFilterButton default False;\r\n property Filter: TTMSFNCTableViewFilter read GetFilter write SetFilter;\r\n property Sorting: TTMSFNCKanbanBoardSorting read GetSorting write SetSorting default kbsNone;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCKanbanBoardColumns = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCKanbanBoardColumns = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n function GetItem(Index: Integer): TTMSFNCKanbanBoardColumn;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCKanbanBoardColumn);\r\n protected\r\n function GetItemClass: TCollectionItemClass; virtual;\r\n public\r\n function GetKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n constructor Create(AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\n function Add: TTMSFNCKanbanBoardColumn; virtual;\r\n function Insert(Index: Integer): TTMSFNCKanbanBoardColumn;\r\n property Items[Index: Integer]: TTMSFNCKanbanBoardColumn read GetItem write SetItem; default;\r\n property KanbanBoard: TTMSFNCCustomKanbanBoard read GetKanbanBoard;\r\n end;\r\n\r\n TTMSFNCKanbanBoardColumnsAppearance = class(TPersistent)\r\n private\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n FMargins: TTMSFNCMargins;\r\n FSpacing: Single;\r\n FFooterFill: TTMSFNCGraphicsFill;\r\n FHeaderFont: TTMSFNCGraphicsFont;\r\n FFooterStroke: TTMSFNCGraphicsStroke;\r\n FHeaderFill: TTMSFNCGraphicsFill;\r\n FHeaderStroke: TTMSFNCGraphicsStroke;\r\n FFooterFont: TTMSFNCGraphicsFont;\r\n FHeaderSize: Single;\r\n FFooterSize: Single;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n procedure SetMargins(const Value: TTMSFNCMargins);\r\n function IsSpacingStored: Boolean;\r\n procedure SetSpacing(const Value: Single);\r\n procedure SetFooterFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFooterFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetFooterStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetHeaderFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetHeaderFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetHeaderStroke(const Value: TTMSFNCGraphicsStroke);\r\n function IsFooterSizeStored: Boolean;\r\n function IsHeaderSizeStored: Boolean;\r\n procedure SetFooterSize(const Value: Single);\r\n procedure SetHeaderSize(const Value: Single);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n protected\r\n procedure Changed(Sender: TObject);\r\n public\r\n constructor Create(AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Margins: TTMSFNCMargins read FMargins write SetMargins;\r\n property Spacing: Single read FSpacing write SetSpacing stored IsSpacingStored nodefault;\r\n property HeaderSize: Single read FHeaderSize write SetHeaderSize stored IsHeaderSizeStored nodefault;\r\n property FooterSize: Single read FFooterSize write SetFooterSize stored IsFooterSizeStored nodefault;\r\n property HeaderFont: TTMSFNCGraphicsFont read FHeaderFont write SetHeaderFont;\r\n property FooterFont: TTMSFNCGraphicsFont read FFooterFont write SetFooterFont;\r\n property HeaderFill: TTMSFNCGraphicsFill read FHeaderFill write SetHeaderFill;\r\n property FooterFill: TTMSFNCGraphicsFill read FFooterFill write SetFooterFill;\r\n property HeaderStroke: TTMSFNCGraphicsStroke read FHeaderStroke write SetHeaderStroke;\r\n property FooterStroke: TTMSFNCGraphicsStroke read FFooterStroke write SetFooterStroke;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n end;\r\n\r\n TTMSFNCKanbanBoardItemHeightMode = (kbhmFixed, kbhmVariable);\r\n\r\n TTMSFNCKanbanBoardItemsAppearance = class(TPersistent)\r\n private\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n FHTMLTemplate: string;\r\n FHeight: Double;\r\n FHeightMode: TTMSFNCKanbanBoardItemHeightMode;\r\n FShowFocus: Boolean;\r\n FDisabledFill: TTMSFNCGraphicsFill;\r\n FFont: TTMSFNCGraphicsFont;\r\n FSelectedFill: TTMSFNCGraphicsFill;\r\n FFixedHeight: Double;\r\n FDisabledStroke: TTMSFNCGraphicsStroke;\r\n FSelectedStroke: TTMSFNCGraphicsStroke;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FTitleFont: TTMSFNCGraphicsFont;\r\n FSpacing: Double;\r\n FMargins: TTMSFNCMargins;\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetSelectedFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetSelectedStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetDisabledFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetDisabledStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetHeightMode(const Value: TTMSFNCKanbanBoardItemHeightMode);\r\n procedure SetFixedHeight(const Value: Double);\r\n procedure SetHTMLTemplate(const Value: string);\r\n function IsHeightStored: Boolean;\r\n procedure SetHeight(const Value: Double);\r\n procedure SetShowFocus(const Value: Boolean);\r\n procedure SetTitleFont(const Value: TTMSFNCGraphicsFont);\r\n function IsSpacingStored: Boolean;\r\n procedure SetSpacing(const Value: Double);\r\n procedure SetMargins(const Value: TTMSFNCMargins);\r\n protected\r\n procedure FontChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n procedure MarginsChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure Changed;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create(AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\n destructor Destroy; override;\r\n published\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property TitleFont: TTMSFNCGraphicsFont read FTitleFont write SetTitleFont;\r\n property Spacing: Double read FSpacing write SetSpacing stored IsSpacingStored nodefault;\r\n property Margins: TTMSFNCMargins read FMargins write SetMargins;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property SelectedFill: TTMSFNCGraphicsFill read FSelectedFill write SetSelectedFill;\r\n property SelectedStroke: TTMSFNCGraphicsStroke read FSelectedStroke write SetSelectedStroke;\r\n property DisabledFill: TTMSFNCGraphicsFill read FDisabledFill write SetDisabledFill;\r\n property DisabledStroke: TTMSFNCGraphicsStroke read FDisabledStroke write SetDisabledStroke;\r\n property HeightMode: TTMSFNCKanbanBoardItemHeightMode read FHeightMode write SetHeightMode default kbhmVariable;\r\n property FixedHeight: Double read FFixedHeight write SetFixedHeight;\r\n property Height: Double read FHeight write SetHeight stored IsHeightStored nodefault;\r\n property HTMLTemplate: string read FHTMLTemplate write SetHTMLTemplate;\r\n property ShowFocus: Boolean read FShowFocus write SetShowFocus default True;\r\n end;\r\n\r\n TTMSFNCKanbanBoardDragDropMode = (kbdmNone, kbdmMove, kbdmCopy);\r\n TTMSFNCKanbanBoardMouseEditMode = (kbemDoubleClick, kbemSingleClick, kbemSingleClickOnSelectedItem);\r\n\r\n TTMSFNCKanbanBoardInteraction = class(TPersistent)\r\n private\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n FMultiSelect: Boolean;\r\n FSwipeBounceGesture: Boolean;\r\n FAutoOpenURL: Boolean;\r\n FTouchScrolling: Boolean;\r\n FDragDropMode: TTMSFNCKanbanBoardDragDropMode;\r\n FMouseEditMode: TTMSFNCKanbanBoardMouseEditMode;\r\n FKeyboardEdit: Boolean;\r\n FEditing: Boolean;\r\n FDirectDrag: Boolean;\r\n procedure SetAutoOpenURL(const Value: Boolean);\r\n procedure SetDragDropMode(const Value: TTMSFNCKanbanBoardDragDropMode);\r\n procedure SetKeyboardEdit(const Value: Boolean);\r\n procedure SetMouseEditMode(const Value: TTMSFNCKanbanBoardMouseEditMode);\r\n procedure SetMultiSelect(const Value: Boolean);\r\n procedure SetSwipeBounceGesture(const Value: Boolean);\r\n procedure SetTouchScrolling(const Value: Boolean);\r\n procedure SetEditing(const Value: Boolean);\r\n procedure SetDirectDrag(const Value: Boolean);\r\n protected\r\n procedure Changed;\r\n public\r\n constructor Create(AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property AutoOpenURL: Boolean read FAutoOpenURL write SetAutoOpenURL default True;\r\n property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default False;\r\n property TouchScrolling: Boolean read FTouchScrolling write SetTouchScrolling default True;\r\n property DragDropMode: TTMSFNCKanbanBoardDragDropMode read FDragDropMode write SetDragDropMode default kbdmNone;\r\n property SwipeBounceGesture: Boolean read FSwipeBounceGesture write SetSwipeBounceGesture default False;\r\n property MouseEditMode: TTMSFNCKanbanBoardMouseEditMode read FMouseEditMode write SetMouseEditMode default kbemSingleClickOnSelectedItem;\r\n property KeyboardEdit: Boolean read FKeyboardEdit write SetKeyboardEdit default True;\r\n property Editing: Boolean read FEditing write SetEditing default False;\r\n property DirectDrag: Boolean read FDirectDrag write SetDirectDrag default False;\r\n end;\r\n\r\n TTMSFNCKanbanBoardTreeViewTableView = class(TTMSFNCTreeViewTableView)\r\n private\r\n FDragPoint: TPointF;\r\n FDragTableView: TTMSFNCKanbanboardTreeViewTableView;\r\n FDragScrollLeft, FDragScrollRight: Boolean;\r\n FScrollTable: TTMSFNCKanbanBoardTableView;\r\n FDragTimerAlternative: TTimer;\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n FColumn: TTMSFNCKanbanBoardColumn;\r\n FDragStarted: Boolean;\r\n FSaveLeft: Single;\r\n FSaveTop: Single;\r\n protected\r\n procedure DragTimeAlternative(Sender: TObject);\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleDragStart(X, Y: Single); override;\r\n procedure HandleDragOver(const Source: TObject; const Point: TPointF; var Accept: Boolean); override;\r\n procedure HandleDragDrop(const Source: TObject; const Point: TPointF); override;\r\n procedure GetNodeOffset(ANode: TTMSFNCTreeViewVirtualNode; var ALeft, ATop, ARight, ABottom: Single); override;\r\n procedure GetNodeMargins(var ALeft, ATop, ARight, ABottom: Single); override;\r\n procedure DoGetNodeSides(ANode: TTMSFNCTreeViewVirtualNode; var ASides: TTMSFNCGraphicsSides); override;\r\n procedure DoGetNodeColor(ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor); override;\r\n procedure DoUpdateNodeText(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AText: String); override;\r\n procedure DoAfterSelectNode(ANode: TTMSFNCTreeViewVirtualNode); override;\r\n procedure UpdateSelection(ANode: TTMSFNCTreeViewVirtualNode; AFocus: Boolean = False); virtual;\r\n procedure DoGetNodeTitleExtraSize(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExtraSize: Single); override;\r\n procedure DoDrawNodeTitleExtra({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF; {%H-}AColumn: Integer; {%H-}ANode: TTMSFNCTreeViewVirtualNode); override;\r\n procedure HandleNodeTitleExtra(ANode: TTMSFNCTreeViewVirtualNode); override;\r\n procedure HandleExpand(AColumn: Integer); override;\r\n procedure HandleCustomKeys(AKey: Word); override;\r\n procedure HandleAlternativeDragOver(X, Y: Single); override;\r\n procedure HandleAlternativeDragDrop(X, Y: Single); override;\r\n procedure InternalSelectVirtualNode(ANode: TTMSFNCTreeViewVirtualNode); override;\r\n function GetColumnsExtraSize: Double; override;\r\n function CanStartDragFromMouseDown: Boolean; override;\r\n function CanStartDragFromMouseMove: Boolean; override;\r\n function AlternativeDragDrop: Boolean; override;\r\n function GetTotalLeft: Single;\r\n function GetTotalTop: Single;\r\n function GetContentRect: TRectF; override;\r\n property SaveLeft: Single read FSaveLeft write FSaveLeft;\r\n property SaveTop: Single read FSaveTop write FSaveTop;\r\n property DragStarted: Boolean read FDragStarted write FDragStarted;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n TTMSFNCKanbanBoardAdapter = class(TTMSFNCCustomComponent)\r\n private\r\n FKanbanBoard: TTMSFNCCustomKanbanBoard;\r\n FActive: boolean;\r\n procedure SetActive(const Value: boolean);\r\n protected\r\n function GetInstance: NativeUInt; override;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n public\r\n property KanbanBoard: TTMSFNCCustomKanbanBoard read FKanbanBoard write FKanbanBoard;\r\n procedure LoadItems; virtual;\r\n procedure GetItems; virtual; abstract;\r\n procedure DeleteItem(AItem: TTMSFNCKanbanBoardItem); virtual; abstract;\r\n procedure InsertItem(AItem: TTMSFNCKanbanBoardItem); virtual; abstract;\r\n procedure UpdateItem(AItem: TTMSFNCKanbanBoardItem); virtual; abstract;\r\n procedure AfterUpdateItem(AItem: TTMSFNCKanbanBoardItem); virtual; abstract;\r\n procedure SelectItem(AItem: TTMSFNCKanbanBoardItem); virtual; abstract;\r\n procedure UpdateItems; virtual;\r\n constructor Create(AOwner: TComponent); override;\r\n published\r\n property Active: Boolean read FActive write SetActive default False;\r\n end;\r\n\r\n TTMSFNCKanbanBoardDoneButtonClickedEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn) of object;\r\n TTMSFNCKanbanBoardBeforeApplyFilterEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn; AFilter: TTMSFNCTableViewFilterData; var AAllow: Boolean) of object;\r\n TTMSFNCKanbanBoardAfterApplyFilterEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn; AFilter: TTMSFNCTableViewFilterData) of object;\r\n TTMSFNCKanbanBoardItemCompareEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn; Item1, Item2: TTMSFNCKanbanBoardItem; var ACompareResult: Integer) of object;\r\n TTMSFNCKanbanBoardUpdateItemTextEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; AText: String) of object;\r\n TTMSFNCKanbanBoardItemCustomDrawMarkEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AMarkType: TTMSFNCKanbanBoardMarkType; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem) of object;\r\n TTMSFNCKanbanBoardCustomizeColumnEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn; ATableView: TTMSFNCKanbanBoardTableView) of object;\r\n TTMSFNCKanbanBoardBeforeDrawItemEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; var AAllow: Boolean; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCKanbanBoardAfterDrawItemEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem) of object;\r\n TTMSFNCKanbanBoardBeforeDrawItemTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; AText: string; var AAllow: Boolean) of object;\r\n TTMSFNCKanbanBoardAfterDrawItemTextEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; AText: string) of object;\r\n TTMSFNCKanbanBoardBeforeDrawItemTitleEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; ATitle: string; var AAllow: Boolean) of object;\r\n TTMSFNCKanbanBoardAfterDrawItemTitleEvent = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; ATitle: string) of object;\r\n TTMSFNCKanbanBoardBeforeDropItemEvent = procedure(Sender: TObject; AFromColumn, AToColumn: TTMSFNCKanbanBoardColumn; AFromItem, AToItem: TTMSFNCKanbanBoardItem; var ACanDrop: Boolean) of object;\r\n TTMSFNCKanbanBoardAfterDropItemEvent = procedure(Sender: TObject; AFromColumn, AToColumn: TTMSFNCKanbanBoardColumn; AFromItem, AToItem: TTMSFNCKanbanBoardItem) of object;\r\n TTMSFNCKanbanBoardSelectedItemEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem) of object;\r\n TTMSFNCKanbanBoardColumnEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn) of object;\r\n TTMSFNCKanbanBoardItemEvent = procedure(Sender: TObject; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem) of object;\r\n\r\n {$IFDEF FNCLIB}\r\n TTMSFNCCustomKanbanBoard = class(TTMSFNCCustomScrollControl, ITMSFNCBitmapContainer)\r\n {$ENDIF}\r\n {$IFNDEF FNCLIB}\r\n TTMSFNCCustomKanbanBoard = class(TTMSFNCCustomScrollControl)\r\n {$ENDIF}\r\n private\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n FColumns: TTMSFNCKanbanBoardColumns;\r\n FItemsAppearance: TTMSFNCKanbanBoardItemsAppearance;\r\n FColumnsAppearance: TTMSFNCKanbanBoardColumnsAppearance;\r\n FOnItemCustomDrawMark: TTMSFNCKanbanBoardItemCustomDrawMarkEvent;\r\n FInteraction: TTMSFNCKanbanBoardInteraction;\r\n FOnCustomizeColumn: TTMSFNCKanbanBoardCustomizeColumnEvent;\r\n FOnBeforeDrawItem: TTMSFNCKanbanBoardBeforeDrawItemEvent;\r\n FOnAfterDrawItem: TTMSFNCKanbanBoardAfterDrawItemEvent;\r\n FOnBeforeDropItem: TTMSFNCKanbanBoardBeforeDropItemEvent;\r\n FOnAfterDropItem: TTMSFNCKanbanBoardAfterDropItemEvent;\r\n FOnUpdateItemText: TTMSFNCKanbanBoardUpdateItemTextEvent;\r\n FOnSelectItem: TTMSFNCKanbanBoardSelectedItemEvent;\r\n FOnItemExpand: TTMSFNCKanbanBoardItemEvent;\r\n FOnColumnExpand: TTMSFNCKanbanBoardColumnEvent;\r\n FOnItemCollapse: TTMSFNCKanbanBoardItemEvent;\r\n FOnColumnCollapse: TTMSFNCKanbanBoardColumnEvent;\r\n FAdapter: TTMSFNCKanbanBoardAdapter;\r\n FOnBeforeDrawItemText: TTMSFNCKanbanBoardBeforeDrawItemTextEvent;\r\n FOnAfterDrawItemTitle: TTMSFNCKanbanBoardAfterDrawItemTitleEvent;\r\n FOnAfterDrawItemText: TTMSFNCKanbanBoardAfterDrawItemTextEvent;\r\n FOnBeforeDrawItemTitle: TTMSFNCKanbanBoardBeforeDrawItemTitleEvent;\r\n FOnItemCompare: TTMSFNCKanbanBoardItemCompareEvent;\r\n FOnDoneButtonClicked: TTMSFNCKanbanBoardDoneButtonClickedEvent;\r\n FOnAfterApplyFilter: TTMSFNCKanbanBoardAfterApplyFilterEvent;\r\n FOnBeforeApplyFilter: TTMSFNCKanbanBoardBeforeApplyFilterEvent;\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n procedure SetColumns(const Value: TTMSFNCKanbanBoardColumns);\r\n procedure SetColumnsAppearance(\r\n const Value: TTMSFNCKanbanBoardColumnsAppearance);\r\n procedure SetItemsAppearance(const Value: TTMSFNCKanbanBoardItemsAppearance);\r\n procedure SetInteraction(const Value: TTMSFNCKanbanBoardInteraction);\r\n procedure SetAdapter(const Value: TTMSFNCKanbanBoardAdapter);\r\n function GetSelectedItem: TTMSFNCKanbanBoardItem;\r\n procedure SetSelectedItem(const Value: TTMSFNCKanbanBoardItem);\r\n protected\r\n function GetVersion: String; override;\r\n function GetTotalContentWidth: Double; override;\r\n function ColumnStretchingActive: Boolean; override;\r\n function CreateColumns: TTMSFNCKanbanBoardColumns;\r\n procedure ApplyStyle; override;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure HorizontalScrollPositionChanged; override;\r\n procedure UpdateColumns(AUpdate: Boolean = True; ARealign: Boolean = True); virtual;\r\n procedure UpdateControl(AUpdate: Boolean = True; ARealign: Boolean = True); override;\r\n procedure UpdateControlScroll({%H-}AHorizontalPos, {%H-}AVerticalPos, {%H-}ANewHorizontalPos, {%H-}ANewVerticalPos: Double); override;\r\n procedure DoItemCustomDrawMark(AGraphics: TTMSFNCGraphics; ARect: TRectF; AMarkType: TTMSFNCKanbanBoardMarkType; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoCustomizeColumn(AColumn: TTMSFNCKanbanBoardColumn; ATableView: TTMSFNCKanbanBoardTableView); virtual;\r\n procedure DoBeforeDrawItem(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; var AAllow: Boolean; var ADefaultDraw: Boolean); virtual;\r\n procedure DoAfterDrawItem(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoBeforeDrawItemText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; AText: string; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawItemText(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; AText: string); virtual;\r\n procedure DoBeforeDrawItemTitle(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; ATitle: string; var AAllow: Boolean); virtual;\r\n procedure DoAfterDrawItemTitle(AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; ATitle: string); virtual;\r\n procedure DoBeforeDropItem(AFromColumn, AToColumn: TTMSFNCKanbanBoardColumn; AFromItem, AToItem: TTMSFNCKanbanBoardItem; var ACanDrop: Boolean); virtual;\r\n procedure DoAfterDropItem(AFromColumn, AToColumn: TTMSFNCKanbanBoardColumn; AFromItem, AToItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoUpdateItemText(AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem; AText: String); virtual;\r\n procedure DoSelectItem(AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoColumnExpand(AColumn: TTMSFNCKanbanBoardColumn); virtual;\r\n procedure DoColumnCollapse(AColumn: TTMSFNCKanbanBoardColumn); virtual;\r\n procedure DoItemExpand(AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoItemCollapse(AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoItemCompare(AColumn: TTMSFNCKanbanBoardColumn; AItem1, AItem2: TTMSFNCKanbanBoardItem; var ACompareResult: Integer); virtual;\r\n procedure DoBeforeApplyFilter(AColumn: TTMSFNCKanbanBoardColumn; AFilter: TTMSFNCTableViewFilterData; AAllow: Boolean); virtual;\r\n procedure DoAfterApplyFilter(AColumn: TTMSFNCKanbanBoardColumn; AFilter: TTMSFNCTableViewFilterData); virtual;\r\n procedure DoDoneButtonClicked(AColumn: TTMSFNCKanbanBoardColumn); virtual;\r\n property Version: String read GetVersion;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n property Columns: TTMSFNCKanbanBoardColumns read FColumns write SetColumns;\r\n property ColumnsAppearance: TTMSFNCKanbanBoardColumnsAppearance read FColumnsAppearance write SetColumnsAppearance;\r\n property ItemsAppearance: TTMSFNCKanbanBoardItemsAppearance read FItemsAppearance write SetItemsAppearance;\r\n property Interaction: TTMSFNCKanbanBoardInteraction read FInteraction write SetInteraction;\r\n property OnItemCustomDrawMark: TTMSFNCKanbanBoardItemCustomDrawMarkEvent read FOnItemCustomDrawMark write FOnItemCustomDrawMark;\r\n property OnItemCompare: TTMSFNCKanbanBoardItemCompareEvent read FOnItemCompare write FOnItemCompare;\r\n property OnBeforeApplyFilter: TTMSFNCKanbanBoardBeforeApplyFilterEvent read FOnBeforeApplyFilter write FOnBeforeApplyFilter;\r\n property OnAfterApplyFilter: TTMSFNCKanbanBoardAfterApplyFilterEvent read FOnAfterApplyFilter write FOnAfterApplyFilter;\r\n property OnDoneButtonClicked: TTMSFNCKanbanBoardDoneButtonClickedEvent read FOnDoneButtonClicked write FOnDoneButtonClicked;\r\n property OnUpdateItemText: TTMSFNCKanbanBoardUpdateItemTextEvent read FOnUpdateItemText write FOnUpdateItemText;\r\n property OnCustomizeColumn: TTMSFNCKanbanBoardCustomizeColumnEvent read FOnCustomizeColumn write FOnCustomizeColumn;\r\n property OnBeforeDrawItem: TTMSFNCKanbanBoardBeforeDrawItemEvent read FOnBeforeDrawItem write FOnBeforeDrawItem;\r\n property OnAfterDrawItem: TTMSFNCKanbanBoardAfterDrawItemEvent read FOnAfterDrawItem write FOnAfterDrawItem;\r\n property OnBeforeDrawItemText: TTMSFNCKanbanBoardBeforeDrawItemTextEvent read FOnBeforeDrawItemText write FOnBeforeDrawItemText;\r\n property OnAfterDrawItemText: TTMSFNCKanbanBoardAfterDrawItemTextEvent read FOnAfterDrawItemText write FOnAfterDrawItemText;\r\n property OnBeforeDrawItemTitle: TTMSFNCKanbanBoardBeforeDrawItemTitleEvent read FOnBeforeDrawItemTitle write FOnBeforeDrawItemTitle;\r\n property OnAfterDrawItemTitle: TTMSFNCKanbanBoardAfterDrawItemTitleEvent read FOnAfterDrawItemTitle write FOnAfterDrawItemTitle;\r\n property OnBeforeDropItem: TTMSFNCKanbanBoardBeforeDropItemEvent read FOnBeforeDropItem write FOnBeforeDropItem;\r\n property OnAfterDropItem: TTMSFNCKanbanBoardAfterDropItemEvent read FOnAfterDropItem write FOnAfterDropItem;\r\n property OnSelectItem: TTMSFNCKanbanBoardSelectedItemEvent read FOnSelectItem write FOnSelectItem;\r\n property OnColumnCollapse: TTMSFNCKanbanBoardColumnEvent read FOnColumnCollapse write FOnColumnCollapse;\r\n property OnColumnExpand: TTMSFNCKanbanBoardColumnEvent read FOnColumnExpand write FOnColumnExpand;\r\n property OnItemCollapse: TTMSFNCKanbanBoardItemEvent read FOnItemCollapse write FOnItemCollapse;\r\n property OnItemExpand: TTMSFNCKanbanBoardItemEvent read FOnItemExpand write FOnItemExpand;\r\n property Adapter: TTMSFNCKanbanBoardAdapter read FAdapter write SetAdapter;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure InitSample; virtual;\r\n procedure ClearSelection;\r\n procedure ClearItems;\r\n procedure SelectItem(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n function XYToColumn(X, Y: Single): TTMSFNCKanbanBoardColumn;\r\n function FindItemWithDBKey(ADBKey: String): TTMSFNCKanbanBoardItem; virtual;\r\n property SelectedItem: TTMSFNCKanbanBoardItem read GetSelectedItem write SetSelectedItem;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCKanbanBoard = class(TTMSFNCCustomKanbanBoard)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n published\r\n property Adapter;\r\n property Version;\r\n property BitmapContainer;\r\n property Stroke;\r\n property Fill;\r\n property Columns;\r\n property ColumnsAppearance;\r\n property Interaction;\r\n property ItemsAppearance;\r\n property OnItemCompare;\r\n property OnBeforeApplyFilter;\r\n property OnAfterApplyFilter;\r\n property OnDoneButtonClicked;\r\n property OnCustomizeColumn;\r\n property OnItemCustomDrawMark;\r\n property OnBeforeDrawItem;\r\n property OnAfterDrawItem;\r\n property OnBeforeDrawItemText;\r\n property OnAfterDrawItemText;\r\n property OnBeforeDrawItemTitle;\r\n property OnAfterDrawItemTitle;\r\n property OnBeforeDropItem;\r\n property OnAfterDropItem;\r\n property OnSelectItem;\r\n property OnUpdateItemText;\r\n property OnColumnCollapse;\r\n property OnColumnExpand;\r\n property OnItemCollapse;\r\n property OnItemExpand;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n WEBLib.Forms, WEBLib.TMSFNCStyles, WEBLib.TMSFNCImage, Math,\r\n SysUtils, WEBLib.TMSFNCUtils, WEBLib.TMSFNCCustomTreeView;\r\n\r\ntype\r\n TTMSFNCCustomTreeViewOpen = class(TTMSFNCCustomTreeView);\r\n TTMSFNCTableViewInteractionOpen = class(TTMSFNCTableViewInteraction);\r\n\r\n{ TTMSFNCCustomKanbanBoard }\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleAlternativeBackgroundFillColor(c) then\r\n ItemsAppearance.Fill.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleLineFillColor(c) then\r\n ItemsAppearance.Stroke.Color := c;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.ClearItems;\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Columns.Count - 1 do\r\n Columns[I].Items.Clear;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.ClearSelection;\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n if Assigned(Columns[I].FTableView) then\r\n Columns[I].FTableView.ClearSelection;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.ColumnStretchingActive: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nconstructor TTMSFNCCustomKanbanBoard.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FColumns := CreateColumns;\r\n FColumnsAppearance := TTMSFNCKanbanBoardColumnsAppearance.Create(Self);\r\n FItemsAppearance := TTMSFNCKanbanBoardItemsAppearance.Create(Self);\r\n FInteraction := TTMSFNCKanbanBoardInteraction.Create(Self);\r\n Width := 810;\r\n Height := 450;\r\n if IsDesignTime then\r\n InitSample;\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.CreateColumns: TTMSFNCKanbanBoardColumns;\r\nbegin\r\n Result := TTMSFNCKanbanBoardColumns.Create(Self);\r\nend;\r\n\r\ndestructor TTMSFNCCustomKanbanBoard.Destroy;\r\nbegin\r\n FInteraction.Free;\r\n FItemsAppearance.Free;\r\n FColumnsAppearance.Free;\r\n FColumns.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoAfterApplyFilter(\r\n AColumn: TTMSFNCKanbanBoardColumn; AFilter: TTMSFNCTableViewFilterData);\r\nbegin\r\n if Assigned(OnAfterApplyFilter) then\r\n OnAfterApplyFilter(Self, AColumn, AFilter);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoAfterDrawItem(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn;\r\n AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnAfterDrawItem) then\r\n OnAfterDrawItem(Self, AGraphics, ARect, AColumn, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoAfterDrawItemText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn;\r\n AItem: TTMSFNCKanbanBoardItem; AText: string);\r\nbegin\r\n if Assigned(OnAfterDrawItemText) then\r\n OnAfterDrawItemText(Self, AGraphics, ARect, AColumn, AItem, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoAfterDrawItemTitle(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn;\r\n AItem: TTMSFNCKanbanBoardItem; ATitle: string);\r\nbegin\r\n if Assigned(OnAfterDrawItemTitle) then\r\n OnAfterDrawItemTitle(Self, AGraphics, ARect, AColumn, AItem, ATitle);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoAfterDropItem(AFromColumn,\r\n AToColumn: TTMSFNCKanbanBoardColumn; AFromItem,\r\n AToItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnAfterDropItem) then\r\n OnAfterDropItem(Self, AFromColumn, AToColumn, AFromItem, AToItem);\r\n\r\n if Assigned(Adapter) then\r\n Adapter.UpdateItem(AToItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoBeforeApplyFilter(\r\n AColumn: TTMSFNCKanbanBoardColumn; AFilter: TTMSFNCTableViewFilterData;\r\n AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeApplyFilter) then\r\n OnBeforeApplyFilter(Self, AColumn, AFilter, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoBeforeDrawItem(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn;\r\n AItem: TTMSFNCKanbanBoardItem; var AAllow, ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItem) then\r\n OnBeforeDrawItem(Self, AGraphics, ARect, AColumn, AItem, AAllow, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoBeforeDrawItemText(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn;\r\n AItem: TTMSFNCKanbanBoardItem; AText: string; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItemText) then\r\n OnBeforeDrawItemText(Self, AGraphics, ARect, AColumn, AItem, AText, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoBeforeDrawItemTitle(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AColumn: TTMSFNCKanbanBoardColumn;\r\n AItem: TTMSFNCKanbanBoardItem; ATitle: string; var AAllow: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDrawItemTitle) then\r\n OnBeforeDrawItemTitle(Self, AGraphics, ARect, AColumn, AItem, ATitle, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoBeforeDropItem(AFromColumn, AToColumn: TTMSFNCKanbanBoardColumn; AFromItem,\r\n AToItem: TTMSFNCKanbanBoardItem; var ACanDrop: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDropItem) then\r\n OnBeforeDropItem(Self, AFromColumn, AToColumn, AFromItem, AToItem, ACanDrop);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoColumnCollapse(\r\n AColumn: TTMSFNCKanbanBoardColumn);\r\nbegin\r\n if Assigned(OnColumnCollapse) then\r\n OnColumnCollapse(Self, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoColumnExpand(\r\n AColumn: TTMSFNCKanbanBoardColumn);\r\nbegin\r\n if Assigned(OnColumnExpand) then\r\n OnColumnExpand(Self, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoCustomizeColumn(\r\n AColumn: TTMSFNCKanbanBoardColumn;\r\n ATableView: TTMSFNCKanbanBoardTableView);\r\nbegin\r\n if Assigned(OnCustomizeColumn) then\r\n OnCustomizeColumn(Self, AColumn, ATableView);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoDoneButtonClicked(\r\n AColumn: TTMSFNCKanbanBoardColumn);\r\nbegin\r\n if Assigned(OnDoneButtonClicked) then\r\n OnDoneButtonClicked(Self, AColumn);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoItemCollapse(\r\n AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnItemCollapse) then\r\n OnItemCollapse(Self, AColumn, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoItemCompare(\r\n AColumn: TTMSFNCKanbanBoardColumn; AItem1, AItem2: TTMSFNCKanbanBoardItem;\r\n var ACompareResult: Integer);\r\nbegin\r\n if Assigned(OnItemCompare) then\r\n OnItemCompare(Self, AColumn, AItem1, AItem2, ACompareResult);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoItemCustomDrawMark(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AMarkType: TTMSFNCKanbanBoardMarkType; AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnItemCustomDrawMark) then\r\n OnItemCustomDrawMark(Self, AGraphics, ARect, AMarkType, AColumn, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoItemExpand(\r\n AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnItemExpand) then\r\n OnItemExpand(Self, AColumn, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoSelectItem(\r\n AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnSelectItem) then\r\n OnSelectItem(Self, AColumn, AItem);\r\n\r\n if Assigned(Adapter) then\r\n Adapter.SelectItem(AItem);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.DoUpdateItemText(\r\n AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem;\r\n AText: String);\r\nbegin\r\n if Assigned(OnUpdateItemText) then\r\n OnUpdateItemText(Self, AColumn, AItem, AText);\r\n\r\n if Assigned(Adapter) then\r\n Adapter.UpdateItem(AItem);\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.FindItemWithDBKey(\r\n ADBKey: String): TTMSFNCKanbanBoardItem;\r\nvar\r\n I: Integer;\r\n k: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n for k := 0 to Columns[I].Items.Count - 1 do\r\n begin\r\n if Columns[I].Items[K].DBKey = ADBKey then\r\n begin\r\n Result := Columns[I].Items[K];\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := FBitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.GetSelectedItem: TTMSFNCKanbanBoardItem;\r\nvar\r\n I: Integer;\r\nbegin\r\n Result := nil;\r\n for I := 0 to FColumns.Count - 1 do\r\n begin\r\n Result := FColumns[I].SelectedItem;\r\n if Assigned(Result) then\r\n Break;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.GetTotalContentWidth: Double;\r\nvar\r\n I: Integer;\r\n tv: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := inherited GetTotalContentWidth;\r\n\r\n for I := ControlCount - 1 downto 0 do\r\n begin\r\n if Controls[I] is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := Controls[I] as TTMSFNCKanbanBoardTableView;\r\n Result := tv.Width + tv.Left + ColumnsAppearance.Margins.Right + GetHorizontalScrollPosition;\r\n Break;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.HorizontalScrollPositionChanged;\r\nvar\r\n I: Integer;\r\n x: Double;\r\n tv: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n inherited;\r\n x := 0;\r\n for I := 0 to ControlCount - 1 do\r\n begin\r\n if Controls[I] is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := Controls[I] as TTMSFNCKanbanBoardTableView;\r\n tv.Left := Round(x - GetHorizontalScrollPosition + ColumnsAppearance.Margins.Left);\r\n x := x + tv.Width + ColumnsAppearance.Spacing;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.InitSample;\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\n it: TTMSFNCKanbanBoardItem;\r\n c1, c2, c3: TTMSFNCGraphicsColor;\r\nbegin\r\n BeginUpdate;\r\n Columns.Clear;\r\n c1 := MakeGraphicsColor(227, 201, 50);\r\n c2 := MakeGraphicsColor(156, 195, 69);\r\n c3 := MakeGraphicsColor(109, 201, 223);\r\n\r\n Interaction.DragDropMode := kbdmMove;\r\n TTMSFNCUtils.SetFontSize(ColumnsAppearance.HeaderFont, 20);\r\n TTMSFNCUtils.SetFontSize(ItemsAppearance.Font, 12);\r\n TTMSFNCUtils.SetFontSize(ItemsAppearance.TitleFont, 16);\r\n\r\n c := Columns.Add;\r\n c.HeaderText := 'To Do';\r\n c.Expandable := True;\r\n it := c.Items.Add;\r\n it.Text := 'Build Feature A';\r\n it.MarkColor := c1;\r\n it.MarkType := [kbmtLeft];\r\n\r\n it := c.Items.Add;\r\n it.Text := 'Test Feature A';\r\n it.UseDefaultAppearance := False;\r\n it.Color := c1;\r\n it.MarkColor := gcRed;\r\n it.MarkType := [kbmtLeft];\r\n\r\n it := c.Items.Add;\r\n it.Text := 'Test Feature B';\r\n it.MarkColor := c2;\r\n it.MarkType := [kbmtLeft];\r\n\r\n it := c.Items.Add;\r\n it.Title := 'Deploy';\r\n it.Expandable := True;\r\n it.Text := 'Deploy Feature A on server';\r\n it.MarkType := [kbmtTop];\r\n\r\n c := Columns.Add;\r\n c.HeaderText := 'Doing';\r\n c.Expandable := True;\r\n it := c.Items.Add;\r\n it.Title := 'Build';\r\n it.Expandable := True;\r\n it.UseDefaultAppearance := False;\r\n it.Color := c3;\r\n it.TitleColor := gcWhite;\r\n it.Text := 'Build the demo application for testing purposes';\r\n\r\n it := c.Items.Add;\r\n it.Text := 'Test the demo application';\r\n\r\n c := Columns.Add;\r\n c.Expandable := True;\r\n c.HeaderText := 'Done';\r\n it := c.Items.Add;\r\n it.Text := 'Create landing page';\r\n\r\n it := c.Items.Add;\r\n it.Text := 'Mailing';\r\n\r\n it := c.Items.Add;\r\n it.Title := 'Setup';\r\n it.Expandable := True;\r\n it.Text := 'Create setup for distribution

  • Innosetup
  • Files
  • Resources
';\r\n it.UseDefaultAppearance := False;\r\n it.Color := c2;\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FBitmapContainer) then\r\n FBitmapContainer := nil;\r\n\r\n if (AComponent = FAdapter) and (Operation = opRemove) then\r\n FAdapter := nil;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SelectItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(AItem) and Assigned(AItem.Column) then\r\n AItem.Column.SelectItem(AItem.Index);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SetAdapter(\r\n const Value: TTMSFNCKanbanBoardAdapter);\r\nbegin\r\n if Assigned(Value) then\r\n Value.KanbanBoard := Self;\r\n FAdapter := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nbegin\r\n if FBitmapContainer <> Value then\r\n begin\r\n FBitmapContainer := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SetColumns(\r\n const Value: TTMSFNCKanbanBoardColumns);\r\nbegin\r\n FColumns.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SetColumnsAppearance(\r\n const Value: TTMSFNCKanbanBoardColumnsAppearance);\r\nbegin\r\n FColumnsAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SetInteraction(\r\n const Value: TTMSFNCKanbanBoardInteraction);\r\nbegin\r\n FInteraction.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SetItemsAppearance(\r\n const Value: TTMSFNCKanbanBoardItemsAppearance);\r\nbegin\r\n FItemsAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.SetSelectedItem(\r\n const Value: TTMSFNCKanbanBoardItem);\r\nbegin\r\n SelectItem(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.UpdateColumns(AUpdate: Boolean = True; ARealign: Boolean = True);\r\nvar\r\n I: Integer;\r\n c: TTMSFNCKanbanBoardColumn;\r\n tv: TTMSFNCKanbanBoardTableView;\r\n tvi: TTMSFNCTableViewItem;\r\n ci: TTMSFNCKanbanBoardItem;\r\n J: Integer;\r\n x: Double;\r\n cr: TRectF;\r\n k: Integer;\r\nbegin\r\n if (UpdateCount > 0) or IsDestroying then\r\n Exit;\r\n\r\n x := -GetHorizontalScrollPosition;\r\n cr := GetContentRect;\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n c := Columns[I];\r\n tv := c.TableView;\r\n if Assigned(tv) then\r\n begin\r\n if c.Visible then\r\n tv.Parent := Self\r\n else\r\n tv.Parent := nil;\r\n\r\n tv.BeginUpdate;\r\n tv.BitmapContainer := BitmapContainer;\r\n tv.Left := Round(x + ColumnsAppearance.Margins.Left);\r\n tv.Top := Round(cr.Top + ColumnsAppearance.Margins.Top);\r\n tv.Height := Round(cr.Bottom - cr.Top - ColumnsAppearance.Margins.Bottom - ColumnsAppearance.Margins.Top);\r\n if c.Expanded then\r\n tv.Width := Round(c.Width)\r\n else\r\n tv.Width := Round(c.CollapsedWidth);\r\n\r\n tv.TreeView.CompactMode := not c.Expanded;\r\n\r\n if AUpdate then\r\n begin\r\n tv.Header.Text := c.HeaderText;\r\n tv.Footer.Text := c.FooterText;\r\n tv.Header.Visible := c.HeaderVisible;\r\n tv.Footer.Visible := c.FooterVisible;\r\n tv.Header.Height := ColumnsAppearance.HeaderSize;\r\n tv.Footer.Height := ColumnsAppearance.FooterSize;\r\n\r\n if c.UseDefaultAppearance then\r\n begin\r\n tv.Fill.Assign(ColumnsAppearance.Fill);\r\n tv.Stroke.Assign(ColumnsAppearance.Stroke);\r\n tv.Header.Fill.Assign(ColumnsAppearance.HeaderFill);\r\n tv.Header.Stroke.Assign(ColumnsAppearance.HeaderStroke);\r\n tv.Header.Font.Assign(ColumnsAppearance.HeaderFont);\r\n tv.Footer.Fill.Assign(ColumnsAppearance.FooterFill);\r\n tv.Footer.Stroke.Assign(ColumnsAppearance.FooterStroke);\r\n tv.Footer.Font.Assign(ColumnsAppearance.FooterFont);\r\n end\r\n else\r\n begin\r\n tv.Fill.Assign(c.Fill);\r\n tv.Stroke.Assign(c.Stroke);\r\n tv.Header.Fill.Assign(c.HeaderFill);\r\n tv.Header.Stroke.Assign(c.HeaderStroke);\r\n tv.Header.Font.Assign(c.HeaderFont);\r\n tv.Footer.Fill.Assign(c.FooterFill);\r\n tv.Footer.Stroke.Assign(c.FooterStroke);\r\n tv.Footer.Font.Assign(c.FooterFont);\r\n end;\r\n\r\n tv.Header.HorizontalTextAlign := c.HeaderHorizontalTextAlign;\r\n tv.Header.VerticalTextAlign := c.HeaderVerticalTextAlign;\r\n tv.Header.WordWrapping := c.HeaderWordWrapping;\r\n tv.Header.Trimming := c.HeaderTrimming;\r\n\r\n tv.Items.Clear;\r\n for J := 0 to c.Items.Count - 1 do\r\n begin\r\n ci := c.Items[J];\r\n tvi := tv.Items.Add;\r\n tvi.AccessoryWidth := 0;\r\n tvi.AccessoryHeight := 0;\r\n tvi.Title := ci.Title;\r\n tvi.TitleExpanded := ci.Expanded;\r\n tvi.Text := ci.Text;\r\n tvi.Checked := ci.Checked;\r\n tvi.HTMLTemplateItems.Assign(ci.HTMLTemplateItems);\r\n tvi.Bitmap.Assign(ci.Bitmap);\r\n tvi.BitmapName := ci.BitmapName;\r\n tvi.WordWrapping := ci.WordWrapping;\r\n tvi.Trimming := ci.Trimming;\r\n tvi.HorizontalTextAlign := ci.HorizontalTextAlign;\r\n tvi.VerticalTextAlign := ci.VerticalTextAlign;\r\n tvi.TextColor := ci.TextColor;\r\n tvi.SelectedTextColor := ci.SelectedTextColor;\r\n tvi.DisabledTextColor := ci.DisabledTextColor;\r\n tvi.TitleWordWrapping := ci.TitleWordWrapping;\r\n tvi.TitleTrimming := ci.TitleTrimming;\r\n tvi.TitleHorizontalTextAlign := ci.TitleHorizontalTextAlign;\r\n tvi.TitleVerticalTextAlign := ci.TitleVerticalTextAlign;\r\n tvi.TitleColor := ci.TitleColor;\r\n tvi.SelectedTitleColor := ci.SelectedTitleColor;\r\n tvi.DisabledTitleColor := ci.DisabledTitleColor;\r\n tvi.Enabled := ci.Enabled;\r\n tvi.Height := ci.Height;\r\n tvi.Visible := ci.Visible;\r\n tvi.Tag := ci.Tag;\r\n k := Integer(ci.CheckType);\r\n tvi.CheckType := TTMSFNCTableViewItemCheckType(k);\r\n end;\r\n end;\r\n\r\n tv.ItemAppearance.Font.Assign(ItemsAppearance.Font);\r\n tv.ItemAppearance.Fill.Assign(ItemsAppearance.Fill);\r\n tv.ItemAppearance.Stroke.Assign(ItemsAppearance.Stroke);\r\n tv.ItemAppearance.SelectedStroke.Assign(ItemsAppearance.SelectedStroke);\r\n tv.ItemAppearance.SelectedFill.Assign(ItemsAppearance.SelectedFill);\r\n tv.ItemAppearance.DisabledStroke.Assign(ItemsAppearance.DisabledStroke);\r\n tv.ItemAppearance.DisabledFill.Assign(ItemsAppearance.DisabledFill);\r\n k := Integer(ItemsAppearance.HeightMode);\r\n tv.ItemAppearance.HeightMode := TTMSFNCTableViewItemHeightMode(k);\r\n tv.ItemAppearance.FixedHeight := ItemsAppearance.FixedHeight;\r\n tv.ItemAppearance.Height := ItemsAppearance.Height;\r\n tv.ItemAppearance.HTMLTemplate := ItemsAppearance.HTMLTemplate;\r\n tv.ItemAppearance.ShowFocus := ItemsAppearance.ShowFocus;\r\n tv.TreeView.NodesAppearance.TitleFont.Assign(ItemsAppearance.TitleFont);\r\n tv.TreeView.NodesAppearance.Spacing := ItemsAppearance.Spacing;\r\n tv.TreeView.NodesAppearance.SelectionArea := tsaDefault;\r\n\r\n tv.Interaction.MultiSelect := Interaction.MultiSelect;\r\n tv.Interaction.AutoOpenURL := Interaction.AutoOpenURL;\r\n tv.Interaction.TouchScrolling := Interaction.TouchScrolling;\r\n k := Integer(Interaction.DragDropMode);\r\n tv.Interaction.DragDropMode := TTMSFNCTableViewDragDropMode(k);\r\n tv.Interaction.SwipeBounceGesture := Interaction.SwipeBounceGesture;\r\n tv.Interaction.LongPressToEdit := False;\r\n k := Integer(Interaction.MouseEditMode);\r\n tv.TreeView.Interaction.MouseEditMode := TTMSFNCTreeViewMouseEditMode(k);\r\n tv.TreeView.Interaction.KeyboardEdit := Interaction.KeyboardEdit;\r\n if Interaction.Editing then\r\n tv.TreeView.Columns[0].EditorType := tcetMemo\r\n else\r\n tv.TreeView.Columns[0].EditorType := tcetNone;\r\n\r\n tv.VerticalScrollBarVisible := True;\r\n tv.TreeView.StretchScrollBars := False;\r\n tv.TreeView.Columns[0].ExpandingButtonSize := 20;\r\n tv.TreeView.Columns[0].Expandable := c.Expandable;\r\n tv.TreeView.Columns[0].Expanded := c.Expanded;\r\n\r\n tv.EndUpdate;\r\n tv.AdaptToStyle := AdaptToStyle;\r\n\r\n tv.FOriginalBoundsRect := RectF(tv.Left + GetHorizontalScrollPosition, tv.Top, tv.Left + tv.Width + GetHorizontalScrollPosition, tv.Top + tv.Height);\r\n\r\n if c.Visible and Assigned(tv.Parent) then\r\n x := x + tv.Width + ColumnsAppearance.Spacing;\r\n\r\n DoCustomizeColumn(c, tv);\r\n end;\r\n end;\r\n\r\n if ARealign then\r\n begin\r\n UpdateControlScrollBars(False, False);\r\n UpdateControl(False, False);\r\n end\r\n else\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.UpdateControl(AUpdate: Boolean = True; ARealign: Boolean = True);\r\nbegin\r\n UpdateColumns(AUpdate, ARealign);\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomKanbanBoard.UpdateControlScroll(AHorizontalPos,\r\n AVerticalPos, ANewHorizontalPos, ANewVerticalPos: Double);\r\nbegin\r\n inherited;\r\n UpdateColumns(False);\r\nend;\r\n\r\nfunction TTMSFNCCustomKanbanBoard.XYToColumn(X, Y: Single): TTMSFNCKanbanBoardColumn;\r\nvar\r\n I: Integer;\r\n c: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := nil;\r\n for I := 0 to Columns.Count - 1 do\r\n begin\r\n c := Columns[I];\r\n if c.Visible and Assigned(c.TableView) and Assigned(c.TableView.Parent) then\r\n begin\r\n if PtInRectEx(ConvertToRectF(c.TableView.BoundsRect), PointF(X, Y)) then\r\n begin\r\n Result := c;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoard }\r\n\r\nprocedure TTMSFNCKanbanBoard.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCKanbanBoard);\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardTableView }\r\n\r\nfunction TTMSFNCKanbanBoardTableView.CreateTreeView: TTMSFNCTreeViewTableView;\r\nbegin\r\n Result := TTMSFNCKanbanBoardTreeViewTableView.Create(Self);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.CustomizeButtons;\r\nbegin\r\n inherited;\r\n BackButton.Height := 20;\r\n DoneButton.Height := 20;\r\n EditButton.Height := 20;\r\n FilterButton.Height := 20;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DoAfterApplyFilter(\r\n AFilter: TTMSFNCTableViewFilterData);\r\nbegin\r\n inherited;\r\n if Assigned(FKanbanBoard) then\r\n FKanbanBoard.DoAfterApplyFilter(FColumn, AFilter);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DoAfterDropItem(AFromItem,\r\n AToItem: TTMSFNCTableViewItem);\r\nbegin\r\n inherited;\r\n if Assigned(FKanbanBoard) then\r\n FKanbanBoard.UpdateColumns;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DoBeforeApplyFilter(\r\n AFilter: TTMSFNCTableViewFilterData; AAllow: Boolean);\r\nbegin\r\n inherited;\r\n if Assigned(FKanbanBoard) then\r\n FKanbanBoard.DoBeforeApplyFilter(FColumn, AFilter, AAllow);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DoColumnSort(Sender: TObject;\r\n AColumn: Integer; ASortMode: TTMSFNCTreeViewNodesSortMode);\r\nvar\r\n i: Integer;\r\nbegin\r\n if Assigned(FColumn) then\r\n begin\r\n i := Integer(ASortMode);\r\n FColumn.Items.Sort(FColumn.Sorting in [kbsNormalCaseSensitive], TTMSFNCKanbanBoardItemsSortMode(i));\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DoDoneButtonClicked(Sender: TObject);\r\nbegin\r\n inherited;\r\n if Assigned(FKanbanBoard) then\r\n FKanbanBoard.DoDoneButtonClicked(FColumn);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DragItemAdd(ANewItem, AAssignItem, AInsertItem: TTMSFNCTableViewItem);\r\nvar\r\n li, lii: TTMSFNCKanbanBoardItem;\r\n tv: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n if Assigned(FColumn) and Assigned(ANewItem) and Assigned(ANewItem.TableView) then\r\n begin\r\n li := nil;\r\n if ANewItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := ANewItem.TableView as TTMSFNCKanbanBoardTableView;\r\n if Assigned(tv.FColumn) then\r\n begin\r\n tv.FColumn.FBlockUpdate := True;\r\n li := tv.FColumn.Items.Add;\r\n end;\r\n end;\r\n\r\n if Assigned(AAssignItem) and Assigned(li) and Assigned(AAssignItem.TableView) then\r\n begin\r\n if AAssignItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := AAssignItem.TableView as TTMSFNCKanbanBoardTableView;\r\n if Assigned(tv.FColumn) then\r\n begin\r\n tv.FColumn.FBlockUpdate := True;\r\n li.Assign(tv.FColumn.FindItem(AAssignItem.Index));\r\n tv.FColumn.FBlockUpdate := False;\r\n end;\r\n end;\r\n end;\r\n\r\n if Assigned(AInsertItem) and Assigned(li) and Assigned(AInsertItem.TableView) then\r\n begin\r\n if AInsertItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := AInsertItem.TableView as TTMSFNCKanbanBoardTableView;\r\n if Assigned(tv.FColumn) then\r\n begin\r\n tv.FColumn.FBlockUpdate := True;\r\n lii := tv.FColumn.FindItem(AInsertItem.Index);\r\n if Assigned(lii) then\r\n li.Index := lii.Index;\r\n tv.FColumn.FBlockUpdate := False;\r\n end;\r\n end;\r\n end;\r\n\r\n if ANewItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := ANewItem.TableView as TTMSFNCKanbanBoardTableView;\r\n tv.FColumn.FBlockUpdate := False;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DragItemDelete(AItem: TTMSFNCTableViewItem);\r\nvar\r\n li: TTMSFNCKanbanBoardItem;\r\n tv: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n if Assigned(AItem) and Assigned(AItem.TableView) then\r\n begin\r\n if AItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := AItem.TableView as TTMSFNCKanbanBoardTableView;\r\n if Assigned(tv.FColumn) then\r\n begin\r\n tv.FColumn.FBlockUpdate := True;\r\n li := tv.FColumn.FindItem(AItem.Index);\r\n if Assigned(li) then\r\n tv.FColumn.Items.Delete(li.Index);\r\n tv.FColumn.FBlockUpdate := False;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTableView.DragItemMove(AFromItem, AToItem: TTMSFNCTableViewItem);\r\nvar\r\n tvf, tvt: TTMSFNCKanbanBoardTableView;\r\n lif, lit: TTMSFNCKanbanBoardItem;\r\nbegin\r\n if Assigned(AFromItem) and Assigned(AToItem) and Assigned(AFromItem.TableView) and Assigned(AToItem.TableView) then\r\n begin\r\n if AFromItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tvf := AFromItem.TableView as TTMSFNCKanbanBoardTableView;\r\n tvt := AToItem.TableView as TTMSFNCKanbanBoardTableView;\r\n if Assigned(tvf.FColumn) and Assigned(tvt.FColumn) then\r\n begin\r\n tvf.FColumn.FBlockUpdate := True;\r\n tvt.FColumn.FBlockUpdate := True;\r\n lif := tvf.FColumn.FindItem(AFromItem.Index);\r\n lit := tvt.FColumn.FindItem(AToItem.Index);\r\n if Assigned(lif) and Assigned(lit) then\r\n lif.Index := lit.Index;\r\n tvf.FColumn.FBlockUpdate := False;\r\n tvt.FColumn.FBlockUpdate := False;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardTreeViewTableView }\r\n\r\nfunction TTMSFNCKanbanBoardTreeViewTableView.AlternativeDragDrop: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardTreeViewTableView.CanStartDragFromMouseDown: Boolean;\r\nbegin\r\n Result := False;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardTreeViewTableView.CanStartDragFromMouseMove: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardTreeViewTableView.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FDragTimerAlternative := TTimer.Create(Self);\r\n FDragTimerAlternative.Interval := 10;\r\n FDragTimerAlternative.Enabled := False;\r\n FDragTimerAlternative.OnTimer := DragTimeAlternative;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.DoAfterSelectNode(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n UpdateSelection(ANode, True);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.DoDrawNodeTitleExtra(\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AColumn: Integer;\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n r: TRectF;\r\nbegin\r\n inherited;\r\n if Assigned(FColumn) and Assigned(ANode) then\r\n begin\r\n it := FColumn.FindItem(ANode.Index);\r\n if Assigned(it) then\r\n begin\r\n if it.Expandable then\r\n begin\r\n r := ARect;\r\n r := RectF(Round(r.Left), Round(r.Top), Round(r.Right), Round(r.Bottom));\r\n InflateRectEx(r, -4, -4);\r\n if it.Expanded then\r\n AGraphics.DrawExpanderButton(r, gesExpanded, False, False, True, False)\r\n else\r\n AGraphics.DrawExpanderButton(r, gesCollapsed, False, False, True, False);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.DoGetNodeColor(\r\n ANode: TTMSFNCTreeViewVirtualNode; var AColor: TTMSFNCGraphicsColor);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n inherited;\r\n if Assigned(FColumn) and Assigned(ANode) then\r\n begin\r\n it := FColumn.FindItem(ANode.Index);\r\n if Assigned(it) then\r\n begin\r\n if not it.UseDefaultAppearance then\r\n AColor := it.Color;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.DoGetNodeTitleExtraSize(ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; var AExtraSize: Single);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n inherited;\r\n if Assigned(FColumn) and Assigned(ANode) then\r\n begin\r\n it := FColumn.FindItem(ANode.Index);\r\n if Assigned(it) then\r\n begin\r\n if it.Expandable then\r\n AExtraSize := 28;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.DoGetNodeSides(\r\n ANode: TTMSFNCTreeViewVirtualNode; var ASides: TTMSFNCGraphicsSides);\r\nbegin\r\n inherited;\r\n if not IsVirtualNodeSelected(ANode) then\r\n ASides := AllSides;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.DoUpdateNodeText(\r\n ANode: TTMSFNCTreeViewVirtualNode; AColumn: Integer; AText: String);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n inherited;\r\n if Assigned(FColumn) and Assigned(ANode) then\r\n begin\r\n it := FColumn.FindItem(ANode.Index);\r\n if Assigned(it) then\r\n begin\r\n it.Text := AText;\r\n if Assigned(FKanbanBoard) then\r\n FKanbanBoard.DoUpdateItemText(FColumn, it, AText);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.DragTimeAlternative(\r\n Sender: TObject);\r\nbegin\r\n if not Assigned(FKanbanBoard) then\r\n Exit;\r\n\r\n if (FDragScrollLeft or FDragScrollRight) and Assigned(FScrollTable) then\r\n begin\r\n if FDragScrollLeft then\r\n FKanbanBoard.Scroll(FKanbanBoard.GetHorizontalScrollPosition - FScrollTable.Width - FKanbanBoard.ColumnsAppearance.Spacing, FKanbanBoard.GetVerticalScrollPosition)\r\n else if FDragScrollRight then\r\n FKanbanBoard.Scroll(FKanbanBoard.GetHorizontalScrollPosition + FScrollTable.Width + FKanbanBoard.ColumnsAppearance.Spacing, FKanbanBoard.GetVerticalScrollPosition);\r\n\r\n FDragTimerAlternative.Enabled := False;\r\n end\r\n else\r\n begin\r\n if Assigned(FDragTableView) then\r\n begin\r\n if (FDragPoint.Y >= FDragTableView.GetContentRect.Bottom) then\r\n FDragTableView.ScrollToVirtualNode(FDragTableView.GetNodeForRow(FDragTableView.StopRow + 1), True, tvnspBottom, True)\r\n else if FDragPoint.Y <= FDragTableView.GetContentRect.Top then\r\n FDragTableView.ScrollToVirtualNode(FDragTableView.GetNodeForRow(FDragTableView.StartRow - 1), True, tvnspTop, True);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardTreeViewTableView.GetColumnsExtraSize: Double;\r\nbegin\r\n Result := 0;\r\n if CustomScrollBars then\r\n begin\r\n if CustomHorizontalScrollBar.Visible then\r\n Result := CustomHorizontalScrollBar.Height + 1;\r\n\r\n if CustomVerticalScrollBar.Visible then\r\n Result := CustomVerticalScrollBar.Width + 1;\r\n end\r\n else\r\n begin\r\n if HorizontalScrollBar.Visible then\r\n Result := HorizontalScrollBar.Height + 1;\r\n\r\n if VerticalScrollBar.Visible then\r\n Result := VerticalScrollBar.Width + 1;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardTreeViewTableView.GetContentRect: TRectF;\r\nbegin\r\n Result := inherited GetContentRect;\r\n if Assigned(FKanbanBoard) then\r\n Result.Bottom := Result.Bottom - FKanbanBoard.ItemsAppearance.Margins.Bottom;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.GetNodeMargins(var ALeft, ATop, ARight, ABottom: Single);\r\nbegin\r\n if Assigned(FKanbanBoard) then\r\n begin\r\n ALeft := FKanbanBoard.ItemsAppearance.Margins.Left;\r\n ATop := FKanbanBoard.ItemsAppearance.Margins.Top;\r\n ARight := FKanbanBoard.ItemsAppearance.Margins.Right;\r\n ABottom := FKanbanBoard.ItemsAppearance.Margins.Bottom;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.GetNodeOffset(\r\n ANode: TTMSFNCTreeViewVirtualNode; var ALeft, ATop, ARight, ABottom: Single);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n inherited;\r\n if Assigned(FColumn) and Assigned(ANode) then\r\n begin\r\n it := FColumn.FindItem(ANode.Index);\r\n if Assigned(it) then\r\n begin\r\n if kbmtLeft in it.MarkType then\r\n ALeft := it.MarkSizeLeft;\r\n if kbmtTop in it.MarkType then\r\n ATop := it.MarkSizeTop;\r\n if kbmtRight in it.MarkType then\r\n ARight := it.MarkSizeRight;\r\n if kbmtBottom in it.MarkType then\r\n ABottom := it.MarkSizeBottom;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardTreeViewTableView.GetTotalLeft: Single;\r\nbegin\r\n Result := Left;\r\n if Assigned(Parent) and (Parent is TTMSFNCCustomControl) then\r\n Result := Result + (Parent as TTMSFNCCustomControl).Left;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardTreeViewTableView.GetTotalTop: Single;\r\nbegin\r\n Result := Top;\r\n if Assigned(Parent) and (Parent is TTMSFNCCustomControl) then\r\n Result := Result + (Parent as TTMSFNCCustomControl).Top;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleAlternativeDragDrop(X,\r\n Y: Single);\r\nvar\r\n a: Boolean;\r\n p: TPointF;\r\n c: TTMSFNCKanbanBoardColumn;\r\n tv: TTMSFNCKanbanBoardTreeViewTableView;\r\nbegin\r\n inherited;\r\n if Assigned(FKanbanBoard) then\r\n begin\r\n FDragTableView := nil;\r\n FDragTimerAlternative.Enabled := False;\r\n p := PointF(X + GetTotalLeft, Y + GetTotalTop);\r\n c := FKanbanBoard.XYToColumn(p.X, p.Y);\r\n if Assigned(c) and Assigned(c.TableView) and Assigned(c.TableView.TreeView) then\r\n begin\r\n tv := (c.TableView.TreeView as TTMSFNCKanbanBoardTreeViewTableView);\r\n p := PointF(p.X - tv.GetTotalLeft, p.Y - tv.GetTotalTop);\r\n a := True;\r\n tv.HandleDragOver(Self, p, a);\r\n if a then\r\n tv.HandleDragDrop(Self, p);\r\n end\r\n else\r\n begin\r\n a := True;\r\n HandleDragOver(Self, PointF(X, Y), a);\r\n if a then\r\n HandleDragDrop(Self, PointF(X, Y));\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleAlternativeDragOver(X,\r\n Y: Single);\r\nvar\r\n a, en: Boolean;\r\n p, pt: TPointF;\r\n I: Integer;\r\n c: TTMSFNCKanbanBoardColumn;\r\n tv: TTMSFNCKanbanBoardTreeViewTableView;\r\n tvx: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n inherited;\r\n if Assigned(FKanbanBoard) then\r\n begin\r\n en := False;\r\n p := PointF(X + GetTotalLeft, Y + GetTotalTop);\r\n c := FKanbanBoard.XYToColumn(p.X, p.Y);\r\n a := True;\r\n if Assigned(c) and Assigned(c.TableView) and Assigned(c.TableView.TreeView) then\r\n begin\r\n tv := (c.TableView.TreeView as TTMSFNCKanbanBoardTreeViewTableView);\r\n pt := PointF(p.X - tv.GetTotalLeft, p.Y - tv.GetTotalTop);\r\n a := True;\r\n tv.HandleDragOver(Self, pt, a);\r\n FDragPoint := p;\r\n FDragTableView := tv;\r\n en := (p.Y >= tv.GetContentRect.Bottom) or (p.Y <= tv.GetContentRect.Top);\r\n end\r\n else\r\n begin\r\n a := True;\r\n HandleDragOver(Self, PointF(X, Y), a);\r\n end;\r\n\r\n FDragScrollLeft := (p.X < FKanbanBoard.LocalRect.Left);\r\n FDragScrollRight := (p.X > FKanbanBoard.LocalRect.Right);\r\n\r\n FScrollTable := nil;\r\n if FDragScrollRight then\r\n begin\r\n for I := 0 to FKanbanBoard.ControlCount - 1 do\r\n begin\r\n if FKanbanBoard.Controls[I] is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tvx := FKanbanBoard.Controls[I] as TTMSFNCKanbanBoardTableView;\r\n if tvx.BoundsRect.Right > FKanbanBoard.LocalRect.Right then\r\n begin\r\n FScrollTable := tvx;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end\r\n else if FDragScrollLeft then\r\n begin\r\n for I := FKanbanBoard.ControlCount - 1 downto 0 do\r\n begin\r\n if FKanbanBoard.Controls[I] is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tvx := FKanbanBoard.Controls[I] as TTMSFNCKanbanBoardTableView;\r\n if (tvx.BoundsRect.Left < FKanbanBoard.LocalRect.Left) then\r\n begin\r\n FScrollTable := tvx;\r\n Break;\r\n end;\r\n end;\r\n end;\r\n end;\r\n\r\n FDragTimerAlternative.Enabled := en or ((FDragScrollLeft or FDragScrollRight) and Assigned(FScrollTable));\r\n\r\n if a then\r\n Cursor := crDrag\r\n else\r\n Cursor := crNoDrop;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleCustomKeys(AKey: Word);\r\nvar\r\n I, K: Integer;\r\nbegin\r\n inherited;\r\n if not (AKey in [KEY_LEFT, KEY_RIGHT]) then\r\n Exit;\r\n\r\n if Assigned(FKanbanBoard) then\r\n begin\r\n for I := 0 to FKanbanBoard.Columns.Count - 1 do\r\n begin\r\n if (FKanbanBoard.Columns[I].TableView.ItemIndex <> -1) then\r\n begin\r\n K := I;\r\n case AKey of\r\n KEY_RIGHT:\r\n begin\r\n Inc(K);\r\n while (K < FKanbanBoard.Columns.Count - 1) and (not FKanbanBoard.Columns[K].Visible or not Assigned(FKanbanBoard.Columns[K].TableView.Parent)) do\r\n Inc(K);\r\n end;\r\n KEY_LEFT:\r\n begin\r\n Dec(K);\r\n while (K > 0) and (not FKanbanBoard.Columns[K].Visible or not Assigned(FKanbanBoard.Columns[K].TableView.Parent)) do\r\n Dec(K);\r\n end;\r\n end;\r\n\r\n if (K >= 0) and (K <= FKanbanBoard.Columns.Count - 1) and FKanbanBoard.Columns[K].Visible and Assigned(FKanbanBoard.Columns[K].TableView.Parent) then\r\n begin\r\n FKanbanBoard.ClearSelection;\r\n if not IntersectRectEx(ConvertToRectF(FKanbanBoard.Columns[K].TableView.BoundsRect), FKanbanBoard.LocalRect) then\r\n begin\r\n if AKey = KEY_RIGHT then\r\n FKanbanBoard.Scroll(FKanbanBoard.Columns[K].TableView.FOriginalBoundsRect.Right - FKanbanBoard.GetContentRect.Right - FKanbanBoard.GetContentRect.Left + FKanbanBoard.ColumnsAppearance.Margins.Right, FKanbanBoard.GetVerticalScrollPosition)\r\n else if AKey = KEY_LEFT then\r\n FKanbanBoard.Scroll(FKanbanBoard.Columns[K].TableView.FOriginalBoundsRect.Left - FKanbanBoard.ColumnsAppearance.Margins.Left, FKanbanBoard.GetVerticalScrollPosition);\r\n end;\r\n\r\n FKanbanBoard.Columns[K].TableView.ItemIndex := 0;\r\n\r\n if FKanbanBoard.Columns[K].TableView.TreeView.CanFocus then\r\n begin\r\n FKanbanBoard.Columns[K].TableView.TreeView.SetFocus;\r\n end;\r\n end;\r\n\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleDragDrop(\r\n const Source: TObject; const Point: TPointF);\r\nvar\r\n tv: TTMSFNCKanbanBoardTreeViewTableView;\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCKanbanBoardTreeViewTableView then\r\n begin\r\n tv := Source as TTMSFNCKanbanBoardTreeViewTableView;\r\n if Assigned(tv.DragBitmap) and tv.DragStarted then\r\n begin\r\n tv.DestroyDragBitmap;\r\n tv.DragStarted := False;\r\n tv.Invalidate;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleDragOver(\r\n const Source: TObject; const Point: TPointF; var Accept: Boolean);\r\nvar\r\n img: TTMSFNCImage;\r\n tv: TTMSFNCKanbanBoardTreeViewTableView;\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCKanbanBoardTreeViewTableView then\r\n begin\r\n tv := Source as TTMSFNCKanbanBoardTreeViewTableView;\r\n if Assigned(tv.DragBitmap) and tv.DragStarted then\r\n begin\r\n img := tv.DragBitmap;\r\n img.SetBounds(Round((Point.X - tv.SaveLeft) + GetTotalLeft), Round((Point.Y - tv.SaveTop) + GetTotalTop), img.Width, img.Height);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleDragStart(X, Y: Single);\r\nvar\r\n img: TTMSFNCImage;\r\n offx, offy: Single;\r\nbegin\r\n inherited;\r\n if IsDragDropActive and not IsReorderActive then\r\n begin\r\n CreateDragBitmap;\r\n if Assigned(DragBitmap) then\r\n begin\r\n img := DragBitmap;\r\n offx := img.Left;\r\n offy := img.Top;\r\n img.Parent := FKanbanBoard;\r\n img.SetBounds(Round(GetTotalLeft + offx), Round(GetTotalTop + offy), img.Width, img.Height);\r\n SaveLeft := (X - offx);\r\n SaveTop := (Y - offy);\r\n FDragStarted := True;\r\n Invalidate;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleExpand(AColumn: Integer);\r\nvar\r\n c: Boolean;\r\nbegin\r\n inherited;\r\n if Assigned(FColumn) then\r\n begin\r\n if FColumn.Expandable then\r\n begin\r\n c := not FColumn.Expanded;\r\n FColumn.Expanded := not FColumn.Expanded;\r\n if Assigned(FKanbanBoard) then\r\n begin\r\n if c then\r\n FKanbanBoard.DoColumnExpand(FColumn)\r\n else\r\n FKanbanBoard.DoColumnCollapse(FColumn);\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleMouseDown(\r\n Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single);\r\nvar\r\n it: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if Assigned(FKanbanBoard) then\r\n begin\r\n if FKanbanBoard.Interaction.DirectDrag then\r\n begin\r\n it := XYToNode(X, Y);\r\n if Assigned(it) then\r\n SelectVirtualNode(it);\r\n end;\r\n end;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.HandleNodeTitleExtra(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n c: Boolean;\r\nbegin\r\n inherited;\r\n if Assigned(FColumn) and Assigned(ANode) then\r\n begin\r\n it := FColumn.FindItem(ANode.Index);\r\n if Assigned(it) then\r\n begin\r\n if it.Expandable then\r\n begin\r\n c := not it.Expanded;\r\n it.Expanded := not it.Expanded;\r\n if Assigned(FKanbanBoard) then\r\n begin\r\n if c then\r\n FKanbanBoard.DoItemExpand(FColumn, it)\r\n else\r\n FKanbanBoard.DoItemCollapse(FColumn, it);\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.InternalSelectVirtualNode(\r\n ANode: TTMSFNCTreeViewVirtualNode);\r\nbegin\r\n inherited;\r\n UpdateSelection(ANode);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardTreeViewTableView.UpdateSelection(\r\n ANode: TTMSFNCTreeViewVirtualNode; AFocus: Boolean = False);\r\nvar\r\n I: Integer;\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n if Assigned(FKanbanBoard) and Assigned(FColumn) then\r\n begin\r\n for I := 0 to FKanbanBoard.Columns.Count - 1 do\r\n begin\r\n if FKanbanBoard.Columns[I].FTableView <> FColumn.FTableView then\r\n FKanbanBoard.Columns[I].FTableView.ClearSelection;\r\n end;\r\n\r\n if Assigned(ANode) then\r\n begin\r\n it := FColumn.FindItem(ANode.Index);\r\n if Assigned(it) then\r\n begin\r\n FKanbanBoard.DoSelectItem(FColumn, it);\r\n if AFocus and Assigned(it.TableView) and Assigned(it.TableView.TreeView) and it.TableView.TreeView.CanFocus then\r\n it.TableView.TreeView.SetFocus;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardColumn }\r\n\r\nfunction TTMSFNCKanbanBoardColumn.AddItem(AText: string): TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := Items.Add;\r\n Result.Text := AText;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.ApplyFilter;\r\nbegin\r\n if Assigned(TableView) then\r\n TableView.ApplyFilter;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCKanbanBoardColumn then\r\n begin\r\n FTag := (Source as TTMSFNCKanbanBoardColumn).Tag;\r\n FName := (Source as TTMSFNCKanbanBoardColumn).Name;\r\n FHeaderText := (Source as TTMSFNCKanbanBoardColumn).HeaderText;\r\n FHeaderTrimming := (Source as TTMSFNCKanbanBoardColumn).HeaderTrimming;\r\n FHeaderWordWrapping := (Source as TTMSFNCKanbanBoardColumn).HeaderWordWrapping;\r\n FHeaderHorizontalTextAlign := (Source as TTMSFNCKanbanBoardColumn).HeaderHorizontalTextAlign;\r\n FHeaderVerticalTextAlign := (Source as TTMSFNCKanbanBoardColumn).HeaderVerticalTextAlign;\r\n FFooterText := (Source as TTMSFNCKanbanBoardColumn).FooterText;\r\n FFooterTrimming := (Source as TTMSFNCKanbanBoardColumn).FooterTrimming;\r\n FFooterWordWrapping := (Source as TTMSFNCKanbanBoardColumn).FooterWordWrapping;\r\n FFooterHorizontalTextAlign := (Source as TTMSFNCKanbanBoardColumn).FooterHorizontalTextAlign;\r\n FFooterVerticalTextAlign := (Source as TTMSFNCKanbanBoardColumn).FooterVerticalTextAlign;\r\n FWidth := (Source as TTMSFNCKanbanBoardColumn).Width;\r\n FVisible := (Source as TTMSFNCKanbanBoardColumn).Visible;\r\n FHeaderVisible := (Source as TTMSFNCKanbanBoardColumn).HeaderVisible;\r\n FFooterVisible := (Source as TTMSFNCKanbanBoardColumn).FooterVisible;\r\n FUseDefaultAppearance := (Source as TTMSFNCKanbanBoardColumn).UseDefaultAppearance;\r\n FFill.Assign((Source as TTMSFNCKanbanBoardColumn).Fill);\r\n FStroke.Assign((Source as TTMSFNCKanbanBoardColumn).Stroke);\r\n FFooterFill.Assign((Source as TTMSFNCKanbanBoardColumn).FooterFill);\r\n FFooterFont.Assign((Source as TTMSFNCKanbanBoardColumn).FooterFont);\r\n FFooterStroke.Assign((Source as TTMSFNCKanbanBoardColumn).FooterStroke);\r\n FHeaderFill.Assign((Source as TTMSFNCKanbanBoardColumn).HeaderFill);\r\n FHeaderStroke.Assign((Source as TTMSFNCKanbanBoardColumn).HeaderStroke);\r\n FHeaderFont.Assign((Source as TTMSFNCKanbanBoardColumn).HeaderFont);\r\n FExpanded := (Source as TTMSFNCKanbanBoardColumn).Expanded;\r\n FExpandable := (Source as TTMSFNCKanbanBoardColumn).Expandable;\r\n FCollapsedWidth := (Source as TTMSFNCKanbanBoardColumn).CollapsedWidth;\r\n FItems.Assign((Source as TTMSFNCKanbanBoardColumn).Items);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.Changed(Sender: TObject);\r\nbegin\r\n UpdateColumn;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.ClearSelection;\r\nbegin\r\n FTableView.ClearSelection;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.CopyItem(AItem: TTMSFNCKanbanBoardItem;\r\n AToColumn: TTMSFNCKanbanboardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := nil;\r\n if Assigned(AItem) then\r\n Result := AItem.CopyItem(AToColumn, AIndex);\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardColumn.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FKanbanBoard := (Collection as TTMSFNCKanbanBoardColumns).KanbanBoard;\r\n\r\n FTableView := CreateTableView;\r\n (FTableView.TreeView as TTMSFNCKanbanBoardTreeViewTableView).FColumn := Self;\r\n (FTableView.TreeView as TTMSFNCKanbanBoardTreeViewTableView).FKanbanBoard := FKanbanBoard;\r\n FTableView.FKanbanBoard := FKanbanBoard;\r\n FTableView.FColumn := Self;\r\n FTableView.TabStop := True;\r\n FTableView.Stored := False;\r\n FTableView.OnAfterDrawItem := DoAfterDrawItem;\r\n FTableView.OnBeforeDrawItem := DoBeforeDrawItem;\r\n FTableView.OnAfterDrawItemText := DoAfterDrawItemText;\r\n FTableView.OnBeforeDrawItemText := DoBeforeDrawItemText;\r\n FTableView.OnAfterDrawItemTitle := DoAfterDrawItemTitle;\r\n FTableView.OnBeforeDrawItemTitle := DoBeforeDrawItemTitle;\r\n FTableView.OnAfterDropItem := DoAfterDropItem;\r\n FTableView.OnBeforeDropItem := DoBeforeDropItem;\r\n\r\n FItems := CreateItems;\r\n\r\n FCollapsedWidth := 100;\r\n FHeaderVisible := True;\r\n FFooterVisible := False;\r\n FExpanded := True;\r\n FExpandable := False;\r\n\r\n FHeaderWordWrapping := False;\r\n FHeaderTrimming := gttCharacter;\r\n FHeaderHorizontalTextAlign := gtaCenter;\r\n FHeaderVerticalTextAlign := gtaCenter;\r\n if Assigned(Collection) then\r\n FHeaderText := TranslateTextEx(sTMSFNCKanbanBoardHeader) + ' ' + inttostr(Collection.Count - 1);\r\n\r\n FFooterWordWrapping := False;\r\n FFooterTrimming := gttCharacter;\r\n FFooterHorizontalTextAlign := gtaCenter;\r\n FFooterVerticalTextAlign := gtaCenter;\r\n if Assigned(Collection) then\r\n FFooterText := TranslateTextEx(sTMSFNCKanbanBoardFooter) + ' ' + inttostr(Collection.Count - 1);\r\n\r\n FName := StringReplace(FHeaderText, ' ', '', [rfReplaceAll]);\r\n FWidth := 250;\r\n FVisible := True;\r\n FUseDefaultAppearance := True;\r\n\r\n FFooterFill := TTMSFNCGraphicsFill.Create(gfkNone, gcWhite);\r\n FFooterStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FHeaderFill := TTMSFNCGraphicsFill.Create(gfkNone, gcWhite);\r\n FHeaderStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FHeaderFont := TTMSFNCGraphicsFont.Create;\r\n FFooterFont := TTMSFNCGraphicsFont.Create;\r\n\r\n FFooterFill.OnChanged := @Changed;\r\n FHeaderFill.OnChanged := @Changed;\r\n FFooterStroke.OnChanged := @Changed;\r\n FHeaderStroke.OnChanged := @Changed;\r\n FStroke.OnChanged := @Changed;\r\n FFill.OnChanged := @Changed;\r\n\r\n FFont.OnChanged := @Changed;\r\n FHeaderFont.OnChanged := @Changed;\r\n FFooterFont.OnChanged := @Changed;\r\n\r\n UpdateColumn;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.CreateItems: TTMSFNCKanbanBoardItems;\r\nbegin\r\n Result := TTMSFNCKanbanBoardItems.Create(Self);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.CreateTableView: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := TTMSFNCKanbanBoardTableView.Create(FKanbanBoard);\r\nend;\r\n\r\ndestructor TTMSFNCKanbanBoardColumn.Destroy;\r\nbegin\r\n FItems.Free;\r\n FHeaderFill.Free;\r\n FHeaderStroke.Free;\r\n FHeaderFont.Free;\r\n FFooterFill.Free;\r\n FFooterStroke.Free;\r\n FFooterFont.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n FFont.Free;\r\n if Assigned(FTableView) then\r\n FTableView.Free;\r\n inherited;\r\n UpdateColumn;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DisableInteraction;\r\nbegin\r\n FTableView.DisableInteraction;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoAfterDrawItemTitle(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ATitle: string);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) and Assigned(AItem) then\r\n begin\r\n it := FindItem(AItem.Index);\r\n if Assigned(it) then\r\n k.DoAfterDrawItemTitle(AGraphics, ARect, Self, it, ATitle);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoAfterDrawItemText(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AText: string);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) and Assigned(AItem) then\r\n begin\r\n it := FindItem(AItem.Index);\r\n if Assigned(it) then\r\n k.DoAfterDrawItemText(AGraphics, ARect, Self, it, AText);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoAfterDrawItem(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\n c: TTMSFNCGraphicsColor;\r\n r: TRectF;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) and Assigned(AItem) then\r\n begin\r\n it := FindItem(AItem.Index);\r\n if Assigned(it) and Assigned(it.Column) then\r\n begin\r\n c := it.MarkColor;\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.Stroke.Kind := gskSolid;\r\n AGraphics.Stroke.Color := c;\r\n AGraphics.Fill.Color := c;\r\n\r\n if kbmtLeft in it.MarkType then\r\n begin\r\n if it.MarkColorLeft <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := it.MarkColorLeft;\r\n AGraphics.Fill.Color := it.MarkColorLeft;\r\n end;\r\n\r\n r := RectF(ARect.Left, ARect.Top, ARect.Left + it.MarkSizeLeft, ARect.Bottom);\r\n if Assigned(k.OnItemCustomDrawMark) then\r\n k.DoItemCustomDrawMark(AGraphics, r, kbmtLeft, it.Column, it)\r\n else\r\n AGraphics.DrawRectangle(r, gcrmNone);\r\n\r\n if it.MarkColorLeft <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := c;\r\n AGraphics.Fill.Color := c;\r\n end;\r\n end;\r\n\r\n if kbmtTop in it.MarkType then\r\n begin\r\n if it.MarkColorTop <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := it.MarkColorTop;\r\n AGraphics.Fill.Color := it.MarkColorTop;\r\n end;\r\n\r\n r := RectF(ARect.Left, ARect.Top, ARect.Right, ARect.Top + it.MarkSizeTop);\r\n if Assigned(k.OnItemCustomDrawMark) then\r\n k.DoItemCustomDrawMark(AGraphics, r, kbmtTop, it.Column, it)\r\n else\r\n AGraphics.DrawRectangle(r, gcrmNone);\r\n\r\n if it.MarkColorTop <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := c;\r\n AGraphics.Fill.Color := c;\r\n end;\r\n end;\r\n\r\n if kbmtRight in it.MarkType then\r\n begin\r\n if it.MarkColorRight <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := it.MarkColorRight;\r\n AGraphics.Fill.Color := it.MarkColorRight;\r\n end;\r\n r := RectF(ARect.Right - it.MarkSizeRight, ARect.Top, ARect.Right, ARect.Bottom);\r\n if Assigned(k.OnItemCustomDrawMark) then\r\n k.DoItemCustomDrawMark(AGraphics, r, kbmtRight, it.Column, it)\r\n else\r\n AGraphics.DrawRectangle(r, gcrmNone);\r\n\r\n if it.MarkColorRight <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := c;\r\n AGraphics.Fill.Color := c;\r\n end;\r\n end;\r\n\r\n if kbmtBottom in it.MarkType then\r\n begin\r\n if it.MarkColorBottom <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := it.MarkColorBottom;\r\n AGraphics.Fill.Color := it.MarkColorBottom;\r\n end;\r\n\r\n r := RectF(ARect.Left, ARect.Bottom - it.MarkSizeBottom, ARect.Right, ARect.Bottom);\r\n if Assigned(k.OnItemCustomDrawMark) then\r\n k.DoItemCustomDrawMark(AGraphics, r, kbmtBottom, it.Column, it)\r\n else\r\n AGraphics.DrawRectangle(r, gcrmNone);\r\n\r\n if it.MarkColorBottom <> gcNull then\r\n begin\r\n AGraphics.Stroke.Color := c;\r\n AGraphics.Fill.Color := c;\r\n end;\r\n end;\r\n\r\n k.DoAfterDrawItem(AGraphics, ARect, Self, it);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoAfterDropItem(Sender: TObject; AFromItem,\r\n AToItem: TTMSFNCTableViewItem);\r\nvar\r\n itfrom, itto: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\n tv: TTMSFNCKanbanBoardTableView;\r\n cfrom, cto: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) then\r\n begin\r\n cfrom := nil;\r\n cto := nil;\r\n itfrom := nil;\r\n itto := nil;\r\n\r\n if Assigned(AFromItem) and Assigned(AFromItem.TableView) then\r\n begin\r\n if AFromItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := AFromItem.TableView as TTMSFNCKanbanBoardTableView;\r\n cfrom := tv.FColumn;\r\n if Assigned(cfrom) then\r\n itfrom := cfrom.FindItem(AFromItem.Index);\r\n end;\r\n end;\r\n\r\n if Assigned(AToItem) and Assigned(AToItem.TableView) then\r\n begin\r\n if AToItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := AToItem.TableView as TTMSFNCKanbanBoardTableView;\r\n cto := tv.FColumn;\r\n if Assigned(cto) then\r\n itto := cto.FindItem(AToItem.Index);\r\n end;\r\n end;\r\n\r\n k.DoAfterDropItem(cfrom, cto, itfrom, itto);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoBeforeDrawItemTitle(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; ATitle: string;\r\n var AAllow: Boolean);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) and Assigned(AItem) then\r\n begin\r\n it := FindItem(AItem.Index);\r\n if Assigned(it) then\r\n k.DoBeforeDrawItemTitle(AGraphics, ARect, Self, it, ATitle, AAllow);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoBeforeDrawItemText(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem; AText: string;\r\n var AAllow: Boolean);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) and Assigned(AItem) then\r\n begin\r\n it := FindItem(AItem.Index);\r\n if Assigned(it) then\r\n k.DoBeforeDrawItemText(AGraphics, ARect, Self, it, AText, AAllow);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoBeforeDrawItem(Sender: TObject;\r\n AGraphics: TTMSFNCGraphics; ARect: TRectF; AItem: TTMSFNCTableViewItem;\r\n var AAllow, ADefaultDraw: Boolean);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) and Assigned(AItem) then\r\n begin\r\n it := FindItem(AItem.Index);\r\n if Assigned(it) then\r\n k.DoBeforeDrawItem(AGraphics, ARect, Self, it, AAllow, ADefaultDraw);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.DoBeforeDropItem(Sender: TObject; AFromItem,\r\n AToItem: TTMSFNCTableViewItem; var ACanDrop: Boolean);\r\nvar\r\n itfrom, itto: TTMSFNCKanbanBoardItem;\r\n k: TTMSFNCCustomKanbanBoard;\r\n tv: TTMSFNCKanbanBoardTableView;\r\n cfrom, cto: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) then\r\n begin\r\n cfrom := nil;\r\n cto := nil;\r\n itfrom := nil;\r\n itto := nil;\r\n\r\n if Assigned(AFromItem) and Assigned(AFromItem.TableView) then\r\n begin\r\n if AFromItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := AFromItem.TableView as TTMSFNCKanbanBoardTableView;\r\n cfrom := tv.FColumn;\r\n if Assigned(cfrom) then\r\n itfrom := cfrom.FindItem(AFromItem.Index);\r\n end;\r\n end;\r\n\r\n if Assigned(AToItem) and Assigned(AToItem.TableView) then\r\n begin\r\n if AToItem.TableView is TTMSFNCKanbanBoardTableView then\r\n begin\r\n tv := AToItem.TableView as TTMSFNCKanbanBoardTableView;\r\n cto := tv.FColumn;\r\n if Assigned(cto) then\r\n itto := cto.FindItem(AToItem.Index);\r\n end;\r\n end;\r\n\r\n k.DoBeforeDropItem(cfrom, cto, itfrom, itto, ACanDrop);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.EnableInteraction;\r\nbegin\r\n FTableView.EnableInteraction;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nvar\r\n k: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := nil;\r\n k := TableView;\r\n if Assigned(k) then\r\n Result := k.BitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetDoneButton: TTMSFNCToolBarButton;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) then\r\n Result := FTableView.DoneButton;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetFilter: TTMSFNCTableViewFilter;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) then\r\n Result := FTableView.Filter;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetFilterButton: TTMSFNCToolBarButton;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) then\r\n Result := FTableView.FilterButton;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetFooterColumnText: String;\r\nbegin\r\n Result := FooterText;\r\n if (Result = '') or (AnsiPos(' 0) or (AnsiPos('/>', Result) > 0) or (AnsiPos('
', UpperCase(Result)) > 0) then\r\n begin\r\n Result := Name;\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCKanbanBoardFooter) + ' ' + inttostr(Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetHeaderColumnText: String;\r\nbegin\r\n Result := HeaderText;\r\n if (Result = '') or (AnsiPos(' 0) or (AnsiPos('/>', Result) > 0) or (AnsiPos('
', UpperCase(Result)) > 0) then\r\n begin\r\n Result := Name;\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCKanbanBoardHeader) + ' ' + inttostr(Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetItemIndex: Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(FTableView) then\r\n Result := FTableView.ItemIndex;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.FindItem(\r\n AIndex: Integer): TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := nil;\r\n if (AIndex >= 0) and (AIndex <= Items.Count - 1) then\r\n Result := Items[AIndex];\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetHeaderText: String;\r\nbegin\r\n Result := HeaderText;\r\n if Result = '' then\r\n begin\r\n Result := Name;\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCKanbanBoardHeader) + ' ' + inttostr(Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetFooterText: String;\r\nbegin\r\n Result := FooterText;\r\n if Result = '' then\r\n begin\r\n Result := Name;\r\n if Result = '' then\r\n Result := TranslateTextEx(sTMSFNCKanbanBoardFooter) + ' ' + inttostr(Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.LookupItem(ALookupString: String;\r\n ACaseSensitive, AAutoSelect: Boolean): TTMSFNCKanbanBoardItem;\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) then\r\n begin\r\n it := FTableView.LookupItem(ALookupString, ACaseSensitive, AAutoSelect);\r\n if Assigned(it) then\r\n Result := FindItem(it.Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.MoveItem(AItem: TTMSFNCKanbanBoardItem;\r\n AToColumn: TTMSFNCKanbanboardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := nil;\r\n if Assigned(AItem) then\r\n Result := AItem.MoveItem(AToColumn, AIndex);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.RemoveFilter;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.RemoveFilter;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.RemoveFilters;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.RemoveFilters;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.RemoveItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(AItem) then\r\n Items.Delete(AItem.Index);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetKanbanBoard: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n Result := FKanbanBoard;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetSelectedItem: TTMSFNCKanbanBoardItem;\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) then\r\n begin\r\n it := FTableView.SelectedItem;\r\n if Assigned(it) then\r\n Result := FindItem(it.Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetSelectedItems: TTMSFNCKanbanBoardSelectedItems;\r\nvar\r\n sel: TTMSFNCTableViewSelectedItems;\r\n I: Integer;\r\nbegin\r\n if Assigned(FTableView) then\r\n begin\r\n sel := FTableView.GetSelectedItems;\r\n SetLength(Result, Length(sel));\r\n for I := 0 to Length(sel) - 1 do\r\n begin\r\n if Assigned(sel[I]) then\r\n Result[I] := FindItem(sel[I].Index);\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetSelItem(\r\n AIndex: Integer): TTMSFNCKanbanBoardItem;\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) then\r\n begin\r\n it := FTableView.SelectedItems[AIndex];\r\n if Assigned(it) then\r\n Result := FindItem(it.Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetShowFilterButton: Boolean;\r\nbegin\r\n Result := False;\r\n if Assigned(FTableView) then\r\n Result := FTableView.Interaction.ShowFilterButton;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetSorting: TTMSFNCKanbanBoardSorting;\r\nvar\r\n k: Integer;\r\nbegin\r\n Result := kbsNone;\r\n if Assigned(FTableView) then\r\n begin\r\n k := Integer(TTMSFNCTableViewInteractionOpen(FTableView.Interaction).Sorting);\r\n Result := TTMSFNCKanbanBoardSorting(k);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHeaderHorizontalTextAlign <> Value then\r\n begin\r\n FHeaderHorizontalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetItemIndex(const Value: Integer);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.ItemIndex := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetItems(\r\n const Value: TTMSFNCKanbanBoardItems);\r\nbegin\r\n FItems.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FFooterFont <> Value then\r\n FFooterFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FFooterHorizontalTextAlign <> Value then\r\n begin\r\n FFooterHorizontalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FFooterStroke <> Value then\r\n FFooterStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterText(const Value: String);\r\nbegin\r\n if FFooterText <> Value then\r\n begin\r\n FFooterText := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FFooterTrimming <> Value then\r\n begin\r\n FFooterTrimming := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FFooterVerticalTextAlign <> Value then\r\n begin\r\n FFooterVerticalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterVisible(const Value: Boolean);\r\nbegin\r\n if FFooterVisible <> Value then\r\n begin\r\n FFooterVisible := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterWordWrapping(const Value: Boolean);\r\nbegin\r\n if FFooterWordWrapping <> Value then\r\n begin\r\n FFooterWordWrapping := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.ScrollToItem(AItemIndex: Integer);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.ScrollToItem(AItemIndex);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.SelectedItemCount: Integer;\r\nbegin\r\n Result := 0;\r\n if Assigned(FTableView) then\r\n Result := FTableView.SelectedItemCount;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SelectItem(AItemIndex: Integer);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.SelectItem(AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SelectItems(\r\n AItemIndexes: TTMSFNCKanbanBoardIntegerArray);\r\nvar\r\n arr: TTMSFNCTableViewIntegerArray;\r\n I: Integer;\r\nbegin\r\n if Assigned(FTableView) then\r\n begin\r\n SetLength(arr, Length(AItemIndexes));\r\n for I := 0 to Length(AItemIndexes) - 1 do\r\n arr[I] := AItemIndexes[I];\r\n\r\n FTableView.SelectItems(arr);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFooterFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FFooterFill <> Value then\r\n FFooterFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetSelectedItem(\r\n const Value: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(Value) then\r\n ItemIndex := Value.Index;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetShowFilterButton(const Value: Boolean);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.Interaction.ShowFilterButton := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetSorting(\r\n const Value: TTMSFNCKanbanBoardSorting);\r\nvar\r\n k: Integer;\r\nbegin\r\n if Assigned(FTableView) then\r\n begin\r\n k := Integer(Value);\r\n TTMSFNCTableViewInteractionOpen(FTableView.Interaction).Sorting := TTMSFNCTableViewSorting(k);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FStroke <> Value then\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetCollapsedWidth(const Value: Double);\r\nbegin\r\n if FCollapsedWidth <> Value then\r\n begin\r\n FCollapsedWidth := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetExpandable(const Value: Boolean);\r\nbegin\r\n if FExpandable <> Value then\r\n begin\r\n FExpandable := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetExpanded(const Value: Boolean);\r\nbegin\r\n if FExpanded <> Value then\r\n begin\r\n FExpanded := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FFill <> Value then\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetFilter(\r\n const Value: TTMSFNCTableViewFilter);\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.Filter.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n if FHeaderFont <> Value then\r\n FHeaderFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n if FHeaderStroke <> Value then\r\n FHeaderStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n if FHeaderFill <> Value then\r\n FHeaderFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetName(const Value: String);\r\nbegin\r\n if FName <> Value then\r\n begin\r\n FName := Value;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderText(const Value: String);\r\nbegin\r\n if FHeaderText <> Value then\r\n begin\r\n FHeaderText := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FHeaderTrimming <> Value then\r\n begin\r\n FHeaderTrimming := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetUseDefaultAppearance(const Value: Boolean);\r\nbegin\r\n if FUseDefaultAppearance <> Value then\r\n begin\r\n FUseDefaultAppearance := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHeaderVerticalTextAlign <> Value then\r\n begin\r\n FHeaderVerticalTextAlign := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderVisible(const Value: Boolean);\r\nbegin\r\n if FHeaderVisible <> Value then\r\n begin\r\n FHeaderVisible := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetVisible(const Value: Boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetWidth(const Value: Double);\r\nbegin\r\n if FWidth <> Value then\r\n begin\r\n FWidth := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.SetHeaderWordWrapping(const Value: Boolean);\r\nbegin\r\n if FHeaderWordWrapping <> Value then\r\n begin\r\n FHeaderWordWrapping := Value;\r\n UpdateColumn;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.StartEditMode;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.StartEditMode;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.StartFiltering;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.StartFiltering;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.StopEditMode;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.StopEditMode;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.StopFiltering;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.StopFiltering;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.ToggleEditMode;\r\nbegin\r\n if Assigned(FTableView) then\r\n FTableView.ToggleEditMode;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.GetTableView: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := FTableView;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.IsCollapsedWidthStored: Boolean;\r\nbegin\r\n Result := CollapsedWidth <> 100;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.UpdateColumn(AUpdate: Boolean = True; ARealign: Boolean = True);\r\nvar\r\n k: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n k := KanbanBoard;\r\n if Assigned(k) then\r\n k.UpdateColumns(AUpdate, ARealign);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumn.UpdateWidth(AWidth: Double);\r\nbegin\r\n FWidth := AWidth;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.XYToItem(X, Y: Single): TTMSFNCKanbanBoardItem;\r\nvar\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n Result := nil;\r\n if Assigned(FTableView) then\r\n begin\r\n it := FTableView.XYToItem(X, Y);\r\n if Assigned(it) then\r\n Result := FindItem(it.Index);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumn.XYToItemIndex(X, Y: Single): Integer;\r\nbegin\r\n Result := -1;\r\n if Assigned(FTableView) then\r\n Result := FTableView.XYToItemIndex(X, Y);\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardColumns }\r\n\r\nfunction TTMSFNCKanbanBoardColumns.Add: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := TTMSFNCKanbanBoardColumn(inherited Add);\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardColumns.Create(AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\nbegin\r\n inherited Create(AKanbanBoard, GetItemClass);\r\n FKanbanBoard := AKanbanBoard;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumns.GetItem(Index: Integer): TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := TTMSFNCKanbanBoardColumn(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumns.GetItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCKanbanBoardColumn;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumns.Insert(Index: Integer): TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := TTMSFNCKanbanBoardColumn(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumns.GetKanbanBoard: TTMSFNCCustomKanbanBoard;\r\nbegin\r\n Result := FKanbanBoard;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumns.SetItem(Index: Integer;\r\n const Value: TTMSFNCKanbanBoardColumn);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardItem }\r\n\r\nprocedure TTMSFNCKanbanBoardItem.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCKanbanBoardItem then\r\n begin\r\n FTag := (Source as TTMSFNCKanbanBoardItem).Tag;\r\n FText := (Source as TTMSFNCKanbanBoardItem).Text;\r\n FTitle := (Source as TTMSFNCKanbanBoardItem).Title;\r\n FColor := (Source as TTMSFNCKanbanBoardItem).Color;\r\n FUseDefaultAppearance := (Source as TTMSFNCKanbanBoardItem).UseDefaultAppearance;\r\n FExpanded := (Source as TTMSFNCKanbanBoardItem).Expanded;\r\n FTitleTrimming := (Source as TTMSFNCKanbanBoardItem).TitleTrimming;\r\n FTitleWordWrapping := (Source as TTMSFNCKanbanBoardItem).TitleWordWrapping;\r\n FTitleHorizontalTextAlign := (Source as TTMSFNCKanbanBoardItem).TitleHorizontalTextAlign;\r\n FTitleVerticalTextAlign := (Source as TTMSFNCKanbanBoardItem).TitleVerticalTextAlign;\r\n FTitleColor := (Source as TTMSFNCKanbanBoardItem).TitleColor;\r\n FSelectedTitleColor := (Source as TTMSFNCKanbanBoardItem).SelectedTitleColor;\r\n FDisabledTitleColor := (Source as TTMSFNCKanbanBoardItem).DisabledTitleColor;\r\n FMarkType := (Source as TTMSFNCKanbanBoardItem).MarkType;\r\n FMarkColor := (Source as TTMSFNCKanbanBoardItem).MarkColor;\r\n FMarkColorLeft := (Source as TTMSFNCKanbanBoardItem).MarkColorLeft;\r\n FMarkColorBottom := (Source as TTMSFNCKanbanBoardItem).MarkColorBottom;\r\n FMarkColorRight := (Source as TTMSFNCKanbanBoardItem).MarkColorRight;\r\n FMarkColorTop := (Source as TTMSFNCKanbanBoardItem).MarkColorTop;\r\n FMarkSizeLeft := (Source as TTMSFNCKanbanBoardItem).MarkSizeLeft;\r\n FMarkSizeTop := (Source as TTMSFNCKanbanBoardItem).MarkSizeTop;\r\n FMarkSizeRight := (Source as TTMSFNCKanbanBoardItem).MarkSizeRight;\r\n FMarkSizeBottom := (Source as TTMSFNCKanbanBoardItem).MarkSizeBottom;\r\n FHTMLTemplateItems.Assign((Source as TTMSFNCKanbanBoardItem).HTMLTemplateItems);\r\n FTrimming := (Source as TTMSFNCKanbanBoardItem).Trimming;\r\n FWordWrapping := (Source as TTMSFNCKanbanBoardItem).WordWrapping;\r\n FHorizontalTextAlign := (Source as TTMSFNCKanbanBoardItem).HorizontalTextAlign;\r\n FVerticalTextAlign := (Source as TTMSFNCKanbanBoardItem).VerticalTextAlign;\r\n FTextColor := (Source as TTMSFNCKanbanBoardItem).TextColor;\r\n FSelectedTextColor := (Source as TTMSFNCKanbanBoardItem).SelectedTextColor;\r\n FDisabledTextColor := (Source as TTMSFNCKanbanBoardItem).DisabledTextColor;\r\n FEnabled := (Source as TTMSFNCKanbanBoardItem).Enabled;\r\n FVisible := (Source as TTMSFNCKanbanBoardItem).Visible;\r\n FBitmapName := (Source as TTMSFNCKanbanBoardItem).BitmapName;\r\n FBitmap.Assign((Source as TTMSFNCKanbanBoardItem).Bitmap);\r\n FHeight := (Source as TTMSFNCKanbanBoardItem).Height;\r\n FChecked := (Source as TTMSFNCKanbanBoardItem).Checked;\r\n FCheckType := (Source as TTMSFNCKanbanBoardItem).CheckType;\r\n FExpandable := (Source as TTMSFNCKanbanBoardItem).Expandable;\r\n AssignData(Source);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.AssignData(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCKanbanBoardItem then\r\n begin\r\n FDataString := (Source as TTMSFNCKanbanBoardItem).DataString;\r\n FDataBoolean := (Source as TTMSFNCKanbanBoardItem).DataBoolean;\r\n FDataObject := (Source as TTMSFNCKanbanBoardItem).DataObject;\r\n FDataInteger := (Source as TTMSFNCKanbanBoardItem).DataInteger;\r\n FDBKey := (Source as TTMSFNCKanbanBoardItem).DBKey;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.BitmapChanged(Sender: TObject);\r\nbegin\r\n UpdateItem;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.Changed(Sender: TObject);\r\nbegin\r\n UpdateItem;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.CopyItem(AToColumn: TTMSFNCKanbanBoardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem;\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := nil;\r\n\r\n if not Assigned(AToColumn) then\r\n Exit;\r\n\r\n if (AIndex <> -1) then\r\n it := AToColumn.Items.Insert(AIndex)\r\n else\r\n it := AToColumn.Items.Add;\r\n\r\n it.Assign(Self);\r\n\r\n Result := it;\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardItem.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FColumn := (Collection as TTMSFNCKanbanBoardItems).Column;\r\n\r\n FTextColor := gcBlack;\r\n FChecked := False;\r\n FCheckType := kbictNone;\r\n FColor := gcNull;\r\n FExpanded := True;\r\n FExpandable := False;\r\n FUseDefaultAppearance := True;\r\n FHeight := -1;\r\n FEnabled := True;\r\n FVisible := True;\r\n FHTMLTemplateItems := TStringList.Create;\r\n FHTMLTemplateItems.OnChange := @TemplateItemsChanged;\r\n FSelectedTextColor := gcBlack;\r\n FDisabledTextColor := gcSilver;\r\n FWordWrapping := true;\r\n FHorizontalTextAlign := gtaLeading;\r\n FVerticalTextAlign := gtaCenter;\r\n FTrimming := gttNone;\r\n FBitmap := TTMSFNCBitmap.Create;\r\n FBitmap.OnChange := @BitmapChanged;\r\n FMarkType := [];\r\n FMarkColor := gcRed;\r\n FMarkColorLeft := gcNull;\r\n FMarkColorRight := gcNull;\r\n FMarkColorBottom := gcNull;\r\n FMarkColorTop := gcNull;\r\n FMarkSizeLeft := 4;\r\n FMarkSizeTop := 4;\r\n FMarkSizeRight := 4;\r\n FMarkSizeBottom := 4;\r\n FTitleColor := gcBlack;\r\n FSelectedTitleColor := gcBlack;\r\n FDisabledTitleColor := gcSilver;\r\n FTitleWordWrapping := true;\r\n FTitleHorizontalTextAlign := gtaLeading;\r\n FTitleVerticalTextAlign := gtaCenter;\r\n FTitleTrimming := gttNone;\r\n UpdateItem;\r\nend;\r\n\r\ndestructor TTMSFNCKanbanBoardItem.Destroy;\r\nbegin\r\n FBitmap.Free;\r\n FHTMLTemplateItems.Free;\r\n inherited;\r\n UpdateItem;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetHeight(const Value: Double);\r\nbegin\r\n if FHeight <> Value then\r\n begin\r\n FHeight := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetHTMLTemplateItems(const Value: TStringList);\r\nbegin\r\n if FHTMLTemplateItems <> Value then\r\n begin\r\n FHTMLTemplateItems.Assign(Value);\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkColorLeft(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FMarkColorLeft <> Value then\r\n begin\r\n FMarkColorLeft := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FMarkColor <> Value then\r\n begin\r\n FMarkColor := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkSizeLeft(const Value: Single);\r\nbegin\r\n if FMarkSizeLeft <> Value then\r\n begin\r\n FMarkSizeLeft := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkSizeTop(const Value: Single);\r\nbegin\r\n if FMarkSizeTop <> Value then\r\n begin\r\n FMarkSizeTop := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkSizeRight(const Value: Single);\r\nbegin\r\n if FMarkSizeRight <> Value then\r\n begin\r\n FMarkSizeRight := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkSizeBottom(const Value: Single);\r\nbegin\r\n if FMarkSizeBottom <> Value then\r\n begin\r\n FMarkSizeBottom := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkType(\r\n const Value: TTMSFNCKanbanBoardMarkTypes);\r\nbegin\r\n if FMarkType <> Value then\r\n begin\r\n FMarkType := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkColorRight(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FMarkColorRight <> Value then\r\n begin\r\n FMarkColorRight := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nvar\r\n l: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := nil;\r\n l := Column;\r\n if Assigned(l) then\r\n Result := l.BitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.GetColumn: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := FColumn;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.GetTableView: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := nil;\r\n if Assigned(FColumn) then\r\n Result := FColumn.FTableView;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.GetTableViewItem(\r\n AIndex: Integer): TTMSFNCTableViewItem;\r\nvar\r\n t: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := nil;\r\n t := TableView;\r\n if Assigned(t) then\r\n if (Index >= 0) and (Index <= t.Items.Count - 1) then\r\n Result := t.Items[Index];\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.TemplateItemsChanged(Sender: TObject);\r\nbegin\r\n UpdateItem;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.LoadFromString(AString: String);\r\nvar\r\n k: Integer;\r\n a: TStringList;\r\n s: TStringList;\r\n y: Integer;\r\n st: string;\r\n ps: Integer;\r\n subst: string;\r\nbegin\r\n a := TStringList.Create;\r\n try\r\n st := AString;\r\n while st <> '' do\r\n begin\r\n ps := Pos('{0}', st);\r\n if ps = 0 then\r\n begin\r\n a.Add(st);\r\n Break;\r\n end;\r\n subst := Copy(st, 1, ps - 1);\r\n a.Add(subst);\r\n Delete(st, 1, ps - 1 + Length('{0}'));\r\n end;\r\n\r\n for K := 0 to a.Count - 1 do\r\n begin\r\n if a[K] <> '' then\r\n begin\r\n if K = 0 then\r\n Text := a[K]\r\n else if K = 1 then\r\n begin\r\n s := TStringList.Create;\r\n try\r\n TTMSFNCUtils.Split(';', a[K], s);\r\n for y := 0 to s.Count - 1 do\r\n begin\r\n if s[y] <> '' then\r\n begin\r\n if y = 0 then\r\n Checked := StrToBool(s[y])\r\n else if y = 1 then\r\n BitmapName := s[y]\r\n else if y = 2 then\r\n TTMSFNCUtils.LoadBitmapFromHexStr(s[y], Bitmap);\r\n end;\r\n end;\r\n finally\r\n s.Free;\r\n end;\r\n end\r\n else if K = 2 then\r\n Enabled := StrToBool(a[K]);\r\n end;\r\n end;\r\n finally\r\n a.Free;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.MoveItem(AToColumn: TTMSFNCKanbanBoardColumn; AIndex: Integer = -1): TTMSFNCKanbanBoardItem;\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := CopyItem(AToColumn, AIndex);\r\n c := Column;\r\n if Assigned(c) then\r\n c.RemoveItem(Self);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.GetStrippedHTMLText: String;\r\nbegin\r\n Result := TTMSFNCUtils.HTMLStrip(GetText);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.GetText: string;\r\nvar\r\n ht: string;\r\n s: string;\r\n tv: TTMSFNCKanbanBoardTableView;\r\n it: TTMSFNCTableViewItem;\r\nbegin\r\n s := '';\r\n tv := TableView;\r\n if Assigned(tv) then\r\n begin\r\n ht := tv.ItemAppearance.HTMLTemplate;\r\n if ht = '' then\r\n s := Text\r\n else\r\n begin\r\n it := GetTableViewItem(Index);\r\n if Assigned(it) then\r\n begin\r\n tv.DoGetHTMLTemplate(it, ht);\r\n s := tv.HTMLReplace(ht, it);\r\n end;\r\n end;\r\n end;\r\n\r\n Result := s;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.IsHeightStored: Boolean;\r\nbegin\r\n Result := Height <> -1;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.IsMarkSizeLeftStored: Boolean;\r\nbegin\r\n Result := MarkSizeLeft <> 4;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.IsMarkSizeTopStored: Boolean;\r\nbegin\r\n Result := MarkSizeTop <> 4;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.IsMarkSizeRightStored: Boolean;\r\nbegin\r\n Result := MarkSizeRight <> 4;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.IsMarkSizeBottomStored: Boolean;\r\nbegin\r\n Result := MarkSizeBottom <> 4;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.IsSelected: Boolean;\r\nvar\r\n i: Integer;\r\n tv: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := False;\r\n tv := TableView;\r\n if Assigned(tv) then\r\n begin\r\n for I := 0 to tv.SelectedItemCount - 1 do\r\n begin\r\n if tv.SelectedItems[I] = GetTableViewItem(Index) then\r\n begin\r\n Result := True;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItem.SaveToString(ATextOnly: Boolean): String;\r\nvar\r\n s: String;\r\n tv: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n tv := TableView;\r\n if not Assigned(tv) then\r\n Exit;\r\n\r\n Result := '';\r\n Result := Result + Text;\r\n\r\n if not ATextOnly then\r\n Result := Result + '{0}';\r\n\r\n if not ATextOnly then\r\n begin\r\n Result := Result + BoolToStr(Checked) + ';';\r\n Result := Result + BitmapName + ';';\r\n Result := Result + TTMSFNCUtils.SaveBitmapToHexStr(Bitmap) + ';';\r\n Result := Result + s;\r\n end;\r\n\r\n if not ATextOnly then\r\n begin\r\n Result := Result + '{0}';\r\n Result := Result + BoolToStr(Enabled);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetChecked(const Value: Boolean);\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\n k: TTMSFNCKanbanBoardTableView;\r\n n: TTMSFNCTreeViewVirtualNode;\r\nbegin\r\n if FChecked <> Value then\r\n begin\r\n FChecked := Value;\r\n c := FColumn;\r\n if Assigned(c) then\r\n begin\r\n k := c.FTableView;\r\n if Assigned(k) then\r\n begin\r\n n := k.GetNodeForItemIndex(Index);\r\n if Assigned(n) and (n.CheckStates[0] <> FChecked) then\r\n begin\r\n if FChecked then\r\n k.TreeView.CheckVirtualNode(n, 0)\r\n else\r\n k.TreeView.UnCheckVirtualNode(n, 0);\r\n end;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetCheckType(\r\n const Value: TTMSFNCKanbanBoardItemCheckType);\r\nbegin\r\n if FCheckType <> Value then\r\n begin\r\n FCheckType := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetExpandable(const Value: Boolean);\r\nbegin\r\n if FExpandable <> Value then\r\n begin\r\n FExpandable := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetExpanded(const Value: Boolean);\r\nbegin\r\n if FExpanded <> Value then\r\n begin\r\n FExpanded := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FColor <> Value then\r\n begin\r\n FColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SelectItem;\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n c := Column;\r\n if Assigned(c) then\r\n c.SelectedItem := Self;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetBitmap(const Value: TTMSFNCBitmap);\r\nbegin\r\n if FBitmap <> Value then\r\n begin\r\n FBitmap.Assign(Value);\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetBitmapName(const Value: string);\r\nbegin\r\n if FBitmapName <> Value then\r\n begin\r\n FBitmapName := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkColorBottom(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FMarkColorBottom <> Value then\r\n begin\r\n FMarkColorBottom := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetDisabledTextColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledTextColor <> Value then\r\n begin\r\n FDisabledTextColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetDisabledTitleColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FDisabledTitleColor <> Value then\r\n begin\r\n FDisabledTitleColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetEnabled(const Value: Boolean);\r\nbegin\r\n if FEnabled <> Value then\r\n begin\r\n FEnabled := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetSelectedTextColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedTextColor <> Value then\r\n begin\r\n FSelectedTextColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetSelectedTitleColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FSelectedTitleColor <> Value then\r\n begin\r\n FSelectedTitleColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTextColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FTextColor <> Value then\r\n begin\r\n FTextColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTitle(const Value: String);\r\nbegin\r\n if FTitle <> Value then\r\n begin\r\n FTitle := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTitleColor(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FTitleColor <> Value then\r\n begin\r\n FTitleColor := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTitleHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTitleHorizontalTextAlign <> Value then\r\n begin\r\n FTitleHorizontalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTitleTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTitleTrimming <> Value then\r\n begin\r\n FTitleTrimming := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTitleVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FTitleVerticalTextAlign <> Value then\r\n begin\r\n FTitleVerticalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTitleWordWrapping(const Value: Boolean);\r\nbegin\r\n if FTitleWordWrapping <> Value then\r\n begin\r\n FTitleWordWrapping := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetMarkColorTop(\r\n const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if FMarkColorTop <> Value then\r\n begin\r\n FMarkColorTop := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetUseDefaultAppearance(const Value: Boolean);\r\nbegin\r\n if FUseDefaultAppearance <> Value then\r\n begin\r\n FUseDefaultAppearance := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetVisible(const Value: Boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n UpdateItem;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItem.UpdateItem;\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n c := FColumn;\r\n if Assigned(c) and not c.FBlockUpdate then\r\n c.UpdateColumn;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardItems }\r\n\r\nfunction TTMSFNCKanbanBoardItems.Add: TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := TTMSFNCKanbanBoardItem(inherited Add);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItems.Clear;\r\nvar\r\n k: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n k := TableView;\r\n if Assigned(k) then\r\n k.BeginUpdate;\r\n inherited Clear;\r\n if Assigned(k) then\r\n k.EndUpdate;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItems.GetColumn: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n Result := FColumn;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItems.Compare(AItem1, AItem2: TTMSFNCKanbanBoardItem;\r\n ACaseSensitive: Boolean; ASortingMode: TTMSFNCKanbanBoardItemsSortMode): Integer;\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\n it1, it2: TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := 0;\r\n\r\n c := FColumn;\r\n if Assigned(c) and Assigned(c.FKanbanBoard) then\r\n begin\r\n if not ACaseSensitive then\r\n Result := AnsiCompareStr(UpperCase(AItem1.StrippedHTMLText), UpperCase(AItem2.StrippedHTMLText))\r\n else\r\n Result := AnsiCompareStr(AItem1.StrippedHTMLText, AItem2.StrippedHTMLText);\r\n\r\n case ASortingMode of\r\n kbismDescending: Result := Result * -1;\r\n end;\r\n\r\n it1 := AItem1;\r\n it2 := AItem2;\r\n\r\n c.FKanbanBoard.DoItemCompare(c, it1, it2, Result);\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardItems.Create(AColumn: TTMSFNCKanbanBoardColumn);\r\nbegin\r\n inherited Create(AColumn, GetItemClass);\r\n FColumn := AColumn;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItems.GetItem(Index: Integer): TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := TTMSFNCKanbanBoardItem(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItems.GetItemClass: TCollectionItemClass;\r\nbegin\r\n Result := TTMSFNCKanbanBoardItem;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItems.Insert(Index: Integer): TTMSFNCKanbanBoardItem;\r\nbegin\r\n Result := TTMSFNCKanbanBoardItem(inherited Insert(Index));\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItems.GetTableView: TTMSFNCKanbanBoardTableView;\r\nbegin\r\n Result := nil;\r\n if Assigned(FColumn) then\r\n Result := FColumn.FTableView;\r\nend;\r\n\r\ntype\r\n {$HINTS OFF}\r\n TShadowedCollection = class(TPersistent)\r\n private\r\n {%H-}FItemClass: TCollectionItemClass;\r\n {$IFDEF LCLWEBLIB}\r\n FItems: TFPList;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n FItems: TList;\r\n {$ENDIF}\r\n end;\r\n {$HINTS ON}\r\n\r\nprocedure TTMSFNCKanbanBoardItems.QuickSort(L, R: Integer; ACaseSensitive: Boolean;\r\n ASortingMode: TTMSFNCKanbanBoardItemsSortMode);\r\nvar\r\n I, J, p: Integer;\r\n {$IFDEF LCLWEBLIB}\r\n SortList: TFPList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n {$IFDEF WEBLIB}\r\n Save: JSValue;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n Save: Pointer;\r\n {$ENDIF}\r\n begin\r\n Save := SortList.Items[Index1];\r\n SortList.Items[Index1] := SortList.Items[Index2];\r\n SortList.Items[Index2] := Save;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n SortList: TList;\r\n\r\n procedure ExchangeItems(Index1, Index2: Integer);\r\n var\r\n Save: TCollectionItem;\r\n begin\r\n Save := SortList[Index1];\r\n SortList[Index1] := SortList[Index2];\r\n SortList[Index2] := Save;\r\n Save.Index := Index2;\r\n end;\r\n {$ENDIF}\r\nbegin\r\n //This cast allows us to get at the private elements in the base class\r\n {$IFNDEF WEBLIB}\r\n SortList := {%H-}TShadowedCollection(Self).FItems;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n SortList := Self.FPList;\r\n {$ENDIF}\r\n\r\n repeat\r\n I := L;\r\n J := R;\r\n P := (L + R) shr 1;\r\n repeat\r\n while Compare(Items[I], Items[P], ACaseSensitive, ASortingMode) < 0 do\r\n Inc(I);\r\n while Compare(Items[J], Items[P], ACaseSensitive, ASortingMode) > 0 do\r\n Dec(J);\r\n if I <= J then\r\n begin\r\n ExchangeItems(I, J);\r\n if P = I then\r\n P := J\r\n else if P = J then\r\n P := I;\r\n Inc(I);\r\n Dec(J);\r\n end;\r\n until I > J;\r\n if L < J then\r\n QuickSort(L, J, ACaseSensitive, ASortingMode);\r\n L := I;\r\n until I >= R;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItems.SetItem(Index: Integer;\r\n const Value: TTMSFNCKanbanBoardItem);\r\nbegin\r\n inherited Items[Index] := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItems.Sort(ACaseSensitive: Boolean;\r\n ASortingMode: TTMSFNCKanbanBoardItemsSortMode);\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\nbegin\r\n c := FColumn;\r\n if Assigned(c) and Assigned(c.FKanbanBoard) then\r\n begin\r\n c.FKanbanBoard.BeginUpdate;\r\n if Count > 1 then\r\n QuickSort(0, Pred(Count), ACaseSensitive, ASortingMode);\r\n c.FKanbanBoard.EndUpdate;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardColumnsAppearance }\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCKanbanBoardColumnsAppearance then\r\n begin\r\n FMargins.Assign((Source as TTMSFNCKanbanBoardColumnsAppearance).Margins);\r\n FSpacing := (Source as TTMSFNCKanbanBoardColumnsAppearance).Spacing;\r\n FHeaderFont.Assign((Source as TTMSFNCKanbanBoardColumnsAppearance).HeaderFont);\r\n FHeaderFill.Assign((Source as TTMSFNCKanbanBoardColumnsAppearance).HeaderFill);\r\n FHeaderStroke.Assign((Source as TTMSFNCKanbanBoardColumnsAppearance).HeaderStroke);\r\n FHeaderSize := (Source as TTMSFNCKanbanBoardColumnsAppearance).HeaderSize;\r\n FFooterFont.Assign((Source as TTMSFNCKanbanBoardColumnsAppearance).FooterFont);\r\n FFooterFill.Assign((Source as TTMSFNCKanbanBoardColumnsAppearance).FooterFill);\r\n FFooterStroke.Assign((Source as TTMSFNCKanbanBoardColumnsAppearance).FooterStroke);\r\n FFooterSize := (Source as TTMSFNCKanbanBoardColumnsAppearance).FooterSize;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.Changed(Sender: TObject);\r\nbegin\r\n if Assigned(FKanbanBoard) then\r\n FKanbanBoard.UpdateColumns;\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardColumnsAppearance.Create(\r\n AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\nbegin\r\n FKanbanBoard := AKanbanBoard;\r\n FMargins := TTMSFNCMargins.Create(RectF(10, 10, 10, 10));\r\n FMargins.OnChange := @Changed;\r\n FSpacing := 20;\r\n\r\n FFooterFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FFooterStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FHeaderFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FHeaderStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhite);\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n\r\n FHeaderFont := TTMSFNCGraphicsFont.Create;\r\n FHeaderFont.Color := gcBlack;\r\n FFooterFont := TTMSFNCGraphicsFont.Create;\r\n FFooterFont.Color := gcBlack;\r\n\r\n FFooterFill.OnChanged := @Changed;\r\n FFooterStroke.OnChanged := @Changed;\r\n FHeaderFill.OnChanged := @Changed;\r\n FHeaderStroke.OnChanged := @Changed;\r\n\r\n FFill.OnChanged := @Changed;\r\n FStroke.OnChanged := @Changed;\r\n\r\n FHeaderFont.OnChanged := @Changed;\r\n FFooterFont.OnChanged := @Changed;\r\n\r\n FFooterSize := 35;\r\n FHeaderSize := 35;\r\nend;\r\n\r\ndestructor TTMSFNCKanbanBoardColumnsAppearance.Destroy;\r\nbegin\r\n FMargins.Free;\r\n FHeaderFont.Free;\r\n FHeaderFill.Free;\r\n FHeaderStroke.Free;\r\n FFooterFont.Free;\r\n FFooterFill.Free;\r\n FFooterStroke.Free;\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumnsAppearance.IsFooterSizeStored: Boolean;\r\nbegin\r\n Result := FooterSize <> 35;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumnsAppearance.IsHeaderSizeStored: Boolean;\r\nbegin\r\n Result := HeaderSize <> 35;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardColumnsAppearance.IsSpacingStored: Boolean;\r\nbegin\r\n Result := Spacing <> 20;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetFooterFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFooterFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetFooterFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFooterFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetFooterSize(\r\n const Value: Single);\r\nbegin\r\n if FFooterSize <> Value then\r\n begin\r\n FFooterSize := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetFooterStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FFooterStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetMargins(\r\n const Value: TTMSFNCMargins);\r\nbegin\r\n FMargins.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetSpacing(const Value: Single);\r\nbegin\r\n if FSpacing <> Value then\r\n begin\r\n FSpacing := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetHeaderFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FHeaderFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetHeaderFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FHeaderFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetHeaderSize(\r\n const Value: Single);\r\nbegin\r\n if FHeaderSize <> Value then\r\n begin\r\n FHeaderSize := Value;\r\n Changed(Self);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardColumnsAppearance.SetHeaderStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FHeaderStroke.Assign(Value);\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardItemsAppearance }\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCKanbanBoardItemsAppearance then\r\n begin\r\n Font.Assign((Source as TTMSFNCKanbanBoardItemsAppearance).Font);\r\n Fill.Assign((Source as TTMSFNCKanbanBoardItemsAppearance).Fill);\r\n Stroke.Assign((Source as TTMSFNCKanbanBoardItemsAppearance).Stroke);\r\n SelectedFill.Assign((Source as TTMSFNCKanbanBoardItemsAppearance).SelectedFill);\r\n SelectedStroke.Assign((Source as TTMSFNCKanbanBoardItemsAppearance).SelectedStroke);\r\n DisabledFill.Assign((Source as TTMSFNCKanbanBoardItemsAppearance).DisabledFill);\r\n DisabledStroke.Assign((Source as TTMSFNCKanbanBoardItemsAppearance).DisabledStroke);\r\n HeightMode := (Source as TTMSFNCKanbanBoardItemsAppearance).HeightMode;\r\n FixedHeight := (Source as TTMSFNCKanbanBoardItemsAppearance).FixedHeight;\r\n FHTMLTemplate := (Source as TTMSFNCKanbanBoardItemsAppearance).HTMLTemplate;\r\n FSpacing := (Source as TTMSFNCKanbanBoardItemsAppearance).Spacing;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.Changed;\r\nbegin\r\n FKanbanBoard.UpdateColumns;\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardItemsAppearance.Create(AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\nbegin\r\n FKanbanBoard := AKanbanBoard;\r\n FShowFocus := True;\r\n FFixedHeight := 25;\r\n FHeight := -1;\r\n FHeightMode := kbhmVariable;\r\n FSpacing := 10;\r\n\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcWhitesmoke);\r\n FStroke := TTMSFNCGraphicsStroke.Create(gskSolid, gcDarkGray);\r\n FSelectedFill := TTMSFNCGraphicsFill.Create(gfkSolid, TTMSFNCTreeViewColorSelection);\r\n FSelectedStroke := TTMSFNCGraphicsStroke.Create(gskSolid, TTMSFNCTreeViewColorSelection);\r\n FDisabledFill := TTMSFNCGraphicsFill.Create(gfkSolid, gcDarkGray);\r\n FDisabledStroke := TTMSFNCGraphicsStroke.Create(gskNone, gcDarkGray);\r\n\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n if Assigned(FKanbanBoard) and FKanbanBoard.IsDesignTime then\r\n FFont.Color := gcBlack;\r\n\r\n FTitleFont := TTMSFNCGraphicsFont.Create;\r\n if Assigned(FKanbanBoard) and FKanbanBoard.IsDesignTime then\r\n FTitleFont.Color := gcBlack;\r\n\r\n FFill.OnChanged := @FillChanged;\r\n FStroke.OnChanged := @StrokeChanged;\r\n\r\n FSelectedFill.OnChanged := @FillChanged;\r\n FSelectedStroke.OnChanged := @StrokeChanged;\r\n\r\n FDisabledFill.OnChanged := @FillChanged;\r\n FDisabledStroke.OnChanged := @StrokeChanged;\r\n\r\n FFont.OnChanged := @FontChanged;\r\n FTitleFont.OnChanged := @FontChanged;\r\n\r\n FMargins := TTMSFNCMargins.Create(RectF(10, 10, 10, 10));\r\n FMargins.OnChange := @MarginsChanged;\r\nend;\r\n\r\ndestructor TTMSFNCKanbanBoardItemsAppearance.Destroy;\r\nbegin\r\n FMargins.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n FFont.Free;\r\n FTitleFont.Free;\r\n\r\n FSelectedFill.Free;\r\n FSelectedStroke.Free;\r\n\r\n FDisabledFill.Free;\r\n FDisabledStroke.Free;\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.FontChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItemsAppearance.IsHeightStored: Boolean;\r\nbegin\r\n Result := Height <> -1;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardItemsAppearance.IsSpacingStored: Boolean;\r\nbegin\r\n Result := Spacing <> 10;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.MarginsChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetDisabledFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FDisabledFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetDisabledStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FDisabledStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetFixedHeight(const Value: Double);\r\nbegin\r\n if FFixedHeight <> Value then\r\n begin\r\n FFixedHeight := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetHeight(const Value: Double);\r\nbegin\r\n if FHeight <> Value then\r\n begin\r\n FHeight := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetHeightMode(\r\n const Value: TTMSFNCKanbanBoardItemHeightMode);\r\nbegin\r\n if FHeightMode <> Value then\r\n begin\r\n FHeightMode := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetHTMLTemplate(\r\n const Value: string);\r\nbegin\r\n if FHTMLTemplate <> Value then\r\n begin\r\n FHTMLTemplate := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetMargins(\r\n const Value: TTMSFNCMargins);\r\nbegin\r\n FMargins.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetSelectedFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FSelectedFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetSelectedStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FSelectedStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetShowFocus(const Value: Boolean);\r\nbegin\r\n if FShowFocus <> Value then\r\n begin\r\n FShowFocus := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetSpacing(const Value: Double);\r\nbegin\r\n if FSpacing <> Value then\r\n begin\r\n FSpacing := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.SetTitleFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FTitleFont.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardItemsAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardInteraction }\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCTableViewInteraction) then\r\n begin\r\n FMultiSelect := (Source as TTMSFNCKanbanBoardInteraction).MultiSelect;\r\n FTouchScrolling := (Source as TTMSFNCKanbanBoardInteraction).TouchScrolling;\r\n FSwipeBounceGesture := (Source as TTMSFNCKanbanBoardInteraction).SwipeBounceGesture;\r\n FDragDropMode := (Source as TTMSFNCKanbanBoardInteraction).DragDropMode;\r\n FMouseEditMode := (Source as TTMSFNCKanbanBoardInteraction).MouseEditMode;\r\n FKeyboardEdit := (Source as TTMSFNCKanbanBoardInteraction).KeyboardEdit;\r\n FEditing := (Source as TTMSFNCKanbanBoardInteraction).Editing;\r\n FDirectDrag := (Source as TTMSFNCKanbanBoardInteraction).DirectDrag;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.Changed;\r\nbegin\r\n if Assigned(FKanbanBoard) then\r\n FKanbanBoard.UpdateColumns(False);\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardInteraction.Create(AKanbanBoard: TTMSFNCCustomKanbanBoard);\r\nbegin\r\n FKanbanBoard := AKanbanBoard;\r\n FSwipeBounceGesture := False;\r\n FTouchScrolling := True;\r\n FMultiSelect := False;\r\n FDragDropMode := kbdmNone;\r\n FMouseEditMode := kbemSingleClickOnSelectedItem;\r\n FKeyboardEdit := True;\r\n FEditing := False;\r\n FDirectDrag := False;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetAutoOpenURL(const Value: Boolean);\r\nbegin\r\n if FAutoOpenURL <> Value then\r\n begin\r\n FAutoOpenURL := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetDirectDrag(const Value: Boolean);\r\nbegin\r\n if FDirectDrag <> Value then\r\n begin\r\n FDirectDrag := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetDragDropMode(\r\n const Value: TTMSFNCKanbanBoardDragDropMode);\r\nbegin\r\n if FDragDropMode <> Value then\r\n begin\r\n FDragDropMode := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetEditing(const Value: Boolean);\r\nbegin\r\n if FEditing <> Value then\r\n begin\r\n FEditing := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetKeyboardEdit(const Value: Boolean);\r\nbegin\r\n if FKeyboardEdit <> Value then\r\n begin\r\n FKeyboardEdit := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetMouseEditMode(\r\n const Value: TTMSFNCKanbanBoardMouseEditMode);\r\nbegin\r\n if FMouseEditMode <> Value then\r\n begin\r\n FMouseEditMode := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetMultiSelect(const Value: Boolean);\r\nbegin\r\n if FMultiSelect <> Value then\r\n begin\r\n FMultiSelect := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetSwipeBounceGesture(\r\n const Value: Boolean);\r\nbegin\r\n if FSwipeBounceGesture <> Value then\r\n begin\r\n FSwipeBounceGesture := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardInteraction.SetTouchScrolling(const Value: Boolean);\r\nbegin\r\n if FTouchScrolling <> Value then\r\n begin\r\n FTouchScrolling := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardAdapter }\r\n\r\nconstructor TTMSFNCKanbanBoardAdapter.Create(AOwner: TComponent);\r\nvar\r\n I: Integer;\r\nbegin\r\n inherited;\r\n FActive := False;\r\n if Assigned(AOwner) and (AOwner is TCustomForm) then\r\n begin\r\n for I := 0 to AOwner.ComponentCount - 1 do\r\n begin\r\n if (AOwner.Components[i] is TTMSFNCCustomKanbanBoard) then\r\n begin\r\n KanbanBoard := AOwner.Components[i] as TTMSFNCCustomKanbanBoard;\r\n Break;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardAdapter.GetInstance: NativeUInt;\r\nbegin\r\n Result := HInstance;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardAdapter.LoadItems;\r\nbegin\r\n if not Assigned(FKanbanBoard) then\r\n Exit;\r\n\r\n FKanbanBoard.ClearItems;\r\n\r\n if Active then\r\n GetItems;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardAdapter.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FKanbanBoard) then\r\n FKanbanBoard := nil;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardAdapter.SetActive(const Value: boolean);\r\nbegin\r\n if (Value <> FActive) then\r\n begin\r\n FActive := Value;\r\n LoadItems;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardAdapter.UpdateItems;\r\nbegin\r\n Active := false;\r\n Active := true;\r\nend;\r\n\r\n\r\nend.\r\n","{\r\n This file is part of the Free Pascal run time library.\r\n Copyright (c) 1999-2000 by Michael Van Canneyt, member of the\r\n Free Pascal development team\r\n\r\n Constants used for displaying messages in DB units\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\n\r\nunit DBConst;\r\n\r\nInterface\r\n\r\nResourcestring\r\n SActiveDataset = 'Operation cannot be performed on an active dataset';\r\n SBadParamFieldType = 'Bad fieldtype for parameter \"%s\".';\r\n SCantSetAutoIncFields = 'AutoInc Fields are read-only';\r\n SConnected = 'Operation cannot be performed on a connected database';\r\n SDatasetReadOnly = 'Dataset is read-only.';\r\n SDatasetRegistered = 'Dataset already registered : \"%s\"';\r\n SDuplicateFieldName = 'Duplicate fieldname : \"%s\"';\r\n SErrAssTransaction = 'Cannot assign transaction while old transaction active!';\r\n SErrColumnNotFound = 'Column \"%s\" not found.';\r\n SErrDatabasenAssigned = 'Database not assigned!';\r\n SErrNoDatabaseAvailable = 'Invalid operation: Not attached to database';\r\n SErrNoDatabaseName = 'Database connect string (DatabaseName) not filled in!';\r\n SErrNoSelectStatement = 'Cannot open a non-select statement';\r\n SErrNoStatement = 'SQL statement not set';\r\n SErrTransAlreadyActive = 'Transaction already active';\r\n SErrTransactionnSet = 'Transaction not set';\r\n SErrIndexResultTooLong = 'Index result for \"%s\" too long, >100 characters (%d).';\r\n SErrIndexBasedOnInvField = 'Field \"%s\" has an invalid field type (%s) to base index on.';\r\n SErrIndexBasedOnUnkField = 'Index based on unknown field \"%s\".';\r\n SErrConnTransactionnSet = 'Transaction of connection not set';\r\n SErrNotASQLConnection = '\"%s\" is not a TSQLConnection';\r\n SErrNotASQLQuery = '\"%s\" is not a TCustomSQLQuery';\r\n STransNotActive = 'Operation cannot be performed on an inactive transaction';\r\n STransActive = 'Operation cannot be performed on an active transaction';\r\n SFieldNotFound = 'Field not found : \"%s\"';\r\n SInactiveDataset = 'Operation cannot be performed on an inactive dataset';\r\n SInvalidDisplayValues = '\"%s\" are not valid boolean displayvalues';\r\n SInvalidFieldKind = '%s : invalid field kind : ';\r\n SInvalidBookmark = 'Invalid bookmark';\r\n SInvalidFieldSize = 'Invalid field size : %d';\r\n SInvalidTypeConversion = 'Invalid type conversion to %s in field %s';\r\n SNeedField = 'Field %s is required, but not supplied.';\r\n SNeedFieldName = 'Field needs a name';\r\n SNoDataset = 'No dataset asssigned for field : \"%s\"';\r\n SNoDatasetRegistered = 'No such dataset registered : \"%s\"';\r\n SNoDatasets = 'No datasets are attached to the database';\r\n SNoSuchRecord = 'Could not find the requested record.';\r\n SNoTransactionRegistered = 'No such transaction registered : \"%s\"';\r\n SNoTransactions = 'No transactions are attached to the database';\r\n SNotABoolean = '\"%s\" is not a valid boolean';\r\n SNotAFloat = '\"%s\" is not a valid float';\r\n SNotAninteger = '\"%s\" is not a valid integer';\r\n SNotConnected = 'Operation cannot be performed on an disconnected database';\r\n SNotEditing = 'Operation not allowed, dataset \"%s\" is not in an edit or insert state.';\r\n SParameterNotFound = 'Parameter \"%s\" not found';\r\n SRangeError = '%f is not between %f and %f for %s';\r\n SReadOnlyField = 'Field %s cannot be modified, it is read-only.';\r\n STransactionRegistered = 'Transaction already registered : \"%s\"';\r\n SUniDirectional = 'Operation cannot be performed on an unidirectional dataset';\r\n SUnknownField = 'No field named \"%s\" was found in dataset \"%s\"';\r\n SUnknownFieldType = 'Unknown field type : %s';\r\n SUnknownParamFieldType = 'Unknown fieldtype for parameter \"%s\".';\r\n SMetadataUnavailable = 'The metadata is not available for this type of database.';\r\n SDeletedRecord = 'The record is deleted.';\r\n SIndexNotFound = 'Index ''%s'' not found';\r\n SParameterCountIncorrect = 'The number of parameters is incorrect.';\r\n SUnsupportedParameter = 'Parameters of the type ''%s'' are not (yet) supported.';\r\n SFieldValueError = 'Invalid value for field ''%s''';\r\n SInvalidCalcType = 'Field ''%s'' cannot be a calculated or lookup field';\r\n SDuplicateName = 'Duplicate name ''%s'' in %s';\r\n SNoParseSQL = '%s is only possible if ParseSQL is True';\r\n SLookupInfoError = 'Lookup information for field ''%s'' is incomplete';\r\n SUnsupportedFieldType = 'Fieldtype %s is not supported';\r\n SInvPacketRecordsValue = 'PacketRecords has to be larger then 0';\r\n SInvPacketRecordsValueFieldNames = 'PacketRecords must be -1 if IndexFieldNames is set';\r\n SInvalidSearchFieldType = 'Searching in fields of type %s is not supported';\r\n SDatasetEmpty = 'The dataset is empty';\r\n SFieldIsNull = 'The field is null';\r\n SOnUpdateError = 'An error occurred while applying the updates in a record: %s';\r\n SApplyRecNotSupported = 'Applying updates is not supported by this TDataset descendent';\r\n SNoWhereFields = 'No %s query specified and failed to generate one. (No fields for inclusion in where statement found)';\r\n SNoUpdateFields = 'No %s query specified and failed to generate one. (No fields found for insert- or update-statement found)';\r\n SNotSupported = 'Operation is not supported by this type of database';\r\n SDBCreateDropFailed = 'Creation or dropping of database failed';\r\n SMaxIndexes = 'The maximum amount of indexes is reached';\r\n SMinIndexes = 'The minimum amount of indexes is 1';\r\n STooManyFields = 'More fields specified then really exist';\r\n// These are added for Delphi-compatilility, but not used by the fcl:\r\n SFieldIndexError = 'Field index out of range';\r\n SIndexFieldMissing = 'Cannot access index field ''%s''';\r\n SNoFieldIndexes = 'No index currently active';\r\n SNotIndexField = 'Field ''%s'' is not indexed and cannot be modified';\r\n SErrUnknownConnectorType = 'Unknown connector type: \"%s\"';\r\n SNoIndexFieldNameGiven = 'There are no fields selected to base the index on';\r\n SStreamNotRecognised = 'The data-stream format is not recognized';\r\n SNoReaderClassRegistered = 'There is no TDatapacketReaderClass registered for this kind of data-stream';\r\n SErrCircularDataSourceReferenceNotAllowed = 'Circular datasource references are not allowed.';\r\n SCommitting = 'Committing transaction';\r\n SRollingBack = 'Rolling back transaction';\r\n SCommitRetaining = 'Commit and retaining transaction';\r\n SRollBackRetaining = 'Rollback and retaining transaction';\r\n SErrNoFieldsDefined = 'Can not create a dataset when there are no fielddefinitions or fields defined';\r\n SErrApplyUpdBeforeRefresh = 'Must apply updates before refreshing data';\r\n SErrNoDataset = 'Missing (compatible) underlying dataset, can not open';\r\n SErrDisconnectedPacketRecords = 'For disconnected TSQLQuery instances, packetrecords must be -1';\r\n SErrImplicitNoRollBack = 'Implicit use of transactions does not allow rollback.';\r\n SErrNoImplicitTransaction = 'Connection %s does not allow implicit transactions.';\r\n SErrImplictTransactionStart = 'Error: attempt to implicitly start a transaction on Connection \"%s\", transaction \"%s\".';\r\n SErrImplicitConnect = 'Error: attempt to implicitly activate connection \"%s\".';\r\n SErrFailedToUpdateRecord = 'Failed to apply record updates: %d rows updated.';\r\n SErrRefreshNotSingleton = 'Refresh SQL resulted in multiple records: %d.';\r\n SErrRefreshEmptyResult = 'Refresh SQL resulted in empty result set.';\r\n SErrNoKeyFieldForRefreshClause = 'No key field found to construct refresh SQL WHERE clause';\r\n SErrFailedToFetchReturningResult = 'Failed to fetch returning result';\r\n SLogParamValue = 'Parameter \"%s\" value : \"%s\"';\r\n SErrInvalidDateTime = 'Invalid date/time value : \"%s\"';\r\n SatEOFInternalOnly = 'loAtEOF is for internal use only.';\r\n SErrInsertingSameRecordtwice = 'Attempt to insert the same record twice.';\r\n SErrDoApplyUpdatesNeedsProxy = 'Cannot apply updates without Data proxy';\r\n\r\nImplementation\r\n\r\nend.\r\n","{\r\n This file is part of the Free Pascal run time library.\r\n Copyright (c) 1999-2017 by Michael Van Canneyt, member of the\r\n Free Pascal development team\r\n\r\n DB database unit\r\n\r\n See the file COPYING.FPC, included in this distribution,\r\n for details about the copyright.\r\n\r\n This program is distributed in the hope that it will be useful,\r\n but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r\n\r\n **********************************************************************}\r\nunit DB;\r\n\r\n{$mode objfpc}\r\n{$h+}\r\n{ $define dsdebug}\r\ninterface\r\n\r\nuses Classes, SysUtils, JS, Types, DateUtils;\r\n\r\nconst\r\n\r\n dsMaxBufferCount = MAXINT div 8;\r\n dsMaxStringSize = 8192;\r\n\r\n // Used in AsBoolean for string fields to determine\r\n // whether it's true or false.\r\n YesNoChars : Array[Boolean] of char = ('N', 'Y');\r\n\r\n SQLDelimiterCharacters = [';',',',' ','(',')',#13,#10,#9];\r\n\r\ntype\r\n\r\n{ Misc Dataset types }\r\n\r\n TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,\r\n dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead,\r\n dsInternalCalc, dsOpening, dsRefreshFields);\r\n\r\n TDataEvent = (deFieldChange, deRecordChange, deDataSetChange,\r\n deDataSetScroll, deLayoutChange, deUpdateRecord, deUpdateState,\r\n deCheckBrowseMode, dePropertyChange, deFieldListChange, deFocusControl,\r\n deParentScroll,deConnectChange,deReconcileError,deDisabledStateChange);\r\n\r\n TUpdateStatus = (usUnmodified, usModified, usInserted, usDeleted, usResolved, usResolveFailed);\r\n TUpdateStatusSet = Set of TUpdateStatus;\r\n\r\n TUpdateMode = (upWhereAll, upWhereChanged, upWhereKeyOnly);\r\n TResolverResponse = (rrSkip, rrAbort, rrMerge, rrApply, rrIgnore);\r\n\r\n TProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden, pfRefreshOnInsert,pfRefreshOnUpdate);\r\n TProviderFlags = set of TProviderFlag;\r\n\r\n{ Forward declarations }\r\n\r\n TFieldDef = class;\r\n TFieldDefs = class;\r\n TField = class;\r\n TFields = Class;\r\n TDataSet = class;\r\n TDataSource = Class;\r\n TDataLink = Class;\r\n TDataProxy = Class;\r\n TDataRequest = class;\r\n TRecordUpdateDescriptor = class;\r\n TRecordUpdateDescriptorList = class;\r\n TRecordUpdateBatch = class;\r\n\r\n{ Exception classes }\r\n\r\n EDatabaseError = class(Exception);\r\n\r\n EUpdateError = class(EDatabaseError)\r\n private\r\n FContext : String;\r\n FErrorCode : integer;\r\n FOriginalException : Exception;\r\n FPreviousError : Integer;\r\n public\r\n constructor Create(NativeError, Context : String;\r\n ErrCode, PrevError : integer; E: Exception);\r\n Destructor Destroy; override;\r\n property Context : String read FContext;\r\n property ErrorCode : integer read FErrorcode;\r\n property OriginalException : Exception read FOriginalException;\r\n property PreviousError : Integer read FPreviousError;\r\n end;\r\n \r\n\r\n{ TFieldDef }\r\n\r\n TFieldClass = class of TField;\r\n\r\n // Data type for field.\r\n TFieldType = (\r\n ftUnknown, ftString, ftInteger, ftLargeInt, ftBoolean, ftFloat, ftDate,\r\n ftTime, ftDateTime, ftAutoInc, ftBlob, ftMemo, ftFixedChar,\r\n ftVariant\r\n );\r\n\r\n{ TDateTimeRec }\r\n\r\n TFieldAttribute = (faHiddenCol, faReadonly, faRequired, faLink, faUnNamed, faFixed);\r\n TFieldAttributes = set of TFieldAttribute;\r\n\r\n{ TNamedItem }\r\n\r\n TNamedItem = class(TCollectionItem)\r\n private\r\n FName: string;\r\n protected\r\n function GetDisplayName: string; override;\r\n procedure SetDisplayName(const Value: string); override;\r\n Public \r\n property DisplayName : string read GetDisplayName write SetDisplayName;\r\n published\r\n property Name : string read FName write SetDisplayName;\r\n end;\r\n\r\n{ TDefCollection }\r\n\r\n TDefCollection = class(TOwnedCollection)\r\n private\r\n FDataset: TDataset;\r\n FUpdated: boolean;\r\n protected\r\n procedure SetItemName(Item: TCollectionItem); override;\r\n public\r\n constructor create(ADataset: TDataset; AOwner: TPersistent; AClass: TCollectionItemClass);\r\n function Find(const AName: string): TNamedItem;\r\n procedure GetItemNames(List: TStrings);\r\n function IndexOf(const AName: string): Longint;\r\n property Dataset: TDataset read FDataset;\r\n property Updated: boolean read FUpdated write FUpdated;\r\n end;\r\n\r\n{ TFieldDef }\r\n\r\n TFieldDef = class(TNamedItem)\r\n Private\r\n FAttributes : TFieldAttributes;\r\n FDataType : TFieldType;\r\n FFieldNo : Longint;\r\n FInternalCalcField : Boolean;\r\n FPrecision : Longint;\r\n FRequired : Boolean;\r\n FSize : Integer;\r\n Function GetFieldClass : TFieldClass;\r\n procedure SetAttributes(AValue: TFieldAttributes);\r\n procedure SetDataType(AValue: TFieldType);\r\n procedure SetPrecision(const AValue: Longint);\r\n procedure SetSize(const AValue: Integer);\r\n procedure SetRequired(const AValue: Boolean);\r\n public\r\n constructor Create(ACollection : TCollection); override;\r\n constructor Create(AOwner: TFieldDefs; const AName: string; ADataType: TFieldType; ASize: Integer; ARequired: Boolean; AFieldNo: Longint); overload;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n function CreateField(AOwner: TComponent): TField;\r\n property FieldClass: TFieldClass read GetFieldClass;\r\n property FieldNo: Longint read FFieldNo;\r\n property InternalCalcField: Boolean read FInternalCalcField write FInternalCalcField;\r\n property Required: Boolean read FRequired write SetRequired;\r\n Published\r\n property Attributes: TFieldAttributes read FAttributes write SetAttributes default [];\r\n property DataType: TFieldType read FDataType write SetDataType;\r\n property Precision: Longint read FPrecision write SetPrecision default 0;\r\n property Size: Integer read FSize write SetSize default 0;\r\n end;\r\n TFieldDefClass = Class of TFieldDef;\r\n\r\n{ TFieldDefs }\r\n\r\n TFieldDefs = class(TDefCollection)\r\n private\r\n FHiddenFields : Boolean;\r\n function GetItem(Index: Longint): TFieldDef;\r\n procedure SetItem(Index: Longint; const AValue: TFieldDef);\r\n Protected\r\n Class Function FieldDefClass : TFieldDefClass; virtual;\r\n public\r\n constructor Create(ADataSet: TDataSet);\r\n// destructor Destroy; override;\r\n Function Add(const AName: string; ADataType: TFieldType; ASize, APrecision: Integer; ARequired, AReadOnly: Boolean; AFieldNo : Integer) : TFieldDef; overload;\r\n Function Add(const AName: string; ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo : Integer) : TFieldDef; overload;\r\n procedure Add(const AName: string; ADataType: TFieldType; ASize: Word; ARequired: Boolean); overload;\r\n procedure Add(const AName: string; ADataType: TFieldType; ASize: Word); overload;\r\n procedure Add(const AName: string; ADataType: TFieldType); overload;\r\n function Add: TFieldDef; overload;\r\n Function AddFieldDef : TFieldDef;\r\n procedure Assign(FieldDefs: TFieldDefs); overload;\r\n function Find(const AName: string): TFieldDef;\r\n// procedure Clear;\r\n// procedure Delete(Index: Longint);\r\n procedure Update; overload;\r\n Function MakeNameUnique(const AName : String) : string; virtual;\r\n Property HiddenFields : Boolean Read FHiddenFields Write FHiddenFields;\r\n property Items[Index: Longint]: TFieldDef read GetItem write SetItem; default;\r\n end;\r\n TFieldDefsClass = Class of TFieldDefs;\r\n\r\n{ TField }\r\n\r\n TFieldKind = (fkData, fkCalculated, fkLookup, fkInternalCalc);\r\n TFieldKinds = Set of TFieldKind;\r\n\r\n TFieldNotifyEvent = procedure(Sender: TField) of object;\r\n TFieldGetTextEvent = procedure(Sender: TField; var aText: string;\r\n DisplayText: Boolean) of object;\r\n TFieldSetTextEvent = procedure(Sender: TField; const aText: string) of object;\r\n TFieldChars = Array of Char;\r\n\r\n{ TLookupList }\r\n\r\n TLookupList = class(TObject)\r\n private\r\n FList: TFPList;\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n procedure Add(const AKey, AValue: JSValue);\r\n procedure Clear;\r\n function FirstKeyByValue(const AValue: JSValue): JSValue;\r\n function ValueOfKey(const AKey: JSValue): JSValue;\r\n procedure ValuesToStrings(AStrings: TStrings);\r\n end;\r\n\r\n{ TField }\r\n\r\n TField = class(TComponent)\r\n private\r\n FAlignment : TAlignment;\r\n FAttributeSet : String;\r\n FCalculated : Boolean;\r\n FConstraintErrorMessage : String;\r\n FCustomConstraint : String;\r\n FDataSet : TDataSet;\r\n// FDataSize : Word;\r\n FDataType : TFieldType;\r\n FDefaultExpression : String;\r\n FDisplayLabel : String;\r\n FDisplayWidth : Longint;\r\n// FEditMask: TEditMask;\r\n FFieldDef: TFieldDef;\r\n FFieldKind : TFieldKind;\r\n FFieldName : String;\r\n FFieldNo : Longint;\r\n FFields : TFields;\r\n FHasConstraints : Boolean;\r\n FImportedConstraint : String;\r\n FIsIndexField : Boolean;\r\n FKeyFields : String;\r\n FLookupCache : Boolean;\r\n FLookupDataSet : TDataSet;\r\n FLookupKeyfields : String;\r\n FLookupresultField : String;\r\n FLookupList: TLookupList;\r\n FOffset : Word;\r\n FOnChange : TFieldNotifyEvent;\r\n FOnGetText: TFieldGetTextEvent;\r\n FOnSetText: TFieldSetTextEvent;\r\n FOnValidate: TFieldNotifyEvent;\r\n FOrigin : String;\r\n FReadOnly : Boolean;\r\n FRequired : Boolean;\r\n FSize : integer;\r\n FValidChars : TFieldChars;\r\n FValueBuffer : JSValue;\r\n FValidating : Boolean;\r\n FVisible : Boolean;\r\n FProviderFlags : TProviderFlags;\r\n function GetIndex : longint;\r\n function GetLookup: Boolean;\r\n procedure SetAlignment(const AValue: TAlignMent);\r\n procedure SetIndex(const AValue: Longint);\r\n function GetDisplayText: String;\r\n function GetEditText: String;\r\n procedure SetEditText(const AValue: string);\r\n procedure SetDisplayLabel(const AValue: string);\r\n procedure SetDisplayWidth(const AValue: Longint);\r\n function GetDisplayWidth: integer;\r\n procedure SetLookup(const AValue: Boolean);\r\n procedure SetReadOnly(const AValue: Boolean);\r\n procedure SetVisible(const AValue: Boolean);\r\n function IsDisplayLabelStored : Boolean;\r\n function IsDisplayWidthStored: Boolean;\r\n function GetLookupList: TLookupList;\r\n procedure CalcLookupValue;\r\n protected\r\n Procedure RaiseAccessError(const TypeName: string);\r\n function AccessError(const TypeName: string): EDatabaseError;\r\n procedure CheckInactive;\r\n class procedure CheckTypeSize(AValue: Longint); virtual;\r\n procedure Change; virtual;\r\n procedure Bind(Binding: Boolean); virtual;\r\n procedure DataChanged;\r\n function GetAsBoolean: Boolean; virtual;\r\n function GetAsBytes: TBytes; virtual;\r\n function GetAsLargeInt: NativeInt; virtual;\r\n function GetAsDateTime: TDateTime; virtual;\r\n function GetAsFloat: Double; virtual;\r\n function GetAsLongint: Longint; virtual;\r\n function GetAsInteger: Longint; virtual;\r\n function GetAsJSValue: JSValue; virtual;\r\n function GetOldValue: JSValue; virtual;\r\n function GetAsString: string; virtual;\r\n function GetCanModify: Boolean; virtual;\r\n function GetClassDesc: String; virtual;\r\n function GetDataSize: Integer; virtual;\r\n function GetDefaultWidth: Longint; virtual;\r\n function GetDisplayName : String;\r\n function GetCurValue: JSValue; virtual;\r\n function GetNewValue: JSValue; virtual;\r\n function GetIsNull: Boolean; virtual;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure PropertyChanged(LayoutAffected: Boolean);\r\n procedure SetAsBoolean(AValue: Boolean); virtual;\r\n procedure SetAsDateTime(AValue: TDateTime); virtual;\r\n procedure SetAsFloat(AValue: Double); virtual;\r\n procedure SetAsLongint(AValue: Longint); virtual;\r\n procedure SetAsInteger(AValue: Longint); virtual;\r\n procedure SetAsLargeInt(AValue: NativeInt); virtual;\r\n procedure SetAsJSValue(const AValue: JSValue); virtual;\r\n procedure SetAsString(const AValue: string); virtual;\r\n procedure SetDataset(AValue : TDataset); virtual;\r\n procedure SetDataType(AValue: TFieldType);\r\n procedure SetNewValue(const AValue: JSValue);\r\n procedure SetSize(AValue: Integer); virtual;\r\n procedure SetText(const AValue: string); virtual;\r\n procedure SetVarValue(const AValue: JSValue); virtual;\r\n procedure SetAsBytes(const AValue: TBytes); virtual;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetParentComponent: TComponent; override;\r\n function HasParent: Boolean; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure AssignValue(const AValue: JSValue);\r\n procedure Clear; virtual;\r\n procedure FocusControl;\r\n function GetData : JSValue;\r\n class function IsBlob: Boolean; virtual;\r\n function IsValidChar(InputChar: Char): Boolean; virtual;\r\n procedure RefreshLookupList;\r\n procedure SetData(Buffer: JSValue); overload;\r\n procedure SetFieldType(AValue: TFieldType); virtual;\r\n procedure SetParentComponent(Value: TComponent); override;\r\n procedure Validate(Buffer: Pointer);\r\n property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;\r\n property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;\r\n property AsFloat: Double read GetAsFloat write SetAsFloat;\r\n property AsLongint: Longint read GetAsLongint write SetAsLongint;\r\n property AsLargeInt: NativeInt read GetAsLargeInt write SetAsLargeInt;\r\n property AsInteger: Longint read GetAsInteger write SetAsInteger;\r\n property AsString: string read GetAsString write SetAsString;\r\n property AsJSValue: JSValue read GetAsJSValue write SetAsJSValue;\r\n property AttributeSet: string read FAttributeSet write FAttributeSet;\r\n property Calculated: Boolean read FCalculated write FCalculated;\r\n property CanModify: Boolean read GetCanModify;\r\n property CurValue: JSValue read GetCurValue;\r\n property DataSet: TDataSet read FDataSet write SetDataSet;\r\n property DataSize: Integer read GetDataSize;\r\n property DataType: TFieldType read FDataType;\r\n property DisplayName: String Read GetDisplayName;\r\n property DisplayText: String read GetDisplayText;\r\n property FieldNo: Longint read FFieldNo;\r\n property IsIndexField: Boolean read FIsIndexField;\r\n property IsNull: Boolean read GetIsNull;\r\n property Lookup: Boolean read GetLookup write SetLookup; deprecated;\r\n property NewValue: JSValue read GetNewValue write SetNewValue;\r\n property Offset: word read FOffset;\r\n property Size: Integer read FSize write SetSize;\r\n property Text: string read GetEditText write SetEditText;\r\n property ValidChars : TFieldChars read FValidChars write FValidChars;\r\n property Value: JSValue read GetAsJSValue write SetAsJSValue;\r\n property OldValue: JSValue read GetOldValue;\r\n property LookupList: TLookupList read GetLookupList;\r\n Property FieldDef : TFieldDef Read FFieldDef;\r\n published\r\n property Alignment : TAlignment read FAlignment write SetAlignment default taLeftJustify;\r\n property CustomConstraint: string read FCustomConstraint write FCustomConstraint;\r\n property ConstraintErrorMessage: string read FConstraintErrorMessage write FConstraintErrorMessage;\r\n property DefaultExpression: string read FDefaultExpression write FDefaultExpression;\r\n property DisplayLabel : string read GetDisplayName write SetDisplayLabel stored IsDisplayLabelStored;\r\n property DisplayWidth: Longint read GetDisplayWidth write SetDisplayWidth stored IsDisplayWidthStored;\r\n property FieldKind: TFieldKind read FFieldKind write FFieldKind;\r\n property FieldName: string read FFieldName write FFieldName;\r\n property HasConstraints: Boolean read FHasConstraints;\r\n property Index: Longint read GetIndex write SetIndex;\r\n property ImportedConstraint: string read FImportedConstraint write FImportedConstraint;\r\n property KeyFields: string read FKeyFields write FKeyFields;\r\n property LookupCache: Boolean read FLookupCache write FLookupCache;\r\n property LookupDataSet: TDataSet read FLookupDataSet write FLookupDataSet;\r\n property LookupKeyFields: string read FLookupKeyFields write FLookupKeyFields;\r\n property LookupResultField: string read FLookupResultField write FLookupResultField;\r\n property Origin: string read FOrigin write FOrigin;\r\n property ProviderFlags : TProviderFlags read FProviderFlags write FProviderFlags;\r\n property ReadOnly: Boolean read FReadOnly write SetReadOnly;\r\n property Required: Boolean read FRequired write FRequired;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property OnChange: TFieldNotifyEvent read FOnChange write FOnChange;\r\n property OnGetText: TFieldGetTextEvent read FOnGetText write FOnGetText;\r\n property OnSetText: TFieldSetTextEvent read FOnSetText write FOnSetText;\r\n property OnValidate: TFieldNotifyEvent read FOnValidate write FOnValidate;\r\n end;\r\n\r\n{ TStringField }\r\n\r\n TStringField = class(TField)\r\n private\r\n FFixedChar : boolean;\r\n FTransliterate : Boolean;\r\n protected\r\n class procedure CheckTypeSize(AValue: Longint); override;\r\n function GetAsBoolean: Boolean; override;\r\n function GetAsDateTime: TDateTime; override;\r\n function GetAsFloat: Double; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsLargeInt: NativeInt; override;\r\n function GetAsString: String; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetDefaultWidth: Longint; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n procedure SetAsBoolean(AValue: Boolean); override;\r\n procedure SetAsDateTime(AValue: TDateTime); override;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n procedure SetAsString(const AValue: String); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n procedure SetFieldType(AValue: TFieldType); override;\r\n property FixedChar : Boolean read FFixedChar write FFixedChar;\r\n property Transliterate: Boolean read FTransliterate write FTransliterate;\r\n property Value: String read GetAsString write SetAsString;\r\n published\r\n property Size default 20;\r\n end;\r\n\r\n\r\n{ TNumericField }\r\n\r\n TNumericField = class(TField)\r\n Private\r\n FDisplayFormat : String;\r\n FEditFormat : String;\r\n protected\r\n class procedure CheckTypeSize(AValue: Longint); override;\r\n procedure RangeError(AValue, Min, Max: Double);\r\n procedure SetDisplayFormat(const AValue: string);\r\n procedure SetEditFormat(const AValue: string);\r\n function GetAsBoolean: Boolean; override;\r\n Procedure SetAsBoolean(AValue: Boolean); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n published\r\n property Alignment default taRightJustify;\r\n property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;\r\n property EditFormat: string read FEditFormat write SetEditFormat;\r\n end;\r\n\r\n{ TLongintField }\r\n\r\n TIntegerField = class(TNumericField)\r\n private\r\n FMinValue,\r\n FMaxValue,\r\n FMinRange,\r\n FMaxRange : Longint;\r\n Procedure SetMinValue (AValue : longint);\r\n Procedure SetMaxValue (AValue : longint);\r\n protected\r\n function GetAsFloat: Double; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n function GetValue(var AValue: Longint): Boolean;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n function GetAsLargeInt: NativeInt; override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n Function CheckRange(AValue : Longint) : Boolean;\r\n property Value: Longint read GetAsInteger write SetAsInteger;\r\n published\r\n property MaxValue: Longint read FMaxValue write SetMaxValue default 0;\r\n property MinValue: Longint read FMinValue write SetMinValue default 0;\r\n end;\r\n\r\n{ TLargeintField }\r\n\r\n TLargeintField = class(TNumericField)\r\n private\r\n FMinValue,\r\n FMaxValue,\r\n FMinRange,\r\n FMaxRange : NativeInt;\r\n Procedure SetMinValue (AValue : NativeInt);\r\n Procedure SetMaxValue (AValue : NativeInt);\r\n protected\r\n function GetAsFloat: Double; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsLargeInt: NativeInt; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n function GetValue(var AValue: NativeInt): Boolean;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n Function CheckRange(AValue : NativeInt) : Boolean;\r\n property Value: NativeInt read GetAsLargeInt write SetAsLargeInt;\r\n published\r\n property MaxValue: NativeInt read FMaxValue write SetMaxValue default 0;\r\n property MinValue: NativeInt read FMinValue write SetMinValue default 0;\r\n end;\r\n\r\n{ TAutoIncField }\r\n\r\n TAutoIncField = class(TIntegerField)\r\n Protected\r\n procedure SetAsInteger(AValue: Longint); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TFloatField }\r\n\r\n TFloatField = class(TNumericField)\r\n private\r\n FCurrency: Boolean;\r\n FMaxValue : Double;\r\n FMinValue : Double;\r\n FPrecision : Longint;\r\n procedure SetCurrency(const AValue: Boolean);\r\n procedure SetPrecision(const AValue: Longint);\r\n protected\r\n function GetAsFloat: Double; override;\r\n function GetAsLargeInt: NativeInt; override;\r\n function GetAsInteger: Longint; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetAsString: string; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsLargeInt(AValue: NativeInt); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n Function CheckRange(AValue : Double) : Boolean;\r\n property Value: Double read GetAsFloat write SetAsFloat;\r\n\r\n published\r\n property Currency: Boolean read FCurrency write SetCurrency default False;\r\n property MaxValue: Double read FMaxValue write FMaxValue;\r\n property MinValue: Double read FMinValue write FMinValue;\r\n property Precision: Longint read FPrecision write SetPrecision default 15; // min 2 instellen, delphi compat\r\n end;\r\n\r\n\r\n{ TBooleanField }\r\n\r\n TBooleanField = class(TField)\r\n private\r\n FDisplayValues : String;\r\n // First byte indicates uppercase or not.\r\n FDisplays : Array[Boolean,Boolean] of string;\r\n Procedure SetDisplayValues(const AValue : String);\r\n protected\r\n function GetAsBoolean: Boolean; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetAsInteger: Longint; override;\r\n function GetDefaultWidth: Longint; override;\r\n procedure SetAsBoolean(AValue: Boolean); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n property Value: Boolean read GetAsBoolean write SetAsBoolean;\r\n published\r\n property DisplayValues: string read FDisplayValues write SetDisplayValues;\r\n end;\r\n\r\n{ TDateTimeField }\r\n\r\n TDateTimeField = class(TField)\r\n private\r\n FDisplayFormat : String;\r\n procedure SetDisplayFormat(const AValue: string);\r\n protected\r\n Function ConvertToDateTime(aValue : JSValue; aRaiseError : Boolean) : TDateTime; virtual;\r\n Function DateTimeToNativeDateTime(aValue : TDateTime) : JSValue; virtual;\r\n function GetAsDateTime: TDateTime; override;\r\n function GetAsFloat: Double; override;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetDataSize: Integer; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n procedure SetAsDateTime(AValue: TDateTime); override;\r\n procedure SetAsFloat(AValue: Double); override;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n property Value: TDateTime read GetAsDateTime write SetAsDateTime;\r\n published\r\n property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;\r\n end;\r\n\r\n{ TDateField }\r\n\r\n TDateField = class(TDateTimeField)\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TTimeField }\r\n\r\n TTimeField = class(TDateTimeField)\r\n protected\r\n procedure SetAsString(const AValue: string); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TBinaryField }\r\n\r\n TBinaryField = class(TField)\r\n protected\r\n class procedure CheckTypeSize(AValue: Longint); override;\r\n Function BlobToBytes(aValue : JSValue) : TBytes; virtual;\r\n Function BytesToBlob(aValue : TBytes) : JSValue; virtual;\r\n function GetAsString: string; override;\r\n function GetAsJSValue: JSValue; override;\r\n function GetValue(var AValue: TBytes): Boolean;\r\n procedure SetAsString(const AValue: string); override;\r\n procedure SetVarValue(const AValue: JSValue); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n published\r\n property Size default 16;\r\n end;\r\n\r\n{ TBytesField }\r\n\r\n\r\n{ TBlobField }\r\n TBlobStreamMode = (bmRead, bmWrite, bmReadWrite);\r\n// TBlobType = ftBlob..ftMemo;\r\n\r\n TBlobField = class(TBinaryField)\r\n private\r\n FModified : Boolean;\r\n // Wrapper that retrieves FDataType as a TBlobType\r\n // function GetBlobType: TBlobType;\r\n // Wrapper that calls SetFieldType\r\n // procedure SetBlobType(AValue: TBlobType);\r\n protected\r\n function GetBlobSize: Longint; virtual;\r\n function GetIsNull: Boolean; override;\r\n procedure GetText(var AText: string; ADisplayText: Boolean); override;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n procedure Clear; override;\r\n class function IsBlob: Boolean; override;\r\n procedure SetFieldType(AValue: TFieldType); override;\r\n property BlobSize: Longint read GetBlobSize;\r\n property Modified: Boolean read FModified write FModified;\r\n property Value: string read GetAsString write SetAsString;\r\n published\r\n // property BlobType: TBlobType read GetBlobType write SetBlobType; // default ftBlob;\r\n property Size default 0;\r\n end;\r\n\r\n{ TMemoField }\r\n\r\n TMemoField = class(TBlobField)\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n\r\n{ TVariantField }\r\n\r\n TVariantField = class(TField)\r\n protected\r\n class procedure CheckTypeSize(aValue: Integer); override;\r\n\r\n function GetAsBoolean: Boolean; override;\r\n procedure SetAsBoolean(aValue: Boolean); override;\r\n\r\n function GetAsDateTime: TDateTime; override;\r\n procedure SetAsDateTime(aValue: TDateTime); override;\r\n\r\n function GetAsFloat: Double; override;\r\n procedure SetAsFloat(aValue: Double); override;\r\n\r\n function GetAsInteger: Longint; override;\r\n procedure SetAsInteger(AValue: Longint); override;\r\n\r\n function GetAsString: string; override;\r\n procedure SetAsString(const aValue: string); override;\r\n\r\n\r\n function GetAsJSValue: JSValue; override;\r\n procedure SetVarValue(const aValue: JSValue); override;\r\n\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n{ TIndexDef }\r\n\r\n TIndexDefs = class;\r\n\r\n TIndexOption = (ixPrimary, ixUnique, ixDescending, ixCaseInsensitive,\r\n ixExpression, ixNonMaintained);\r\n TIndexOptions = set of TIndexOption;\r\n\r\n TIndexDef = class(TNamedItem)\r\n Private\r\n FCaseinsFields: string;\r\n FDescFields: string;\r\n FExpression : String;\r\n FFields : String;\r\n FOptions : TIndexOptions;\r\n FSource : String;\r\n protected\r\n function GetExpression: string;\r\n procedure SetCaseInsFields(const AValue: string); virtual;\r\n procedure SetDescFields(const AValue: string);\r\n procedure SetExpression(const AValue: string);\r\n public\r\n constructor Create(Owner: TIndexDefs; const AName, TheFields: string;\r\n TheOptions: TIndexOptions); overload;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property Expression: string read GetExpression write SetExpression;\r\n property Fields: string read FFields write FFields;\r\n property CaseInsFields: string read FCaseinsFields write SetCaseInsFields;\r\n property DescFields: string read FDescFields write SetDescFields;\r\n property Options: TIndexOptions read FOptions write FOptions;\r\n property Source: string read FSource write FSource;\r\n end;\r\n\r\n{ TIndexDefs }\r\n\r\n TIndexDefs = class(TDefCollection)\r\n Private\r\n Function GetItem(Index: Integer): TIndexDef;\r\n Procedure SetItem(Index: Integer; Value: TIndexDef);\r\n public\r\n constructor Create(ADataSet: TDataSet); virtual; overload;\r\n procedure Add(const Name, Fields: string; Options: TIndexOptions);\r\n Function AddIndexDef: TIndexDef;\r\n function Find(const IndexName: string): TIndexDef;\r\n function FindIndexForFields(const Fields: string): TIndexDef;\r\n function GetIndexForFields(const Fields: string;\r\n CaseInsensitive: Boolean): TIndexDef;\r\n procedure Update; overload; virtual;\r\n Property Items[Index: Integer] : TIndexDef read GetItem write SetItem; default;\r\n end;\r\n\r\n{ TCheckConstraint }\r\n\r\n TCheckConstraint = class(TCollectionItem)\r\n Private\r\n FCustomConstraint : String;\r\n FErrorMessage : String;\r\n FFromDictionary : Boolean;\r\n FImportedConstraint : String;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n // function GetDisplayName: string; override;\r\n published\r\n property CustomConstraint: string read FCustomConstraint write FCustomConstraint;\r\n property ErrorMessage: string read FErrorMessage write FErrorMessage;\r\n property FromDictionary: Boolean read FFromDictionary write FFromDictionary;\r\n property ImportedConstraint: string read FImportedConstraint write FImportedConstraint;\r\n end;\r\n\r\n{ TCheckConstraints }\r\n\r\n TCheckConstraints = class(TCollection)\r\n Private\r\n Function GetItem(Index : Longint) : TCheckConstraint;\r\n Procedure SetItem(index : Longint; Value : TCheckConstraint);\r\n protected\r\n function GetOwner: TPersistent; override;\r\n public\r\n constructor Create(AOwner: TPersistent);\r\n function Add: TCheckConstraint;\r\n property Items[Index: Longint]: TCheckConstraint read GetItem write SetItem; default;\r\n end;\r\n\r\n { TFieldsEnumerator }\r\n\r\n TFieldsEnumerator = class\r\n private\r\n FPosition: Integer;\r\n FFields: TFields;\r\n function GetCurrent: TField;\r\n public\r\n constructor Create(AFields: TFields);\r\n function MoveNext: Boolean;\r\n property Current: TField read GetCurrent;\r\n end;\r\n\r\n{ TFields }\r\n\r\n TFields = Class(TObject)\r\n Private\r\n FDataset : TDataset;\r\n FFieldList : TFpList;\r\n FOnChange : TNotifyEvent;\r\n FValidFieldKinds : TFieldKinds;\r\n Protected\r\n Procedure ClearFieldDefs;\r\n Procedure Changed;\r\n Procedure CheckfieldKind(Fieldkind : TFieldKind; Field : TField);\r\n Function GetCount : Longint;\r\n Function GetField (Index : Integer) : TField;\r\n Procedure SetField(Index: Integer; Value: TField);\r\n Procedure SetFieldIndex (Field : TField;Value : Integer);\r\n Property OnChange : TNotifyEvent Read FOnChange Write FOnChange;\r\n Property ValidFieldKinds : TFieldKinds Read FValidFieldKinds;\r\n Public\r\n Constructor Create(ADataset : TDataset);\r\n Destructor Destroy;override;\r\n Procedure Add(Field : TField);\r\n Procedure CheckFieldName (Const Value : String);\r\n Procedure CheckFieldNames (Const Value : String);\r\n Procedure Clear;\r\n Function FindField (Const Value : String) : TField;\r\n Function FieldByName (Const Value : String) : TField;\r\n Function FieldByNumber(FieldNo : Integer) : TField;\r\n Function GetEnumerator: TFieldsEnumerator;\r\n Procedure GetFieldNames (Values : TStrings);\r\n Function IndexOf(Field : TField) : Longint;\r\n procedure Remove(Value : TField);\r\n Property Count : Integer Read GetCount;\r\n Property Dataset : TDataset Read FDataset;\r\n Property Fields [Index : Integer] : TField Read GetField Write SetField; default;\r\n end;\r\n TFieldsClass = Class of TFields;\r\n\r\n{ TParam }\r\n\r\n TBlobData = TBytes; // Delphi defines it as alias to TBytes\r\n\r\n TParamBinding = array of integer;\r\n\r\n TParamType = (ptUnknown, ptInput, ptOutput, ptInputOutput, ptResult);\r\n TParamTypes = set of TParamType;\r\n\r\n TParamStyle = (psInterbase,psPostgreSQL,psSimulated);\r\n\r\n TParams = class;\r\n\r\n TParam = class(TCollectionItem)\r\n private\r\n FNativeStr: string;\r\n FValue: JSValue;\r\n FPrecision: Integer;\r\n FNumericScale: Integer;\r\n FName: string;\r\n FDataType: TFieldType;\r\n FBound: Boolean;\r\n FParamType: TParamType;\r\n FSize: Integer;\r\n Function GetDataSet: TDataSet;\r\n Function IsParamStored: Boolean;\r\n procedure SetAsBytes(AValue: TBlobData);\r\n protected\r\n Procedure AssignParam(Param: TParam);\r\n Procedure AssignTo(Dest: TPersistent); override;\r\n Function GetAsBoolean: Boolean;\r\n Function GetAsBytes: TBytes;\r\n Function GetAsDateTime: TDateTime;\r\n Function GetAsFloat: Double;\r\n Function GetAsInteger: Longint;\r\n Function GetAsLargeInt: NativeInt;\r\n Function GetAsMemo: string;\r\n Function GetAsString: string;\r\n Function GetAsJSValue: JSValue;\r\n Function GetDisplayName: string; override;\r\n Function GetIsNull: Boolean;\r\n Function IsEqual(AValue: TParam): Boolean;\r\n Procedure SetAsBlob(const AValue: TBlobData);\r\n Procedure SetAsBoolean(AValue: Boolean);\r\n Procedure SetAsBytes(const AValue: TBytes);\r\n Procedure SetAsDate(const AValue: TDateTime);\r\n Procedure SetAsDateTime(const AValue: TDateTime);\r\n Procedure SetAsFloat(const AValue: Double);\r\n Procedure SetAsInteger(AValue: Longint);\r\n Procedure SetAsLargeInt(AValue: NativeInt);\r\n Procedure SetAsMemo(const AValue: string);\r\n Procedure SetAsString(const AValue: string);\r\n Procedure SetAsTime(const AValue: TDateTime);\r\n Procedure SetAsJSValue(const AValue: JSValue);\r\n Procedure SetDataType(AValue: TFieldType);\r\n Procedure SetText(const AValue: string);\r\n public\r\n constructor Create(ACollection: TCollection); overload; override;\r\n constructor Create(AParams: TParams; AParamType: TParamType); reintroduce; overload;\r\n Procedure Assign(Source: TPersistent); override;\r\n Procedure AssignField(Field: TField);\r\n Procedure AssignToField(Field: TField);\r\n Procedure AssignFieldValue(Field: TField; const AValue: JSValue);\r\n Procedure AssignFromField(Field : TField);\r\n Procedure Clear;\r\n Property AsBlob : TBlobData read GetAsBytes write SetAsBytes;\r\n Property AsBoolean : Boolean read GetAsBoolean write SetAsBoolean;\r\n Property AsBytes : TBytes read GetAsBytes write SetAsBytes;\r\n Property AsDate : TDateTime read GetAsDateTime write SetAsDate;\r\n Property AsDateTime : TDateTime read GetAsDateTime write SetAsDateTime;\r\n Property AsFloat : Double read GetAsFloat write SetAsFloat;\r\n Property AsInteger : LongInt read GetAsInteger write SetAsInteger;\r\n Property AsLargeInt : NativeInt read GetAsLargeInt write SetAsLargeInt;\r\n Property AsMemo : string read GetAsMemo write SetAsMemo;\r\n Property AsSmallInt : LongInt read GetAsInteger write SetAsInteger;\r\n Property AsString : string read GetAsString write SetAsString;\r\n Property AsTime : TDateTime read GetAsDateTime write SetAsTime;\r\n Property Bound : Boolean read FBound write FBound;\r\n Property Dataset : TDataset Read GetDataset;\r\n Property IsNull : Boolean read GetIsNull;\r\n Property Text : string read GetAsString write SetText;\r\n published\r\n Property DataType : TFieldType read FDataType write SetDataType;\r\n Property Name : string read FName write FName;\r\n Property NumericScale : Integer read FNumericScale write FNumericScale default 0;\r\n Property ParamType : TParamType read FParamType write FParamType;\r\n Property Precision : Integer read FPrecision write FPrecision default 0;\r\n Property Size : Integer read FSize write FSize default 0;\r\n Property Value : JSValue read GetAsJSValue write SetAsJSValue stored IsParamStored;\r\n end;\r\n TParamClass = Class of TParam;\r\n\r\n{ TParams }\r\n\r\n TParams = class(TCollection)\r\n private\r\n FOwner: TPersistent;\r\n Function GetItem(Index: Integer): TParam;\r\n Function GetParamValue(const ParamName: string): JSValue;\r\n Procedure SetItem(Index: Integer; Value: TParam);\r\n Procedure SetParamValue(const ParamName: string; const Value: JSValue);\r\n protected\r\n Procedure AssignTo(Dest: TPersistent); override;\r\n Function GetDataSet: TDataSet;\r\n Function GetOwner: TPersistent; override;\r\n Class Function ParamClass : TParamClass; virtual;\r\n public\r\n Constructor Create(AOwner: TPersistent; AItemClass : TCollectionItemClass); overload;\r\n Constructor Create(AOwner: TPersistent); overload;\r\n Constructor Create; overload;\r\n Procedure AddParam(Value: TParam);\r\n Procedure AssignValues(Value: TParams);\r\n Function CreateParam(FldType: TFieldType; const ParamName: string; ParamType: TParamType): TParam;\r\n Function FindParam(const Value: string): TParam;\r\n Procedure GetParamList(List: TList; const ParamNames: string);\r\n Function IsEqual(Value: TParams): Boolean;\r\n Function ParamByName(const Value: string): TParam;\r\n Function ParseSQL(SQL: String; DoCreate: Boolean): String; overload;\r\n Function ParseSQL(SQL: String; DoCreate, EscapeSlash, EscapeRepeat : Boolean; ParameterStyle : TParamStyle): String; overload;\r\n Function ParseSQL(SQL: String; DoCreate, EscapeSlash, EscapeRepeat : Boolean; ParameterStyle : TParamStyle; out ParamBinding: TParambinding): String; overload;\r\n Function ParseSQL(SQL: String; DoCreate, EscapeSlash, EscapeRepeat : Boolean; ParameterStyle : TParamStyle; out ParamBinding: TParambinding; out ReplaceString : string): String; overload;\r\n Procedure RemoveParam(Value: TParam);\r\n Procedure CopyParamValuesFromDataset(ADataset : TDataset; CopyBound : Boolean);\r\n Property Dataset : TDataset Read GetDataset;\r\n Property Items[Index: Integer] : TParam read GetItem write SetItem; default;\r\n Property ParamValues[const ParamName: string] : JSValue read GetParamValue write SetParamValue;\r\n end;\r\n\r\n{ TDataSet }\r\n \r\n TBookmarkFlag = (bfCurrent, bfBOF, bfEOF, bfInserted);\r\n TBookmark = record\r\n Data : JSValue;\r\n Flag : TBookmarkFlag;\r\n end; // Bookmark is always the index in the data array.\r\n TBookmarkStr = string; // JSON encoded version of the above\r\n\r\n TGetMode = (gmCurrent, gmNext, gmPrior);\r\n TGetResult = (grOK, grBOF, grEOF, grError);\r\n\r\n TResyncMode = set of (rmExact, rmCenter);\r\n TDataAction = (daFail, daAbort, daRetry);\r\n TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied);\r\n TUpdateKind = (ukModify, ukInsert, ukDelete);\r\n\r\n TLocateOption = (loCaseInsensitive, loPartialKey);\r\n TLocateOptions = set of TLocateOption;\r\n TDataOperation = procedure of object;\r\n\r\n TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;\r\n TDataSetErrorEvent = procedure(DataSet: TDataSet; E: EDatabaseError;\r\n var DataAction: TDataAction) of object;\r\n\r\n TFilterOption = (foCaseInsensitive, foNoPartialCompare);\r\n TFilterOptions = set of TFilterOption;\r\n\r\n TLoadOption = (loNoOpen,loNoEvents,loAtEOF);\r\n TLoadOptions = Set of TLoadOption;\r\n TDatasetLoadEvent = procedure(DataSet: TDataSet; Data : JSValue) of object;\r\n TDatasetLoadFailEvent = procedure(DataSet: TDataSet; ID : Integer; Const ErrorMsg : String) of object;\r\n\r\n TFilterRecordEvent = procedure(DataSet: TDataSet;\r\n var Accept: Boolean) of object;\r\n TDatasetClass = Class of TDataset;\r\n\r\n TRecordState = (rsNew,rsClean,rsUpdate,rsDelete);\r\n TDataRecord = record\r\n data : JSValue;\r\n state : TRecordState;\r\n bookmark : JSValue;\r\n bookmarkFlag : TBookmarkFlag;\r\n end;\r\n TBuffers = Array of TDataRecord;\r\n\r\n{------------------------------------------------------------------------------}\r\n\r\n TDataSet = class(TComponent)\r\n Private\r\n FAfterApplyUpdates: TDatasetNotifyEvent;\r\n FAfterLoad: TDatasetNotifyEvent;\r\n FBeforeApplyUpdates: TDatasetNotifyEvent;\r\n FBeforeLoad: TDatasetNotifyEvent;\r\n FBlockReadSize: Integer;\r\n FCalcBuffer: TDataRecord;\r\n FCalcFieldsSize: Longint;\r\n FOnLoadFail: TDatasetLoadFailEvent;\r\n FOpenAfterRead : boolean;\r\n FActiveRecord: Longint;\r\n FAfterCancel: TDataSetNotifyEvent;\r\n FAfterClose: TDataSetNotifyEvent;\r\n FAfterDelete: TDataSetNotifyEvent;\r\n FAfterEdit: TDataSetNotifyEvent;\r\n FAfterInsert: TDataSetNotifyEvent;\r\n FAfterOpen: TDataSetNotifyEvent;\r\n FAfterPost: TDataSetNotifyEvent;\r\n FAfterRefresh: TDataSetNotifyEvent;\r\n FAfterScroll: TDataSetNotifyEvent;\r\n FAutoCalcFields: Boolean;\r\n FBOF: Boolean;\r\n FBeforeCancel: TDataSetNotifyEvent;\r\n FBeforeClose: TDataSetNotifyEvent;\r\n FBeforeDelete: TDataSetNotifyEvent;\r\n FBeforeEdit: TDataSetNotifyEvent;\r\n FBeforeInsert: TDataSetNotifyEvent;\r\n FBeforeOpen: TDataSetNotifyEvent;\r\n FBeforePost: TDataSetNotifyEvent;\r\n FBeforeRefresh: TDataSetNotifyEvent;\r\n FBeforeScroll: TDataSetNotifyEvent;\r\n FBlobFieldCount: Longint;\r\n FBuffers : TBuffers;\r\n FBufferCount: Longint;\r\n FConstraints: TCheckConstraints;\r\n FDisableControlsCount : Integer;\r\n FDisableControlsState : TDatasetState;\r\n FCurrentRecord: Longint;\r\n FDataSources : TFPList;\r\n FDefaultFields: Boolean;\r\n FEOF: Boolean;\r\n FEnableControlsEvent : TDataEvent;\r\n FFieldList : TFields;\r\n FFieldDefs: TFieldDefs;\r\n FFilterOptions: TFilterOptions;\r\n FFilterText: string;\r\n FFiltered: Boolean;\r\n FFound: Boolean;\r\n FInternalCalcFields: Boolean;\r\n FModified: Boolean;\r\n FOnCalcFields: TDataSetNotifyEvent;\r\n FOnDeleteError: TDataSetErrorEvent;\r\n FOnEditError: TDataSetErrorEvent;\r\n FOnFilterRecord: TFilterRecordEvent;\r\n FOnNewRecord: TDataSetNotifyEvent;\r\n FOnPostError: TDataSetErrorEvent;\r\n FRecordCount: Longint;\r\n FIsUniDirectional: Boolean;\r\n FState : TDataSetState;\r\n FInternalOpenComplete: Boolean;\r\n FDataProxy : TDataProxy;\r\n FDataRequestID : Integer;\r\n FUpdateBatchID : Integer;\r\n FChangeList : TFPList;\r\n FBatchList : TFPList;\r\n Procedure DoInsertAppend(DoAppend : Boolean);\r\n Procedure DoInternalOpen;\r\n Function GetBuffer (Index : longint) : TDataRecord;\r\n function GetBufferCount: Longint;\r\n function GetDataProxy: TDataProxy;\r\n Procedure RegisterDataSource(ADataSource : TDataSource);\r\n procedure SetConstraints(Value: TCheckConstraints);\r\n procedure SetDataProxy(AValue: TDataProxy);\r\n Procedure ShiftBuffersForward;\r\n Procedure ShiftBuffersBackward;\r\n Function TryDoing (P : TDataOperation; Ev : TDatasetErrorEvent) : Boolean;\r\n Function GetActive : boolean;\r\n Procedure UnRegisterDataSource(ADataSource : TDataSource);\r\n procedure SetBlockReadSize(AValue: Integer); virtual;\r\n Procedure SetFieldDefs(AFieldDefs: TFieldDefs);\r\n procedure DoInsertAppendRecord(const Values: array of jsValue; DoAppend : boolean);\r\n // Callback for Tdataproxy.DoGetData;\r\n function ResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor): Boolean;\r\n procedure HandleRequestresponse(ARequest: TDataRequest);\r\n protected\r\n // Proxy methods\r\n // Override this to integrate package in local data\r\n function DoResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor): Boolean; virtual;\r\n Function GetRecordUpdates(AList: TRecordUpdateDescriptorList) : Integer; virtual;\r\n procedure ResolveUpdateBatch(Sender: TObject; aBatch: TRecordUpdateBatch); virtual;\r\n Function DataPacketReceived(ARequest: TDataRequest) : Boolean; virtual;\r\n function DoLoad(aOptions: TLoadOptions; aAfterLoad: TDatasetLoadEvent): Boolean; virtual;\r\n function DoGetDataProxy: TDataProxy; virtual;\r\n Procedure InitChangeList; virtual;\r\n Procedure DoneChangeList; virtual;\r\n Procedure ClearChangeList;\r\n Function IndexInChangeList(aBookmark: TBookmark): Integer; virtual;\r\n Function AddToChangeList(aChange : TUpdateStatus) : TRecordUpdateDescriptor ; virtual;\r\n Procedure RemoveFromChangeList(R : TRecordUpdateDescriptor); virtual;\r\n Procedure DoApplyUpdates;\r\n procedure RecalcBufListSize;\r\n procedure ActivateBuffers; virtual;\r\n procedure BindFields(Binding: Boolean);\r\n procedure BlockReadNext; virtual;\r\n function BookmarkAvailable: Boolean;\r\n procedure CalculateFields(Var Buffer: TDataRecord); virtual;\r\n procedure CheckActive; virtual;\r\n procedure CheckInactive; virtual;\r\n procedure CheckBiDirectional;\r\n procedure Loaded; override;\r\n procedure ClearBuffers; virtual;\r\n procedure ClearCalcFields(var Buffer: TDataRecord); virtual;\r\n procedure CloseBlob(Field: TField); virtual;\r\n procedure CloseCursor; virtual;\r\n procedure CreateFields; virtual;\r\n procedure DataEvent(Event: TDataEvent; Info: JSValue); virtual;\r\n procedure DestroyFields; virtual;\r\n procedure DoAfterCancel; virtual;\r\n procedure DoAfterClose; virtual;\r\n procedure DoAfterDelete; virtual;\r\n procedure DoAfterEdit; virtual;\r\n procedure DoAfterInsert; virtual;\r\n procedure DoAfterOpen; virtual;\r\n procedure DoAfterPost; virtual;\r\n procedure DoAfterScroll; virtual;\r\n procedure DoAfterRefresh; virtual;\r\n procedure DoBeforeCancel; virtual;\r\n procedure DoBeforeClose; virtual;\r\n procedure DoBeforeDelete; virtual;\r\n procedure DoBeforeEdit; virtual;\r\n procedure DoBeforeInsert; virtual;\r\n procedure DoBeforeOpen; virtual;\r\n procedure DoBeforePost; virtual;\r\n procedure DoBeforeScroll; virtual;\r\n procedure DoBeforeRefresh; virtual;\r\n procedure DoOnCalcFields; virtual;\r\n procedure DoOnNewRecord; virtual;\r\n procedure DoBeforeLoad; virtual;\r\n procedure DoAfterLoad; virtual;\r\n procedure DoBeforeApplyUpdates; virtual;\r\n procedure DoAfterApplyUpdates;virtual;\r\n function FieldByNumber(FieldNo: Longint): TField;\r\n function FindRecord(Restart, GoForward: Boolean): Boolean; virtual;\r\n function GetBookmarkStr: TBookmarkStr; virtual;\r\n procedure GetCalcFields(Var Buffer: TDataRecord); virtual;\r\n function GetCanModify: Boolean; virtual;\r\n procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;\r\n function GetFieldClass(FieldType: TFieldType): TFieldClass; virtual;\r\n Function GetfieldCount : Integer;\r\n function GetFieldValues(const FieldName : string) : JSValue; virtual;\r\n function GetIsIndexField(Field: TField): Boolean; virtual;\r\n function GetIndexDefs(IndexDefs : TIndexDefs; IndexTypes : TIndexOptions) : TIndexDefs;\r\n function GetNextRecords: Longint; virtual;\r\n function GetNextRecord: Boolean; virtual;\r\n function GetPriorRecords: Longint; virtual;\r\n function GetPriorRecord: Boolean; virtual;\r\n function GetRecordCount: Longint; virtual;\r\n function GetRecNo: Longint; virtual;\r\n procedure InitFieldDefs; virtual;\r\n procedure InitFieldDefsFromfields;\r\n procedure InitRecord(var Buffer: TDataRecord); virtual;\r\n procedure InternalCancel; virtual;\r\n procedure InternalEdit; virtual;\r\n procedure InternalInsert; virtual;\r\n procedure InternalRefresh; virtual;\r\n procedure OpenCursor(InfoQuery: Boolean); virtual;\r\n procedure OpenCursorcomplete; virtual;\r\n procedure RefreshInternalCalcFields(Var Buffer: TDataRecord); virtual;\r\n procedure RestoreState(const Value: TDataSetState);\r\n Procedure SetActive (Value : Boolean); virtual;\r\n procedure SetBookmarkStr(const Value: TBookmarkStr); virtual;\r\n procedure SetBufListSize(Value: Longint); virtual;\r\n procedure SetChildOrder(Child: TComponent; Order: Longint); override;\r\n procedure SetCurrentRecord(Index: Longint); virtual;\r\n procedure SetDefaultFields(const Value: Boolean);\r\n procedure SetFiltered(Value: Boolean); virtual;\r\n procedure SetFilterOptions(Value: TFilterOptions); virtual;\r\n procedure SetFilterText(const Value: string); virtual;\r\n procedure SetFieldValues(const FieldName: string; Value: JSValue); virtual;\r\n procedure SetFound(const Value: Boolean); virtual;\r\n procedure SetModified(Value: Boolean);\r\n procedure SetName(const NewName: TComponentName); override;\r\n procedure SetOnFilterRecord(const Value: TFilterRecordEvent); virtual;\r\n procedure SetRecNo(Value: Longint); virtual;\r\n procedure SetState(Value: TDataSetState);\r\n function SetTempState(const Value: TDataSetState): TDataSetState;\r\n Function TempBuffer: TDataRecord;\r\n procedure UpdateIndexDefs; virtual;\r\n property ActiveRecord: Longint read FActiveRecord;\r\n property CurrentRecord: Longint read FCurrentRecord;\r\n property BlobFieldCount: Longint read FBlobFieldCount;\r\n property Buffers[Index: Longint]: TDataRecord read GetBuffer;\r\n property BufferCount: Longint read GetBufferCount;\r\n property CalcBuffer: TDataRecord read FCalcBuffer;\r\n property CalcFieldsSize: Longint read FCalcFieldsSize;\r\n property InternalCalcFields: Boolean read FInternalCalcFields;\r\n property Constraints: TCheckConstraints read FConstraints write SetConstraints;\r\n function AllocRecordBuffer: TDataRecord; virtual;\r\n procedure FreeRecordBuffer(var Buffer: TDataRecord); virtual;\r\n procedure GetBookmarkData(Buffer: TDataRecord; var Data: TBookmark); virtual;\r\n function GetBookmarkFlag(Buffer: TDataRecord): TBookmarkFlag; virtual;\r\n function GetDataSource: TDataSource; virtual;\r\n function GetRecordSize: Word; virtual;\r\n procedure InternalAddRecord(Buffer: Pointer; AAppend: Boolean); virtual;\r\n procedure InternalDelete; virtual;\r\n procedure InternalFirst; virtual;\r\n procedure InternalGotoBookmark(ABookmark: TBookmark); virtual;\r\n procedure InternalHandleException(E: Exception); virtual;\r\n procedure InternalInitRecord(var Buffer: TDataRecord); virtual;\r\n procedure InternalLast; virtual;\r\n procedure InternalPost; virtual;\r\n procedure InternalSetToRecord(Buffer: TDataRecord); virtual;\r\n procedure SetBookmarkFlag(Var Buffer: TDataRecord; Value: TBookmarkFlag); virtual;\r\n procedure SetBookmarkData(Var Buffer: TDataRecord; Data: TBookmark); virtual;\r\n procedure SetUniDirectional(const Value: Boolean);\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n // These use the active buffer\r\n function GetFieldData(Field: TField): JSValue; virtual; overload;\r\n procedure SetFieldData(Field: TField; AValue : JSValue); virtual; overload;\r\n function GetFieldData(Field: TField; Buffer: TDatarecord): JSValue; virtual; overload;\r\n procedure SetFieldData(Field: TField; var Buffer: TDatarecord; AValue : JSValue); virtual; overload;\r\n class function FieldDefsClass : TFieldDefsClass; virtual;\r\n class function FieldsClass : TFieldsClass; virtual;\r\n protected { abstract methods }\r\n function GetRecord(var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;\r\n procedure InternalClose; virtual; abstract;\r\n procedure InternalOpen; virtual; abstract;\r\n procedure InternalInitFieldDefs; virtual; abstract;\r\n function IsCursorOpen: Boolean; virtual; abstract;\r\n property DataProxy : TDataProxy Read GetDataProxy Write SetDataProxy;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function ActiveBuffer: TDataRecord;\r\n procedure Append;\r\n procedure AppendRecord(const Values: array of jsValue);\r\n function BookmarkValid(ABookmark: TBookmark): Boolean; virtual;\r\n function ConvertToDateTime(aValue : JSValue; ARaiseException : Boolean) : TDateTime; virtual;\r\n function ConvertDateTimeToNative(aValue : TDateTime) : JSValue; virtual;\r\n Class function DefaultConvertToDateTime(aValue : JSValue; ARaiseException : Boolean) : TDateTime; virtual;\r\n Class function DefaultConvertDateTimeToNative(aValue : TDateTime) : JSValue; virtual;\r\n Function BlobDataToBytes(aValue : JSValue) : TBytes; virtual;\r\n Class Function DefaultBlobDataToBytes(aValue : JSValue) : TBytes; virtual;\r\n Function BytesToBlobData(aValue : TBytes) : JSValue ; virtual;\r\n Class Function DefaultBytesToBlobData(aValue : TBytes) : JSValue; virtual;\r\n procedure Cancel; virtual;\r\n procedure CheckBrowseMode;\r\n procedure ClearFields;\r\n procedure Close;\r\n Procedure ApplyUpdates;\r\n function ControlsDisabled: Boolean;\r\n function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; virtual;\r\n procedure CursorPosChanged;\r\n procedure Delete; virtual;\r\n procedure DisableControls;\r\n procedure Edit;\r\n procedure EnableControls;\r\n function FieldByName(const FieldName: string): TField;\r\n function FindField(const FieldName: string): TField;\r\n function FindFirst: Boolean; virtual;\r\n function FindLast: Boolean; virtual;\r\n function FindNext: Boolean; virtual;\r\n function FindPrior: Boolean; virtual;\r\n procedure First;\r\n procedure FreeBookmark(ABookmark: TBookmark); virtual;\r\n function GetBookmark: TBookmark; virtual;\r\n function GetCurrentRecord(Buffer: TDataRecord): Boolean; virtual;\r\n procedure GetFieldList(List: TList; const FieldNames: string);\r\n procedure GetFieldNames(List: TStrings);\r\n procedure GotoBookmark(const ABookmark: TBookmark);\r\n procedure Insert;\r\n procedure InsertRecord(const Values: array of JSValue);\r\n function IsEmpty: Boolean;\r\n function IsLinkedTo(ADataSource: TDataSource): Boolean;\r\n function IsSequenced: Boolean; virtual;\r\n procedure Last;\r\n Function Load(aOptions : TLoadOptions; aAfterLoad : TDatasetLoadEvent) : Boolean;\r\n function Locate(const KeyFields: string; const KeyValues: JSValue; Options: TLocateOptions) : boolean; virtual;\r\n function Lookup(const KeyFields: string; const KeyValues: JSValue; const ResultFields: string): JSValue; virtual;\r\n function MoveBy(Distance: Longint): Longint;\r\n procedure Next;\r\n procedure Open;\r\n procedure Post; virtual;\r\n procedure Prior;\r\n procedure Refresh;\r\n procedure Resync(Mode: TResyncMode); virtual;\r\n procedure SetFields(const Values: array of JSValue);\r\n procedure UpdateCursorPos;\r\n procedure UpdateRecord;\r\n function UpdateStatus: TUpdateStatus; virtual;\r\n property BlockReadSize: Integer read FBlockReadSize write SetBlockReadSize;\r\n property BOF: Boolean read FBOF;\r\n property Bookmark: TBookmark read GetBookmark write GotoBookmark;\r\n property CanModify: Boolean read GetCanModify;\r\n property DataSource: TDataSource read GetDataSource;\r\n property DefaultFields: Boolean read FDefaultFields;\r\n property EOF: Boolean read FEOF;\r\n property FieldCount: Longint read GetFieldCount;\r\n property FieldDefs: TFieldDefs read FFieldDefs write SetFieldDefs;\r\n property Found: Boolean read FFound;\r\n property Modified: Boolean read FModified;\r\n property IsUniDirectional: Boolean read FIsUniDirectional default False;\r\n property RecordCount: Longint read GetRecordCount;\r\n property RecNo: Longint read GetRecNo write SetRecNo;\r\n property RecordSize: Word read GetRecordSize;\r\n property State: TDataSetState read FState;\r\n property Fields : TFields read FFieldList;\r\n// property FieldValues[FieldName : string] : JSValue read GetFieldValues write SetFieldValues; default;\r\n property Filter: string read FFilterText write SetFilterText;\r\n property Filtered: Boolean read FFiltered write SetFiltered default False;\r\n property FilterOptions: TFilterOptions read FFilterOptions write SetFilterOptions;\r\n property Active: Boolean read GetActive write SetActive default False;\r\n property AutoCalcFields: Boolean read FAutoCalcFields write FAutoCalcFields default true;\r\n property BeforeOpen: TDataSetNotifyEvent read FBeforeOpen write FBeforeOpen;\r\n property AfterOpen: TDataSetNotifyEvent read FAfterOpen write FAfterOpen;\r\n property BeforeClose: TDataSetNotifyEvent read FBeforeClose write FBeforeClose;\r\n property AfterClose: TDataSetNotifyEvent read FAfterClose write FAfterClose;\r\n property BeforeInsert: TDataSetNotifyEvent read FBeforeInsert write FBeforeInsert;\r\n property AfterInsert: TDataSetNotifyEvent read FAfterInsert write FAfterInsert;\r\n property BeforeEdit: TDataSetNotifyEvent read FBeforeEdit write FBeforeEdit;\r\n property AfterEdit: TDataSetNotifyEvent read FAfterEdit write FAfterEdit;\r\n property BeforePost: TDataSetNotifyEvent read FBeforePost write FBeforePost;\r\n property AfterPost: TDataSetNotifyEvent read FAfterPost write FAfterPost;\r\n property BeforeCancel: TDataSetNotifyEvent read FBeforeCancel write FBeforeCancel;\r\n property AfterCancel: TDataSetNotifyEvent read FAfterCancel write FAfterCancel;\r\n property BeforeDelete: TDataSetNotifyEvent read FBeforeDelete write FBeforeDelete;\r\n property AfterDelete: TDataSetNotifyEvent read FAfterDelete write FAfterDelete;\r\n property BeforeScroll: TDataSetNotifyEvent read FBeforeScroll write FBeforeScroll;\r\n property AfterScroll: TDataSetNotifyEvent read FAfterScroll write FAfterScroll;\r\n property BeforeRefresh: TDataSetNotifyEvent read FBeforeRefresh write FBeforeRefresh;\r\n property BeforeLoad : TDatasetNotifyEvent Read FBeforeLoad Write FBeforeLoad;\r\n Property AfterLoad : TDatasetNotifyEvent Read FAfterLoad Write FAfterLoad;\r\n Property BeforeApplyUpdates : TDatasetNotifyEvent Read FBeforeApplyUpdates Write FBeforeApplyUpdates;\r\n Property AfterApplyUpdates : TDatasetNotifyEvent Read FAfterApplyUpdates Write FAfterApplyUpdates;\r\n property AfterRefresh: TDataSetNotifyEvent read FAfterRefresh write FAfterRefresh;\r\n property OnCalcFields: TDataSetNotifyEvent read FOnCalcFields write FOnCalcFields;\r\n property OnDeleteError: TDataSetErrorEvent read FOnDeleteError write FOnDeleteError;\r\n property OnEditError: TDataSetErrorEvent read FOnEditError write FOnEditError;\r\n property OnFilterRecord: TFilterRecordEvent read FOnFilterRecord write SetOnFilterRecord;\r\n property OnNewRecord: TDataSetNotifyEvent read FOnNewRecord write FOnNewRecord;\r\n property OnPostError: TDataSetErrorEvent read FOnPostError write FOnPostError;\r\n property OnLoadFail : TDatasetLoadFailEvent Read FOnLoadFail Write FOnLoadFail;\r\n end;\r\n\r\n{ TDataLink }\r\n\r\n TDataLink = class(TPersistent)\r\n private\r\n FFirstRecord,\r\n FBufferCount : Integer;\r\n FActive,\r\n FDataSourceFixed,\r\n FEditing,\r\n FReadOnly,\r\n FUpdatingRecord,\r\n FVisualControl : Boolean;\r\n FDataSource : TDataSource;\r\n Function CalcFirstRecord(Index : Integer) : Integer;\r\n Procedure CalcRange;\r\n Procedure CheckActiveAndEditing;\r\n Function GetDataset : TDataset;\r\n procedure SetActive(AActive: Boolean);\r\n procedure SetDataSource(Value: TDataSource);\r\n Procedure SetReadOnly(Value : Boolean);\r\n protected\r\n procedure ActiveChanged; virtual;\r\n procedure CheckBrowseMode; virtual;\r\n procedure DataEvent(Event: TDataEvent; Info: JSValue); virtual;\r\n procedure DataSetChanged; virtual;\r\n procedure DataSetScrolled(Distance: Integer); virtual;\r\n procedure EditingChanged; virtual;\r\n procedure FocusControl(Field: JSValue); virtual;\r\n function GetActiveRecord: Integer; virtual;\r\n function GetBOF: Boolean; virtual;\r\n function GetBufferCount: Integer; virtual;\r\n function GetEOF: Boolean; virtual;\r\n function GetRecordCount: Integer; virtual;\r\n procedure LayoutChanged; virtual;\r\n function MoveBy(Distance: Integer): Integer; virtual;\r\n procedure RecordChanged(Field: TField); virtual;\r\n procedure SetActiveRecord(Value: Integer); virtual;\r\n procedure SetBufferCount(Value: Integer); virtual;\r\n procedure UpdateData; virtual;\r\n property VisualControl: Boolean read FVisualControl write FVisualControl;\r\n property FirstRecord: Integer read FFirstRecord write FFirstRecord;\r\n public\r\n constructor Create;\r\n destructor Destroy; override;\r\n function Edit: Boolean;\r\n procedure UpdateRecord;\r\n property Active: Boolean read FActive;\r\n property ActiveRecord: Integer read GetActiveRecord write SetActiveRecord;\r\n property BOF: Boolean read GetBOF;\r\n property BufferCount: Integer read GetBufferCount write SetBufferCount;\r\n property DataSet: TDataSet read GetDataSet;\r\n property DataSource: TDataSource read FDataSource write SetDataSource;\r\n property DataSourceFixed: Boolean read FDataSourceFixed write FDataSourceFixed;\r\n property Editing: Boolean read FEditing;\r\n property Eof: Boolean read GetEOF;\r\n property ReadOnly: Boolean read FReadOnly write SetReadOnly;\r\n property RecordCount: Integer read GetRecordCount;\r\n end;\r\n\r\n{ TDetailDataLink }\r\n\r\n TDetailDataLink = class(TDataLink)\r\n protected\r\n function GetDetailDataSet: TDataSet; virtual;\r\n public\r\n property DetailDataSet: TDataSet read GetDetailDataSet;\r\n end;\r\n\r\n{ TMasterDataLink }\r\n\r\n TMasterDataLink = class(TDetailDataLink)\r\n private\r\n FDetailDataSet: TDataSet;\r\n FFieldNames: string;\r\n FFields: TList;\r\n FOnMasterChange: TNotifyEvent;\r\n FOnMasterDisable: TNotifyEvent;\r\n procedure SetFieldNames(const Value: string);\r\n protected\r\n procedure ActiveChanged; override;\r\n procedure CheckBrowseMode; override;\r\n function GetDetailDataSet: TDataSet; override;\r\n procedure LayoutChanged; override;\r\n procedure RecordChanged(Field: TField); override;\r\n Procedure DoMasterDisable; virtual;\r\n Procedure DoMasterChange; virtual;\r\n public\r\n constructor Create(ADataSet: TDataSet);virtual;\r\n destructor Destroy; override;\r\n property FieldNames: string read FFieldNames write SetFieldNames;\r\n property Fields: TList read FFields;\r\n property OnMasterChange: TNotifyEvent read FOnMasterChange write FOnMasterChange;\r\n property OnMasterDisable: TNotifyEvent read FOnMasterDisable write FOnMasterDisable;\r\n end;\r\n\r\n{ TMasterParamsDataLink }\r\n\r\n TMasterParamsDataLink = Class(TMasterDataLink)\r\n Private\r\n FParams : TParams;\r\n Procedure SetParams(AValue : TParams);\r\n Protected\r\n Procedure DoMasterDisable; override;\r\n Procedure DoMasterChange; override;\r\n Public\r\n constructor Create(ADataSet: TDataSet); override;\r\n Procedure RefreshParamNames; virtual;\r\n Procedure CopyParamsFromMaster(CopyBound : Boolean); virtual;\r\n Property Params : TParams Read FParams Write SetParams;\r\n end;\r\n\r\n{ TDataSource }\r\n\r\n TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;\r\n\r\n TDataSource = class(TComponent)\r\n private\r\n FDataSet: TDataSet;\r\n FDataLinks: TList;\r\n FEnabled: Boolean;\r\n FAutoEdit: Boolean;\r\n FState: TDataSetState;\r\n FOnStateChange: TNotifyEvent;\r\n FOnDataChange: TDataChangeEvent;\r\n FOnUpdateData: TNotifyEvent;\r\n procedure DistributeEvent(Event: TDataEvent; Info: JSValue);\r\n procedure RegisterDataLink(DataLink: TDataLink);\r\n Procedure ProcessEvent(Event : TDataEvent; Info : JSValue);\r\n procedure SetDataSet(ADataSet: TDataSet);\r\n procedure SetEnabled(Value: Boolean);\r\n procedure UnregisterDataLink(DataLink: TDataLink);\r\n protected\r\n Procedure DoDataChange (Info : Pointer);virtual;\r\n Procedure DoStateChange; virtual;\r\n Procedure DoUpdateData;\r\n property DataLinks: TList read FDataLinks;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Edit;\r\n function IsLinkedTo(ADataSet: TDataSet): Boolean;\r\n property State: TDataSetState read FState;\r\n published\r\n property AutoEdit: Boolean read FAutoEdit write FAutoEdit default True;\r\n property DataSet: TDataSet read FDataSet write SetDataSet;\r\n property Enabled: Boolean read FEnabled write SetEnabled default True;\r\n property OnStateChange: TNotifyEvent read FOnStateChange write FOnStateChange;\r\n property OnDataChange: TDataChangeEvent read FOnDataChange write FOnDataChange;\r\n property OnUpdateData: TNotifyEvent read FOnUpdateData write FOnUpdateData;\r\n end;\r\n\r\n\r\n { TDataRequest }\r\n TDataRequestResult = (rrFail,rrEOF,rrOK);\r\n TDataRequestEvent = Procedure (ARequest : TDataRequest) of object;\r\n\r\n TDataRequest = Class(TObject)\r\n private\r\n FBookmark: TBookMark;\r\n FCurrent: TBookMark;\r\n FDataset: TDataset;\r\n FErrorMsg: String;\r\n FEvent: TDatasetLoadEvent;\r\n FLoadOptions: TLoadOptions;\r\n FRequestID: Integer;\r\n FSuccess: TDataRequestResult;\r\n FData : JSValue;\r\n FAfterRequest : TDataRequestEvent;\r\n FDataProxy : TDataProxy;\r\n Protected\r\n Procedure DoAfterRequest;\r\n Public\r\n Constructor Create(aDataProxy : TDataProxy; aOptions: TLoadOptions; aAfterRequest: TDataRequestEvent; aAfterLoad: TDatasetLoadEvent); virtual;\r\n property DataProxy : TDataProxy Read FDataProxy;\r\n Property Dataset : TDataset Read FDataset;\r\n Property Bookmark : TBookMark Read FBookmark;\r\n Property RequestID : Integer Read FRequestID;\r\n Property LoadOptions : TLoadOptions Read FLoadOptions;\r\n Property Current : TBookMark Read FCurrent;\r\n Property Success : TDataRequestResult Read FSuccess Write FSuccess;\r\n Property Event : TDatasetLoadEvent Read FEvent;\r\n Property ErrorMsg : String Read FErrorMsg Write FErrorMsg;\r\n Property Data : JSValue read FData Write FData;\r\n end;\r\n TDataRequestClass = Class of TDataRequest;\r\n\r\n { TRecordUpdateDescriptor }\r\n\r\n TRecordUpdateDescriptor = Class(TObject)\r\n private\r\n FBookmark: TBookmark;\r\n FData: JSValue;\r\n FDataset: TDataset;\r\n FProxy: TDataProxy;\r\n FResolveError: String;\r\n FServerData: JSValue;\r\n FStatus: TUpdateStatus;\r\n FOriginalStatus : TUpdateStatus;\r\n Protected\r\n Procedure SetStatus(aValue : TUpdateStatus); virtual;\r\n Public\r\n Constructor Create(aProxy : TDataProxy; aDataset : TDataset; aBookmark : TBookMark; AData : JSValue; AStatus : TUpdateStatus);\r\n Procedure Resolve(aData : JSValue);\r\n Procedure ResolveFailed(aError : String);\r\n Property Proxy : TDataProxy read FProxy;\r\n Property Dataset : TDataset Read FDataset;\r\n Property OriginalStatus : TUpdateStatus Read FOriginalStatus;\r\n Property Status : TUpdateStatus Read FStatus;\r\n Property ServerData : JSValue Read FServerData;\r\n Property Data : JSValue Read FData;\r\n Property Bookmark : TBookmark Read FBookmark;\r\n Property ResolveError : String Read FResolveError ;\r\n end;\r\n TRecordUpdateDescriptorClass = Class of TRecordUpdateDescriptor;\r\n\r\n { TRecordUpdateDescriptorList }\r\n\r\n TRecordUpdateDescriptorList = Class(TFPList)\r\n private\r\n function GetUpdate(AIndex : Integer): TRecordUpdateDescriptor;\r\n Public\r\n Property UpdateDescriptors[AIndex : Integer] : TRecordUpdateDescriptor Read GetUpdate; Default;\r\n end;\r\n\r\n { TRecordUpdateBatch }\r\n TUpdateBatchStatus = (ubsPending,ubsProcessing,ubsProcessed,ubsResolved);\r\n TResolveBatchEvent = Procedure (Sender : TObject; ARequest : TRecordUpdateBatch) of object;\r\n\r\n TRecordUpdateBatch = class(TObject)\r\n private\r\n FBatchID: Integer;\r\n FDataset: TDataset;\r\n FLastChangeIndex: Integer;\r\n FList: TRecordUpdateDescriptorList;\r\n FOnResolve: TResolveBatchEvent;\r\n FOwnsList: Boolean;\r\n FStatus: TUpdateBatchStatus;\r\n Protected\r\n Property LastChangeIndex : Integer Read FLastChangeIndex;\r\n Public\r\n Constructor Create (aBatchID : Integer; AList : TRecordUpdateDescriptorList; AOwnsList : Boolean);\r\n Destructor Destroy; override;\r\n Procedure FreeList;\r\n Property Dataset : TDataset Read FDataset Write FDataset;\r\n Property OnResolve : TResolveBatchEvent Read FOnResolve Write FOnResolve;\r\n Property OwnsList : Boolean Read FOwnsList;\r\n property BatchID : Integer Read FBatchID;\r\n Property Status : TUpdateBatchStatus Read FStatus Write FStatus;\r\n Property List : TRecordUpdateDescriptorList Read FList;\r\n end;\r\n TRecordUpdateBatchClass = Class of TRecordUpdateBatch;\r\n\r\n { TDataProxy }\r\n\r\n TDataProxy = Class(TComponent)\r\n Protected\r\n Function GetDataRequestClass : TDataRequestClass; virtual;\r\n Function GetUpdateDescriptorClass : TRecordUpdateDescriptorClass; virtual;\r\n Function GetUpdateBatchClass : TRecordUpdateBatchClass; virtual;\r\n // Use this to call resolve event, and free the batch.\r\n Procedure ResolveBatch(aBatch : TRecordUpdateBatch);\r\n Public\r\n Function GetDataRequest(aOptions: TLoadOptions; aAfterRequest: TDataRequestEvent; aAfterLoad: TDatasetLoadEvent) : TDataRequest; virtual;\r\n Function GetUpdateDescriptor(aDataset : TDataset; aBookmark : TBookMark; AData : JSValue; AStatus : TUpdateStatus) : TRecordUpdateDescriptor; virtual;\r\n function GetRecordUpdateBatch(aBatchID: Integer; AList: TRecordUpdateDescriptorList; AOwnsList: Boolean=True): TRecordUpdateBatch; virtual;\r\n // actual calls to do the work. Dataset wi\r\n Function DoGetData(aRequest : TDataRequest) : Boolean; virtual; abstract;\r\n // TDataProxy is responsible for calling OnResolve and if not, Freeing the batch.\r\n Function ProcessUpdateBatch(aBatch : TRecordUpdateBatch): Boolean; virtual; abstract;\r\n end;\r\n\r\nconst\r\n {\r\n TFieldType = (\r\n ftUnknown, ftString, ftInteger, ftLargeInt, ftBoolean, ftFloat, ftDate,\r\n ftTime, ftDateTime, ftAutoInc, ftBlob, ftMemo, ftFixedChar,\r\n ftVariant\r\n );\r\n }\r\n\r\nConst\r\n Fieldtypenames : Array [TFieldType] of String =\r\n (\r\n {ftUnknown} 'Unknown',\r\n {ftString} 'String',\r\n {ftInteger} 'Integer',\r\n {ftLargeint} 'NativeInt',\r\n {ftBoolean} 'Boolean',\r\n {ftFloat} 'Float',\r\n {ftDate} 'Date',\r\n {ftTime} 'Time',\r\n {ftDateTime} 'DateTime',\r\n {ftAutoInc} 'AutoInc',\r\n {ftBlob} 'Blob',\r\n {ftMemo} 'Memo',\r\n {ftFixedChar} 'FixedChar',\r\n {ftVariant} 'Variant'\r\n );\r\n\r\n DefaultFieldClasses : Array [TFieldType] of TFieldClass =\r\n (\r\n { ftUnknown} Tfield,\r\n { ftString} TStringField,\r\n { ftInteger} TIntegerField,\r\n { ftLargeint} TLargeIntField,\r\n { ftBoolean} TBooleanField,\r\n { ftFloat} TFloatField,\r\n { ftDate} TDateField,\r\n { ftTime} TTimeField,\r\n { ftDateTime} TDateTimeField,\r\n { ftAutoInc} TAutoIncField,\r\n { ftBlob} TBlobField,\r\n { ftMemo} TMemoField,\r\n { ftFixedChar} TStringField,\r\n { ftVariant} TVariantField\r\n );\r\n\r\n dsEditModes = [dsEdit, dsInsert, dsSetKey];\r\n dsWriteModes = [dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter,\r\n dsNewValue, dsInternalCalc, dsRefreshFields];\r\n // Correct list of all field types that are BLOB types.\r\n // Please use this instead of checking TBlobType which will give\r\n // incorrect results\r\n ftBlobTypes = [ftBlob, ftMemo];\r\n\r\n\r\n{ Auxiliary functions }\r\n\r\nProcedure DatabaseError (Const Msg : String); overload;\r\nProcedure DatabaseError (Const Msg : String; Comp : TComponent); overload;\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue); overload;\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue; Comp : TComponent); overload;\r\nFunction ExtractFieldName(Const Fields: String; var Pos: Integer): String;\r\n\r\n// function SkipComments(var p: PChar; EscapeSlash, EscapeRepeat : Boolean) : boolean;\r\n\r\n// operator Enumerator(ADataSet: TDataSet): TDataSetEnumerator;\r\n \r\nimplementation\r\n\r\nuses DBConst,TypInfo;\r\n\r\n{ ---------------------------------------------------------------------\r\n Auxiliary functions\r\n ---------------------------------------------------------------------}\r\n\r\nProcedure DatabaseError (Const Msg : String);\r\n\r\nbegin\r\n Raise EDataBaseError.Create(Msg);\r\nend;\r\n\r\nProcedure DatabaseError (Const Msg : String; Comp : TComponent);\r\n\r\nbegin\r\n if assigned(Comp) and (Comp.Name <> '') then\r\n Raise EDatabaseError.CreateFmt('%s : %s',[Comp.Name,Msg])\r\n else\r\n DatabaseError(Msg);\r\nend;\r\n\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue);\r\n\r\nbegin\r\n Raise EDatabaseError.CreateFmt(Fmt,Args);\r\nend;\r\n\r\nProcedure DatabaseErrorFmt (Const Fmt : String; Const Args : Array Of JSValue;\r\n Comp : TComponent);\r\nbegin\r\n if assigned(comp) then\r\n Raise EDatabaseError.CreateFmt(Format('%s : %s',[Comp.Name,Fmt]),Args)\r\n else\r\n DatabaseErrorFmt(Fmt, Args);\r\nend;\r\n\r\nfunction ExtractFieldName(const Fields: string; var Pos: Integer): string;\r\nvar\r\n i: Integer;\r\n FieldsLength: Integer;\r\nbegin\r\n i:=Pos;\r\n FieldsLength:=Length(Fields);\r\n while (i<=FieldsLength) and (Fields[i]<>';') do Inc(i);\r\n Result:=Trim(Copy(Fields,Pos,i-Pos));\r\n if (i<=FieldsLength) and (Fields[i]=';') then Inc(i);\r\n Pos:=i;\r\nend;\r\n\r\n{ TRecordUpdateBatch }\r\n\r\nconstructor TRecordUpdateBatch.Create(aBatchID: Integer; AList: TRecordUpdateDescriptorList; AOwnsList : Boolean);\r\nbegin\r\n FBatchID:=aBatchID;\r\n FList:=AList;\r\n FOwnsList:=AOwnsList;\r\n FStatus:=ubsPending;\r\nend;\r\n\r\ndestructor TRecordUpdateBatch.Destroy;\r\nbegin\r\n if OwnsList then\r\n FreeList;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TRecordUpdateBatch.FreeList;\r\nbegin\r\n FreeAndNil(FList);\r\nend;\r\n\r\n{ TRecordUpdateDescriptorList }\r\n\r\nfunction TRecordUpdateDescriptorList.GetUpdate(AIndex : Integer): TRecordUpdateDescriptor;\r\nbegin\r\n Result:=TRecordUpdateDescriptor(Items[AIndex]);\r\nend;\r\n\r\n{ TRecordUpdateDescriptor }\r\n\r\nprocedure TRecordUpdateDescriptor.SetStatus(aValue: TUpdateStatus);\r\nbegin\r\n FStatus:=AValue;\r\nend;\r\n\r\nconstructor TRecordUpdateDescriptor.Create(aProxy: TDataProxy; aDataset: TDataset; aBookmark: TBookMark; AData: JSValue;\r\n AStatus: TUpdateStatus);\r\nbegin\r\n FDataset:=aDataset;\r\n FBookmark:=aBookmark;\r\n FData:=AData;\r\n FStatus:=AStatus;\r\n FOriginalStatus:=AStatus;\r\n FProxy:=aProxy;\r\nend;\r\n\r\n\r\nprocedure TRecordUpdateDescriptor.Resolve(aData: JSValue);\r\nbegin\r\n FStatus:=usResolved;\r\n FServerData:=AData;\r\nend;\r\n\r\nprocedure TRecordUpdateDescriptor.ResolveFailed(aError: String);\r\nbegin\r\n SetStatus(usResolveFailed);\r\n FResolveError:=AError;\r\nend;\r\n\r\n{ TDataRequest }\r\n\r\nprocedure TDataRequest.DoAfterRequest;\r\nbegin\r\n if Assigned(FAfterRequest) then\r\n FAfterRequest(Self);\r\nend;\r\n\r\nconstructor TDataRequest.Create(aDataProxy : TDataProxy; aOptions: TLoadOptions; aAfterRequest: TDataRequestEvent; aAfterLoad: TDatasetLoadEvent);\r\nbegin\r\n FDataProxy:=aDataProxy;\r\n FLoadOptions:=aOptions;\r\n FEvent:=aAfterLoad;\r\n FAfterRequest:=aAfterRequest;\r\nend;\r\n\r\n{ TDataProxy }\r\n\r\nfunction TDataProxy.GetDataRequestClass: TDataRequestClass;\r\nbegin\r\n Result:=TDataRequest;\r\nend;\r\n\r\nfunction TDataProxy.GetUpdateDescriptorClass: TRecordUpdateDescriptorClass;\r\nbegin\r\n Result:=TRecordUpdateDescriptor;\r\nend;\r\n\r\nfunction TDataProxy.GetUpdateBatchClass: TRecordUpdateBatchClass;\r\nbegin\r\n Result:=TRecordUpdateBatch;\r\nend;\r\n\r\nprocedure TDataProxy.ResolveBatch(aBatch: TRecordUpdateBatch);\r\nbegin\r\n try\r\n If Assigned(ABatch.FOnResolve) then\r\n ABatch.FOnResolve(Self,ABatch);\r\n finally\r\n aBatch.Free;\r\n end;\r\nend;\r\n\r\nfunction TDataProxy.GetDataRequest(aOptions: TLoadOptions; aAfterRequest : TDataRequestEvent; aAfterLoad: TDatasetLoadEvent): TDataRequest;\r\nbegin\r\n Result:=GetDataRequestClass.Create(Self,aOptions,aAfterRequest,aAfterLoad);\r\nend;\r\n\r\nfunction TDataProxy.GetUpdateDescriptor(aDataset : TDataset; aBookmark: TBookMark; AData: JSValue; AStatus: TUpdateStatus): TRecordUpdateDescriptor;\r\nbegin\r\n Result:=GetUpdateDescriptorClass.Create(Self,aDataset, aBookmark,AData,AStatus);\r\nend;\r\n\r\nfunction TDataProxy.GetRecordUpdateBatch(aBatchID: Integer; AList: TRecordUpdateDescriptorList; AOwnsList : Boolean = True): TRecordUpdateBatch;\r\nbegin\r\n Result:=GetUpdateBatchClass.Create(aBatchID,AList,AOwnsList);\r\nend;\r\n\r\n\r\n{ EUpdateError }\r\nconstructor EUpdateError.Create(NativeError, Context : String;\r\n ErrCode, PrevError : integer; E: Exception);\r\n \r\nbegin\r\n Inherited CreateFmt(NativeError,[Context]);\r\n FContext := Context;\r\n FErrorCode := ErrCode;\r\n FPreviousError := PrevError;\r\n FOriginalException := E;\r\nend;\r\n\r\nDestructor EUpdateError.Destroy;\r\n\r\nbegin\r\n FOriginalException.Free;\r\n Inherited;\r\nend;\r\n\r\n{ TNamedItem }\r\n\r\nfunction TNamedItem.GetDisplayName: string;\r\nbegin\r\n Result := FName;\r\nend;\r\n\r\nprocedure TNamedItem.SetDisplayName(const Value: string);\r\nVar TmpInd : Integer;\r\nbegin\r\n if FName=Value then exit;\r\n if (Value <> '') and (Collection is TFieldDefs ) then\r\n begin\r\n TmpInd := (TDefCollection(Collection).IndexOf(Value));\r\n if (TmpInd >= 0) and (TmpInd <> Index) then\r\n DatabaseErrorFmt(SDuplicateName, [Value, Collection.ClassName]);\r\n end;\r\n FName:=Value;\r\n inherited SetDisplayName(Value);\r\nend;\r\n\r\n{ TDefCollection }\r\n\r\nprocedure TDefCollection.SetItemName(Item: TCollectionItem);\r\n\r\nVar\r\n N : TNamedItem;\r\n TN : String;\r\n\r\nbegin\r\n N:=Item as TNamedItem;\r\n if N.Name = '' then\r\n begin\r\n TN:=Copy(ClassName, 2, 5) + IntToStr(N.ID+1);\r\n if assigned(Dataset) then\r\n TN:=Dataset.Name+TN;\r\n N.Name:=TN;\r\n end\r\n else\r\n inherited SetItemName(Item);\r\nend;\r\n\r\nconstructor TDefCollection.create(ADataset: TDataset; AOwner: TPersistent;\r\n AClass: TCollectionItemClass);\r\nbegin\r\n inherited Create(AOwner,AClass);\r\n FDataset := ADataset;\r\nend;\r\n\r\nfunction TDefCollection.Find(const AName: string): TNamedItem;\r\nvar i: integer;\r\nbegin\r\n Result := Nil;\r\n for i := 0 to Count - 1 do\r\n if AnsiSameText(TNamedItem(Items[i]).Name, AName) then\r\n begin\r\n Result := TNamedItem(Items[i]);\r\n Break;\r\n end;\r\nend;\r\n\r\nprocedure TDefCollection.GetItemNames(List: TStrings);\r\nvar i: LongInt;\r\nbegin\r\n for i := 0 to Count - 1 do\r\n List.Add(TNamedItem(Items[i]).Name);\r\nend;\r\n\r\nfunction TDefCollection.IndexOf(const AName: string): Longint;\r\nvar i: LongInt;\r\nbegin\r\n Result := -1;\r\n for i := 0 to Count - 1 do\r\n if AnsiSameText(TNamedItem(Items[i]).Name, AName) then\r\n begin\r\n Result := i;\r\n Break;\r\n end;\r\nend;\r\n\r\n{ TIndexDef }\r\n\r\nprocedure TIndexDef.SetDescFields(const AValue: string);\r\nbegin\r\n if FDescFields=AValue then exit;\r\n if AValue <> '' then FOptions:=FOptions + [ixDescending];\r\n FDescFields:=AValue;\r\nend;\r\n\r\nprocedure TIndexDef.Assign(Source: TPersistent);\r\nvar idef : TIndexDef;\r\nbegin\r\n idef := nil;\r\n if Source is TIndexDef then\r\n idef := Source as TIndexDef;\r\n if Assigned(idef) then\r\n begin\r\n FName := idef.Name;\r\n FFields := idef.Fields;\r\n FOptions := idef.Options;\r\n FCaseinsFields := idef.CaseInsFields;\r\n FDescFields := idef.DescFields;\r\n FSource := idef.Source;\r\n FExpression := idef.Expression;\r\n end\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\nfunction TIndexDef.GetExpression: string;\r\nbegin\r\n Result := FExpression;\r\nend;\r\n\r\nprocedure TIndexDef.SetExpression(const AValue: string);\r\nbegin\r\n FExpression := AValue;\r\nend;\r\n\r\nprocedure TIndexDef.SetCaseInsFields(const AValue: string);\r\nbegin\r\n if FCaseinsFields=AValue then exit;\r\n if AValue <> '' then FOptions:=FOptions + [ixCaseInsensitive];\r\n FCaseinsFields:=AValue;\r\nend;\r\n\r\nconstructor TIndexDef.Create(Owner: TIndexDefs; const AName, TheFields: string;\r\n TheOptions: TIndexOptions);\r\n\r\nbegin\r\n FName := aname;\r\n inherited create(Owner);\r\n FFields := TheFields;\r\n FOptions := TheOptions;\r\nend;\r\n\r\n\r\n{ TIndexDefs }\r\n\r\nFunction TIndexDefs.GetItem (Index : integer) : TIndexDef;\r\n\r\nbegin\r\n Result:=(Inherited GetItem(Index)) as TIndexDef;\r\nend;\r\n\r\nProcedure TIndexDefs.SetItem(Index: Integer; Value: TIndexDef);\r\nbegin\r\n Inherited SetItem(Index,Value);\r\nend;\r\n\r\nconstructor TIndexDefs.Create(ADataSet: TDataSet);\r\n\r\nbegin\r\n inherited create(ADataset, Owner, TIndexDef);\r\nend;\r\n\r\n\r\nFunction TIndexDefs.AddIndexDef: TIndexDef;\r\n\r\nbegin\r\n// Result := inherited add as TIndexDef;\r\n Result:=TIndexDef.Create(Self,'','',[]);\r\nend;\r\n\r\nprocedure TIndexDefs.Add(const Name, Fields: string; Options: TIndexOptions);\r\n\r\nbegin\r\n TIndexDef.Create(Self,Name,Fields,Options);\r\nend;\r\n\r\nfunction TIndexDefs.Find(const IndexName: string): TIndexDef;\r\nbegin\r\n Result := (inherited Find(IndexName)) as TIndexDef;\r\n if (Result=Nil) Then\r\n DatabaseErrorFmt(SIndexNotFound, [IndexName], FDataSet);\r\nend;\r\n\r\nfunction TIndexDefs.FindIndexForFields(const Fields: string): TIndexDef;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\n\r\nfunction TIndexDefs.GetIndexForFields(const Fields: string;\r\n CaseInsensitive: Boolean): TIndexDef;\r\n\r\nvar\r\n i, FieldsLen: integer;\r\n Last: TIndexDef;\r\nbegin\r\n Last := nil;\r\n FieldsLen := Length(Fields);\r\n for i := 0 to Count - 1 do\r\n begin\r\n Result := Items[I];\r\n if (Result.Options * [ixDescending, ixExpression] = []) and\r\n (not CaseInsensitive or (ixCaseInsensitive in Result.Options)) and\r\n AnsiSameText(Fields, Result.Fields) then\r\n begin\r\n Exit;\r\n end else\r\n if AnsiSameText(Fields, Copy(Result.Fields, 1, FieldsLen)) and\r\n ((Length(Result.Fields) = FieldsLen) or\r\n (Result.Fields[FieldsLen + 1] = ';')) then\r\n begin\r\n if (Last = nil) or\r\n ((Last <> nil) And (Length(Last.Fields) > Length(Result.Fields))) then\r\n Last := Result;\r\n end;\r\n end;\r\n Result := Last;\r\nend;\r\n\r\nprocedure TIndexDefs.Update;\r\n\r\nbegin\r\n if (not updated) and assigned(Dataset) then\r\n begin\r\n Dataset.UpdateIndexDefs;\r\n updated := True;\r\n end;\r\nend;\r\n\r\n{ TCheckConstraint }\r\n\r\nprocedure TCheckConstraint.Assign(Source: TPersistent);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\n\r\n\r\n{ TCheckConstraints }\r\n\r\nFunction TCheckConstraints.GetItem(Index : Longint) : TCheckConstraint;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result := nil;\r\nend;\r\n\r\n\r\nProcedure TCheckConstraints.SetItem(index : Longint; Value : TCheckConstraint);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\n\r\nfunction TCheckConstraints.GetOwner: TPersistent;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result := nil;\r\nend;\r\n\r\n\r\nconstructor TCheckConstraints.Create(AOwner: TPersistent);\r\n\r\nbegin\r\n //!! To be implemented\r\n inherited Create(TCheckConstraint);\r\nend;\r\n\r\n\r\nfunction TCheckConstraints.Add: TCheckConstraint;\r\n\r\nbegin\r\n //!! To be implemented\r\n Result := nil;\r\nend;\r\n\r\n{ TLookupList }\r\n\r\nconstructor TLookupList.Create;\r\n\r\nbegin\r\n FList := TFPList.Create;\r\nend;\r\n\r\ndestructor TLookupList.Destroy;\r\n\r\nbegin\r\n Clear;\r\n FList.Destroy;\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TLookupList.Add(const AKey, AValue: JSValue);\r\n\r\nvar LookupRec: TJSObject;\r\n\r\nbegin\r\n LookupRec:=New(['Key',AKey,'Value',AValue]);\r\n FList.Add(LookupRec);\r\nend;\r\n\r\nprocedure TLookupList.Clear;\r\n\r\nbegin\r\n FList.Clear;\r\nend;\r\n\r\nfunction TLookupList.FirstKeyByValue(const AValue: JSValue): JSValue;\r\nvar\r\n i: Integer;\r\nbegin\r\n for i := 0 to FList.Count - 1 do\r\n with TJSObject(FList[i]) do\r\n if Properties['Value'] = AValue then\r\n begin\r\n Result := Properties['Key'];\r\n exit;\r\n end;\r\n Result := Null;\r\nend;\r\n\r\nfunction TLookupList.ValueOfKey(const AKey: JSValue): JSValue;\r\n\r\n Function VarArraySameValues(VarArray1,VarArray2 : TJSValueDynArray) : Boolean;\r\n // This only works for one-dimensional vararrays with a lower bound of 0\r\n // and equal higher bounds wich only contains JSValues.\r\n // The vararrays returned by GetFieldValues do apply.\r\n var i : integer;\r\n begin\r\n Result := True;\r\n if (Length(VarArray1)<>Length(VarArray2)) then\r\n exit;\r\n for i := 0 to Length(VarArray1) do\r\n begin\r\n if VarArray1[i]<>VarArray2[i] then\r\n begin\r\n Result := false;\r\n Exit;\r\n end;\r\n end;\r\n end;\r\n\r\nvar I: Integer;\r\nbegin\r\n Result := Null;\r\n if IsNull(AKey) then Exit;\r\n i := FList.Count - 1;\r\n if IsArray(AKey) then\r\n while (i >= 0) And not VarArraySameValues(TJSValueDynArray(TJSOBject(FList.Items[I]).Properties['Key']),TJSValueDynArray(AKey)) do Dec(i)\r\n else\r\n while (i >= 0) And (TJSObject(FList[I]).Properties['Key'] <> AKey) do Dec(i);\r\n if i >= 0 then Result := TJSObject(FList[I]).Properties['Value'];\r\nend;\r\n\r\nprocedure TLookupList.ValuesToStrings(AStrings: TStrings);\r\n\r\nvar\r\n i: Integer;\r\n p: TJSObject;\r\n\r\nbegin\r\n AStrings.Clear;\r\n for i := 0 to FList.Count - 1 do\r\n begin\r\n p := TJSObject(FList[i]);\r\n AStrings.AddObject(String(p.properties['Value']), TObject(p));\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TDataSet\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n DefaultBufferCount = 10;\r\n\r\nconstructor TDataSet.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n FFieldDefs:=FieldDefsClass.Create(Self);\r\n FFieldList:=FieldsClass.Create(Self);\r\n FDataSources:=TFPList.Create;\r\n FConstraints:=TCheckConstraints.Create(Self);\r\n SetLength(FBuffers,1);\r\n FActiveRecord := 0;\r\n FEOF := True;\r\n FBOF := True;\r\n FIsUniDirectional := False;\r\n FAutoCalcFields := True;\r\n FDataRequestID:=0;\r\nend;\r\n\r\n\r\n\r\ndestructor TDataSet.Destroy;\r\n\r\nvar\r\n i: Integer;\r\n\r\nbegin\r\n Active:=False;\r\n FFieldDefs.Free;\r\n FFieldList.Free;\r\n With FDataSources do\r\n begin\r\n While Count>0 do\r\n TDataSource(Items[Count - 1]).DataSet:=Nil;\r\n Destroy;\r\n end;\r\n for i := 0 to FBufferCount do\r\n FreeRecordBuffer(FBuffers[i]);\r\n FConstraints.Free;\r\n SetLength(FBuffers,1);\r\n Inherited Destroy;\r\nend;\r\n\r\n// This procedure must be called when the first record is made/read\r\nprocedure TDataSet.ActivateBuffers;\r\n\r\nbegin\r\n FBOF:=False;\r\n FEOF:=False;\r\n FActiveRecord:=0;\r\nend;\r\n\r\nprocedure TDataSet.BindFields(Binding: Boolean);\r\n\r\nvar i, FieldIndex: Integer;\r\n FieldDef: TFieldDef;\r\n Field: TField;\r\n\r\nbegin\r\n { FieldNo is set to -1 for calculated/lookup fields, to 0 for unbound field\r\n and for bound fields it is set to FieldDef.FieldNo }\r\n FCalcFieldsSize := 0;\r\n FBlobFieldCount := 0;\r\n for i := 0 to Fields.Count - 1 do\r\n begin\r\n Field := Fields[i];\r\n Field.FFieldDef := Nil;\r\n if not Binding then\r\n Field.FFieldNo := 0\r\n else if Field.FieldKind in [fkCalculated, fkLookup] then\r\n begin\r\n Field.FFieldNo := -1;\r\n Field.FOffset := FCalcFieldsSize;\r\n Inc(FCalcFieldsSize, Field.DataSize + 1);\r\n end\r\n else\r\n begin\r\n FieldIndex := FieldDefs.IndexOf(Field.FieldName);\r\n if FieldIndex = -1 then\r\n DatabaseErrorFmt(SFieldNotFound,[Field.FieldName],Self)\r\n else\r\n begin\r\n FieldDef := FieldDefs[FieldIndex];\r\n Field.FFieldDef := FieldDef;\r\n Field.FFieldNo := FieldDef.FieldNo;\r\n if FieldDef.InternalCalcField then\r\n FInternalCalcFields := True;\r\n if Field.IsBlob then\r\n begin\r\n Field.FSize := FieldDef.Size;\r\n Field.FOffset := FBlobFieldCount;\r\n Inc(FBlobFieldCount);\r\n end;\r\n // synchronize CodePage between TFieldDef and TField\r\n // character data in record buffer and field buffer should have same CodePage\r\n end;\r\n end;\r\n Field.Bind(Binding);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.BookmarkAvailable: Boolean;\r\n\r\nConst BookmarkStates = [dsBrowse,dsEdit,dsInsert];\r\n\r\nbegin\r\n Result:=(Not IsEmpty) and not FIsUniDirectional and (State in BookmarkStates)\r\n and (getBookMarkFlag(ActiveBuffer)=bfCurrent);\r\nend;\r\n\r\nprocedure TDataSet.CalculateFields(var Buffer: TDataRecord);\r\nvar\r\n i: Integer;\r\n OldState: TDatasetState;\r\nbegin\r\n FCalcBuffer := Buffer; \r\n if FState <> dsInternalCalc then\r\n begin\r\n OldState := FState;\r\n FState := dsCalcFields;\r\n try\r\n ClearCalcFields(FCalcBuffer);\r\n if not IsUniDirectional then\r\n for i := 0 to FFieldList.Count - 1 do\r\n if FFieldList[i].FieldKind = fkLookup then\r\n FFieldList[i].CalcLookupValue;\r\n finally\r\n DoOnCalcFields;\r\n FState := OldState;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.CheckActive;\r\n\r\nbegin\r\n If Not Active then\r\n DataBaseError(SInactiveDataset,Self);\r\nend;\r\n\r\nprocedure TDataSet.CheckInactive;\r\n\r\nbegin\r\n If Active then\r\n DataBaseError(SActiveDataset,Self);\r\nend;\r\n\r\nprocedure TDataSet.ClearBuffers;\r\n\r\nbegin\r\n FRecordCount:=0;\r\n FActiveRecord:=0;\r\n FCurrentRecord:=-1;\r\n FBOF:=True;\r\n FEOF:=True;\r\nend;\r\n\r\nprocedure TDataSet.ClearCalcFields(var Buffer: TDataRecord);\r\n\r\nbegin\r\n // Empty\r\nend;\r\n\r\nprocedure TDataSet.CloseBlob(Field: TField);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.CloseCursor;\r\n\r\nbegin\r\n ClearBuffers;\r\n SetBufListSize(0);\r\n Fields.ClearFieldDefs;\r\n InternalClose;\r\n FInternalOpenComplete := False;\r\nend;\r\n\r\nprocedure TDataSet.CreateFields;\r\n\r\nVar I : longint;\r\n\r\nbegin\r\n{$ifdef DSDebug}\r\n Writeln ('Creating fields');\r\n Writeln ('Count : ',fielddefs.Count);\r\n For I:=0 to FieldDefs.Count-1 do\r\n Writeln('Def ',I,' : ',Fielddefs.items[i].Name,'(',Fielddefs.items[i].FieldNo,')');\r\n{$endif}\r\n For I:=0 to FieldDefs.Count-1 do\r\n With FieldDefs.Items[I] do\r\n If DataType<>ftUnknown then\r\n begin\r\n {$ifdef DSDebug}\r\n Writeln('About to create field ',FieldDefs.Items[i].Name);\r\n {$endif}\r\n CreateField(self);\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.DataEvent(Event: TDataEvent; Info: JSValue);\r\n\r\n procedure HandleFieldChange(aField: TField);\r\n begin\r\n if aField.FieldKind in [fkData, fkInternalCalc] then\r\n SetModified(True);\r\n \r\n if State <> dsSetKey then begin\r\n if aField.FieldKind = fkData then begin\r\n if FInternalCalcFields then\r\n RefreshInternalCalcFields(FBuffers[FActiveRecord])\r\n else if FAutoCalcFields and (FCalcFieldsSize <> 0) then\r\n CalculateFields(FBuffers[FActiveRecord]);\r\n end;\r\n \r\n aField.Change;\r\n end;\r\n end;\r\n \r\n procedure HandleScrollOrChange;\r\n begin\r\n if State <> dsInsert then\r\n UpdateCursorPos;\r\n end;\r\n\r\nvar\r\n i: Integer;\r\nbegin\r\n case Event of\r\n deFieldChange : HandleFieldChange(TField(Info));\r\n deDataSetChange,\r\n deDataSetScroll : HandleScrollOrChange;\r\n deLayoutChange : FEnableControlsEvent:=deLayoutChange; \r\n end;\r\n\r\n if not ControlsDisabled and (FState <> dsBlockRead) then begin\r\n for i := 0 to FDataSources.Count - 1 do\r\n TDataSource(FDataSources[i]).ProcessEvent(Event, Info);\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.DestroyFields;\r\n\r\nbegin\r\n FFieldList.Clear;\r\nend;\r\n\r\nprocedure TDataSet.DoAfterCancel;\r\n\r\nbegin\r\n If assigned(FAfterCancel) then\r\n FAfterCancel(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterClose;\r\n\r\nbegin\r\n If assigned(FAfterClose) and not (csDestroying in ComponentState) then\r\n FAfterClose(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterDelete;\r\n\r\nbegin\r\n If assigned(FAfterDelete) then\r\n FAfterDelete(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterEdit;\r\n\r\nbegin\r\n If assigned(FAfterEdit) then\r\n FAfterEdit(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterInsert;\r\n\r\nbegin\r\n If assigned(FAfterInsert) then\r\n FAfterInsert(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterOpen;\r\n\r\nbegin\r\n If assigned(FAfterOpen) then\r\n FAfterOpen(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterPost;\r\n\r\nbegin\r\n If assigned(FAfterPost) then\r\n FAfterPost(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterScroll;\r\n\r\nbegin\r\n If assigned(FAfterScroll) then\r\n FAfterScroll(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterRefresh;\r\n\r\nbegin\r\n If assigned(FAfterRefresh) then\r\n FAfterRefresh(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeCancel;\r\n\r\nbegin\r\n If assigned(FBeforeCancel) then\r\n FBeforeCancel(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeClose;\r\n\r\nbegin\r\n If assigned(FBeforeClose) and not (csDestroying in ComponentState) then\r\n FBeforeClose(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeDelete;\r\n\r\nbegin\r\n If assigned(FBeforeDelete) then\r\n FBeforeDelete(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeEdit;\r\n\r\nbegin\r\n If assigned(FBeforeEdit) then\r\n FBeforeEdit(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeInsert;\r\n\r\nbegin\r\n If assigned(FBeforeInsert) then\r\n FBeforeInsert(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeOpen;\r\n\r\nbegin\r\n If assigned(FBeforeOpen) then\r\n FBeforeOpen(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforePost;\r\n\r\nbegin\r\n If assigned(FBeforePost) then\r\n FBeforePost(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeScroll;\r\n\r\nbegin\r\n If assigned(FBeforeScroll) then\r\n FBeforeScroll(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeRefresh;\r\n\r\nbegin\r\n If assigned(FBeforeRefresh) then\r\n FBeforeRefresh(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoInternalOpen;\r\n\r\nbegin\r\n InternalOpen;\r\n FInternalOpenComplete := True;\r\n{$ifdef dsdebug}\r\n Writeln ('Calling internal open');\r\n{$endif}\r\n{$ifdef dsdebug}\r\n Writeln ('Calling RecalcBufListSize');\r\n{$endif}\r\n FRecordCount := 0;\r\n RecalcBufListSize;\r\n FBOF := True;\r\n FEOF := (FRecordCount = 0);\r\n if Assigned(DataProxy) then\r\n InitChangeList;\r\nend;\r\n\r\nprocedure TDataSet.DoOnCalcFields;\r\n\r\nbegin\r\n If Assigned(FOnCalcfields) then\r\n FOnCalcFields(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoOnNewRecord;\r\n\r\nbegin\r\n If assigned(FOnNewRecord) then\r\n FOnNewRecord(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeLoad;\r\nbegin\r\n If Assigned(FBeforeLoad) then\r\n FBeforeLoad(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterLoad;\r\nbegin\r\n if Assigned(FAfterLoad) then\r\n FAfterLoad(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoBeforeApplyUpdates;\r\n\r\nbegin\r\n If Assigned(FBeforeApplyUpdates) then\r\n FBeforeApplyUpdates(Self);\r\nend;\r\n\r\nprocedure TDataSet.DoAfterApplyUpdates;\r\n\r\nbegin\r\n If Assigned(FAfterApplyUpdates) then\r\n FAfterApplyUpdates(Self);\r\nend;\r\n\r\nfunction TDataSet.FieldByNumber(FieldNo: Longint): TField;\r\n\r\nbegin\r\n Result:=FFieldList.FieldByNumber(FieldNo);\r\nend;\r\n\r\nfunction TDataSet.FindRecord(Restart, GoForward: Boolean): Boolean;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\n\r\nfunction TDataSet.GetBookmarkStr: TBookmarkStr;\r\n\r\nVar\r\n B : TBookMark;\r\n\r\nbegin\r\n Result:='';\r\n If BookMarkAvailable then\r\n begin\r\n GetBookMarkData(ActiveBuffer,B);\r\n Result:=TJSJSON.stringify(B);\r\n end\r\nend;\r\n\r\nfunction TDataSet.GetBuffer(Index: longint): TDataRecord;\r\n\r\nbegin\r\n Result:=FBuffers[Index];\r\nend;\r\n\r\nfunction TDataSet.GetBufferCount: Longint;\r\nbegin\r\n Result:=Length(FBuffers);\r\nend;\r\n\r\nfunction TDataSet.DoGetDataProxy: TDataProxy;\r\n\r\nbegin\r\n Result:=nil;\r\nend;\r\n\r\nprocedure TDataSet.InitChangeList;\r\n\r\nbegin\r\n DoneChangeList;\r\n FChangeList:=TFPList.Create;\r\nend;\r\n\r\nprocedure TDataSet.ClearChangeList;\r\n\r\nVar\r\n I : integer;\r\n\r\nbegin\r\n If not Assigned(FChangeList) then\r\n exit;\r\n For I:=0 to FChangeList.Count-1 do\r\n begin\r\n TObject(FChangeList[i]).Destroy;\r\n FChangeList[i]:=Nil;\r\n end;\r\nend;\r\n\r\nFunction TDataSet.IndexInChangeList(aBookmark : TBookmark) : Integer;\r\n\r\nbegin\r\n Result:=-1;\r\n if Not assigned(FChangeList) then\r\n exit;\r\n Result:=FChangeList.Count-1;\r\n While (Result>=0) and (CompareBookmarks(aBookMark,TRecordUpdateDescriptor(FChangeList[Result]).Bookmark)<>0) do\r\n Dec(Result);\r\nend;\r\n\r\nFunction TDataSet.AddToChangeList(aChange: TUpdateStatus) : TRecordUpdateDescriptor;\r\n\r\nVar\r\n B : TBookmark;\r\n I : Integer;\r\n\r\nbegin\r\n Result:=Nil;\r\n if Not Assigned(FChangeList) then\r\n Exit;\r\n B:=GetBookmark;\r\n I:=IndexInChangeList(B);\r\n if (I=-1) then\r\n begin\r\n if Assigned(DataProxy) then\r\n Result:=DataProxy.GetUpdateDescriptor(Self,B,ActiveBuffer.data,aChange)\r\n else\r\n Result:=TRecordUpdateDescriptor.Create(Nil,Self,B,ActiveBuffer.data,aChange);\r\n FChangeList.Add(Result);\r\n end\r\n else\r\n begin\r\n Result:=TRecordUpdateDescriptor(FChangeList[i]);\r\n Case aChange of\r\n usDeleted : Result.FStatus:=usDeleted;\r\n usInserted : DatabaseError(SErrInsertingSameRecordtwice,Self);\r\n usModified : Result.FData:=ActiveBuffer.Data;\r\n end\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.RemoveFromChangeList(R: TRecordUpdateDescriptor);\r\n\r\nbegin\r\n if Not (Assigned(R) and Assigned(FChangeList)) then\r\n Exit;\r\nend;\r\n\r\nFunction TDataSet.GetRecordUpdates(AList: TRecordUpdateDescriptorList) : Integer;\r\n\r\nVar\r\n I,MinIndex : integer;\r\n\r\nbegin\r\n MinIndex:=0; // Check batch list for minimal index ?\r\n For I:=MinIndex to FChangeList.Count-1 do\r\n Alist.Add(FChangeList[i]);\r\n Result:=FChangeList.Count;\r\nend;\r\n\r\nFunction TDataSet.ResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor) : Boolean;\r\n\r\nbegin\r\n try\r\n Result:=DoResolveRecordUpdate(anUpdate);\r\n If not Result then\r\n anUpdate.FStatus:=usResolveFailed;\r\n except\r\n On E : Exception do\r\n anUpdate.ResolveFailed(E.Classname+': '+E.Message);\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.ResolveUpdateBatch(Sender: TObject; aBatch : TRecordUpdateBatch);\r\n\r\nVar\r\n BI,RI,Idx: integer;\r\n RUD : TRecordUpdateDescriptor;\r\n doRemove : Boolean;\r\n\r\nbegin\r\n if Assigned(FBatchList) and (aBatch.Dataset=Self) then\r\n BI:=FBatchList.IndexOf(aBatch)\r\n else\r\n BI:=-1;\r\n if (BI=-1) then\r\n Exit;\r\n FBatchList.Delete(Bi);\r\n For RI:=0 to aBatch.List.Count-1 do\r\n begin\r\n RUD:=aBatch.List[RI];\r\n aBatch.List.Items[RI]:=Nil;\r\n Idx:=IndexInChangeList(RUD.Bookmark);\r\n if (Idx<>-1) then\r\n begin\r\n doRemove:=False;\r\n if (RUD.Status=usResolved) then\r\n DoRemove:=ResolveRecordUpdate(RUD)\r\n else\r\n DoRemove:=(RUD.Status in [usUnmodified,usResolveFailed]);\r\n // What if not resolvable.. ?\r\n If DoRemove then\r\n begin\r\n RUD.Free;\r\n FChangeList.Delete(Idx);\r\n end;\r\n end;\r\n end;\r\n if (FBatchList.Count=0) then\r\n FreeAndNil(FBatchList);\r\n DoAfterApplyUpdates;\r\nend;\r\n\r\nprocedure TDataSet.DoApplyUpdates;\r\n\r\nVar\r\n B : TRecordUpdateBatch;\r\n l : TRecordUpdateDescriptorList;\r\n I : integer;\r\n\r\nbegin\r\n if Not Assigned(DataProxy) then\r\n DatabaseError(SErrDoApplyUpdatesNeedsProxy,Self);\r\n if Not (Assigned(FChangeList) and (FChangeList.Count>0)) then\r\n Exit;\r\n L:=TRecordUpdateDescriptorList.Create;\r\n try\r\n I:=GetRecordUpdates(L);\r\n except\r\n L.Free;\r\n Raise;\r\n end;\r\n Inc(FUpdateBatchID);\r\n B:=DataProxy.GetRecordUpdateBatch(FUpdateBatchID,L,True);\r\n B.FDataset:=Self;\r\n B.FLastChangeIndex:=I;\r\n B.OnResolve:=@ResolveUpdateBatch;\r\n If not Assigned(FBatchlist) then\r\n FBatchlist:=TFPList.Create;\r\n FBatchList.Add(B);\r\n DataProxy.ProcessUpdateBatch(B);\r\nend;\r\n\r\nprocedure TDataSet.DoneChangeList;\r\n\r\nbegin\r\n ClearChangeList;\r\n FreeAndNil(FChangeList);\r\nend;\r\n\r\nfunction TDataSet.GetDataProxy: TDataProxy;\r\n\r\nbegin\r\n If (FDataProxy=Nil) then\r\n DataProxy:=DoGetDataProxy;\r\n Result:=FDataProxy;\r\nend;\r\n\r\nfunction TDataSet.DataPacketReceived(ARequest: TDataRequest): Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nprocedure TDataSet.HandleRequestresponse(ARequest: TDataRequest);\r\n\r\nVar\r\n DataAdded : Boolean;\r\n\r\nbegin\r\n if Not Assigned(ARequest) then\r\n exit;\r\n Case ARequest.Success of\r\n rrFail:\r\n begin\r\n if Assigned(FOnLoadFail) then\r\n FOnLoadFail(Self,aRequest.RequestID,aRequest.ErrorMsg);\r\n end;\r\n rrEOF,\r\n rrOK :\r\n begin\r\n DataAdded:=False;\r\n // Notify caller\r\n if Assigned(ARequest.Event) then\r\n ARequest.Event(Self,aRequest.Data);\r\n // allow descendent to integrate data.\r\n // Must be done before user is notified or dataset is opened...\r\n if (ARequest.Success<>rrEOF) then\r\n DataAdded:=DataPacketReceived(aRequest);\r\n // Open if needed.\r\n if Not (Active or (loNoOpen in aRequest.LoadOptions)) then\r\n begin\r\n // Notify user\r\n if not (loNoEvents in aRequest.LoadOptions) then\r\n DoAfterLoad;\r\n Open\r\n end\r\n else\r\n begin\r\n if (loAtEOF in aRequest.LoadOptions) and DataAdded then\r\n FEOF:=False;\r\n if not (loNoEvents in aRequest.LoadOptions) then\r\n DoAfterLoad;\r\n end;\r\n end;\r\n end;\r\n aRequest.Destroy;\r\nend;\r\n\r\nfunction TDataSet.DoResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor): Boolean;\r\nbegin\r\n Result:=True;\r\nend;\r\n\r\nprocedure TDataSet.GetCalcFields(var Buffer: TDataRecord);\r\n\r\nbegin\r\n if (FCalcFieldsSize > 0) or FInternalCalcFields then\r\n CalculateFields(Buffer);\r\nend;\r\n\r\nfunction TDataSet.GetCanModify: Boolean;\r\n\r\nbegin\r\n Result:= not FIsUnidirectional;\r\nend;\r\n\r\nprocedure TDataSet.GetChildren(Proc: TGetChildProc; Root: TComponent);\r\n\r\nvar\r\n I: Integer;\r\n Field: TField;\r\n\r\nbegin\r\n for I := 0 to Fields.Count - 1 do begin\r\n Field := Fields[I];\r\n if (Field.Owner = Root) then\r\n Proc(Field);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.GetDataSource: TDataSource;\r\nbegin\r\n Result:=nil;\r\nend;\r\n\r\nfunction TDataSet.GetRecordSize: Word;\r\nbegin\r\n Result := 0;\r\nend;\r\n\r\nprocedure TDataSet.InternalAddRecord(Buffer: Pointer; AAppend: Boolean);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalDelete;\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalFirst;\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalGotoBookmark(ABookmark: TBookMark);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\n\r\nfunction TDataset.GetFieldData(Field: TField; Buffer: TDatarecord): JSValue;\r\n\r\nbegin\r\n Result:=TJSObject(buffer.data).Properties[Field.FieldName];\r\nend;\r\n\r\n\r\nprocedure TDataSet.SetFieldData(Field: TField; var Buffer: TDataRecord; AValue : JSValue);\r\n\r\nbegin\r\n TJSObject(buffer.data).Properties[Field.FieldName]:=AValue;\r\nend;\r\n\r\n\r\nfunction TDataSet.GetFieldClass(FieldType: TFieldType): TFieldClass;\r\n\r\nbegin\r\n Result := DefaultFieldClasses[FieldType];\r\nend;\r\n\r\nfunction TDataSet.GetIsIndexField(Field: TField): Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.GetIndexDefs(IndexDefs: TIndexDefs; IndexTypes: TIndexOptions\r\n ): TIndexDefs;\r\n \r\nvar i,f : integer;\r\n IndexFields : TStrings;\r\n \r\nbegin\r\n IndexDefs.Update;\r\n Result := TIndexDefs.Create(Self);\r\n Result.Assign(IndexDefs);\r\n i := 0;\r\n IndexFields := TStringList.Create;\r\n while i < result.Count do\r\n begin\r\n if (not ((IndexTypes = []) and (result[i].Options = []))) and\r\n ((IndexTypes * result[i].Options) = []) then\r\n begin\r\n result.Delete(i);\r\n dec(i);\r\n end\r\n else\r\n begin\r\n// ExtractStrings([';'],[' '],result[i].Fields,Indexfields);\r\n for f := 0 to IndexFields.Count-1 do\r\n if FindField(Indexfields[f]) = nil then\r\n begin\r\n result.Delete(i);\r\n dec(i);\r\n break;\r\n end;\r\n end;\r\n inc(i);\r\n end;\r\n IndexFields.Free;\r\nend;\r\n\r\nfunction TDataSet.GetNextRecord: Boolean;\r\n\r\nVar\r\n T : TDataRecord;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Getting next record. Internal RecordCount : ',FRecordCount);\r\n Writeln ('Getting next record. Internal buffercount : ',FBufferCount);\r\n{$endif}\r\n If FRecordCount>0 Then\r\n SetCurrentRecord(FRecordCount-1);\r\n Result:=GetRecord(FBuffers[FBufferCount],gmNext,True)=grOK;\r\n if Result then\r\n begin\r\n If FRecordCount=0 then ActivateBuffers;\r\n if FRecordCount=FBufferCount then\r\n ShiftBuffersBackward\r\n else\r\n begin\r\n Inc(FRecordCount);\r\n FCurrentRecord:=FRecordCount - 1;\r\n T:=FBuffers[FCurrentRecord];\r\n FBuffers[FCurrentRecord]:=FBuffers[FBufferCount];\r\n FBuffers[FBufferCount]:=T;\r\n end;\r\n end\r\n else\r\n CursorPosChanged;\r\n{$ifdef dsdebug}\r\n Writeln ('Result getting next record : ',Result);\r\n{$endif}\r\nend;\r\n\r\nfunction TDataSet.GetNextRecords: Longint;\r\n\r\nbegin\r\n Result:=0;\r\n{$ifdef dsdebug}\r\n Writeln ('Getting next record(s), need :',FBufferCount);\r\n{$endif}\r\n While (FRecordCount0 Then SetCurrentRecord(0);\r\n Result:=GetRecord(FBuffers[FBufferCount],gmPrior,True)=grOK;\r\n if Result then\r\n begin\r\n If FRecordCount=0 then ActivateBuffers;\r\n ShiftBuffersForward;\r\n\r\n if FRecordCount 0 then\r\n begin\r\n CheckActive; \r\n SetState(dsBlockRead);\r\n end\t\r\n else\r\n begin\r\n //update state only when in dsBlockRead \r\n if FState = dsBlockRead then\r\n SetState(dsBrowse);\r\n end;\t\r\nend;\r\n\r\nprocedure TDataSet.SetFieldDefs(AFieldDefs: TFieldDefs);\r\n\r\nbegin\r\n Fields.ClearFieldDefs;\r\n FFieldDefs.Assign(AFieldDefs);\r\nend;\r\n\r\nprocedure TDataSet.DoInsertAppendRecord(const Values: array of JSValue; DoAppend : boolean);\r\nvar i : integer;\r\n ValuesSize : integer;\r\nbegin\r\n ValuesSize:=Length(Values);\r\n if ValuesSize>FieldCount then DatabaseError(STooManyFields,self);\r\n if DoAppend then\r\n Append\r\n else\r\n Insert;\r\n for i := 0 to ValuesSize-1 do\r\n Fields[i].AssignValue(Values[i]);\r\n Post;\r\nend;\r\n\r\nprocedure TDataSet.InitFieldDefsFromFields;\r\nvar i : integer;\r\n\r\nbegin\r\n if FieldDefs.Count = 0 then\r\n begin\r\n FieldDefs.BeginUpdate;\r\n try\r\n for i := 0 to Fields.Count-1 do with Fields[i] do\r\n if not (FieldKind in [fkCalculated,fkLookup]) then // Do not add fielddefs for calculated/lookup fields.\r\n begin\r\n FFieldDef:=FieldDefs.FieldDefClass.Create(FieldDefs,FieldName,DataType,Size,Required,FieldDefs.Count+1);\r\n with FFieldDef do\r\n begin\r\n if Required then Attributes := Attributes + [faRequired];\r\n if ReadOnly then Attributes := Attributes + [faReadOnly];\r\n end;\r\n end;\r\n finally\r\n FieldDefs.EndUpdate;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.InitRecord(var Buffer: TDataRecord);\r\n\r\nbegin\r\n InternalInitRecord(Buffer);\r\n ClearCalcFields(Buffer);\r\nend;\r\n\r\nprocedure TDataSet.InternalCancel;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.InternalEdit;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.InternalRefresh;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.OpenCursor(InfoQuery: Boolean);\r\n\r\nbegin\r\n if InfoQuery then\r\n InternalInitFieldDefs\r\n else if State <> dsOpening then\r\n DoInternalOpen;\r\nend;\r\n\r\nprocedure TDataSet.OpenCursorcomplete;\r\nbegin\r\n try\r\n if FState = dsOpening then DoInternalOpen\r\n finally\r\n if FInternalOpenComplete then\r\n begin\r\n SetState(dsBrowse);\r\n DoAfterOpen;\r\n if not IsEmpty then\r\n DoAfterScroll;\r\n end\r\n else\r\n begin\r\n SetState(dsInactive);\r\n CloseCursor;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.RefreshInternalCalcFields(Var Buffer: TDataRecord);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nfunction TDataSet.SetTempState(const Value: TDataSetState): TDataSetState;\r\n\r\nbegin\r\n result := FState;\r\n FState := value;\r\n inc(FDisableControlsCount);\r\nend;\r\n\r\nprocedure TDataSet.RestoreState(const Value: TDataSetState);\r\n\r\nbegin\r\n FState := value;\r\n dec(FDisableControlsCount);\r\nend;\r\n\r\nfunction TDataSet.GetActive: boolean;\r\n\r\nbegin\r\n result := (FState <> dsInactive) and (FState <> dsOpening);\r\nend;\r\n\r\nprocedure TDataSet.InternalHandleException(E :Exception);\r\n\r\nbegin\r\n ShowException(E,Nil);\r\nend;\r\n\r\nprocedure TDataSet.InternalInitRecord(var Buffer: TDataRecord);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalLast;\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.InternalPost;\r\n\r\n Procedure CheckRequiredFields;\r\n\r\n Var I : longint;\r\n\r\n begin\r\n For I:=0 to FFieldList.Count-1 do\r\n With FFieldList[i] do\r\n // Required fields that are NOT autoinc !! Autoinc cannot be set !!\r\n if Required and not ReadOnly and\r\n (FieldKind=fkData) and Not (DataType=ftAutoInc) and IsNull then\r\n DatabaseErrorFmt(SNeedField,[DisplayName],Self);\r\n end;\r\n\r\nbegin\r\n CheckRequiredFields;\r\nend;\r\n\r\nprocedure TDataSet.InternalSetToRecord(Buffer: TDataRecord);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.SetBookmarkFlag(Var Buffer: TDataRecord; Value: TBookmarkFlag);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.SetBookmarkData(Var Buffer: TDataRecord; Data: TBookmark);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.SetUniDirectional(const Value: Boolean);\r\nbegin\r\n FIsUniDirectional := Value;\r\nend;\r\n\r\nprocedure TDataSet.Notification(AComponent: TComponent; Operation: TOperation);\r\nbegin\r\n inherited Notification(AComponent, Operation);\r\n if (Operation=opRemove) and (AComponent=FDataProxy) then\r\n FDataProxy:=Nil;\r\nend;\r\n\r\nclass function TDataSet.FieldDefsClass: TFieldDefsClass;\r\nbegin\r\n Result:=TFieldDefs;\r\nend;\r\n\r\nclass function TDataSet.FieldsClass: TFieldsClass;\r\nbegin\r\n Result:=TFields;\r\nend;\r\n\r\nprocedure TDataSet.SetActive(Value: Boolean);\r\n\r\nbegin\r\n if value and (Fstate = dsInactive) then\r\n begin\r\n if csLoading in ComponentState then\r\n begin\r\n FOpenAfterRead := true;\r\n exit;\r\n end\r\n else\r\n begin\r\n DoBeforeOpen;\r\n FEnableControlsEvent:=deLayoutChange;\r\n FInternalCalcFields:=False;\r\n try\r\n FDefaultFields:=FieldCount=0;\r\n OpenCursor(False);\r\n finally\r\n if FState <> dsOpening then OpenCursorComplete;\r\n end;\r\n end;\r\n FModified:=False;\r\n end\r\n else if not value and (Fstate <> dsinactive) then\r\n begin\r\n DoBeforeClose;\r\n SetState(dsInactive);\r\n FDataRequestID:=0;\r\n DoneChangeList;\r\n CloseCursor;\r\n DoAfterClose;\r\n FModified:=False;\r\n end\r\nend;\r\n\r\nprocedure TDataSet.Loaded;\r\n\r\nbegin\r\n inherited;\r\n try\r\n if FOpenAfterRead then SetActive(true);\r\n except\r\n on E : Exception do\r\n if csDesigning in Componentstate then\r\n InternalHandleException(E);\r\n else\r\n raise;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TDataSet.RecalcBufListSize;\r\n\r\nvar\r\n i, j, ABufferCount: Integer;\r\n DataLink: TDataLink;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln('Recalculating buffer list size - check cursor');\r\n{$endif}\r\n If Not IsCursorOpen Then\r\n Exit;\r\n{$ifdef dsdebug}\r\n Writeln('Recalculating buffer list size');\r\n{$endif}\r\n if IsUniDirectional then\r\n ABufferCount := 1\r\n else\r\n ABufferCount := DefaultBufferCount;\r\n\r\n for i := 0 to FDataSources.Count - 1 do\r\n for j := 0 to TDataSource(FDataSources[i]).DataLinks.Count - 1 do\r\n begin\r\n DataLink:=TDataLink(TDataSource(FDataSources[i]).DataLinks[j]);\r\n if ABufferCountBufferCount then\r\n begin\r\n For I:=FBufferCount to Value do\r\n FBuffers[i]:=AllocRecordBuffer;\r\n end\r\n else if value=0) and (FActiveRecord>Value-1) then\r\n begin\r\n for i := 0 to (FActiveRecord-Value) do\r\n ShiftBuffersBackward;\r\n FActiveRecord := Value -1;\r\n end;\r\n SetLength(FBuffers,Value+1); // FBuffers[FBufferCount] is used as a temp buffer\r\n FBufferCount:=Value;\r\n if FRecordCount > FBufferCount then\r\n FRecordCount := FBufferCount;\r\n\r\nend;\r\n\r\nprocedure TDataSet.SetChildOrder(Child: TComponent; Order: Longint);\r\n\r\nvar\r\n Field: TField;\r\nbegin\r\n Field := Child as TField;\r\n if Fields.IndexOf(Field) >= 0 then\r\n Field.Index := Order;\r\nend;\r\n\r\nprocedure TDataSet.SetCurrentRecord(Index: Longint);\r\n\r\nbegin\r\n If FCurrentRecord<>Index then\r\n begin\r\n{$ifdef DSdebug}\r\n Writeln ('Setting current record to: ',index);\r\n{$endif}\r\n if not FIsUniDirectional then Case GetBookMarkFlag(FBuffers[Index]) of\r\n bfCurrent : InternalSetToRecord(FBuffers[Index]);\r\n bfBOF : InternalFirst;\r\n bfEOF : InternalLast;\r\n end;\r\n FCurrentRecord:=Index;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.SetDefaultFields(const Value: Boolean);\r\nbegin\r\n FDefaultFields := Value;\r\nend;\r\n\r\nprocedure TDataSet.CheckBiDirectional;\r\n\r\nbegin\r\n if FIsUniDirectional then DataBaseError(SUniDirectional,Self);\r\nend;\r\n\r\nprocedure TDataSet.SetFilterOptions(Value: TFilterOptions);\r\n\r\nbegin\r\n CheckBiDirectional;\r\n FFilterOptions := Value;\r\nend;\r\n\r\nprocedure TDataSet.SetFilterText(const Value: string);\r\n\r\nbegin\r\n FFilterText := value;\r\nend;\r\n\r\nprocedure TDataSet.SetFiltered(Value: Boolean);\r\n\r\nbegin\r\n if Value then CheckBiDirectional;\r\n FFiltered := value;\r\nend;\r\n\r\nprocedure TDataSet.SetFound(const Value: Boolean);\r\nbegin\r\n FFound := Value;\r\nend;\r\n\r\nprocedure TDataSet.SetModified(Value: Boolean);\r\n\r\nbegin\r\n FModified := value;\r\nend;\r\n\r\nprocedure TDataSet.SetName(const NewName: TComponentName);\r\n\r\n function CheckName(const FieldName: string): string;\r\n var i,j: integer;\r\n begin\r\n Result := FieldName;\r\n i := 0;\r\n j := 0;\r\n while (i < Fields.Count) do begin\r\n if Result = Fields[i].FieldName then begin\r\n inc(j);\r\n Result := FieldName + IntToStr(j);\r\n end else Inc(i);\r\n end;\r\n end;\r\n\r\nvar\r\n i: integer;\r\n nm: string;\r\n old: string;\r\n\r\nbegin\r\n if Self.Name = NewName then Exit;\r\n old := Self.Name;\r\n inherited SetName(NewName);\r\n if (csDesigning in ComponentState) then\r\n for i := 0 to Fields.Count - 1 do begin\r\n nm := old + Fields[i].FieldName;\r\n if Copy(Fields[i].Name, 1, Length(nm)) = nm then\r\n Fields[i].Name := CheckName(NewName + Fields[i].FieldName);\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.SetOnFilterRecord(const Value: TFilterRecordEvent);\r\n\r\nbegin\r\n CheckBiDirectional;\r\n FOnFilterRecord := Value;\r\nend;\r\n\r\nprocedure TDataSet.SetRecNo(Value: Longint);\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.SetState(Value: TDataSetState);\r\n\r\nbegin\r\n If Value<>FState then\r\n begin\r\n FState:=Value;\r\n if Value=dsBrowse then\r\n FModified:=false;\r\n DataEvent(deUpdateState,0);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.TempBuffer: TDataRecord;\r\n\r\nbegin\r\n Result := FBuffers[FRecordCount];\r\nend;\r\n\r\nprocedure TDataSet.UpdateIndexDefs;\r\n\r\nbegin\r\n // Empty Abstract\r\nend;\r\n\r\nfunction TDataSet.AllocRecordBuffer: TDataRecord;\r\nbegin\r\n Result.data:=Null;\r\n Result.state:=rsNew;\r\n// Result := nil;\r\nend;\r\n\r\nprocedure TDataSet.FreeRecordBuffer(var Buffer: TDataRecord);\r\nbegin\r\n // empty stub\r\nend;\r\n\r\nprocedure TDataSet.GetBookmarkData(Buffer: TDataRecord; var Data: TBookmark);\r\nbegin\r\n\r\nend;\r\n\r\n\r\nfunction TDataSet.GetBookmarkFlag(Buffer: TDataRecord): TBookmarkFlag;\r\nbegin\r\n Result := bfCurrent;\r\nend;\r\n\r\nfunction TDataSet.ControlsDisabled: Boolean;\r\n\r\nbegin\r\n Result := (FDisableControlsCount > 0);\r\nend;\r\n\r\nfunction TDataSet.ActiveBuffer: TDataRecord;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Active buffer requested. Returning record number: ',ActiveRecord);\r\n{$endif}\r\n Result:=FBuffers[FActiveRecord];\r\nend;\r\n\r\nfunction TDataSet.GetFieldData(Field: TField): JSValue;\r\nbegin\r\n Result:=GetFieldData(Field,ActiveBuffer);\r\nend;\r\n\r\nprocedure TDataSet.SetFieldData(Field: TField; AValue: JSValue);\r\nbegin\r\n SetFieldData(Field,FBuffers[FActiveRecord],AValue);\r\nend;\r\n\r\nprocedure TDataSet.Append;\r\n\r\nbegin\r\n DoInsertAppend(True);\r\nend;\r\n\r\nprocedure TDataSet.InternalInsert;\r\n\r\nbegin\r\n //!! To be implemented\r\nend;\r\n\r\nprocedure TDataSet.AppendRecord(const Values: array of JSValue);\r\n\r\nbegin\r\n DoInsertAppendRecord(Values,True);\r\nend;\r\n\r\nfunction TDataSet.BookmarkValid(ABookmark: TBookmark): Boolean;\r\n{\r\n Should be overridden by descendant objects.\r\n}\r\nbegin\r\n Result:=False\r\nend;\r\n\r\n\r\n\r\nfunction TDataSet.ConvertToDateTime(aValue: JSValue; ARaiseException: Boolean): TDateTime;\r\nbegin\r\n Result:=DefaultConvertToDateTime(aValue,ARaiseException);\r\nend;\r\n\r\nclass function TDataSet.DefaultConvertToDateTime(aValue: JSValue; ARaiseException: Boolean): TDateTime;\r\nbegin\r\n Result:=0;\r\n if IsString(aValue) then\r\n begin\r\n if not TryRFC3339ToDateTime(String(AValue),Result) then\r\n Raise EConvertError.CreateFmt(SErrInvalidDateTime,[String(aValue)])\r\n end\r\n else if IsNumber(aValue) then\r\n Result:=TDateTime(AValue)\r\nend;\r\n\r\nfunction TDataSet.ConvertDateTimeToNative(aValue : TDateTime) : JSValue;\r\n\r\nbegin\r\n Result:=DefaultConvertDateTimeToNative(aValue);\r\nend;\r\n\r\nClass function TDataSet.DefaultConvertDateTimeToNative(aValue : TDateTime) : JSValue;\r\n\r\nbegin\r\n Result:=DateTimeToRFC3339(aValue);\r\nend;\r\n\r\nfunction TDataSet.BlobDataToBytes(aValue: JSValue): TBytes;\r\nbegin\r\n Result:=DefaultBlobDataToBytes(aValue);\r\nend;\r\n\r\nclass function TDataSet.DefaultBlobDataToBytes(aValue: JSValue): TBytes;\r\n\r\nVar\r\n S : String;\r\n I,J,L : Integer;\r\n\r\nbegin\r\n SetLength(Result,0);\r\n // We assume a string, hex-encoded.\r\n if isString(AValue) then\r\n begin\r\n S:=String(Avalue);\r\n L:=Length(S);\r\n SetLength(Result,(L+1) div 2);\r\n I:=1;\r\n J:=0;\r\n While (I dsSetKey then\r\n GetCalcFields(FBuffers[FActiveRecord]);\r\n DataEvent(deRecordChange, 0);\r\nend;\r\n\r\nprocedure TDataSet.Close;\r\n\r\nbegin\r\n Active:=False;\r\nend;\r\n\r\nprocedure TDataSet.ApplyUpdates;\r\nbegin\r\n DoBeforeApplyUpdates;\r\n DoApplyUpdates;\r\nend;\r\n\r\nfunction TDataSet.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint;\r\n\r\nbegin\r\n Result:=0;\r\nend;\r\n\r\nprocedure TDataSet.CursorPosChanged;\r\n\r\n\r\nbegin\r\n FCurrentRecord:=-1;\r\nend;\r\n\r\nprocedure TDataSet.Delete;\r\n\r\nVar\r\n R : TRecordUpdateDescriptor;\r\n\r\nbegin\r\n If Not CanModify then\r\n DatabaseError(SDatasetReadOnly,Self);\r\n If IsEmpty then\r\n DatabaseError(SDatasetEmpty,Self);\r\n if State in [dsInsert] then\r\n begin\r\n Cancel;\r\n end else begin\r\n DataEvent(deCheckBrowseMode,0);\r\n{$ifdef dsdebug}\r\n writeln ('Delete: checking required fields');\r\n{$endif}\r\n DoBeforeDelete;\r\n DoBeforeScroll;\r\n R:=AddToChangeList(usDeleted);\r\n If Not TryDoing(@InternalDelete,OnDeleteError) then\r\n begin\r\n if Assigned(R) then\r\n RemoveFromChangeList(R);\r\n exit;\r\n end;\r\n{$ifdef dsdebug}\r\n writeln ('Delete: Internaldelete succeeded');\r\n{$endif}\r\n SetState(dsBrowse);\r\n{$ifdef dsdebug}\r\n writeln ('Delete: Browse mode set');\r\n{$endif}\r\n SetCurrentRecord(FActiveRecord);\r\n Resync([]);\r\n DoAfterDelete;\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.DisableControls;\r\n\r\n\r\nbegin\r\n If FDisableControlsCount=0 then\r\n begin\r\n { Save current state,\r\n needed to detect change of state when enabling controls.\r\n }\r\n FDisableControlsState:=FState;\r\n FEnableControlsEvent:=deDatasetChange;\r\n end;\r\n Inc(FDisableControlsCount);\r\nend;\r\n\r\nprocedure TDataSet.DoInsertAppend(DoAppend: Boolean);\r\n\r\n\r\n procedure DoInsert(DoAppend : Boolean);\r\n\r\n Var\r\n BookBeforeInsert : TBookmark;\r\n TempBuf : TDataRecord;\r\n I : integer;\r\n\r\n begin\r\n // need to scroll up al buffers after current one,\r\n // but copy current bookmark to insert buffer.\r\n If FRecordCount > 0 then\r\n BookBeforeInsert:=Bookmark;\r\n\r\n if not DoAppend then\r\n begin\r\n if FRecordCount > 0 then\r\n begin\r\n TempBuf := FBuffers[FBufferCount];\r\n for I:=FBufferCount downto FActiveRecord+1 do\r\n FBuffers[I]:=FBuffers[I-1];\r\n FBuffers[FActiveRecord]:=TempBuf;\r\n end;\r\n end\r\n else if FRecordCount=FBufferCount then\r\n ShiftBuffersBackward\r\n else\r\n begin\r\n if FRecordCount>0 then\r\n inc(FActiveRecord);\r\n end;\r\n\r\n // Active buffer is now edit buffer. Initialize.\r\n InitRecord(FBuffers[FActiveRecord]);\r\n CursorPosChanged;\r\n\r\n // Put bookmark in edit buffer.\r\n if FRecordCount=0 then\r\n SetBookmarkFlag(FBuffers[FActiveRecord],bfEOF)\r\n else\r\n begin\r\n fBOF := false;\r\n // 29:01:05, JvdS: Why is this here?!? It can result in records with the same bookmark-data?\r\n // I would say that the 'internalinsert' should do this. But I don't know how Tdbf handles it\r\n\r\n // 1-apr-06, JvdS: It just sets the bookmark of the newly inserted record to the place\r\n // where the record should be inserted. So it is ok.\r\n if FRecordCount > 0 then\r\n begin\r\n SetBookMarkData(FBuffers[FActiveRecord],BookBeforeInsert);\r\n FreeBookmark(BookBeforeInsert);\r\n end;\r\n end;\r\n\r\n InternalInsert;\r\n\r\n // update buffer count.\r\n If FRecordCount0 then\r\n FActiveRecord:=FRecordCount-1;\r\n DoInsert(True);\r\n SetBookmarkFlag(FBuffers[FActiveRecord],bfEOF);\r\n FBOF :=False;\r\n FEOF := true;\r\n end;\r\n SetState(dsInsert);\r\n try\r\n DoOnNewRecord;\r\n except\r\n SetCurrentRecord(FActiveRecord);\r\n resync([]);\r\n raise;\r\n end;\r\n // mark as not modified.\r\n FModified:=False;\r\n // Final events.\r\n DataEvent(deDatasetChange,0);\r\n DoAfterInsert;\r\n DoAfterScroll;\r\n{$ifdef dsdebug}\r\n Writeln ('Done with append');\r\n{$endif}\r\nend;\r\n\r\nprocedure TDataSet.Edit;\r\n\r\nbegin\r\n If State in [dsEdit,dsInsert] then exit;\r\n CheckBrowseMode;\r\n If Not CanModify then\r\n DatabaseError(SDatasetReadOnly,Self);\r\n If FRecordCount = 0 then\r\n begin\r\n Append;\r\n Exit;\r\n end;\r\n DoBeforeEdit;\r\n If Not TryDoing(@InternalEdit,OnEditError) then exit;\r\n GetCalcFields(FBuffers[FActiveRecord]);\r\n SetState(dsEdit);\r\n DataEvent(deRecordChange,0);\r\n DoAfterEdit;\r\nend;\r\n\r\nprocedure TDataSet.EnableControls;\r\n\r\n\r\nbegin\r\n if FDisableControlsCount > 0 then\r\n Dec(FDisableControlsCount);\r\n\r\n if FDisableControlsCount = 0 then begin\r\n if FState <> FDisableControlsState then\r\n DataEvent(deUpdateState, 0);\r\n\r\n if (FState <> dsInactive) and (FDisableControlsState <> dsInactive) then\r\n DataEvent(FEnableControlsEvent, 0);\r\n end;\r\nend;\r\n\r\nfunction TDataSet.FieldByName(const FieldName: string): TField;\r\n\r\n\r\nbegin\r\n Result:=FindField(FieldName);\r\n If Result=Nil then\r\n DatabaseErrorFmt(SFieldNotFound,[FieldName],Self);\r\nend;\r\n\r\nfunction TDataSet.FindField(const FieldName: string): TField;\r\n\r\n\r\nbegin\r\n Result:=FFieldList.FindField(FieldName);\r\nend;\r\n\r\nfunction TDataSet.FindFirst: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.FindLast: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.FindNext: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nfunction TDataSet.FindPrior: Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nprocedure TDataSet.First;\r\n\r\n\r\nbegin\r\n CheckBrowseMode;\r\n DoBeforeScroll;\r\n if not FIsUniDirectional then\r\n ClearBuffers\r\n else if not FBof then\r\n begin\r\n Active := False;\r\n Active := True;\r\n end;\r\n try\r\n InternalFirst;\r\n if not FIsUniDirectional then GetNextRecords;\r\n finally\r\n FBOF:=True;\r\n DataEvent(deDatasetChange,0);\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.FreeBookmark(ABookmark: TBookmark);\r\n\r\n\r\nbegin\r\n {$ifdef noautomatedbookmark}\r\n FreeMem(ABookMark,FBookMarkSize);\r\n {$endif}\r\nend;\r\n\r\nfunction TDataSet.GetBookmark: TBookmark;\r\n\r\n\r\nbegin\r\n if BookmarkAvailable then\r\n GetBookMarkdata(ActiveBuffer,Result)\r\n else\r\n Result.Data:=Null;\r\nend;\r\n\r\nfunction TDataSet.GetCurrentRecord(Buffer: TDataRecord): Boolean;\r\n\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nprocedure TDataSet.GetFieldList(List: TList; const FieldNames: string);\r\n\r\nvar\r\n F: TField;\r\n N: String;\r\n StrPos: Integer;\r\n\r\nbegin\r\n if (FieldNames = '') or (List = nil) then\r\n Exit;\r\n StrPos := 1;\r\n repeat\r\n N := ExtractFieldName(FieldNames, StrPos);\r\n F := FieldByName(N);\r\n List.Add(F);\r\n until StrPos > Length(FieldNames);\r\nend;\r\n\r\nprocedure TDataSet.GetFieldNames(List: TStrings);\r\n\r\n\r\nbegin\r\n FFieldList.GetFieldNames(List);\r\nend;\r\n\r\nprocedure TDataSet.GotoBookmark(const ABookmark: TBookmark);\r\n\r\n\r\nbegin\r\n If Assigned(ABookMark) then\r\n begin\r\n CheckBrowseMode;\r\n DoBeforeScroll;\r\n{$ifdef dsdebug}\r\n Writeln('Gotobookmark: ',ABookMark.Data);\r\n{$endif}\r\n InternalGotoBookMark(ABookMark);\r\n Resync([rmExact,rmCenter]);\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.Insert;\r\n\r\nbegin\r\n DoInsertAppend(False);\r\nend;\r\n\r\nprocedure TDataSet.InsertRecord(const Values: array of JSValue);\r\n\r\nbegin\r\n DoInsertAppendRecord(Values,False);\r\nend;\r\n\r\nfunction TDataSet.IsEmpty: Boolean;\r\n\r\nbegin\r\n Result:=(fBof and fEof) and\r\n (not (State = dsInsert)); // After an insert on an empty dataset, both fBof and fEof are true\r\nend;\r\n\r\nfunction TDataSet.IsLinkedTo(ADataSource: TDataSource): Boolean;\r\n\r\nbegin\r\n//!! Not tested, I never used nested DS\r\n if (ADataSource = nil) or (ADataSource.Dataset = nil) then begin\r\n Result := False\r\n end else if ADataSource.Dataset = Self then begin\r\n Result := True;\r\n end else begin\r\n Result := ADataSource.Dataset.IsLinkedTo(ADataSource.Dataset.DataSource);\r\n end;\r\n//!! DataSetField not implemented\r\nend;\r\n\r\nfunction TDataSet.IsSequenced: Boolean;\r\n\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TDataSet.Last;\r\n\r\nbegin\r\n CheckBiDirectional;\r\n CheckBrowseMode;\r\n DoBeforeScroll;\r\n ClearBuffers;\r\n try\r\n // Writeln('FActiveRecord before last',FActiveRecord);\r\n InternalLast;\r\n // Writeln('FActiveRecord after last',FActiveRecord);\r\n GetPriorRecords;\r\n // Writeln('FRecordCount: ',FRecordCount);\r\n if FRecordCount>0 then\r\n FActiveRecord:=FRecordCount-1;\r\n // Writeln('FActiveRecord ',FActiveRecord);\r\n finally\r\n FEOF:=true;\r\n DataEvent(deDataSetChange, 0);\r\n DoAfterScroll;\r\n end;\r\nend;\r\n\r\nfunction TDataSet.DoLoad(aOptions: TLoadOptions; aAfterLoad: TDatasetLoadEvent): Boolean;\r\n\r\nVar\r\n Request : TDataRequest;\r\n\r\nbegin\r\n if not (loNoEvents in aOptions) then\r\n DoBeforeLoad;\r\n Result:=DataProxy<>Nil;\r\n if Not Result then\r\n Exit;\r\n Request:=DataProxy.GetDataRequest(aOptions,@HandleRequestResponse,aAfterLoad);\r\n Request.FDataset:=Self;\r\n If Active then\r\n Request.FBookmark:=GetBookmark;\r\n Inc(FDataRequestID);\r\n Request.FRequestID:=FDataRequestID;\r\n DataProxy.DoGetData(Request);\r\nend;\r\n\r\n\r\nfunction TDataSet.Load(aOptions: TLoadOptions; aAfterLoad: TDatasetLoadEvent): Boolean;\r\n\r\nbegin\r\n if loAtEOF in aOptions then\r\n DatabaseError(SatEOFInternalOnly,Self);\r\n Result:=DoLoad(aOptions,aAfterLoad);\r\nend;\r\n\r\nfunction TDataSet.MoveBy(Distance: Longint): Longint;\r\nVar\r\n TheResult: Integer;\r\n\r\n Function ScrollForward : Integer;\r\n begin\r\n Result:=0;\r\n{$ifdef dsdebug}\r\n Writeln('Scrolling forward : ',Distance);\r\n Writeln('Active buffer : ',FActiveRecord);\r\n Writeln('RecordCount : ',FRecordCount);\r\n WriteLn('BufferCount : ',FBufferCount);\r\n{$endif}\r\n FBOF:=False;\r\n While (Distance>0) and not FEOF do\r\n begin\r\n If FActiveRecord0 then\r\n begin\r\n Dec(FActiveRecord);\r\n Inc(Distance);\r\n Dec(TheResult); //Dec(Result);\r\n end\r\n else\r\n begin\r\n {$ifdef dsdebug}\r\n Writeln('Moveby : need next record');\r\n {$endif}\r\n If GetPriorRecord then\r\n begin\r\n Inc(Distance);\r\n Inc(Result);\r\n Dec(TheResult); //Dec(Result);\r\n end\r\n else\r\n FBOF:=true;\r\n end;\r\n end\r\n end;\r\n\r\nVar\r\n Scrolled : Integer;\r\n\r\nbegin\r\n CheckBrowseMode;\r\n Result:=0; TheResult:=0;\r\n DoBeforeScroll;\r\n If (Distance = 0) or\r\n ((Distance>0) and FEOF) or\r\n ((Distance<0) and FBOF) then\r\n exit;\r\n Try\r\n Scrolled := 0;\r\n If Distance>0 then\r\n Scrolled:=ScrollForward\r\n else\r\n Scrolled:=ScrollBackward;\r\n finally\r\n{$ifdef dsdebug}\r\n WriteLn('ActiveRecord=', FActiveRecord,' FEOF=',FEOF,' FBOF=',FBOF);\r\n{$Endif}\r\n DataEvent(deDatasetScroll,Scrolled);\r\n DoAfterScroll;\r\n Result:=TheResult;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.Next;\r\n\r\nbegin\r\n if BlockReadSize>0 then\r\n BlockReadNext\r\n else\r\n MoveBy(1);\r\nend;\r\n\r\nprocedure TDataSet.BlockReadNext;\r\nbegin\r\n MoveBy(1);\r\nend;\r\n\r\nprocedure TDataSet.Open;\r\n\r\nbegin\r\n Active:=True;\r\nend;\r\n\r\nprocedure TDataSet.Post;\r\n\r\nConst\r\n UpdateStates : Array[Boolean] of TUpdateStatus = (usModified,usInserted);\r\n\r\nVar\r\n R : TRecordUpdateDescriptor;\r\n WasInsert : Boolean;\r\n\r\nbegin\r\n UpdateRecord;\r\n if State in [dsEdit,dsInsert] then\r\n begin\r\n DataEvent(deCheckBrowseMode,0);\r\n{$ifdef dsdebug}\r\n writeln ('Post: checking required fields');\r\n{$endif}\r\n DoBeforePost;\r\n WasInsert:=State=dsInsert;\r\n If Not TryDoing(@InternalPost,OnPostError) then exit;\r\n CursorPosChanged;\r\n{$ifdef dsdebug}\r\n writeln ('Post: Internalpost succeeded');\r\n{$endif}\r\n// First set the state to dsBrowse, then the Resync, to prevent the calling of\r\n// the deDatasetChange event, while the state is still 'editable', while the db isn't\r\n SetState(dsBrowse);\r\n Resync([]);\r\n // We get the new values here, since the bookmark should now be correct to find the record later on when doing applyupdates.\r\n R:=AddToChangeList(UpdateStates[wasInsert]);\r\n if Assigned(R) then\r\n R.FBookmark:=BookMark;\r\n{$ifdef dsdebug}\r\n writeln ('Post: Browse mode set');\r\n{$endif}\r\n DoAfterPost;\r\n end\r\n else if State<>dsSetKey then\r\n DatabaseErrorFmt(SNotEditing, [Name], Self);\r\nend;\r\n\r\nprocedure TDataSet.Prior;\r\n\r\nbegin\r\n MoveBy(-1);\r\nend;\r\n\r\nprocedure TDataSet.Refresh;\r\n\r\nbegin\r\n CheckbrowseMode;\r\n DoBeforeRefresh;\r\n UpdateCursorPos;\r\n InternalRefresh;\r\n{ SetCurrentRecord is called by UpdateCursorPos already, so as long as\r\n InternalRefresh doesn't do strange things this should be ok. }\r\n// SetCurrentRecord(FActiveRecord);\r\n Resync([]);\r\n DoAfterRefresh;\r\nend;\r\n\r\nprocedure TDataSet.RegisterDataSource(ADataSource: TDataSource);\r\n\r\nbegin\r\n FDataSources.Add(ADataSource);\r\n RecalcBufListSize;\r\nend;\r\n\r\n\r\nprocedure TDataSet.Resync(Mode: TResyncMode);\r\n\r\nvar i,count : integer;\r\n\r\nbegin\r\n // See if we can find the requested record.\r\n{$ifdef dsdebug}\r\n Writeln ('Resync called');\r\n{$endif}\r\n if FIsUnidirectional then Exit;\r\n// place the cursor of the underlying dataset to the active record\r\n// SetCurrentRecord(FActiveRecord);\r\n\r\n// Now look if the data on the current cursor of the underlying dataset is still available\r\n If GetRecord(FBuffers[0],gmCurrent,False)<>grOk Then\r\n// If that fails and rmExact is set, then raise an exception\r\n If rmExact in Mode then\r\n DatabaseError(SNoSuchRecord,Self)\r\n// else, if rmexact is not set, try to fetch the next or prior record in the underlying dataset\r\n else if (GetRecord(FBuffers[0],gmNext,True)<>grOk) and\r\n (GetRecord(FBuffers[0],gmPrior,True)<>grOk) then\r\n begin\r\n{$ifdef dsdebug}\r\n Writeln ('Resync: fuzzy resync');\r\n{$endif}\r\n // nothing found, invalidate buffer and bail out.\r\n ClearBuffers;\r\n // Make sure that the active record is 'empty', ie: that all fields are null\r\n InternalInitRecord(FBuffers[FActiveRecord]);\r\n DataEvent(deDatasetChange,0);\r\n exit;\r\n end;\r\n FCurrentRecord := 0;\r\n FEOF := false;\r\n FBOF := false;\r\n\r\n// If we've arrived here, FBuffer[0] is the current record\r\n If (rmCenter in Mode) then\r\n count := (FRecordCount div 2)\r\n else\r\n count := FActiveRecord;\r\n i := 0;\r\n FRecordCount := 1;\r\n FActiveRecord := 0;\r\n\r\n// Fill the buffers before the active record\r\n while (i < count) and GetPriorRecord do\r\n inc(i);\r\n FActiveRecord := i;\r\n// Fill the rest of the buffer\r\n GetNextRecords;\r\n// If the buffer is not full yet, try to fetch some more prior records\r\n if FRecordCount < FBufferCount then FActiveRecord:=FActiveRecord+getpriorrecords;\r\n// That's all folks!\r\n DataEvent(deDatasetChange,0);\r\nend;\r\n\r\nprocedure TDataSet.SetFields(const Values: array of JSValue);\r\n\r\nVar I : longint;\r\nbegin\r\n For I:=0 to high(Values) do\r\n Fields[I].AssignValue(Values[I]);\r\nend;\r\n\r\nfunction TDataSet.TryDoing(P: TDataOperation; Ev: TDatasetErrorEvent): Boolean;\r\n\r\nVar Retry : TDataAction;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Trying to do');\r\n If P=Nil then writeln ('Procedure to call is nil !!!');\r\n{$endif dsdebug}\r\n Result:=True;\r\n Retry:=daRetry;\r\n while Retry=daRetry do\r\n Try\r\n{$ifdef dsdebug}\r\n Writeln ('Trying : updatecursorpos');\r\n{$endif dsdebug}\r\n UpdateCursorPos;\r\n{$ifdef dsdebug}\r\n Writeln ('Trying to do it');\r\n{$endif dsdebug}\r\n P();\r\n exit;\r\n except\r\n On E : EDatabaseError do\r\n begin\r\n retry:=daFail;\r\n If Assigned(Ev) then\r\n Ev(Self,E,Retry);\r\n Case Retry of\r\n daFail : Raise;\r\n daAbort : Abort;\r\n end;\r\n end;\r\n else\r\n Raise;\r\n end;\r\n{$ifdef dsdebug}\r\n Writeln ('Exit Trying to do');\r\n{$endif dsdebug}\r\nend;\r\n\r\nprocedure TDataSet.UpdateCursorPos;\r\n\r\nbegin\r\n If FRecordCount>0 then\r\n SetCurrentRecord(FActiveRecord);\r\nend;\r\n\r\nprocedure TDataSet.UpdateRecord;\r\n\r\nbegin\r\n if not (State in dsEditModes) then\r\n DatabaseErrorFmt(SNotEditing, [Name], Self);\r\n DataEvent(deUpdateRecord, 0);\r\nend;\r\n\r\nfunction TDataSet.UpdateStatus: TUpdateStatus;\r\n\r\nbegin\r\n Result:=usUnmodified;\r\nend;\r\n\r\nprocedure TDataSet.SetConstraints(Value: TCheckConstraints);\r\nbegin\r\n FConstraints.Assign(Value);\r\nend;\r\n\r\nprocedure TDataSet.SetDataProxy(AValue: TDataProxy);\r\nbegin\r\n If AValue=FDataProxy then\r\n exit;\r\n if Assigned(FDataProxy) then\r\n FDataProxy.RemoveFreeNotification(Self);\r\n FDataProxy:=AValue;\r\n if Assigned(FDataProxy) then\r\n FDataProxy.FreeNotification(Self)\r\nend;\r\n\r\nfunction TDataSet.GetfieldCount: Integer;\r\n\r\nbegin\r\n Result:=FFieldList.Count;\r\nend;\r\n\r\nprocedure TDataSet.ShiftBuffersBackward;\r\n\r\nvar\r\n TempBuf : TDataRecord;\r\n I : Integer;\r\n\r\nbegin\r\n TempBuf := FBuffers[0];\r\n For I:=1 to FBufferCount do\r\n FBuffers[I-1]:=FBuffers[i];\r\n FBuffers[BufferCount]:=TempBuf;\r\nend;\r\n\r\nprocedure TDataSet.ShiftBuffersForward;\r\n\r\nvar\r\n TempBuf : TDataRecord;\r\n I : Integer;\r\n\r\nbegin\r\n TempBuf := FBuffers[FBufferCount];\r\n For I:=FBufferCount downto 1 do\r\n FBuffers[I]:=FBuffers[i-1];\r\n FBuffers[0]:=TempBuf;\r\nend;\r\n\r\nfunction TDataSet.GetFieldValues(const FieldName: string): JSValue;\r\n\r\nvar\r\n i: Integer;\r\n FieldList: TList;\r\n A : TJSValueDynArray;\r\n\r\nbegin\r\n FieldList := TList.Create;\r\n try\r\n GetFieldList(FieldList, FieldName);\r\n if FieldList.Count>1 then\r\n begin\r\n SetLength(A,FieldList.Count);\r\n for i := 0 to FieldList.Count - 1 do\r\n A[i] := TField(FieldList[i]).Value;\r\n Result:=A;\r\n end\r\n else\r\n Result := FieldByName(FieldName).Value;\r\n finally\r\n FieldList.Free;\r\n end;\r\nend;\r\n\r\nprocedure TDataSet.SetFieldValues(const FieldName: string; Value: JSValue);\r\n\r\nvar\r\n i : Integer;\r\n FieldList: TList;\r\n A : TJSValueDynArray;\r\n\r\nbegin\r\n if IsArray(Value) then\r\n begin\r\n FieldList := TList.Create;\r\n try\r\n GetFieldList(FieldList, FieldName);\r\n A:=TJSValueDynArray(Value);\r\n if (FieldList.Count = 1) and (Length(A)>0) then\r\n // Allow for a field type that can deal with an array\r\n FieldByName(FieldName).Value := Value\r\n else\r\n for i := 0 to FieldList.Count - 1 do\r\n TField(FieldList[i]).Value := A[i];\r\n finally\r\n FieldList.Free;\r\n end;\r\n end\r\n else\r\n FieldByName(FieldName).Value := Value;\r\nend;\r\n\r\nfunction TDataSet.Locate(const KeyFields: string; const KeyValues: JSValue;\r\n Options: TLocateOptions): boolean;\r\n\r\nbegin\r\n CheckBiDirectional;\r\n Result := False;\r\nend;\r\n\r\nfunction TDataSet.Lookup(const KeyFields: string; const KeyValues: JSValue;\r\n const ResultFields: string): JSValue;\r\n\r\nbegin\r\n CheckBiDirectional;\r\n Result := Null;\r\nend;\r\n\r\n\r\nprocedure TDataSet.UnRegisterDataSource(ADataSource: TDataSource);\r\n\r\nbegin\r\n FDataSources.Remove(ADataSource);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TFieldDef\r\n ---------------------------------------------------------------------}\r\n\r\nconstructor TFieldDef.Create(ACollection: TCollection);\r\n\r\nbegin\r\n Inherited Create(ACollection);\r\n FFieldNo:=Index+1;\r\nend;\r\n\r\nconstructor TFieldDef.Create(AOwner: TFieldDefs; const AName: string; ADataType: TFieldType; ASize: Integer; ARequired: Boolean;\r\n AFieldNo: Longint);\r\nbegin\r\n{$ifdef dsdebug }\r\n Writeln('TFieldDef.Create : ',Aname,'(',AFieldNo,')');\r\n{$endif}\r\n Inherited Create(AOwner);\r\n Name:=Aname;\r\n FDatatype:=ADatatype;\r\n FSize:=ASize;\r\n FRequired:=ARequired;\r\n FPrecision:=-1;\r\n FFieldNo:=AFieldNo;\r\nend;\r\n\r\ndestructor TFieldDef.Destroy;\r\n\r\nbegin\r\n Inherited destroy;\r\nend;\r\n\r\nprocedure TFieldDef.Assign(Source: TPersistent);\r\nvar fd: TFieldDef;\r\nbegin\r\n fd := nil;\r\n if Source is TFieldDef then\r\n fd := Source as TFieldDef;\r\n if Assigned(fd) then begin\r\n Collection.BeginUpdate;\r\n try\r\n Name := fd.Name;\r\n DataType := fd.DataType;\r\n Size := fd.Size;\r\n Precision := fd.Precision;\r\n FRequired := fd.Required;\r\n finally\r\n Collection.EndUpdate;\r\n end;\r\n end\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\nfunction TFieldDef.CreateField(AOwner: TComponent): TField;\r\n\r\nvar TheField : TFieldClass;\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Creating field '+FNAME);\r\n{$endif dsdebug}\r\n TheField:=GetFieldClass;\r\n if TheField=Nil then\r\n DatabaseErrorFmt(SUnknownFieldType,[FName]);\r\n Result:=TheField.Create(AOwner);\r\n Try\r\n Result.FFieldDef:=Self;\r\n Result.Size:=FSize;\r\n Result.Required:=FRequired;\r\n Result.FFieldName:=FName;\r\n Result.FDisplayLabel:=DisplayName;\r\n Result.FFieldNo:=Self.FieldNo;\r\n Result.SetFieldType(DataType);\r\n Result.FReadOnly:=(faReadOnly in Attributes);\r\n{$ifdef dsdebug}\r\n Writeln ('TFieldDef.CreateField : Result Fieldno : ',Result.FieldNo,'; Self : ',FieldNo);\r\n Writeln ('TFieldDef.CreateField : Trying to set dataset');\r\n{$endif dsdebug}\r\n Result.Dataset:=TFieldDefs(Collection).Dataset;\r\n if (Result is TFloatField) then\r\n TFloatField(Result).Precision := FPrecision;\r\n except\r\n Result.Free;\r\n Raise;\r\n end;\r\nend;\r\n\r\nprocedure TFieldDef.SetAttributes(AValue: TFieldAttributes);\r\nbegin\r\n FAttributes := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetDataType(AValue: TFieldType);\r\nbegin\r\n FDataType := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetPrecision(const AValue: Longint);\r\nbegin\r\n FPrecision := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetSize(const AValue: Integer);\r\nbegin\r\n FSize := AValue;\r\n Changed(False);\r\nend;\r\n\r\nprocedure TFieldDef.SetRequired(const AValue: Boolean);\r\nbegin\r\n FRequired := AValue;\r\n Changed(False);\r\nend;\r\n\r\nfunction TFieldDef.GetFieldClass: TFieldClass;\r\n\r\nbegin\r\n //!! Should be owner as tdataset but that doesn't work ??\r\n\r\n If Assigned(Collection) And\r\n (Collection is TFieldDefs) And\r\n Assigned(TFieldDefs(Collection).Dataset) then\r\n Result:=TFieldDefs(Collection).Dataset.GetFieldClass(FDataType)\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TFieldDefs\r\n ---------------------------------------------------------------------}\r\n\r\n{\r\ndestructor TFieldDefs.Destroy;\r\n\r\nbegin\r\n FItems.Free;\r\n // This will destroy all fielddefs since we own them...\r\n Inherited Destroy;\r\nend;\r\n}\r\n\r\nprocedure TFieldDefs.Add(const AName: string; ADataType: TFieldType);\r\n\r\nbegin\r\n Add(AName,ADatatype,0,False);\r\nend;\r\n\r\nprocedure TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize : Word);\r\n\r\nbegin\r\n Add(AName,ADatatype,ASize,False);\r\nend;\r\n\r\nprocedure TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize: Word;\r\n ARequired: Boolean);\r\n\r\nbegin\r\n If Length(AName)=0 Then\r\n DatabaseError(SNeedFieldName,Dataset);\r\n // the fielddef will register itself here as an owned component.\r\n // fieldno is 1 based !\r\n BeginUpdate;\r\n try\r\n Add(AName,ADataType,ASize,ARequired,Count+1);\r\n finally\r\n EndUpdate;\r\n end;\r\nend;\r\n\r\nfunction TFieldDefs.Add: TFieldDef;\r\nbegin\r\n Result := TFieldDef(inherited Add);\r\nend;\r\n\r\nfunction TFieldDefs.GetItem(Index: Longint): TFieldDef;\r\n\r\nbegin\r\n Result := TFieldDef(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TFieldDefs.SetItem(Index: Longint; const AValue: TFieldDef);\r\nbegin\r\n inherited Items[Index] := AValue;\r\nend;\r\n\r\nclass function TFieldDefs.FieldDefClass: TFieldDefClass;\r\nbegin\r\n Result:=TFieldDef;\r\nend;\r\n\r\nconstructor TFieldDefs.Create(ADataSet: TDataSet);\r\nbegin\r\n Inherited Create(ADataset, Owner, FieldDefClass);\r\nend;\r\n\r\nfunction TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize, APrecision: Integer;\r\n ARequired, AReadOnly: Boolean; AFieldNo: Integer): TFieldDef;\r\nbegin\r\n Result:=FieldDefClass.Create(Self, MakeNameUnique(AName), ADataType, ASize, ARequired, AFieldNo);\r\n if AReadOnly then\r\n Result.Attributes := Result.Attributes + [faReadOnly];\r\nend;\r\n\r\nfunction TFieldDefs.Add(const AName: string; ADataType: TFieldType; ASize: Word; ARequired: Boolean; AFieldNo: Integer): TFieldDef;\r\nbegin\r\n Result:=FieldDefClass.Create(Self,AName,ADataType,ASize,ARequired,AFieldNo);\r\nend;\r\n\r\nprocedure TFieldDefs.Assign(FieldDefs: TFieldDefs);\r\n\r\nvar I : longint;\r\n\r\nbegin\r\n Clear;\r\n For i:=0 to FieldDefs.Count-1 do\r\n With FieldDefs[i] do\r\n Add(Name,DataType,Size,Required);\r\nend;\r\n\r\nfunction TFieldDefs.Find(const AName: string): TFieldDef;\r\nbegin\r\n Result := (Inherited Find(AName)) as TFieldDef;\r\n if Result=nil then DatabaseErrorFmt(SFieldNotFound,[AName],FDataset);\r\nend;\r\n\r\n{\r\nprocedure TFieldDefs.Clear;\r\n\r\nvar I : longint;\r\n\r\nbegin\r\n For I:=FItems.Count-1 downto 0 do\r\n TFieldDef(Fitems[i]).Free;\r\n FItems.Clear;\r\nend;\r\n}\r\n\r\nprocedure TFieldDefs.Update;\r\n\r\nbegin\r\n if not Updated then\r\n begin\r\n If Assigned(Dataset) then\r\n DataSet.InitFieldDefs;\r\n Updated := True;\r\n end;\r\nend;\r\n\r\nfunction TFieldDefs.MakeNameUnique(const AName: String): string;\r\nvar DblFieldCount : integer;\r\nbegin\r\n DblFieldCount := 0;\r\n Result := AName;\r\n while assigned(inherited Find(Result)) do\r\n begin\r\n inc(DblFieldCount);\r\n Result := AName + '_' + IntToStr(DblFieldCount);\r\n end;\r\nend;\r\n\r\nfunction TFieldDefs.AddFieldDef: TFieldDef;\r\n\r\nbegin\r\n Result:=FieldDefClass.Create(Self,'',ftUnknown,0,False,Count+1);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TField\r\n ---------------------------------------------------------------------}\r\n\r\nConst\r\n// SBCD = 'BCD';\r\n SBoolean = 'Boolean';\r\n SDateTime = 'TDateTime';\r\n SFloat = 'Float';\r\n SInteger = 'Integer';\r\n SLargeInt = 'NativeInt';\r\n SJSValue = 'JSValue';\r\n SString = 'String';\r\n SBytes = 'Bytes';\r\n\r\nconstructor TField.Create(AOwner: TComponent);\r\n\r\n//Var\r\n// I : Integer;\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n FVisible:=True;\r\n SetLength(FValidChars,255);\r\n// For I:=0 to 255 do\r\n// FValidChars[i]:=Char(i);\r\n\r\n FProviderFlags := [pfInUpdate,pfInWhere];\r\nend;\r\n\r\ndestructor TField.Destroy;\r\n\r\nbegin\r\n IF Assigned(FDataSet) then\r\n begin\r\n FDataSet.Active:=False;\r\n if Assigned(FFields) then\r\n FFields.Remove(Self);\r\n end;\r\n FLookupList.Free;\r\n Inherited Destroy;\r\nend;\r\n\r\nProcedure TField.RaiseAccessError(const TypeName: string);\r\n\r\nVar\r\n E : EDatabaseError;\r\n\r\nbegin\r\n E:=AccessError(TypeName);\r\n Raise E;\r\nend;\r\n\r\nfunction TField.AccessError(const TypeName: string): EDatabaseError;\r\n\r\nbegin\r\n Raise EDatabaseError.CreateFmt(SinvalidTypeConversion,[TypeName,FFieldName]);\r\nend;\r\n\r\nprocedure TField.Assign(Source: TPersistent);\r\n\r\nbegin\r\n if Source = nil then Clear\r\n else if Source is TField then begin\r\n Value := TField(Source).Value;\r\n end else\r\n inherited Assign(Source);\r\nend;\r\n\r\nprocedure TField.AssignValue(const AValue: JSValue);\r\n\r\n procedure Error;\r\n begin\r\n DatabaseErrorFmt(SFieldValueError, [DisplayName]);\r\n end;\r\n\r\nbegin\r\n Case GetValueType(AValue) of\r\n jvtNull : Clear;\r\n jvtBoolean : AsBoolean:=Boolean(AValue);\r\n jvtInteger : AsLargeInt:=NativeInt(AValue);\r\n jvtFloat : AsFloat:=Double(AValue);\r\n jvtString : AsString:=String(AValue);\r\n jvtArray : SetAsBytes(TBytes(AValue));\r\n else\r\n Error;\r\n end;\r\nend;\r\n\r\nprocedure TField.Bind(Binding: Boolean);\r\n\r\nbegin\r\n if Binding and (FieldKind=fkLookup) then\r\n begin\r\n if ((FLookupDataSet = nil) or (FLookupKeyFields = '') or\r\n (FLookupResultField = '') or (FKeyFields = '')) then\r\n DatabaseErrorFmt(SLookupInfoError, [DisplayName]);\r\n FFields.CheckFieldNames(FKeyFields);\r\n FLookupDataSet.Open;\r\n FLookupDataSet.Fields.CheckFieldNames(FLookupKeyFields);\r\n FLookupDataSet.FieldByName(FLookupResultField);\r\n if FLookupCache then\r\n RefreshLookupList;\r\n end;\r\nend;\r\n\r\nprocedure TField.Change;\r\n\r\nbegin\r\n If Assigned(FOnChange) Then\r\n FOnChange(Self);\r\nend;\r\n\r\nprocedure TField.CheckInactive;\r\n\r\nbegin\r\n If Assigned(FDataSet) then\r\n FDataset.CheckInactive;\r\nend;\r\n\r\nprocedure TField.Clear;\r\n\r\nbegin\r\n SetData(Nil);\r\nend;\r\n\r\nprocedure TField.DataChanged;\r\n\r\nbegin\r\n FDataset.DataEvent(deFieldChange,self);\r\nend;\r\n\r\nprocedure TField.FocusControl;\r\nvar\r\n Field1: TField;\r\nbegin\r\n Field1 := Self;\r\n FDataSet.DataEvent(deFocusControl,Field1);\r\nend;\r\n\r\nfunction TField.GetAsBoolean: Boolean;\r\nbegin\r\n raiseAccessError(SBoolean);\r\nend;\r\n\r\nfunction TField.GetAsBytes: TBytes;\r\n\r\nbegin\r\n raiseAccessError(SBytes);\r\nend;\r\n\r\n\r\nfunction TField.GetAsDateTime: TDateTime;\r\n\r\nbegin\r\n raiseAccessError(SdateTime);\r\nend;\r\n\r\nfunction TField.GetAsFloat: Double;\r\n\r\nbegin\r\n raiseAccessError(SDateTime);\r\nend;\r\n\r\nfunction TField.GetAsLargeInt: NativeInt;\r\nbegin\r\n RaiseAccessError(SLargeInt);\r\nend;\r\n\r\nfunction TField.GetAsLongint: Longint;\r\n\r\nbegin\r\n Result:=GetAsInteger;\r\nend;\r\n\r\nfunction TField.GetAsInteger: Longint;\r\n\r\nbegin\r\n RaiseAccessError(SInteger);\r\nend;\r\n\r\nfunction TField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData\r\nend;\r\n\r\n\r\nfunction TField.GetAsString: string;\r\nbegin\r\n Result := GetClassDesc\r\nend;\r\n\r\nfunction TField.GetOldValue: JSValue;\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsOldValue);\r\n Result := GetAsJSValue;\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nfunction TField.GetNewValue: JSValue;\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsNewValue);\r\n Result := GetAsJSValue;\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetNewValue(const AValue: JSValue);\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsNewValue);\r\n SetAsJSValue(AValue);\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nfunction TField.GetCurValue: JSValue;\r\n\r\nvar SaveState : TDatasetState;\r\n\r\nbegin\r\n SaveState := FDataset.State;\r\n try\r\n FDataset.SetTempState(dsCurValue);\r\n Result := GetAsJSValue;\r\n finally\r\n FDataset.RestoreState(SaveState);\r\n end;\r\nend;\r\n\r\nfunction TField.GetCanModify: Boolean;\r\n\r\nbegin\r\n Result:=Not ReadOnly;\r\n If Result then\r\n begin\r\n Result := FieldKind in [fkData, fkInternalCalc];\r\n if Result then\r\n begin\r\n Result:=Assigned(DataSet) and Dataset.Active;\r\n If Result then\r\n Result:= DataSet.CanModify;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TField.GetClassDesc: String;\r\nvar ClassN : string;\r\nbegin\r\n ClassN := copy(ClassName,2,pos('Field',ClassName)-2);\r\n if isNull then\r\n result := '(' + LowerCase(ClassN) + ')'\r\n else\r\n result := '(' + UpperCase(ClassN) + ')';\r\nend;\r\n\r\n\r\nfunction TField.GetData : JSValue;\r\n\r\nbegin\r\n IF FDataset=Nil then\r\n DatabaseErrorFmt(SNoDataset,[FieldName]);\r\n If FValidating then\r\n result:=FValueBuffer\r\n else\r\n Result:=FDataset.GetFieldData(Self);\r\nend;\r\n\r\nfunction TField.GetDataSize: Integer;\r\n\r\nbegin\r\n Result:=0;\r\nend;\r\n\r\nfunction TField.GetDefaultWidth: Longint;\r\n\r\nbegin\r\n Result:=10;\r\nend;\r\n\r\nfunction TField.GetDisplayName : String;\r\n\r\nbegin\r\n If FDisplayLabel<>'' then\r\n result:=FDisplayLabel\r\n else\r\n Result:=FFieldName;\r\nend;\r\n\r\nfunction TField.IsDisplayLabelStored: Boolean;\r\n\r\nbegin\r\n Result:=(DisplayLabel<>FieldName);\r\nend;\r\n\r\nfunction TField.IsDisplayWidthStored: Boolean;\r\n\r\nbegin\r\n Result:=(FDisplayWidth<>0);\r\nend;\r\n\r\nfunction TField.GetLookupList: TLookupList;\r\nbegin\r\n if not Assigned(FLookupList) then\r\n FLookupList := TLookupList.Create;\r\n Result := FLookupList;\r\nend;\r\n\r\nprocedure TField.CalcLookupValue;\r\nbegin\r\n{ MVC: TODO\r\n if FLookupCache then\r\n Value := LookupList.ValueOfKey(FDataSet.FieldValues[FKeyFields])\r\n else if Assigned(FLookupDataSet) and FDataSet.Active then\r\n Value := FLookupDataSet.Lookup(FLookupKeyfields, FDataSet.FieldValues[FKeyFields], FLookupresultField);\r\n}\r\nend;\r\n\r\nfunction TField.GetIndex: longint;\r\n\r\nbegin\r\n If Assigned(FDataset) then\r\n Result:=FDataset.FFieldList.IndexOf(Self)\r\n else\r\n Result:=-1;\r\nend;\r\n\r\nfunction TField.GetLookup: Boolean;\r\nbegin\r\n Result := FieldKind = fkLookup;\r\nend;\r\n\r\nprocedure TField.SetAlignment(const AValue: TAlignMent);\r\nbegin\r\n if FAlignment <> AValue then\r\n begin\r\n FAlignment := AValue;\r\n PropertyChanged(false);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetIndex(const AValue: Longint);\r\nbegin\r\n if FFields <> nil then FFields.SetFieldIndex(Self, AValue)\r\nend;\r\n\r\nfunction TField.GetIsNull: Boolean;\r\n\r\nbegin\r\n Result:=js.IsNull(GetData);\r\nend;\r\n\r\nfunction TField.GetParentComponent: TComponent;\r\n\r\nbegin\r\n Result := DataSet;\r\nend;\r\n\r\nprocedure TField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nbegin\r\n AText:=GetAsString;\r\nend;\r\n\r\nfunction TField.HasParent: Boolean;\r\n\r\nbegin\r\n HasParent:=True;\r\nend;\r\n\r\nfunction TField.IsValidChar(InputChar: Char): Boolean;\r\n\r\nbegin\r\n // FValidChars must be set in Create.\r\n Result:=CharInset(InputChar,FValidChars);\r\nend;\r\n\r\nprocedure TField.RefreshLookupList;\r\nvar\r\n tmpActive: Boolean;\r\nbegin\r\n if not Assigned(FLookupDataSet) or (Length(FLookupKeyfields) = 0)\r\n or (Length(FLookupresultField) = 0) or (Length(FKeyFields) = 0) then\r\n Exit;\r\n \r\n tmpActive := FLookupDataSet.Active;\r\n try\r\n FLookupDataSet.Active := True;\r\n FFields.CheckFieldNames(FKeyFields);\r\n FLookupDataSet.Fields.CheckFieldNames(FLookupKeyFields);\r\n FLookupDataset.FieldByName(FLookupResultField); // I presume that if it doesn't exist it throws exception, and that a field with null value is still valid\r\n LookupList.Clear; // have to be F-less because we might be creating it here with getter!\r\n\r\n FLookupDataSet.DisableControls;\r\n try\r\n FLookupDataSet.First;\r\n while not FLookupDataSet.Eof do\r\n begin\r\n// FLookupList.Add(FLookupDataSet.FieldValues[FLookupKeyfields], FLookupDataSet.FieldValues[FLookupResultField]);\r\n FLookupDataSet.Next;\r\n end;\r\n finally\r\n FLookupDataSet.EnableControls;\r\n end;\r\n finally\r\n FLookupDataSet.Active := tmpActive;\r\n end;\r\nend;\r\n\r\nprocedure TField.Notification(AComponent: TComponent; Operation: TOperation);\r\n\r\nbegin\r\n Inherited Notification(AComponent,Operation);\r\n if (Operation = opRemove) and (AComponent = FLookupDataSet) then\r\n FLookupDataSet := nil;\r\nend;\r\n\r\nprocedure TField.PropertyChanged(LayoutAffected: Boolean);\r\n\r\nbegin\r\n If (FDataset<>Nil) and (FDataset.Active) then\r\n If LayoutAffected then\r\n FDataset.DataEvent(deLayoutChange,0)\r\n else\r\n FDataset.DataEvent(deDatasetchange,0);\r\nend;\r\n\r\n\r\nprocedure TField.SetAsBytes(const AValue: TBytes);\r\nbegin\r\n RaiseAccessError(SBytes);\r\nend;\r\n\r\nprocedure TField.SetAsBoolean(AValue: Boolean);\r\n\r\nbegin\r\n RaiseAccessError(SBoolean);\r\nend;\r\n\r\nprocedure TField.SetAsDateTime(AValue: TDateTime);\r\n\r\nbegin\r\n RaiseAccessError(SDateTime);\r\nend;\r\n\r\nprocedure TField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n RaiseAccessError(SFloat);\r\nend;\r\n\r\nprocedure TField.SetAsJSValue(const AValue: JSValue);\r\n\r\nbegin\r\n if js.IsNull(AValue) then\r\n Clear\r\n else\r\n try\r\n SetVarValue(AValue);\r\n except\r\n on EVariantError do\r\n DatabaseErrorFmt(SFieldValueError, [DisplayName]);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TField.SetAsLongint(AValue: Longint);\r\nbegin\r\n SetAsInteger(AValue);\r\nend;\r\n\r\nprocedure TField.SetAsInteger(AValue: Longint);\r\nbegin\r\n RaiseAccessError(SInteger);\r\nend;\r\n\r\nprocedure TField.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n RaiseAccessError(SLargeInt);\r\nend;\r\n\r\nprocedure TField.SetAsString(const AValue: string);\r\nbegin\r\n RaiseAccessError(SString);\r\nend;\r\n\r\nprocedure TField.SetData(Buffer: JSValue);\r\n\r\nbegin\r\n If Not Assigned(FDataset) then\r\n DatabaseErrorFmt(SNoDataset,[FieldName]);\r\n FDataSet.SetFieldData(Self,Buffer);\r\nend;\r\n\r\nprocedure TField.SetDataset(AValue: TDataset);\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln ('Setting dataset');\r\n{$endif}\r\n If AValue=FDataset then exit;\r\n If Assigned(FDataset) Then\r\n begin\r\n FDataset.CheckInactive;\r\n FDataset.FFieldList.Remove(Self);\r\n end;\r\n If Assigned(AValue) then\r\n begin\r\n AValue.CheckInactive;\r\n AValue.FFieldList.Add(Self);\r\n end;\r\n FDataset:=AValue;\r\nend;\r\n\r\nprocedure TField.SetDataType(AValue: TFieldType);\r\n\r\nbegin\r\n FDataType := AValue;\r\nend;\r\n\r\nprocedure TField.SetFieldType(AValue: TFieldType);\r\n\r\nbegin\r\n { empty }\r\nend;\r\n\r\nprocedure TField.SetParentComponent(Value: TComponent);\r\n\r\nbegin\r\n if not (csLoading in ComponentState) then\r\n DataSet := Value as TDataSet;\r\nend;\r\n\r\nprocedure TField.SetSize(AValue: Integer);\r\n\r\nbegin\r\n CheckInactive;\r\n CheckTypeSize(AValue);\r\n FSize:=AValue;\r\nend;\r\n\r\nprocedure TField.SetText(const AValue: string);\r\n\r\nbegin\r\n SetAsString(AValue);\r\nend;\r\n\r\nprocedure TField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n RaiseAccessError(SJSValue);\r\nend;\r\n\r\nprocedure TField.Validate(Buffer: Pointer);\r\n\r\nbegin\r\n If assigned(OnValidate) Then\r\n begin\r\n FValueBuffer:=Buffer;\r\n FValidating:=True;\r\n Try\r\n OnValidate(Self);\r\n finally\r\n FValidating:=False;\r\n end;\r\n end;\r\nend;\r\n\r\nclass function TField.IsBlob: Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\nclass procedure TField.CheckTypeSize(AValue: Longint);\r\n\r\nbegin\r\n If (AValue<>0) and Not IsBlob Then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue]);\r\nend;\r\n\r\n// TField private methods\r\n\r\nprocedure TField.SetEditText(const AValue: string);\r\nbegin\r\n if Assigned(OnSetText) then\r\n OnSetText(Self, AValue)\r\n else\r\n SetText(AValue);\r\nend;\r\n\r\nfunction TField.GetEditText: String;\r\nbegin\r\n SetLength(Result, 0);\r\n if Assigned(OnGetText) then\r\n OnGetText(Self, Result, False)\r\n else\r\n GetText(Result, False);\r\nend;\r\n\r\nfunction TField.GetDisplayText: String;\r\nbegin\r\n SetLength(Result, 0);\r\n if Assigned(OnGetText) then\r\n OnGetText(Self, Result, True)\r\n else\r\n GetText(Result, True);\r\nend;\r\n\r\nprocedure TField.SetDisplayLabel(const AValue: string);\r\nbegin\r\n if FDisplayLabel<>AValue then\r\n begin\r\n FDisplayLabel:=AValue;\r\n PropertyChanged(true);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetDisplayWidth(const AValue: Longint);\r\nbegin\r\n if FDisplayWidth<>AValue then\r\n begin\r\n FDisplayWidth:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nfunction TField.GetDisplayWidth: integer;\r\nbegin\r\n if FDisplayWidth=0 then\r\n result:=GetDefaultWidth\r\n else\r\n result:=FDisplayWidth;\r\nend;\r\n\r\nprocedure TField.SetLookup(const AValue: Boolean);\r\nconst\r\n ValueToLookupMap: array[Boolean] of TFieldKind = (fkData, fkLookup);\r\nbegin\r\n FieldKind := ValueToLookupMap[AValue];\r\nend;\r\n\r\nprocedure TField.SetReadOnly(const AValue: Boolean);\r\nbegin\r\n if (FReadOnly<>AValue) then\r\n begin\r\n FReadOnly:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nprocedure TField.SetVisible(const AValue: Boolean);\r\nbegin\r\n if FVisible<>AValue then\r\n begin\r\n FVisible:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TStringField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TStringField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftString);\r\n FFixedChar := False;\r\n FTransliterate := False;\r\n FSize := 20;\r\nend;\r\n\r\nprocedure TStringField.SetFieldType(AValue: TFieldType);\r\nbegin\r\n if AValue in [ftString, ftFixedChar] then\r\n SetDataType(AValue);\r\nend;\r\n\r\nclass procedure TStringField.CheckTypeSize(AValue: Longint);\r\n\r\nbegin\r\n// A size of 0 is allowed, since for example Firebird allows\r\n// a query like: 'select '' as fieldname from table' which\r\n// results in a string with size 0.\r\n If (AValue<0) Then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue])\r\nend;\r\n\r\nfunction TStringField.GetAsBoolean: Boolean;\r\n\r\nvar S : String;\r\n\r\nbegin\r\n S:=GetAsString;\r\n result := (Length(S)>0) and (Upcase(S[1]) in ['T',YesNoChars[True]]);\r\nend;\r\n\r\nfunction TStringField.GetAsDateTime: TDateTime;\r\n\r\nbegin\r\n Result:=StrToDateTime(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=StrToFloat(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsInteger: Longint;\r\n\r\nbegin\r\n Result:=StrToInt(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsLargeInt: NativeInt;\r\n\r\nbegin\r\n Result:=StrToInt64(GetAsString);\r\nend;\r\n\r\nfunction TStringField.GetAsString: String;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isString(V) then\r\n Result := String(V)\r\n else\r\n Result:='';\r\nend;\r\n\r\n\r\nfunction TStringField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData\r\nend;\r\n\r\n\r\nfunction TStringField.GetDefaultWidth: Longint;\r\n\r\nbegin\r\n result:=Size;\r\nend;\r\n\r\nprocedure TStringField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nbegin\r\n AText:=GetAsString;\r\nend;\r\n\r\n\r\nprocedure TStringField.SetAsBoolean(AValue: Boolean);\r\n\r\nbegin\r\n If AValue Then\r\n SetAsString('T')\r\n else\r\n SetAsString('F');\r\nend;\r\n\r\nprocedure TStringField.SetAsDateTime(AValue: TDateTime);\r\n\r\nbegin\r\n SetAsString(DateTimeToStr(AValue));\r\nend;\r\n\r\nprocedure TStringField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsString(FloatToStr(AValue));\r\nend;\r\n\r\nprocedure TStringField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n SetAsString(IntToStr(AValue));\r\nend;\r\n\r\nprocedure TStringField.SetAsLargeInt(AValue: NativeInt);\r\n\r\nbegin\r\n SetAsString(IntToStr(AValue));\r\nend;\r\n\r\n\r\nprocedure TStringField.SetAsString(const AValue: String);\r\nbegin\r\n SetData(AValue);\r\nend;\r\n\r\n\r\nprocedure TStringField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if isString(AVAlue) then\r\n SetAsString(String(AValue))\r\n else\r\n RaiseAccessError(SFieldValueError);\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TNumericField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TNumericField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n AlignMent:=taRightJustify;\r\nend;\r\n\r\nclass procedure TNumericField.CheckTypeSize(AValue: Longint);\r\nbegin\r\n // This procedure is only added because some TDataset descendents have the\r\n // but that they set the Size property as if it is the DataSize property.\r\n // To avoid problems with those descendents, allow values <= 16.\r\n If (AValue>16) Then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue]);\r\nend;\r\n\r\nprocedure TNumericField.RangeError(AValue, Min, Max: Double);\r\n\r\nbegin\r\n DatabaseErrorFmt(SRangeError,[AValue,Min,Max,FieldName]);\r\nend;\r\n\r\nprocedure TNumericField.SetDisplayFormat(const AValue: string);\r\n\r\nbegin\r\n If FDisplayFormat<>AValue then\r\n begin\r\n FDisplayFormat:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nprocedure TNumericField.SetEditFormat(const AValue: string);\r\n\r\nbegin\r\n If FEditFormat<>AValue then\r\n begin\r\n FEditFormat:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nfunction TNumericField.GetAsBoolean: Boolean;\r\nbegin\r\n Result:=GetAsInteger<>0;\r\nend;\r\n\r\nprocedure TNumericField.SetAsBoolean(AValue: Boolean);\r\nbegin\r\n SetAsInteger(ord(AValue));\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TIntegerField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TIntegerField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftInteger);\r\n FMinRange:=Low(LongInt);\r\n FMaxRange:=High(LongInt);\r\n// MVC : Todo\r\n// FValidchars:=['+','-','0'..'9'];\r\nend;\r\n\r\nfunction TIntegerField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=GetAsInteger;\r\nend;\r\n\r\nfunction TIntegerField.GetAsLargeInt: NativeInt;\r\nbegin\r\n Result:=GetAsInteger;\r\nend;\r\n\r\nfunction TIntegerField.GetAsInteger: Longint;\r\n\r\nbegin\r\n If Not GetValue(Result) then\r\n Result:=0;\r\nend;\r\n\r\nfunction TIntegerField.GetAsJSValue: JSValue;\r\n\r\nvar L : Longint;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=L\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TIntegerField.GetAsString: string;\r\n\r\nvar L : Longint;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=IntTostr(L)\r\n else\r\n Result:='';\r\nend;\r\n\r\n\r\nprocedure TIntegerField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nvar l : longint;\r\n fmt : string;\r\n\r\nbegin\r\n Atext:='';\r\n If Not GetValue(l) then exit;\r\n If ADisplayText or (FEditFormat='') then\r\n fmt:=FDisplayFormat\r\n else\r\n fmt:=FEditFormat;\r\n If length(fmt)<>0 then\r\n AText:=FormatFloat(fmt,L)\r\n else\r\n Str(L,AText);\r\nend;\r\n\r\nfunction TIntegerField.GetValue(var AValue: Longint): Boolean;\r\n\r\nvar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n Result:=isInteger(V);\r\n if Result then\r\n AValue:=Longint(V);\r\nend;\r\n\r\nprocedure TIntegerField.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n if (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n SetAsInteger(AValue)\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nprocedure TIntegerField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsInteger(Round(AValue));\r\nend;\r\n\r\nprocedure TIntegerField.SetAsInteger(AValue: Longint);\r\nbegin\r\n If CheckRange(AValue) then\r\n SetData(AValue)\r\n else\r\n if (FMinValue<>0) or (FMaxValue<>0) then\r\n RangeError(AValue,FMinValue,FMaxValue)\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nprocedure TIntegerField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if IsInteger(aValue) then\r\n SetAsInteger(Integer(AValue))\r\n else\r\n RaiseAccessError(SInteger);\r\nend;\r\n\r\nprocedure TIntegerField.SetAsString(const AValue: string);\r\n\r\nvar L,Code : longint;\r\n\r\nbegin\r\n If length(AValue)=0 then\r\n Clear\r\n else\r\n begin\r\n Val(AValue,L,Code);\r\n If Code=0 then\r\n SetAsInteger(L)\r\n else\r\n DatabaseErrorFmt(SNotAnInteger,[AValue]);\r\n end;\r\nend;\r\n\r\nFunction TIntegerField.CheckRange(AValue : longint) : Boolean;\r\n\r\nbegin\r\n if (FMinValue<>0) or (FMaxValue<>0) then\r\n Result := (AValue>=FMinValue) and (AValue<=FMaxValue)\r\n else\r\n Result := (AValue>=FMinRange) and (AValue<=FMaxRange);\r\nend;\r\n\r\nProcedure TIntegerField.SetMaxValue (AValue : longint);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMaxValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nProcedure TIntegerField.SetMinValue (AValue : longint);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMinValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TLargeintField\r\n ---------------------------------------------------------------------}\r\n\r\n\r\nconstructor TLargeintField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftLargeint);\r\n FMinRange:=Low(NativeInt);\r\n FMaxRange:=High(NativeInt);\r\n// MVC : Todo\r\n// FValidchars:=['+','-','0'..'9'];\r\nend;\r\n\r\nfunction TLargeintField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=GetAsLargeInt;\r\nend;\r\n\r\nfunction TLargeintField.GetAsLargeInt: NativeInt;\r\n\r\nbegin\r\n If Not GetValue(Result) then\r\n Result:=0;\r\nend;\r\n\r\nfunction TLargeIntField.GetAsJSValue: JSValue;\r\n\r\nvar L : NativeInt;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=L\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TLargeintField.GetAsInteger: Longint;\r\n\r\nbegin\r\n Result:=GetAsLargeInt;\r\nend;\r\n\r\nfunction TLargeintField.GetAsString: string;\r\n\r\nvar L : NativeInt;\r\n\r\nbegin\r\n If GetValue(L) then\r\n Result:=IntTostr(L)\r\n else\r\n Result:='';\r\nend;\r\n\r\nprocedure TLargeintField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nvar l : NativeInt;\r\n fmt : string;\r\n\r\nbegin\r\n Atext:='';\r\n If Not GetValue(l) then exit;\r\n If ADisplayText or (FEditFormat='') then\r\n fmt:=FDisplayFormat\r\n else\r\n fmt:=FEditFormat;\r\n If length(fmt)<>0 then\r\n AText:=FormatFloat(fmt,L)\r\n else\r\n Str(L,AText);\r\nend;\r\n\r\nfunction TLargeintField.GetValue(var AValue: NativeInt): Boolean;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n Result:=isInteger(P);\r\n if Result then\r\n AValue:=NativeInt(P);\r\nend;\r\n\r\nprocedure TLargeintField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsLargeInt(Round(AValue));\r\nend;\r\n\r\nprocedure TLargeintField.SetAsLargeInt(AValue: NativeInt);\r\n\r\nbegin\r\n If CheckRange(AValue) then\r\n SetData(AValue)\r\n else\r\n RangeError(AValue,FMinValue,FMaxValue);\r\nend;\r\n\r\nprocedure TLargeintField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n SetAsLargeInt(AValue);\r\nend;\r\n\r\nprocedure TLargeintField.SetAsString(const AValue: string);\r\n\r\nvar L : NativeInt;\r\n code : Longint;\r\n\r\nbegin\r\n If length(AValue)=0 then\r\n Clear\r\n else\r\n begin\r\n Val(AValue,L,Code);\r\n If Code=0 then\r\n SetAsLargeInt(L)\r\n else\r\n DatabaseErrorFmt(SNotAnInteger,[AValue]);\r\n end;\r\nend;\r\n\r\nprocedure TLargeintField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if IsInteger(Avalue) then\r\n SetAsLargeInt(NativeInt(AValue))\r\n else\r\n RaiseAccessError(SLargeInt);\r\nend;\r\n\r\nFunction TLargeintField.CheckRange(AValue : NativeInt) : Boolean;\r\n\r\nbegin\r\n if (FMinValue<>0) or (FMaxValue<>0) then\r\n Result := (AValue>=FMinValue) and (AValue<=FMaxValue)\r\n else\r\n Result := (AValue>=FMinRange) and (AValue<=FMaxRange);\r\nend;\r\n\r\nProcedure TLargeintField.SetMaxValue (AValue : NativeInt);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMaxValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\nProcedure TLargeintField.SetMinValue (AValue : NativeInt);\r\n\r\nbegin\r\n If (AValue>=FMinRange) and (AValue<=FMaxRange) then\r\n FMinValue:=AValue\r\n else\r\n RangeError(AValue,FMinRange,FMaxRange);\r\nend;\r\n\r\n\r\n{ TAutoIncField }\r\n\r\nconstructor TAutoIncField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOWner);\r\n SetDataType(ftAutoInc);\r\nend;\r\n\r\nProcedure TAutoIncField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n // Some databases allows insertion of explicit values into identity columns\r\n // (some of them also allows (some not) updating identity columns)\r\n // So allow it at client side and leave check for server side\r\n //if not(FDataSet.State in [dsFilter,dsSetKey,dsInsert]) then\r\n // DataBaseError(SCantSetAutoIncFields);\r\n inherited;\r\nend;\r\n\r\n{ TFloatField }\r\n\r\nprocedure TFloatField.SetCurrency(const AValue: Boolean);\r\nbegin\r\n if FCurrency=AValue then exit;\r\n FCurrency:=AValue;\r\nend;\r\n\r\nprocedure TFloatField.SetPrecision(const AValue: Longint);\r\nbegin\r\n if (AValue = -1) or (AValue > 1) then\r\n FPrecision := AValue\r\n else\r\n FPrecision := 2;\r\nend;\r\n\r\nfunction TFloatField.GetAsFloat: Double;\r\n\r\nVar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n If IsNumber(P) then\r\n Result:=Double(P)\r\n else\r\n Result:=0.0;\r\nend;\r\n\r\nfunction TFloatField.GetAsJSValue: JSValue;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if IsNumber(P) then\r\n Result:=P\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TFloatField.GetAsLargeInt: NativeInt;\r\nbegin\r\n Result:=Round(GetAsFloat);\r\nend;\r\n\r\nfunction TFloatField.GetAsInteger: Longint;\r\n\r\nbegin\r\n Result:=Round(GetAsFloat);\r\nend;\r\n\r\nfunction TFloatField.GetAsString: string;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if IsNumber(P) then\r\n Result:=FloatToStr(Double(P))\r\n else\r\n Result:='';\r\nend;\r\n\r\nprocedure TFloatField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nVar\r\n fmt : string;\r\n E : Double;\r\n Digits : integer;\r\n ff: TFloatFormat;\r\n P : JSValue;\r\n\r\nbegin\r\n AText:='';\r\n P:=GetData;\r\n if Not IsNumber(P) then\r\n exit;\r\n E:=Double(P);\r\n If ADisplayText or (Length(FEditFormat) = 0) Then\r\n Fmt:=FDisplayFormat\r\n else\r\n Fmt:=FEditFormat;\r\n \r\n Digits := 0;\r\n if not FCurrency then\r\n ff := ffGeneral\r\n else\r\n begin\r\n Digits := 2;\r\n ff := ffFixed;\r\n end;\r\n\r\n\r\n If fmt<>'' then\r\n AText:=FormatFloat(fmt,E)\r\n else\r\n AText:=FloatToStrF(E,ff,FPrecision,Digits);\r\nend;\r\n\r\nprocedure TFloatField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n If CheckRange(AValue) then\r\n SetData(AValue)\r\n else\r\n RangeError(AValue,FMinValue,FMaxValue);\r\nend;\r\n\r\nprocedure TFloatField.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n SetAsFloat(AValue);\r\nend;\r\n\r\nprocedure TFloatField.SetAsInteger(AValue: Longint);\r\n\r\nbegin\r\n SetAsFloat(AValue);\r\nend;\r\n\r\nprocedure TFloatField.SetAsString(const AValue: string);\r\n\r\nvar f : Double;\r\n\r\nbegin\r\n If (AValue='') then\r\n Clear\r\n else \r\n begin\r\n If not TryStrToFloat(AValue,F) then\r\n DatabaseErrorFmt(SNotAFloat, [AValue]);\r\n SetAsFloat(f);\r\n end;\r\nend;\r\n\r\nprocedure TFloatField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if IsNumber(aValue) then\r\n SetAsFloat(Double(AValue))\r\n else\r\n RaiseAccessError('Float');\r\nend;\r\n\r\nconstructor TFloatField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftFloat);\r\n FPrecision:=15;\r\n// MVC\r\n// FValidChars := [DecimalSeparator, '+', '-', '0'..'9', 'E', 'e'];\r\nend;\r\n\r\nFunction TFloatField.CheckRange(AValue : Double) : Boolean;\r\n\r\nbegin\r\n If (FMinValue<>0) or (FMaxValue<>0) then\r\n Result:=(AValue>=FMinValue) and (AValue<=FMaxValue)\r\n else\r\n Result:=True;\r\nend;\r\n\r\n{ TBooleanField }\r\n\r\nfunction TBooleanField.GetAsBoolean: Boolean;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if isBoolean(P) then\r\n Result:=Boolean(P)\r\n else\r\n Result:=False;\r\nend;\r\n\r\nfunction TBooleanField.GetAsJSValue: JSValue;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if isBoolean(P) then\r\n Result:=Boolean(P)\r\n else\r\n Result:=Null;\r\nend;\r\n\r\nfunction TBooleanField.GetAsString: string;\r\n\r\nvar\r\n P : JSValue;\r\n\r\nbegin\r\n P:=GetData;\r\n if isBoolean(P) then\r\n Result:=FDisplays[False,Boolean(P)]\r\n else\r\n result:='';\r\nend;\r\n\r\nfunction TBooleanField.GetDefaultWidth: Longint;\r\n\r\nbegin\r\n Result:=Length(FDisplays[false,false]);\r\n If Result0);\r\nend;\r\n\r\nprocedure TBooleanField.SetAsBoolean(AValue: Boolean);\r\n\r\nbegin\r\n SetData(AValue);\r\nend;\r\n\r\nprocedure TBooleanField.SetAsString(const AValue: string);\r\n\r\nvar Temp : string;\r\n\r\nbegin\r\n Temp:=UpperCase(AValue);\r\n if Temp='' then\r\n Clear\r\n else if pos(Temp, FDisplays[True,True])=1 then\r\n SetAsBoolean(True)\r\n else if pos(Temp, FDisplays[True,False])=1 then\r\n SetAsBoolean(False)\r\n else\r\n DatabaseErrorFmt(SNotABoolean,[AValue]);\r\nend;\r\n\r\nprocedure TBooleanField.SetVarValue(const AValue: JSValue);\r\nbegin\r\n if isBoolean(aValue) then\r\n SetAsBoolean(Boolean(AValue))\r\n else if isNumber(aValue) then\r\n SetAsBoolean(Double(AValue)<>0)\r\nend;\r\n\r\nconstructor TBooleanField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftBoolean);\r\n DisplayValues:='True;False';\r\nend;\r\n\r\nProcedure TBooleanField.SetDisplayValues(const AValue : String);\r\n\r\nvar I : longint;\r\n\r\nbegin\r\n If FDisplayValues<>AValue then\r\n begin\r\n I:=Pos(';',AValue);\r\n If (I<2) or (I=Length(AValue)) then\r\n DatabaseErrorFmt(SInvalidDisplayValues,[AValue]);\r\n FdisplayValues:=AValue;\r\n // Store display values and their uppercase equivalents;\r\n FDisplays[False,True]:=Copy(AValue,1,I-1);\r\n FDisplays[True,True]:=UpperCase(FDisplays[False,True]);\r\n FDisplays[False,False]:=Copy(AValue,I+1,Length(AValue)-i);\r\n FDisplays[True,False]:=UpperCase(FDisplays[False,False]);\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\n{ TDateTimeField }\r\n\r\nprocedure TDateTimeField.SetDisplayFormat(const AValue: string);\r\nbegin\r\n if FDisplayFormat<>AValue then begin\r\n FDisplayFormat:=AValue;\r\n PropertyChanged(True);\r\n end;\r\nend;\r\n\r\nfunction TDateTimeField.ConvertToDateTime(aValue: JSValue; aRaiseError: Boolean): TDateTime;\r\nbegin\r\n if Assigned(Dataset) then\r\n Result:=Dataset.ConvertToDateTime(aValue,aRaiseError)\r\n else\r\n Result:=TDataset.DefaultConvertToDateTime(aValue,aRaiseError);\r\nend;\r\n\r\nfunction TDateTimeField.DateTimeToNativeDateTime(aValue: TDateTime): JSValue;\r\nbegin\r\n if Assigned(Dataset) then\r\n Result:=Dataset.ConvertDateTimeToNative(aValue)\r\n else\r\n Result:=TDataset.DefaultConvertDateTimeToNative(aValue);\r\nend;\r\n\r\nfunction TDateTimeField.GetAsDateTime: TDateTime;\r\n\r\nbegin\r\n Result:=ConvertToDateTime(GetData,False);\r\nend;\r\n\r\nprocedure TDateTimeField.SetVarValue(const AValue: JSValue);\r\n\r\nbegin\r\n SetAsDateTime(ConvertToDateTime(aValue,True));\r\nend;\r\n\r\nfunction TDateTimeField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData;\r\n if Not isString(Result) then\r\n Result:=Null;\r\nend;\r\n\r\nfunction TDateTimeField.GetDataSize: Integer;\r\nbegin\r\n Result:=inherited GetDataSize;\r\nend;\r\n\r\nfunction TDateTimeField.GetAsFloat: Double;\r\n\r\nbegin\r\n Result:=GetAsdateTime;\r\nend;\r\n\r\n\r\nfunction TDateTimeField.GetAsString: string;\r\n\r\nbegin\r\n GetText(Result,False);\r\nend;\r\n\r\n\r\nProcedure TDateTimeField.GetText(var AText: string; ADisplayText: Boolean);\r\n\r\nvar\r\n R : TDateTime;\r\n F : String;\r\n\r\nbegin\r\n R:=ConvertToDateTime(GetData,false);\r\n If (R=0) then\r\n AText:=''\r\n else\r\n begin\r\n If (ADisplayText) and (Length(FDisplayFormat)<>0) then\r\n F:=FDisplayFormat\r\n else\r\n Case DataType of\r\n ftTime : F:=LongTimeFormat;\r\n ftDate : F:=ShortDateFormat;\r\n else\r\n F:='c'\r\n end;\r\n AText:=FormatDateTime(F,R);\r\n end;\r\nend;\r\n\r\n\r\nprocedure TDateTimeField.SetAsDateTime(AValue: TDateTime);\r\n\r\nbegin\r\n SetData(DateTimeToNativeDateTime(aValue));\r\nend;\r\n\r\n\r\nprocedure TDateTimeField.SetAsFloat(AValue: Double);\r\n\r\nbegin\r\n SetAsDateTime(AValue);\r\nend;\r\n\r\n\r\nprocedure TDateTimeField.SetAsString(const AValue: string);\r\n\r\nvar R : TDateTime;\r\n\r\nbegin\r\n if AValue<>'' then\r\n begin\r\n R:=StrToDateTime(AValue);\r\n SetData(DateTimeToNativeDateTime(R));\r\n end\r\n else\r\n SetData(Null);\r\nend;\r\n\r\n\r\nconstructor TDateTimeField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftDateTime);\r\nend;\r\n\r\n\r\n{ TDateField }\r\n\r\nconstructor TDateField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftDate);\r\nend;\r\n\r\n\r\n{ TTimeField }\r\n\r\nconstructor TTimeField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftTime);\r\nend;\r\n\r\nprocedure TTimeField.SetAsString(const AValue: string);\r\n\r\nvar\r\n R : TDateTime;\r\n\r\nbegin\r\n if AValue<>'' then\r\n begin\r\n R:=StrToTime(AValue);\r\n SetData(DateTimeToNativeDateTime(R));\r\n end\r\n else\r\n SetData(Null);\r\nend;\r\n\r\n\r\n\r\n{ TBinaryField }\r\n\r\nclass procedure TBinaryField.CheckTypeSize(AValue: Longint);\r\n\r\nbegin\r\n // Just check for really invalid stuff; actual size is\r\n // dependent on the record...\r\n If AValue<1 then\r\n DatabaseErrorFmt(SInvalidFieldSize,[AValue]);\r\nend;\r\n\r\nFunction TBinaryField.BlobToBytes(aValue : JSValue) : TBytes;\r\n\r\nbegin\r\n if Assigned(Dataset) then\r\n Result:=DataSet.BlobDataToBytes(aValue)\r\n else\r\n Result:=TDataSet.DefaultBlobDataToBytes(aValue)\r\nend;\r\n\r\nFunction TBinaryField.BytesToBlob(aValue : TBytes) : JSValue;\r\n\r\nbegin\r\n if Assigned(Dataset) then\r\n Result:=DataSet.BytesToBlobData(aValue)\r\n else\r\n Result:=TDataSet.DefaultBytesToBlobData(aValue)\r\nend;\r\n\r\nfunction TBinaryField.GetAsString: string;\r\n\r\nvar\r\n V : JSValue;\r\n S : TBytes;\r\n I : Integer;\r\n\r\nbegin\r\n Result := '';\r\n V:=GetData;\r\n if V<>Null then\r\n begin\r\n S:=BlobToBytes(V);\r\n For I:=0 to Length(S) do\r\n TJSString(Result).Concat(TJSString.fromCharCode(S[I]));\r\n end;\r\nend;\r\n\r\n\r\nfunction TBinaryField.GetAsJSValue: JSValue;\r\n\r\nbegin\r\n Result:=GetData;\r\nend;\r\n\r\n\r\nfunction TBinaryField.GetValue(var AValue: TBytes): Boolean;\r\nvar\r\n V : JSValue;\r\nbegin\r\n V:=GetData;\r\n Result:=(V<>Null);\r\n if Result then\r\n AValue:=BlobToBytes(V)\r\n else\r\n SetLength(AValue,0);\r\nend;\r\n\r\n\r\n\r\nprocedure TBinaryField.SetAsString(const AValue: string);\r\n\r\nvar\r\n B : TBytes;\r\n i : Integer;\r\n\r\nbegin\r\n SetLength(B, Length(aValue));\r\n For I:=1 to Length(aValue) do\r\n B[i-1]:=Ord(aValue[i]);\r\n SetAsBytes(B);\r\nend;\r\n\r\n\r\nprocedure TBinaryField.SetVarValue(const AValue: JSValue);\r\n\r\nvar\r\n B: TBytes;\r\n I,Len: integer;\r\n\r\nbegin\r\n if IsArray(AValue) then\r\n begin\r\n Len:=Length(TJSValueDynArray(AValue));\r\n SetLength(B, Len);\r\n For I:=1 to Len-1 do\r\n B[i]:=TBytes(AValue)[i];\r\n SetAsBytes(B);\r\n end\r\n else if IsString(AValue) then\r\n SetAsString(String(AValue))\r\n else\r\n RaiseAccessError('Blob');\r\nend;\r\n\r\n\r\nconstructor TBinaryField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\nend;\r\n\r\n\r\n\r\n{ TBlobField }\r\n\r\nconstructor TBlobField.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n SetDataType(ftBlob);\r\nend;\r\n\r\nprocedure TBlobField.Clear;\r\nbegin\r\n SetData(Null);\r\nend;\r\n\r\n(*\r\nfunction TBlobField.GetBlobType: TBlobType;\r\nbegin\r\n Result:=ftBlob;\r\nend;\r\n\r\nprocedure TBlobField.SetBlobType(AValue: TBlobType);\r\nbegin\r\n SetFieldType(TFieldType(AValue));\r\nend;\r\n*)\r\n\r\n\r\n\r\n\r\nfunction TBlobField.GetBlobSize: Longint;\r\n\r\nvar\r\n B : TBytes;\r\n\r\nbegin\r\n B:=GetAsBytes;\r\n Result:=Length(B);\r\nend;\r\n\r\n\r\nfunction TBlobField.GetIsNull: Boolean;\r\n\r\nbegin\r\n if Not Modified then\r\n Result:= inherited GetIsNull\r\n else\r\n Result:=GetBlobSize=0;\r\nend;\r\n\r\nprocedure TBlobField.GetText(var AText: string; ADisplayText: Boolean);\r\nbegin\r\n AText := inherited GetAsString;\r\nend;\r\n\r\nclass function TBlobField.IsBlob: Boolean;\r\n\r\nbegin\r\n Result:=True;\r\nend;\r\n\r\nprocedure TBlobField.SetFieldType(AValue: TFieldType);\r\nbegin\r\n if AValue in ftBlobTypes then\r\n SetDataType(AValue);\r\nend;\r\n\r\n{ TMemoField }\r\n\r\nconstructor TMemoField.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n SetDataType(ftMemo);\r\nend;\r\n\r\n\r\n\r\n{ TVariantField }\r\n\r\nconstructor TVariantField.Create(AOwner: TComponent);\r\nbegin\r\n inherited Create(AOwner);\r\n SetDataType(ftVariant);\r\nend;\r\n\r\nclass procedure TVariantField.CheckTypeSize(aValue: Integer);\r\nbegin\r\n { empty }\r\nend;\r\n\r\nfunction TVariantField.GetAsBoolean: Boolean;\r\nbegin\r\n Result :=GetAsJSValue=True;\r\nend;\r\n\r\nfunction TVariantField.GetAsDateTime: TDateTime;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if Assigned(Dataset) then\r\n Result:=Dataset.ConvertToDateTime(V,True)\r\n else\r\n Result:=TDataset.DefaultConvertToDateTime(V,True)\r\nend;\r\n\r\nfunction TVariantField.GetAsFloat: Double;\r\n\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isNumber(V) then\r\n Result:=Double(V)\r\n else if isString(V) then\r\n Result:=parsefloat(String(V))\r\n else\r\n RaiseAccessError('Variant');\r\nend;\r\n\r\nfunction TVariantField.GetAsInteger: Longint;\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isInteger(V) then\r\n Result:=Integer(V)\r\n else if isString(V) then\r\n Result:=parseInt(String(V))\r\n else\r\n RaiseAccessError('Variant');\r\nend;\r\n\r\nfunction TVariantField.GetAsString: string;\r\nVar\r\n V : JSValue;\r\n\r\nbegin\r\n V:=GetData;\r\n if isInteger(V) then\r\n Result:=IntToStr(Integer(V))\r\n else if isNumber(V) then\r\n Result:=FloatToStr(Double(V))\r\n else if isString(V) then\r\n Result:=String(V)\r\n else\r\n RaiseAccessError('Variant');\r\nend;\r\n\r\n\r\nfunction TVariantField.GetAsJSValue: JSValue;\r\nbegin\r\n Result:=GetData;\r\nend;\r\n\r\nprocedure TVariantField.SetAsBoolean(aValue: Boolean);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsDateTime(aValue: TDateTime);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsFloat(aValue: Double);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsInteger(AValue: Longint);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetAsString(const aValue: string);\r\nbegin\r\n SetVarValue(aValue);\r\nend;\r\n\r\nprocedure TVariantField.SetVarValue(const aValue: JSValue);\r\nbegin\r\n SetData(aValue);\r\nend;\r\n\r\n{ TFieldsEnumerator }\r\n\r\nfunction TFieldsEnumerator.GetCurrent: TField;\r\nbegin\r\n Result := FFields[FPosition];\r\nend;\r\n\r\nconstructor TFieldsEnumerator.Create(AFields: TFields);\r\nbegin\r\n inherited Create;\r\n FFields := AFields;\r\n FPosition := -1;\r\nend;\r\n\r\nfunction TFieldsEnumerator.MoveNext: Boolean;\r\nbegin\r\n inc(FPosition);\r\n Result := FPosition < FFields.Count;\r\nend;\r\n\r\n{ TFields }\r\n\r\nconstructor TFields.Create(ADataset: TDataset);\r\n\r\nbegin\r\n FDataSet:=ADataset;\r\n FFieldList:=TFpList.Create;\r\n FValidFieldKinds:=[fkData..fkInternalcalc];\r\nend;\r\n\r\ndestructor TFields.Destroy;\r\n\r\nbegin\r\n if Assigned(FFieldList) then\r\n Clear;\r\n FreeAndNil(FFieldList);\r\n inherited Destroy;\r\nend;\r\n\r\nprocedure TFields.ClearFieldDefs;\r\n\r\nVar\r\n i : Integer;\r\n\r\nbegin\r\n For I:=0 to Count-1 do\r\n Fields[i].FFieldDef:=Nil;\r\nend;\r\n\r\nprocedure TFields.Changed;\r\n\r\nbegin\r\n // Removed FDataSet.Active check, needed for Persistent fields (see bug ID 30954)\r\n if (FDataSet <> nil) and not (csDestroying in FDataSet.ComponentState) then\r\n FDataSet.DataEvent(deFieldListChange, 0);\r\n If Assigned(FOnChange) then\r\n FOnChange(Self);\r\nend;\r\n\r\nprocedure TFields.CheckfieldKind(Fieldkind: TFieldKind; Field: TField);\r\n\r\nbegin\r\n If Not (FieldKind in ValidFieldKinds) Then\r\n DatabaseErrorFmt(SInvalidFieldKind,[Field.FieldName]);\r\nend;\r\n\r\nfunction TFields.GetCount: Longint;\r\n\r\nbegin\r\n Result:=FFieldList.Count;\r\nend;\r\n\r\n\r\nfunction TFields.GetField(Index: Integer): TField;\r\n\r\nbegin\r\n Result:=Tfield(FFieldList[Index]);\r\nend;\r\n\r\nprocedure TFields.SetField(Index: Integer; Value: TField);\r\nbegin\r\n Fields[Index].Assign(Value);\r\nend;\r\n\r\nprocedure TFields.SetFieldIndex(Field: TField; Value: Integer);\r\nvar Old : Longint;\r\nbegin\r\n Old := FFieldList.indexOf(Field);\r\n If Old=-1 then\r\n Exit;\r\n // Check value\r\n If Value<0 Then Value:=0;\r\n If Value>=Count then Value:=Count-1;\r\n If Value<>Old then\r\n begin\r\n FFieldList.Delete(Old);\r\n FFieldList.Insert(Value,Field);\r\n Field.PropertyChanged(True);\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TFields.Add(Field: TField);\r\n\r\nbegin\r\n CheckFieldName(Field.FieldName);\r\n FFieldList.Add(Field);\r\n Field.FFields:=Self;\r\n Changed;\r\nend;\r\n\r\nprocedure TFields.CheckFieldName(const Value: String);\r\n\r\nbegin\r\n If FindField(Value)<>Nil then\r\n DataBaseErrorFmt(SDuplicateFieldName,[Value],FDataset);\r\nend;\r\n\r\nprocedure TFields.CheckFieldNames(const Value: String);\r\n\r\nvar\r\n N: String;\r\n StrPos: Integer;\r\n\r\nbegin\r\n if Value = '' then\r\n Exit;\r\n StrPos := 1;\r\n repeat\r\n N := ExtractFieldName(Value, StrPos);\r\n // Will raise an error if no such field...\r\n FieldByName(N);\r\n until StrPos > Length(Value);\r\nend;\r\n\r\nprocedure TFields.Clear;\r\nvar\r\n AField: TField;\r\nbegin\r\n while FFieldList.Count > 0 do \r\n begin\r\n AField := TField(FFieldList.Last);\r\n AField.FDataSet := Nil;\r\n AField.Free;\r\n FFieldList.Delete(FFieldList.Count - 1);\r\n end;\r\n Changed;\r\nend;\r\n\r\nfunction TFields.FindField(const Value: String): TField;\r\nvar S : String;\r\n I : longint;\r\nbegin\r\n S:=UpperCase(Value);\r\n For I:=0 To FFieldList.Count-1 do\r\n begin\r\n Result:=TField(FFieldList[I]);\r\n if S=UpperCase(Result.FieldName) then\r\n begin\r\n {$ifdef dsdebug}\r\n Writeln ('Found field ',Value);\r\n {$endif}\r\n Exit;\r\n end;\r\n end;\r\n Result:=Nil;\r\nend;\r\n\r\nfunction TFields.FieldByName(const Value: String): TField;\r\n\r\nbegin\r\n Result:=FindField(Value);\r\n If result=Nil then\r\n DatabaseErrorFmt(SFieldNotFound,[Value],FDataset);\r\nend;\r\n\r\nfunction TFields.FieldByNumber(FieldNo: Integer): TField;\r\nvar i : Longint;\r\nbegin\r\n For I:=0 to FFieldList.Count-1 do\r\n begin\r\n Result:=TField(FFieldList[I]);\r\n if FieldNo=Result.FieldNo then\r\n Exit;\r\n end;\r\n Result:=Nil;\r\nend;\r\n\r\nfunction TFields.GetEnumerator: TFieldsEnumerator;\r\n\r\nbegin\r\n Result:=TFieldsEnumerator.Create(Self);\r\nend;\r\n\r\nprocedure TFields.GetFieldNames(Values: TStrings);\r\nvar i : longint;\r\nbegin\r\n Values.Clear;\r\n For I:=0 to FFieldList.Count-1 do\r\n Values.Add(Tfield(FFieldList[I]).FieldName);\r\nend;\r\n\r\nfunction TFields.IndexOf(Field: TField): Longint;\r\n\r\nbegin\r\n Result:=FFieldList.IndexOf(Field);\r\nend;\r\n\r\nprocedure TFields.Remove(Value : TField);\r\n\r\nbegin\r\n FFieldList.Remove(Value);\r\n Value.FFields := nil;\r\n Changed;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TDatalink\r\n ---------------------------------------------------------------------}\r\n\r\nConstructor TDataLink.Create;\r\n\r\nbegin\r\n Inherited Create;\r\n FBufferCount:=1;\r\n FFirstRecord := 0;\r\n FDataSource := nil;\r\n FDatasourceFixed:=False;\r\nend;\r\n\r\n\r\nDestructor TDataLink.Destroy;\r\n\r\nbegin\r\n Factive:=False;\r\n FEditing:=False;\r\n FDataSourceFixed:=False;\r\n DataSource:=Nil;\r\n Inherited Destroy;\r\nend;\r\n\r\n\r\nProcedure TDataLink.ActiveChanged;\r\n\r\nbegin\r\n FFirstRecord := 0;\r\nend;\r\n\r\nProcedure TDataLink.CheckActiveAndEditing;\r\n\r\nVar\r\n B : Boolean;\r\n\r\nbegin\r\n B:=Assigned(DataSource) and Not (DataSource.State in [dsInactive,dsOpening]);\r\n If B<>FActive then\r\n begin\r\n FActive:=B;\r\n ActiveChanged;\r\n end;\r\n B:=Assigned(DataSource) and (DataSource.State in dsEditModes) and Not FReadOnly;\r\n If B<>FEditing Then\r\n begin\r\n FEditing:=B;\r\n EditingChanged;\r\n end;\r\nend;\r\n\r\n\r\nProcedure TDataLink.CheckBrowseMode;\r\n\r\nbegin\r\nend;\r\n\r\n\r\nFunction TDataLink.CalcFirstRecord(Index : Integer) : Integer;\r\nbegin\r\n if DataSource.DataSet.FActiveRecord > FFirstRecord + Index + FBufferCount - 1 then\r\n Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index + FBufferCount - 1)\r\n else if DataSource.DataSet.FActiveRecord < FFirstRecord + Index then\r\n Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index)\r\n else Result := 0;\r\n \r\n Inc(FFirstRecord, Index + Result);\r\nend;\r\n\r\n\r\nProcedure TDataLink.CalcRange;\r\nvar\r\n aMax, aMin: integer;\r\nbegin\r\n aMin:= DataSet.FActiveRecord - FBufferCount + 1;\r\n If aMin < 0 Then aMin:= 0;\r\n aMax:= Dataset.FBufferCount - FBufferCount;\r\n If aMax < 0 then aMax:= 0;\r\n\r\n If aMax>DataSet.FActiveRecord Then aMax:=DataSet.FActiveRecord;\r\n\r\n If FFirstRecord < aMin Then FFirstRecord:= aMin;\r\n If FFirstrecord > aMax Then FFirstRecord:= aMax;\r\n\r\n If (FfirstRecord<>0) And\r\n (DataSet.FActiveRecord - FFirstRecord < FBufferCount -1) Then\r\n Dec(FFirstRecord, 1);\r\n\r\nend;\r\n\r\n\r\nProcedure TDataLink.DataEvent(Event: TDataEvent; Info: JSValue);\r\n\r\n\r\nbegin\r\n Case Event of\r\n deFieldChange, deRecordChange:\r\n If Not FUpdatingRecord then\r\n RecordChanged(TField(Info));\r\n deDataSetChange: begin\r\n SetActive(DataSource.DataSet.Active);\r\n CalcRange;\r\n CalcFirstRecord(Integer(Info));\r\n DatasetChanged;\r\n end;\r\n deDataSetScroll: DatasetScrolled(CalcFirstRecord(Integer(Info)));\r\n deLayoutChange: begin\r\n CalcFirstRecord(Integer(Info));\r\n LayoutChanged;\r\n end;\r\n deUpdateRecord: UpdateRecord;\r\n deUpdateState: CheckActiveAndEditing;\r\n deCheckBrowseMode: CheckBrowseMode;\r\n deFocusControl:\r\n FocusControl(Info);\r\n end;\r\nend;\r\n\r\n\r\nProcedure TDataLink.DataSetChanged;\r\n\r\nbegin\r\n RecordChanged(Nil);\r\nend;\r\n\r\n\r\nProcedure TDataLink.DataSetScrolled(Distance: Integer);\r\n\r\nbegin\r\n DataSetChanged;\r\nend;\r\n\r\n\r\nProcedure TDataLink.EditingChanged;\r\n\r\nbegin\r\nend;\r\n\r\n\r\nProcedure TDataLink.FocusControl(Field: JSValue);\r\n\r\nbegin\r\nend;\r\n\r\n\r\nFunction TDataLink.GetActiveRecord: Integer;\r\n\r\nbegin\r\n Result:=Dataset.FActiveRecord - FFirstRecord;\r\nend;\r\n\r\nFunction TDatalink.GetDataSet : TDataset;\r\n\r\nbegin\r\n If Assigned(Datasource) then\r\n Result:=DataSource.DataSet\r\n else\r\n Result:=Nil; \r\nend;\r\n\r\n\r\nFunction TDataLink.GetBOF: Boolean;\r\n\r\nbegin\r\n Result:=DataSet.BOF\r\nend;\r\n\r\n\r\nFunction TDataLink.GetBufferCount: Integer;\r\n\r\nbegin\r\n Result:=FBufferCount;\r\nend;\r\n\r\n\r\nFunction TDataLink.GetEOF: Boolean;\r\n\r\nbegin\r\n Result:=DataSet.EOF\r\nend;\r\n\r\n\r\nFunction TDataLink.GetRecordCount: Integer;\r\n\r\nbegin\r\n Result:=Dataset.FRecordCount;\r\n If Result>BufferCount then\r\n Result:=BufferCount;\r\nend;\r\n\r\n\r\nProcedure TDataLink.LayoutChanged;\r\n\r\nbegin\r\n DataSetChanged;\r\nend;\r\n\r\n\r\nFunction TDataLink.MoveBy(Distance: Integer): Integer;\r\n\r\nbegin\r\n Result:=DataSet.MoveBy(Distance);\r\nend;\r\n\r\n\r\nProcedure TDataLink.RecordChanged(Field: TField);\r\n\r\nbegin\r\nend;\r\n\r\n\r\nProcedure TDataLink.SetActiveRecord(Value: Integer);\r\n\r\nbegin\r\n{$ifdef dsdebug}\r\n Writeln('Datalink. Setting active record to ',Value,' with firstrecord ',ffirstrecord);\r\n{$endif}\r\n Dataset.FActiveRecord:=Value + FFirstRecord;\r\nend;\r\n\r\n\r\nProcedure TDataLink.SetBufferCount(Value: Integer);\r\n\r\nbegin\r\n If FBufferCount<>Value then\r\n begin\r\n FBufferCount:=Value;\r\n if Active then begin\r\n DataSet.RecalcBufListSize;\r\n CalcRange;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TDataLink.SetActive(AActive: Boolean);\r\nbegin\r\n if Active <> AActive then\r\n begin\r\n FActive := AActive;\r\n // !!!: Set internal state\r\n ActiveChanged;\r\n end;\r\nend;\r\n\r\nProcedure TDataLink.SetDataSource(Value : TDatasource);\r\n\r\nbegin\r\n if FDataSource = Value then\r\n Exit;\r\n if not FDataSourceFixed then\r\n begin\r\n if Assigned(DataSource) then\r\n Begin\r\n DataSource.UnregisterDatalink(Self);\r\n FDataSource := nil;\r\n CheckActiveAndEditing;\r\n End;\r\n FDataSource := Value;\r\n if Assigned(DataSource) then\r\n begin\r\n DataSource.RegisterDatalink(Self);\r\n CheckActiveAndEditing;\r\n End;\r\n end;\r\nend;\r\n\r\nProcedure TDatalink.SetReadOnly(Value : Boolean);\r\n\r\nbegin\r\n If FReadOnly<>Value then\r\n begin\r\n FReadOnly:=Value;\r\n CheckActiveAndEditing;\r\n end;\r\nend;\r\n\r\nProcedure TDataLink.UpdateData;\r\n\r\nbegin\r\nend;\r\n\r\n\r\n\r\nFunction TDataLink.Edit: Boolean;\r\n\r\nbegin\r\n If Not FReadOnly then\r\n DataSource.Edit;\r\n // Triggered event will set FEditing\r\n Result:=FEditing;\r\nend;\r\n\r\n\r\nProcedure TDataLink.UpdateRecord;\r\n\r\nbegin\r\n FUpdatingRecord:=True;\r\n Try\r\n UpdateData;\r\n finally\r\n FUpdatingRecord:=False;\r\n end;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TDetailDataLink\r\n ---------------------------------------------------------------------}\r\n\r\nFunction TDetailDataLink.GetDetailDataSet: TDataSet;\r\n\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\n\r\n{ ---------------------------------------------------------------------\r\n TMasterDataLink\r\n ---------------------------------------------------------------------}\r\n\r\nconstructor TMasterDataLink.Create(ADataSet: TDataSet);\r\n\r\nbegin\r\n inherited Create;\r\n FDetailDataSet:=ADataSet;\r\n FFields:=TList.Create;\r\nend;\r\n\r\n\r\ndestructor TMasterDataLink.Destroy;\r\n\r\nbegin\r\n FFields.Free;\r\n inherited Destroy;\r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.ActiveChanged;\r\n\r\nbegin\r\n FFields.Clear;\r\n if Active then\r\n try\r\n DataSet.GetFieldList(FFields, FFieldNames);\r\n except\r\n FFields.Clear;\r\n raise;\r\n end;\r\n if FDetailDataSet.Active and not (csDestroying in FDetailDataSet.ComponentState) then\r\n if Active and (FFields.Count > 0) then\r\n DoMasterChange\r\n else\r\n DoMasterDisable; \r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.CheckBrowseMode;\r\n\r\nbegin\r\n if FDetailDataSet.Active then FDetailDataSet.CheckBrowseMode;\r\nend;\r\n\r\n\r\nFunction TMasterDataLink.GetDetailDataSet: TDataSet;\r\n\r\nbegin\r\n Result := FDetailDataSet;\r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.LayoutChanged;\r\n\r\nbegin\r\n ActiveChanged;\r\nend;\r\n\r\n\r\nProcedure TMasterDataLink.RecordChanged(Field: TField);\r\n\r\nbegin\r\n if (DataSource.State <> dsSetKey) and FDetailDataSet.Active and\r\n (FFields.Count > 0) and ((Field = nil) or\r\n (FFields.IndexOf(Field) >= 0)) then\r\n DoMasterChange; \r\nend;\r\n\r\nprocedure TMasterDatalink.SetFieldNames(const Value: string);\r\n\r\nbegin\r\n if FFieldNames <> Value then\r\n begin\r\n FFieldNames := Value;\r\n ActiveChanged;\r\n end;\r\nend;\r\n\r\nProcedure TMasterDataLink.DoMasterDisable; \r\n\r\nbegin\r\n if Assigned(FOnMasterDisable) then \r\n FOnMasterDisable(Self);\r\nend;\r\n\r\nProcedure TMasterDataLink.DoMasterChange; \r\n\r\nbegin\r\n If Assigned(FOnMasterChange) then\r\n FOnMasterChange(Self);\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TMasterParamsDataLink\r\n ---------------------------------------------------------------------}\r\n\r\nconstructor TMasterParamsDataLink.Create(ADataSet: TDataSet);\r\n\r\nVar\r\n P : TParams;\r\n\r\nbegin\r\n inherited Create(ADataset);\r\n If (ADataset<>Nil) then\r\n begin\r\n P:=TParams(GetObjectProp(ADataset,'Params',TParams));\r\n if (P<>Nil) then\r\n Params:=P;\r\n end; \r\nend;\r\n\r\n\r\nProcedure TMasterParamsDataLink.SetParams(AValue : TParams);\r\n\r\nbegin\r\n FParams:=AValue;\r\n If (AValue<>Nil) then\r\n RefreshParamNames;\r\nend;\r\n\r\nProcedure TMasterParamsDataLink.RefreshParamNames; \r\n\r\nVar\r\n FN : String;\r\n DS : TDataset;\r\n F : TField;\r\n I : Integer;\r\n P : TParam;\r\n\r\n\r\nbegin\r\n FN:='';\r\n DS:=Dataset;\r\n If Assigned(FParams) then\r\n begin\r\n F:=Nil;\r\n For I:=0 to FParams.Count-1 do\r\n begin\r\n P:=FParams[i];\r\n if not P.Bound then\r\n begin\r\n If Assigned(DS) then\r\n F:=DS.FindField(P.Name);\r\n If (Not Assigned(DS)) or (not DS.Active) or (F<>Nil) then\r\n begin\r\n If (FN<>'') then\r\n FN:=FN+';';\r\n FN:=FN+P.Name;\r\n end;\r\n end;\r\n end;\r\n end;\r\n FieldNames:=FN; \r\nend;\r\n\r\nProcedure TMasterParamsDataLink.CopyParamsFromMaster(CopyBound : Boolean);\r\n\r\nbegin\r\n if Assigned(FParams) then\r\n FParams.CopyParamValuesFromDataset(Dataset,CopyBound);\r\nend;\r\n\r\nProcedure TMasterParamsDataLink.DoMasterDisable; \r\n\r\nbegin\r\n Inherited;\r\n // If master dataset is closing, leave detail dataset intact (Delphi compatible behavior)\r\n // If master dataset is reopened, relationship will be reestablished\r\nend;\r\n\r\nProcedure TMasterParamsDataLink.DoMasterChange; \r\n\r\nbegin\r\n Inherited;\r\n if Assigned(Params) and Assigned(DetailDataset) and DetailDataset.Active then\r\n begin\r\n DetailDataSet.CheckBrowseMode;\r\n DetailDataset.Close;\r\n DetailDataset.Open;\r\n end;\r\nend;\r\n\r\n{ ---------------------------------------------------------------------\r\n TDatasource\r\n ---------------------------------------------------------------------}\r\n\r\nConstructor TDataSource.Create(AOwner: TComponent);\r\n\r\nbegin\r\n Inherited Create(AOwner);\r\n FDatalinks := TList.Create;\r\n FEnabled := True;\r\n FAutoEdit := True;\r\nend;\r\n\r\n\r\nDestructor TDataSource.Destroy;\r\n\r\nbegin\r\n FOnStateCHange:=Nil;\r\n Dataset:=Nil;\r\n With FDataLinks do\r\n While Count>0 do\r\n TDatalink(Items[Count - 1]).DataSource:=Nil;\r\n FDatalinks.Free;\r\n inherited Destroy;\r\nend;\r\n\r\n\r\nProcedure TDatasource.Edit;\r\n\r\nbegin\r\n If (State=dsBrowse) and AutoEdit Then\r\n Dataset.Edit;\r\nend;\r\n\r\n\r\nFunction TDataSource.IsLinkedTo(ADataSet: TDataSet): Boolean;\r\n\r\nbegin\r\n Result:=False;\r\nend;\r\n\r\n\r\nprocedure TDatasource.DistributeEvent(Event: TDataEvent; Info: JSValue);\r\n\r\n\r\nVar\r\n i : Longint;\r\n\r\nbegin\r\n With FDatalinks do\r\n begin\r\n For I:=0 to Count-1 do\r\n With TDatalink(Items[i]) do\r\n If Not VisualControl Then\r\n DataEvent(Event,Info);\r\n For I:=0 to Count-1 do\r\n With TDatalink(Items[i]) do\r\n If VisualControl Then\r\n DataEvent(Event,Info);\r\n end;\r\nend;\r\n\r\nprocedure TDatasource.RegisterDataLink(DataLink: TDataLink);\r\n\r\nbegin\r\n FDatalinks.Add(DataLink);\r\n if Assigned(DataSet) then\r\n DataSet.RecalcBufListSize;\r\nend;\r\n\r\n\r\nprocedure TDatasource.SetDataSet(ADataSet: TDataSet);\r\nbegin\r\n If FDataset<>Nil Then\r\n Begin\r\n FDataset.UnRegisterDataSource(Self);\r\n FDataSet:=nil;\r\n ProcessEvent(deUpdateState,0);\r\n End;\r\n If ADataset<>Nil Then\r\n begin\r\n ADataset.RegisterDatasource(Self);\r\n FDataSet:=ADataset;\r\n ProcessEvent(deUpdateState,0);\r\n End;\r\nend;\r\n\r\n\r\nprocedure TDatasource.SetEnabled(Value: Boolean);\r\n\r\nbegin\r\n FEnabled:=Value;\r\nend;\r\n\r\n\r\nProcedure TDatasource.DoDataChange (Info : Pointer);\r\n\r\nbegin\r\n If Assigned(OnDataChange) Then\r\n OnDataChange(Self,TField(Info));\r\nend;\r\n\r\nProcedure TDatasource.DoStateChange;\r\n\r\nbegin\r\n If Assigned(OnStateChange) Then\r\n OnStateChange(Self);\r\nend;\r\n\r\n\r\nProcedure TDatasource.DoUpdateData;\r\n\r\nbegin\r\n If Assigned(OnUpdateData) Then\r\n OnUpdateData(Self);\r\nend;\r\n\r\n\r\nprocedure TDatasource.UnregisterDataLink(DataLink: TDataLink);\r\n\r\nbegin\r\n FDatalinks.Remove(Datalink);\r\n If Dataset<>Nil then\r\n DataSet.RecalcBufListSize;\r\n //Dataset.SetBufListSize(DataLink.BufferCount);\r\nend;\r\n\r\n\r\nprocedure TDataSource.ProcessEvent(Event : TDataEvent; Info : JSValue);\r\n\r\nConst\r\n OnDataChangeEvents = [deRecordChange, deDataSetChange, deDataSetScroll,\r\n deLayoutChange,deUpdateState];\r\n\r\nVar\r\n NeedDataChange : Boolean;\r\n FLastState : TdataSetState;\r\n\r\nbegin\r\n // Special UpdateState handling.\r\n If Event=deUpdateState then\r\n begin\r\n NeedDataChange:=(FState=dsInactive);\r\n FLastState:=FState;\r\n If Assigned(Dataset) then\r\n FState:=Dataset.State\r\n else\r\n FState:=dsInactive;\r\n // Don't do events if nothing changed.\r\n If FState=FLastState then\r\n exit;\r\n end\r\n else\r\n NeedDataChange:=True;\r\n DistributeEvent(Event,Info);\r\n // Extra handlers\r\n If Not (csDestroying in ComponentState) then\r\n begin\r\n If (Event=deUpdateState) then\r\n DoStateChange;\r\n If (Event in OnDataChangeEvents) and\r\n NeedDataChange Then\r\n DoDataChange(Nil);\r\n If (Event = deFieldChange) Then\r\n DoDataCHange(Pointer(Info));\r\n If (Event=deUpdateRecord) then\r\n DoUpdateData;\r\n end;\r\n end;\r\n\r\n\r\nprocedure SkipQuotesString(S : String; var p : integer; QuoteChar : char; EscapeSlash, EscapeRepeat : Boolean);\r\n\r\nvar notRepeatEscaped : boolean;\r\nbegin\r\n Inc(p);\r\n repeat\r\n notRepeatEscaped := True;\r\n while not CharInSet(S[p],[#0, QuoteChar]) do\r\n begin\r\n if EscapeSlash and (S[p]='\\') and (P=0) do\r\n If (CompareText(Value,Items[i].Name)=0) then\r\n Result:=Items[i]\r\n else\r\n Dec(i);\r\nend;\r\n\r\nProcedure TParams.GetParamList(List: TList; const ParamNames: string);\r\n\r\nVar\r\n P: TParam;\r\n N: String;\r\n StrPos: Integer;\r\n\r\nbegin\r\n if (ParamNames = '') or (List = nil) then\r\n Exit;\r\n StrPos := 1;\r\n repeat\r\n N := ExtractFieldName(ParamNames, StrPos);\r\n P := ParamByName(N);\r\n List.Add(P);\r\n until StrPos > Length(ParamNames);\r\nend;\r\n\r\nFunction TParams.IsEqual(Value: TParams): Boolean;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n Result:=(Value.Count=Count);\r\n I:=Count-1;\r\n While Result and (I>=0) do\r\n begin\r\n Result:=Items[I].IsEqual(Value[i]);\r\n Dec(I);\r\n end;\r\nend;\r\n\r\nFunction TParams.ParamByName(const Value: string): TParam;\r\nbegin\r\n Result:=FindParam(Value);\r\n If (Result=Nil) then\r\n DatabaseErrorFmt(SParameterNotFound,[Value],Dataset);\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate: Boolean): String;\r\n\r\nvar pb : TParamBinding;\r\n rs : string;\r\n\r\nbegin\r\n Result := ParseSQL(SQL,DoCreate,True,True,psInterbase, pb, rs);\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate, EscapeSlash,\r\n EscapeRepeat: Boolean; ParameterStyle: TParamStyle): String;\r\n\r\nvar pb : TParamBinding;\r\n rs : string;\r\n\r\nbegin\r\n Result := ParseSQL(SQL,DoCreate,EscapeSlash,EscapeRepeat,ParameterStyle,pb, rs);\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate, EscapeSlash,\r\n EscapeRepeat: Boolean; ParameterStyle: TParamStyle; out\r\n ParamBinding: TParambinding): String;\r\n\r\nvar rs : string;\r\n\r\nbegin\r\n Result := ParseSQL(SQL,DoCreate,EscapeSlash, EscapeRepeat, ParameterStyle,ParamBinding, rs);\r\nend;\r\n\r\nfunction SkipComments(S : String; Var p: Integer; EscapeSlash, EscapeRepeat : Boolean) : Boolean;\r\n\r\nbegin\r\n Result := False;\r\n case S[P] of\r\n '''', '\"', '`':\r\n begin\r\n Result := True;\r\n // single quote, double quote or backtick delimited string\r\n SkipQuotesString(S,p, S[p], EscapeSlash, EscapeRepeat);\r\n end;\r\n '-': // possible start of -- comment\r\n begin\r\n Inc(p);\r\n if S[p]='-' then // -- comment\r\n begin\r\n Result := True;\r\n repeat // skip until at end of line\r\n Inc(p);\r\n until CharInset(S[p],[#10, #13, #0]);\r\n while CharInSet(S[p],[#10, #13]) do\r\n Inc(p); // newline is part of comment\r\n end;\r\n end;\r\n '/': // possible start of /* */ comment\r\n begin\r\n Inc(p);\r\n if S[p]='*' then // /* */ comment\r\n begin\r\n Result := True;\r\n Inc(p);\r\n while p<=Length(S) do\r\n begin\r\n if S[p]='*' then // possible end of comment\r\n begin\r\n Inc(p);\r\n if S[p]='/' then Break; // end of comment\r\n end\r\n else\r\n Inc(p);\r\n end;\r\n if (P<=Length(s)) and (S[p]='/') then\r\n Inc(p); // skip final /\r\n end;\r\n end;\r\n end; {case}\r\nend;\r\n\r\nFunction TParams.ParseSQL(SQL: String; DoCreate, EscapeSlash,\r\n EscapeRepeat: Boolean; ParameterStyle: TParamStyle; out\r\n ParamBinding: TParambinding; out ReplaceString: string): String;\r\n\r\ntype\r\n // used for ParamPart\r\n TStringPart = record\r\n Start,Stop:integer;\r\n end;\r\n\r\nconst\r\n ParamAllocStepSize = 8;\r\n PAramDelimiters : Array of char = (';',',',' ','(',')',#13,#10,#9,#0,'=','+','-','*','\\','/','[',']','|');\r\n\r\nvar\r\n IgnorePart:boolean;\r\n p,ParamNameStart,BufStart:Integer;\r\n ParamName:string;\r\n QuestionMarkParamCount,ParameterIndex,NewLength:integer;\r\n ParamCount:integer; // actual number of parameters encountered so far;\r\n // always <= Length(ParamPart) = Length(Parambinding)\r\n // Parambinding will have length ParamCount in the end\r\n ParamPart:array of TStringPart; // describe which parts of buf are parameters\r\n NewQueryLength:integer;\r\n NewQuery:string;\r\n NewQueryIndex,BufIndex,CopyLen,i:integer; // Parambinding will have length ParamCount in the end\r\n tmpParam:TParam;\r\n\r\nbegin\r\n if DoCreate then Clear;\r\n // Parse the SQL and build ParamBinding\r\n ParamCount:=0;\r\n NewQueryLength:=Length(SQL);\r\n SetLength(ParamPart,ParamAllocStepSize);\r\n SetLength(ParamBinding,ParamAllocStepSize);\r\n QuestionMarkParamCount:=0; // number of ? params found in query so far\r\n\r\n ReplaceString := '$';\r\n if ParameterStyle = psSimulated then\r\n while pos(ReplaceString,SQL) > 0 do ReplaceString := ReplaceString+'$';\r\n\r\n p:=1;\r\n BufStart:=p; // used to calculate ParamPart.Start values\r\n repeat\r\n while SkipComments(SQL,p,EscapeSlash,EscapeRepeat) do ;\r\n case SQL[p] of\r\n ':','?': // parameter\r\n begin\r\n IgnorePart := False;\r\n if SQL[p]=':' then\r\n begin // find parameter name\r\n Inc(p);\r\n if charInSet(SQL[p],[':','=',' ']) then // ignore ::, since some databases uses this as a cast (wb 4813)\r\n begin\r\n IgnorePart := True;\r\n Inc(p);\r\n end\r\n else\r\n begin\r\n if (SQL[p]='\"') then // Check if the parameter-name is between quotes\r\n begin\r\n ParamNameStart:=p;\r\n SkipQuotesString(SQL,p,'\"',EscapeSlash,EscapeRepeat);\r\n // Do not include the quotes in ParamName, but they must be included\r\n // when the parameter is replaced by some place-holder.\r\n ParamName:=Copy(SQL,ParamNameStart+1,p-ParamNameStart-2);\r\n end\r\n else\r\n begin\r\n ParamNameStart:=p;\r\n while not CharInSet(SQL[p], ParamDelimiters) do\r\n Inc(p);\r\n ParamName:=Copy(SQL,ParamNameStart,p-ParamNameStart);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n Inc(p);\r\n ParamNameStart:=p;\r\n ParamName:='';\r\n end;\r\n if not IgnorePart then\r\n begin\r\n Inc(ParamCount);\r\n if ParamCount>Length(ParamPart) then\r\n begin\r\n NewLength:=Length(ParamPart)+ParamAllocStepSize;\r\n SetLength(ParamPart,NewLength);\r\n SetLength(ParamBinding,NewLength);\r\n end;\r\n if DoCreate then\r\n begin\r\n // Check if this is the first occurance of the parameter\r\n tmpParam := FindParam(ParamName);\r\n // If so, create the parameter and assign the Parameterindex\r\n if not assigned(tmpParam) then\r\n ParameterIndex := CreateParam(ftUnknown, ParamName, ptInput).Index\r\n else // else only assign the ParameterIndex\r\n ParameterIndex := tmpParam.Index;\r\n end\r\n // else find ParameterIndex\r\n else\r\n begin\r\n if ParamName<>'' then\r\n ParameterIndex:=ParamByName(ParamName).Index\r\n else\r\n begin\r\n ParameterIndex:=QuestionMarkParamCount;\r\n Inc(QuestionMarkParamCount);\r\n end;\r\n end;\r\n if ParameterStyle in [psPostgreSQL,psSimulated] then\r\n begin\r\n i:=ParameterIndex+1;\r\n repeat\r\n inc(NewQueryLength);\r\n i:=i div 10;\r\n until i=0;\r\n end;\r\n // store ParameterIndex in FParamIndex, ParamPart data\r\n ParamBinding[ParamCount-1]:=ParameterIndex;\r\n ParamPart[ParamCount-1].Start:=ParamNameStart-BufStart;\r\n ParamPart[ParamCount-1].Stop:=p-BufStart+1;\r\n // update NewQueryLength\r\n Dec(NewQueryLength,p-ParamNameStart);\r\n end;\r\n end;\r\n #0:\r\n Break; // end of SQL\r\n else\r\n Inc(p);\r\n end;\r\n until false;\r\n SetLength(ParamPart,ParamCount);\r\n SetLength(ParamBinding,ParamCount);\r\n if ParamCount<=0 then\r\n NewQuery:=SQL\r\n else\r\n begin\r\n // replace :ParamName by ? for interbase and by $x for postgresql/psSimulated\r\n // (using ParamPart array and NewQueryLength)\r\n if (ParameterStyle = psSimulated) and (length(ReplaceString) > 1) then\r\n inc(NewQueryLength,(paramcount)*(length(ReplaceString)-1));\r\n\r\n SetLength(NewQuery,NewQueryLength);\r\n NewQueryIndex:=1;\r\n BufIndex:=1;\r\n for i:=0 to High(ParamPart) do\r\n begin\r\n CopyLen:=ParamPart[i].Start-BufIndex;\r\n NewQuery:=NewQuery+Copy(SQL,BufIndex,CopyLen);\r\n Inc(NewQueryIndex,CopyLen);\r\n case ParameterStyle of\r\n psInterbase : begin\r\n NewQuery:=NewQuery+'?';\r\n Inc(NewQueryIndex);\r\n end;\r\n psPostgreSQL,\r\n psSimulated : begin\r\n ParamName := IntToStr(ParamBinding[i]+1);\r\n NewQuery:=StringOfChar('$',Length(ReplaceString));\r\n NewQuery:=NewQuery+ParamName;\r\n end;\r\n end;\r\n BufIndex:=ParamPart[i].Stop;\r\n end;\r\n CopyLen:=Length(SQL)+1-BufIndex;\r\n if (CopyLen>0) then\r\n NewQuery:=NewQuery+Copy(SQL,BufIndex,CopyLen);\r\n end;\r\n Result:=NewQuery;\r\nend;\r\n\r\n\r\nProcedure TParams.RemoveParam(Value: TParam);\r\nbegin\r\n Value.Collection:=Nil;\r\nend;\r\n\r\n{ TParam }\r\n\r\nFunction TParam.GetDataSet: TDataSet;\r\nbegin\r\n If Assigned(Collection) and (Collection is TParams) then\r\n Result:=TParams(Collection).GetDataset\r\n else\r\n Result:=Nil;\r\nend;\r\n\r\nFunction TParam.IsParamStored: Boolean;\r\nbegin\r\n Result:=Bound;\r\nend;\r\n\r\nprocedure TParam.SetAsBytes(AValue: TBlobData);\r\nbegin\r\n FValue:=TDataset.DefaultBytesToBlobData(aValue);\r\nend;\r\n\r\nProcedure TParam.AssignParam(Param: TParam);\r\nbegin\r\n if Not Assigned(Param) then\r\n begin\r\n Clear;\r\n FDataType:=ftunknown;\r\n FParamType:=ptUnknown;\r\n Name:='';\r\n Size:=0;\r\n Precision:=0;\r\n NumericScale:=0;\r\n end\r\n else\r\n begin\r\n FDataType:=Param.DataType;\r\n if Param.IsNull then\r\n Clear\r\n else\r\n FValue:=Param.FValue;\r\n FBound:=Param.Bound;\r\n Name:=Param.Name;\r\n if (ParamType=ptUnknown) then\r\n ParamType:=Param.ParamType;\r\n Size:=Param.Size;\r\n Precision:=Param.Precision;\r\n NumericScale:=Param.NumericScale;\r\n end;\r\nend;\r\n\r\nProcedure TParam.AssignTo(Dest: TPersistent);\r\nbegin\r\n if (Dest is TField) then\r\n AssignToField(TField(Dest))\r\n else\r\n inherited AssignTo(Dest);\r\nend;\r\n\r\nFunction TParam.GetAsBoolean: Boolean;\r\nbegin\r\n If IsNull then\r\n Result:=False\r\n else\r\n Result:=FValue=true;\r\nend;\r\n\r\nFunction TParam.GetAsBytes: TBytes;\r\nbegin\r\n if IsNull then\r\n Result:=nil\r\n else if isArray(FValue) then\r\n Result:=TBytes(FValue)\r\nend;\r\n\r\nFunction TParam.GetAsDateTime: TDateTime;\r\nbegin\r\n If IsNull then\r\n Result:=0.0\r\n else\r\n Result:=TDateTime(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsFloat: Double;\r\nbegin\r\n If IsNull then\r\n Result:=0.0\r\n else\r\n Result:=Double(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsInteger: Longint;\r\nbegin\r\n If IsNull or not IsInteger(FValue) then\r\n Result:=0\r\n else\r\n Result:=Integer(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsLargeInt: NativeInt;\r\nbegin\r\n If IsNull or not IsInteger(FValue) then\r\n Result:=0\r\n else\r\n Result:=NativeInt(FValue);\r\nend;\r\n\r\n\r\nFunction TParam.GetAsMemo: string;\r\nbegin\r\n If IsNull or not IsString(FValue) then\r\n Result:=''\r\n else\r\n Result:=String(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsString: string;\r\n\r\nbegin\r\n If IsNull or not IsString(FValue) then\r\n Result:=''\r\n else\r\n Result:=String(FValue);\r\nend;\r\n\r\nFunction TParam.GetAsJSValue: JSValue;\r\nbegin\r\n if IsNull then\r\n Result:=Null\r\n else\r\n Result:=FValue;\r\nend;\r\nFunction TParam.GetDisplayName: string;\r\nbegin\r\n if (FName<>'') then\r\n Result:=FName\r\n else\r\n Result:=inherited GetDisplayName\r\nend;\r\n\r\nFunction TParam.GetIsNull: Boolean;\r\nbegin\r\n Result:= JS.IsNull(FValue);\r\nend;\r\n\r\nFunction TParam.IsEqual(AValue: TParam): Boolean;\r\nbegin\r\n Result:=(Name=AValue.Name)\r\n and (IsNull=AValue.IsNull)\r\n and (Bound=AValue.Bound)\r\n and (DataType=AValue.DataType)\r\n and (ParamType=AValue.ParamType)\r\n and (GetValueType(FValue)=GetValueType(AValue.FValue))\r\n and (FValue=AValue.FValue);\r\nend;\r\n\r\nProcedure TParam.SetAsBlob(const AValue: TBlobData);\r\nbegin\r\n FDataType:=ftBlob;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsBoolean(AValue: Boolean);\r\nbegin\r\n FDataType:=ftBoolean;\r\n Value:=AValue;\r\nend;\r\n\r\nprocedure TParam.SetAsBytes(const AValue: TBytes);\r\nbegin\r\n\r\nend;\r\n\r\nProcedure TParam.SetAsDate(const AValue: TDateTime);\r\nbegin\r\n FDataType:=ftDate;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsDateTime(const AValue: TDateTime);\r\nbegin\r\n FDataType:=ftDateTime;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsFloat(const AValue: Double);\r\nbegin\r\n FDataType:=ftFloat;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsInteger(AValue: Longint);\r\nbegin\r\n FDataType:=ftInteger;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsLargeInt(AValue: NativeInt);\r\nbegin\r\n FDataType:=ftLargeint;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsMemo(const AValue: string);\r\nbegin\r\n FDataType:=ftMemo;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsString(const AValue: string);\r\nbegin\r\n if FDataType <> ftFixedChar then\r\n FDataType := ftString;\r\n Value:=AValue;\r\nend;\r\n\r\n\r\nProcedure TParam.SetAsTime(const AValue: TDateTime);\r\nbegin\r\n FDataType:=ftTime;\r\n Value:=AValue;\r\nend;\r\n\r\nProcedure TParam.SetAsJSValue(const AValue: JSValue);\r\n\r\nbegin\r\n FValue:=AValue;\r\n FBound:=not JS.IsNull(AValue);\r\n if FBound then\r\n case GetValueType(aValue) of\r\n jvtBoolean : FDataType:=ftBoolean;\r\n jvtInteger : FDataType:=ftInteger;\r\n jvtFloat : FDataType:=ftFloat;\r\n jvtObject,jvtArray : FDataType:=ftBlob;\r\n end;\r\nend;\r\n\r\nProcedure TParam.SetDataType(AValue: TFieldType);\r\n\r\n\r\nbegin\r\n FDataType:=AValue;\r\n\r\nend;\r\n\r\nProcedure TParam.SetText(const AValue: string);\r\nbegin\r\n Value:=AValue;\r\nend;\r\n\r\nconstructor TParam.Create(ACollection: TCollection);\r\nbegin\r\n inherited Create(ACollection);\r\n ParamType:=ptUnknown;\r\n DataType:=ftUnknown;\r\n FValue:=Null;\r\nend;\r\n\r\nconstructor TParam.Create(AParams: TParams; AParamType: TParamType);\r\nbegin\r\n Create(AParams);\r\n ParamType:=AParamType;\r\nend;\r\n\r\nProcedure TParam.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TParam) then\r\n AssignParam(TParam(Source))\r\n else if (Source is TField) then\r\n AssignField(TField(Source))\r\n else if (source is TStrings) then\r\n AsMemo:=TStrings(Source).Text\r\n else\r\n inherited Assign(Source);\r\nend;\r\n\r\nProcedure TParam.AssignField(Field: TField);\r\nbegin\r\n if Assigned(Field) then\r\n begin\r\n // Need TField.Value\r\n AssignFieldValue(Field,Field.Value);\r\n Name:=Field.FieldName;\r\n end\r\n else\r\n begin\r\n Clear;\r\n Name:='';\r\n end\r\nend;\r\n\r\nProcedure TParam.AssignToField(Field : TField);\r\n\r\nbegin\r\n if Assigned(Field) then\r\n case FDataType of\r\n ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);\r\n // Need TField.AsSmallInt\r\n // Need TField.AsWord\r\n ftInteger,\r\n ftAutoInc : Field.AsInteger:=AsInteger;\r\n ftFloat : Field.AsFloat:=AsFloat;\r\n ftBoolean : Field.AsBoolean:=AsBoolean;\r\n ftBlob,\r\n ftString,\r\n ftMemo,\r\n ftFixedChar: Field.AsString:=AsString;\r\n ftTime,\r\n ftDate,\r\n ftDateTime : Field.AsDateTime:=AsDateTime;\r\n end;\r\nend;\r\n\r\nProcedure TParam.AssignFromField(Field : TField);\r\n\r\nbegin\r\n if Assigned(Field) then\r\n begin\r\n FDataType:=Field.DataType;\r\n case Field.DataType of\r\n ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);\r\n ftInteger,\r\n ftAutoInc : AsInteger:=Field.AsInteger;\r\n ftFloat : AsFloat:=Field.AsFloat;\r\n ftBoolean : AsBoolean:=Field.AsBoolean;\r\n ftBlob,\r\n ftString,\r\n ftMemo,\r\n ftFixedChar: AsString:=Field.AsString;\r\n ftTime,\r\n ftDate,\r\n ftDateTime : AsDateTime:=Field.AsDateTime;\r\n end;\r\n end;\r\nend;\r\n\r\nProcedure TParam.AssignFieldValue(Field: TField; const AValue: JSValue);\r\n\r\nbegin\r\n If Assigned(Field) then\r\n begin\r\n\r\n if (Field.DataType = ftString) and TStringField(Field).FixedChar then\r\n FDataType := ftFixedChar\r\n else if (Field.DataType = ftMemo) and (Field.Size > 255) then\r\n FDataType := ftString\r\n else\r\n FDataType := Field.DataType;\r\n if JS.IsNull(AValue) then\r\n Clear\r\n else\r\n Value:=AValue;\r\n\r\n Size:=Field.DataSize;\r\n FBound:=True;\r\n\r\n end;\r\nend;\r\n\r\nProcedure TParam.Clear;\r\nbegin\r\n FValue:=Null;\r\nend;\r\n\r\n\r\nProcedure TParams.CopyParamValuesFromDataset(ADataSet: TDataSet;\r\n CopyBound: Boolean);\r\n\r\nVar\r\n I : Integer;\r\n P : TParam;\r\n F : TField;\r\n\r\nbegin\r\n If assigned(ADataSet) then\r\n For I:=0 to Count-1 do\r\n begin\r\n P:=Items[i];\r\n if CopyBound or (not P.Bound) then\r\n begin\r\n // Master dataset must be active and unbound parameters must have fields\r\n // with same names in master dataset (Delphi compatible behavior)\r\n F:=ADataSet.FieldByName(P.Name);\r\n P.AssignField(F);\r\n If Not CopyBound then\r\n P.Bound:=False;\r\n end;\r\n end;\r\nend;\r\n\r\ninitialization\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCKanbanBoardDatabaseAdapter;\r\n\r\ninterface\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF WEBLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF LCLLIB}\r\n{$DEFINE LCLWEBLIB}\r\n{$ENDIF}\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCKanbanBoard, {%H-}WEBLib.TMSFNCTypes, SysUtils\r\n {$IFDEF LCLWEBLIB}\r\n , DB\r\n {$ENDIF}\r\n {$IFNDEF LCLWEBLIB}\r\n , Data.DB\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 1; // Build nr.\r\n\r\n // version history\r\n // v1.0.0.0 : first release\r\n // v1.0.0.1 : Fixed : Issue with access violation during scrolling in combination with TDBGrid\r\n\r\ntype\r\n TTMSFNCKanbanBoardDatabaseAdapterItemSource = class;\r\n\r\n TTMSFNCKanbanBoardDatabaseAdapter = class;\r\n\r\n TTMSFNCKanbanBoardDatabaseAdapterItemDataLink = class(TDataLink)\r\n private\r\n FItem: TTMSFNCKanbanBoardDatabaseAdapterItemSource;\r\n protected\r\n procedure ActiveChanged; override;\r\n procedure DataSetChanged; override;\r\n procedure DataSetScrolled(Distance: Integer); override;\r\n procedure RecordChanged(Field: TField); override;\r\n function Adapter: TTMSFNCKanbanBoardAdapter;\r\n public\r\n constructor Create(AItem: TTMSFNCKanbanBoardDatabaseAdapterItemSource);\r\n destructor Destroy; override;\r\n end;\r\n\r\n TTMSFNCKanbanBoardDatabaseAdapterItemSource = class(TPersistent)\r\n private\r\n FUpdateCount: Integer;\r\n FDataLink: TTMSFNCKanbanBoardDatabaseAdapterItemDataLink;\r\n FAdapter: TTMSFNCKanbanBoardAdapter;\r\n FTitle: String;\r\n FText: String;\r\n FDBKey: String;\r\n FColumn: String;\r\n FAutoIncrementDBKey: Boolean;\r\n procedure SetText(const Value: String);\r\n procedure SetTitle(const Value: String);\r\n function GetDataSource: TDataSource;\r\n procedure SetDataSource(const Value: TDataSource);\r\n procedure SetDBKey(const Value: String);\r\n procedure SetColumn(const Value: String);\r\n procedure SetAutoIncrementDBKey(const Value: Boolean);\r\n protected\r\n function CheckDataSet: Boolean;\r\n procedure ClearItems(ADBKey: String; ADeleteItem: TTMSFNCKanbanBoardItem = nil);\r\n procedure DeleteItem(AItem: TTMSFNCKanbanBoardItem);\r\n procedure LocateItem(ADataSet: TDataSet; AItem: TTMSFNCKanbanBoardItem);\r\n procedure InsertItem(AItem: TTMSFNCKanbanBoardItem);\r\n procedure SelectItem(AItem: TTMSFNCKanbanBoardItem);\r\n procedure ReadItem(AItem: TTMSFNCKanbanBoardItem);\r\n procedure WriteItem(AItem: TTMSFNCKanbanBoardItem);\r\n procedure BeginUpdate; virtual;\r\n procedure EndUpdate; virtual;\r\n function IsUpdating: Boolean; virtual;\r\n public\r\n constructor Create(AAdapter: TTMSFNCKanbanBoardAdapter);\r\n procedure Assign(Source: TPersistent); override;\r\n destructor Destroy; override;\r\n published\r\n property DataSource: TDataSource read GetDataSource write SetDataSource;\r\n property Title: String read FTitle write SetTitle;\r\n property Text: String read FText write SetText;\r\n property Column: String read FColumn write SetColumn;\r\n property DBKey: String read FDBKey write SetDBKey;\r\n property AutoIncrementDBKey: Boolean read FAutoIncrementDBKey write SetAutoIncrementDBKey default True;\r\n end;\r\n\r\n TTMSFNCKanbanBoardDatabaseAdapterItemLocateEvent = procedure(Sender: TObject; AItem: TTMSFNCKanbanBoardItem) of object;\r\n TTMSFNCKanbanBoardDatabaseAdapterItemToFieldsEvent = procedure(Sender: TObject; AItem: TTMSFNCKanbanBoardItem; AFields: TFields) of object;\r\n TTMSFNCKanbanBoardDatabaseAdapterFieldsToItemEvent = procedure(Sender: TObject; AFields: TFields; AItem: TTMSFNCKanbanBoardItem) of object;\r\n TTMSFNCKanbanBoardDatabaseAdapterColumnToFieldsEvent = procedure(Sender: TObject; AColumn: Integer; AFields: TFields; AColumnField: TField) of object;\r\n TTMSFNCKanbanBoardDatabaseAdapterFieldsToColumnEvent = procedure(Sender: TObject; AFields: TFields; AColumnField: TField; var AColumn: Integer; var AAcceptItem: Boolean) of object;\r\n TTMSFNCKanbanBoardDatabaseAdapterItemCreateDBKeyEvent = procedure(Sender: TObject; AItem: TTMSFNCKanbanBoardItem; var ADBKey: string) of object;\r\n TTMSFNCKanbanBoardDatabaseAdapterItemEvent = procedure(Sender: TObject; AItem: TTMSFNCKanbanBoardItem) of object;\r\n TTMSFNCKanbanBoardDatabaseAdapterItemsLoadedEvent = TNotifyEvent;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCKanbanBoardDatabaseAdapter = class(TTMSFNCKanbanBoardAdapter)\r\n private\r\n FItem: TTMSFNCKanbanBoardDatabaseAdapterItemSource;\r\n FOnFieldsToItem: TTMSFNCKanbanBoardDatabaseAdapterFieldsToItemEvent;\r\n FOnItemToFields: TTMSFNCKanbanBoardDatabaseAdapterItemToFieldsEvent;\r\n FOnItemCreateDBKey: TTMSFNCKanbanBoardDatabaseAdapterItemCreateDBKeyEvent;\r\n FOnItemUpdated: TTMSFNCKanbanBoardDatabaseAdapterItemEvent;\r\n FOnItemsLoaded: TTMSFNCKanbanBoardDatabaseAdapterItemsLoadedEvent;\r\n FOnItemInserted: TTMSFNCKanbanBoardDatabaseAdapterItemEvent;\r\n FOnItemRead: TTMSFNCKanbanBoardDatabaseAdapterItemEvent;\r\n FOnFieldsToColumn: TTMSFNCKanbanBoardDatabaseAdapterFieldsToColumnEvent;\r\n FOnColumnToFields: TTMSFNCKanbanBoardDatabaseAdapterColumnToFieldsEvent;\r\n FOnItemLocate: TTMSFNCKanbanBoardDatabaseAdapterItemLocateEvent;\r\n procedure SetItem(const Value: TTMSFNCKanbanBoardDatabaseAdapterItemSource);\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n procedure Notification(AComponent: TComponent; AOperation: TOperation); override;\r\n procedure CreateOrReadDBItem(AItem: TTMSFNCKanbanBoardItem = nil); virtual;\r\n procedure ClearDBItems(ADBKey: String; ADeleteItem: TTMSFNCKanbanBoardItem = nil);\r\n procedure ReadDBItem(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure WriteDBItem(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoItemToFields(AItem: TTMSFNCKanbanBoardItem; AFields: TFields); virtual;\r\n procedure DoColumnToFields(AColumn: Integer; AFields: TFields; AColumnField: TField); virtual;\r\n procedure DoFieldsToItem(AFields: TFields; AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoFieldsToColumn(AFields: TFields; AColumnField: TField; var AColumn: Integer; var AAcceptItem: Boolean); virtual;\r\n procedure DoItemCreateDBKey(AItem: TTMSFNCKanbanBoardItem; var ADBKey: String); virtual;\r\n procedure DoItemInserted(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoItemUpdated(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoItemRead(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure DoItemsLoaded; virtual;\r\n function CreateKey: string; virtual;\r\n function GetVersion: string; override;\r\n public\r\n procedure GetItems; override;\r\n procedure LoadItems; override;\r\n procedure DeleteItem(AItem: TTMSFNCKanbanBoardItem); override;\r\n procedure InsertItem(AItem: TTMSFNCKanbanBoardItem); override;\r\n procedure ReadItem(AItem: TTMSFNCKanbanBoardItem); virtual;\r\n procedure UpdateItem(AItem: TTMSFNCKanbanBoardItem); override;\r\n procedure AfterUpdateItem({%H-}AItem: TTMSFNCKanbanBoardItem); override;\r\n procedure SelectItem(AItem: TTMSFNCKanbanBoardItem); override;\r\n constructor Create(AOwner: TComponent); override;\r\n procedure Assign(Source: TPersistent); override;\r\n destructor Destroy; override;\r\n published\r\n property Version: string read GetVersion;\r\n property Item: TTMSFNCKanbanBoardDatabaseAdapterItemSource read FItem write SetItem;\r\n property OnItemToFields: TTMSFNCKanbanBoardDatabaseAdapterItemToFieldsEvent read FOnItemToFields write FOnItemToFields;\r\n property OnFieldsToItem: TTMSFNCKanbanBoardDatabaseAdapterFieldsToItemEvent read FOnFieldsToItem write FOnFieldsToItem;\r\n property OnItemLocate: TTMSFNCKanbanBoardDatabaseAdapterItemLocateEvent read FOnItemLocate write FOnItemLocate; \r\n property OnItemCreateDBKey: TTMSFNCKanbanBoardDatabaseAdapterItemCreateDBKeyEvent read FOnItemCreateDBKey write FOnItemCreateDBKey;\r\n property OnItemInserted: TTMSFNCKanbanBoardDatabaseAdapterItemEvent read FOnItemInserted write FOnItemInserted;\r\n property OnItemUpdated: TTMSFNCKanbanBoardDatabaseAdapterItemEvent read FOnItemUpdated write FOnItemUpdated;\r\n property OnItemRead: TTMSFNCKanbanBoardDatabaseAdapterItemEvent read FOnItemRead write FOnItemRead;\r\n property OnItemsLoaded: TTMSFNCKanbanBoardDatabaseAdapterItemsLoadedEvent read FOnItemsLoaded write FOnItemsLoaded;\r\n property OnColumnToFields: TTMSFNCKanbanBoardDatabaseAdapterColumnToFieldsEvent read FOnColumnToFields write FOnColumnToFields;\r\n property OnFieldsToColumn: TTMSFNCKanbanBoardDatabaseAdapterFieldsToColumnEvent read FOnFieldsToColumn write FOnFieldsToColumn;\r\n end;\r\n\r\nimplementation\r\n\r\n{$R TMSFNCKanbanBoardDatabaseAdapter.res}\r\n\r\nuses\r\n WEBLib.TMSFNCUtils;\r\n\r\ntype\r\n TTMSFNCCustomKanbanBoardOpen = class(TTMSFNCCustomKanbanBoard);\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.AfterUpdateItem(\r\n AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCKanbanBoardDatabaseAdapter then\r\n FItem.Assign((Source as TTMSFNCKanbanBoardDatabaseAdapter).Item);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.ClearDBItems(ADBKey: String; ADeleteItem: TTMSFNCKanbanBoardItem = nil);\r\nbegin\r\n if Assigned(FItem) then\r\n FItem.ClearItems(ADBKey, ADeleteItem);\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardDatabaseAdapter.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FItem := TTMSFNCKanbanBoardDatabaseAdapterItemSource.Create(Self);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DeleteItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(FItem) then\r\n FItem.DeleteItem(AItem);\r\nend;\r\n\r\ndestructor TTMSFNCKanbanBoardDatabaseAdapter.Destroy;\r\nbegin\r\n FItem.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoColumnToFields(AColumn: Integer;\r\n AFields: TFields; AColumnField: TField);\r\nbegin\r\n if Assigned(OnColumnToFields) then\r\n OnColumnToFields(Self, AColumn, AFields, AColumnField);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoFieldsToItem(AFields: TFields; AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnFieldsToItem) then\r\n OnFieldsToItem(Self, AFields, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoFieldsToColumn(AFields: TFields;\r\n AColumnField: TField; var AColumn: Integer; var AAcceptItem: Boolean);\r\nbegin\r\n if Assigned(OnFieldsToColumn) then\r\n OnFieldsToColumn(Self, AFields, AColumnField, AColumn, AAcceptItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoItemCreateDBKey(\r\n AItem: TTMSFNCKanbanBoardItem; var ADBKey: String);\r\nbegin\r\n if Assigned(OnItemCreateDBKey) then\r\n OnItemCreateDBKey(Self, AItem, ADBKey)\r\n else\r\n ADBKey := CreateKey;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoItemInserted(\r\n AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnItemInserted) then\r\n OnItemInserted(Self, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoItemRead(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnItemRead) then\r\n OnItemRead(Self, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoItemsLoaded;\r\nbegin\r\n if Assigned(OnItemsLoaded) then\r\n OnItemsLoaded(Self);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoItemToFields(AItem: TTMSFNCKanbanBoardItem; AFields: TFields);\r\nbegin\r\n if Assigned(OnItemToFields) then\r\n OnItemToFields(Self, AItem, AFields);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.DoItemUpdated(\r\n AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(OnItemUpdated) then\r\n OnItemUpdated(Self, AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.GetItems;\r\nvar\r\n ds: TDataSet;\r\n b: TBookmark;\r\nbegin\r\n if not Assigned(KanbanBoard) then\r\n Exit;\r\n\r\n if not Item.CheckDataSet then\r\n Exit;\r\n\r\n if Item.IsUpdating then\r\n Exit;\r\n\r\n Item.BeginUpdate;\r\n ds := Item.DataSource.DataSet;\r\n if Assigned(ds) then\r\n begin\r\n KanbanBoard.BeginUpdate;\r\n ds.DisableControls;\r\n b := ds.GetBookmark;\r\n ds.First;\r\n while not ds.Eof do\r\n begin\r\n CreateOrReadDBItem;\r\n ds.Next;\r\n end;\r\n ds.GotoBookmark(b);\r\n ds.EnableControls;\r\n ds.FreeBookmark(b);\r\n KanbanBoard.EndUpdate;\r\n end;\r\n Item.EndUpdate;\r\n\r\n DoItemsLoaded;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardDatabaseAdapter.GetVersion: string;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.InsertItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(FItem) then\r\n FItem.InsertItem(AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.LoadItems;\r\nvar\r\n p: TTMSFNCCustomKanbanBoardOpen;\r\nbegin\r\n if not Assigned(KanbanBoard) then\r\n Exit;\r\n\r\n p := TTMSFNCCustomKanbanBoardOpen(KanbanBoard);\r\n\r\n p.BeginUpdate;\r\n p.ClearItems;\r\n\r\n if Active then\r\n GetItems;\r\n\r\n p.EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.Notification(AComponent: TComponent;\r\n AOperation: TOperation);\r\nbegin\r\n inherited;\r\n if (AOperation = opRemove) and (AComponent = FItem.DataSource) then\r\n FItem.DataSource := nil;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.SelectItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(FItem) then\r\n FItem.SelectItem(AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.SetItem(\r\n const Value: TTMSFNCKanbanBoardDatabaseAdapterItemSource);\r\nbegin\r\n FItem.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.ReadDBItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if not Assigned(AItem) then\r\n Exit;\r\n\r\n CreateOrReadDBItem(AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.ReadItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(FItem) then\r\n FItem.ReadItem(AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCKanbanBoardDatabaseAdapter);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.UpdateItem(AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(FItem) then\r\n FItem.WriteItem(AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.WriteDBItem(AItem: TTMSFNCKanbanBoardItem);\r\nvar\r\n ft, fn, fdbkey, fcol: TField;\r\n ds: TDataSet;\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n if not Assigned(AItem) then\r\n Exit;\r\n\r\n ds := Item.DataSource.DataSet;\r\n if Assigned(ds) then\r\n begin\r\n fdbkey := nil;\r\n if Item.DBKey <> '' then\r\n fdbkey := ds.FieldByName(Item.DBKey);\r\n\r\n ft := nil;\r\n if Item.Title <> '' then\r\n ft := ds.FieldByName(Item.Title);\r\n\r\n fn := nil;\r\n if Item.Text <> '' then\r\n fn := ds.FieldByName(Item.Text);\r\n\r\n fcol := nil;\r\n if Item.Column <> '' then\r\n fcol := ds.FieldByName(Item.Column);\r\n\r\n if Assigned(fdbkey) and Assigned(fcol) then\r\n begin\r\n it := AItem;\r\n\r\n if Assigned(ft) then\r\n ft.AsString := it.Title;\r\n if Assigned(fn) then\r\n fn.AsString := it.Text;\r\n if Assigned(fcol) then\r\n fcol.AsInteger := it.Column.Index;\r\n\r\n DoColumnToFields(it.Column.Index, ds.Fields, fcol);\r\n DoItemToFields(it, ds.Fields);\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapter.CreateOrReadDBItem(AItem: TTMSFNCKanbanBoardItem = nil);\r\nvar\r\n ft, fn, fdbkey, fcol: TField;\r\n ds: TDataSet;\r\n it, itn: TTMSFNCKanbanBoardItem;\r\n c: Integer;\r\n col: TTMSFNCKanbanBoardColumn;\r\n a: Boolean;\r\nbegin\r\n ds := Item.DataSource.DataSet;\r\n if Assigned(ds) then\r\n begin\r\n if Assigned(KanbanBoard) then\r\n KanbanBoard.BeginUpdate;\r\n\r\n fdbkey := nil;\r\n if Item.DBKey <> '' then\r\n fdbkey := ds.FieldByName(Item.DBKey);\r\n\r\n ft := nil;\r\n if Item.Title <> '' then\r\n ft := ds.FieldByName(Item.Title);\r\n\r\n fn := nil;\r\n if Item.Text <> '' then\r\n fn := ds.FieldByName(Item.Text);\r\n\r\n fcol := nil;\r\n if Item.Column <> '' then\r\n fcol := ds.FieldByName(Item.Column);\r\n\r\n if Assigned(fdbkey) and Assigned(fcol) then\r\n begin\r\n c := fcol.AsInteger;\r\n a := True;\r\n\r\n DoFieldsToColumn(ds.Fields, fcol, c, a);\r\n\r\n if a and (c >= 0) and (c <= TTMSFNCCustomKanbanBoardOpen(KanbanBoard).Columns.Count - 1) then\r\n begin\r\n itn := nil;\r\n if Assigned(AItem) then\r\n begin\r\n it := AItem;\r\n itn := TTMSFNCCustomKanbanBoardOpen(KanbanBoard).Columns[c].Items.Add;\r\n end\r\n else\r\n it := TTMSFNCCustomKanbanBoardOpen(KanbanBoard).Columns[c].Items.Add;\r\n\r\n\r\n if Assigned(fcol) and Assigned(itn) then\r\n begin\r\n itn.Assign(it);\r\n col := it.Column;\r\n if Assigned(col) then\r\n col.Items.Delete(it.Index);\r\n\r\n it := itn;\r\n end;\r\n\r\n it.DBKey := fdbkey.AsString;\r\n if Assigned(ft) then\r\n it.Title := ft.AsString;\r\n if Assigned(fn) then\r\n it.Text := fn.AsString;\r\n\r\n DoFieldsToItem(ds.Fields, it);\r\n\r\n DoItemRead(it);\r\n end;\r\n end;\r\n\r\n if Assigned(KanbanBoard) then\r\n KanbanBoard.EndUpdate;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardDatabaseAdapter.CreateKey: string;\r\n{$IFDEF LCLLIB}\r\nvar\r\n g: TGUID;\r\n{$ENDIF}\r\nbegin\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n Result := TGuid.NewGuid.ToString;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n CreateGUID(g);\r\n Result := GUIDToString(g);\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n raise Exception.Create('Implement Create Key (GUID)');\r\n {$ENDIF}\r\nend; \r\n\r\n{ TTMSFNCKanbanBoardDatabaseAdapterItemDataLink }\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.ActiveChanged;\r\nvar\r\n a: TTMSFNCKanbanBoardAdapter;\r\nbegin\r\n inherited;\r\n a := Adapter;\r\n if Assigned(a) then\r\n a.LoadItems;\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.Adapter: TTMSFNCKanbanBoardAdapter;\r\nbegin\r\n Result := nil;\r\n if Assigned(FItem) then\r\n Result := FItem.FAdapter;\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.Create(AItem: TTMSFNCKanbanBoardDatabaseAdapterItemSource);\r\nbegin\r\n FItem := AItem;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.DataSetChanged;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.DataSetScrolled(Distance: Integer);\r\nbegin\r\n inherited;\r\nend;\r\n\r\ndestructor TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.Destroy;\r\nbegin\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.RecordChanged(Field: TField);\r\nvar\r\n fdbkey: TField;\r\n a: TTMSFNCKanbanBoardAdapter;\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n inherited;\r\n\r\n a := Adapter;\r\n if Assigned(a) and not a.Active then\r\n Exit;\r\n\r\n if not FItem.CheckDataSet or FItem.IsUpdating then\r\n Exit;\r\n\r\n FItem.BeginUpdate;\r\n if Assigned(DataSet) then\r\n begin\r\n if DataSet.Active then\r\n begin\r\n if DataSet.State = dsBrowse then\r\n begin\r\n fdbkey := nil;\r\n if FItem.DBKey <> '' then\r\n fdbkey := DataSet.FieldByName(FItem.DBKey);\r\n\r\n if Assigned(fdbkey) then\r\n begin\r\n it := nil;\r\n if Assigned(a.KanbanBoard) then\r\n it := a.KanbanBoard.FindItemWithDBKey(fdbkey.AsString);\r\n\r\n if Assigned(it) then\r\n begin\r\n if a is TTMSFNCKanbanBoardDatabaseAdapter then\r\n (a as TTMSFNCKanbanBoardDatabaseAdapter).ReadDBItem(it);\r\n end;\r\n\r\n it := nil;\r\n if Assigned(a.KanbanBoard) then\r\n it := a.KanbanBoard.FindItemWithDBKey(fdbkey.AsString);\r\n\r\n if Assigned(it) then\r\n begin\r\n if Assigned(a.KanbanBoard) then\r\n a.KanbanBoard.SelectItem(it);\r\n end;\r\n\r\n end;\r\n end;\r\n end;\r\n end;\r\n FItem.EndUpdate;\r\nend;\r\n\r\n{ TTMSFNCKanbanBoardDatabaseAdapterItemSource }\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCKanbanBoardDatabaseAdapterItemSource then\r\n begin\r\n DataSource := (Source as TTMSFNCKanbanBoardDatabaseAdapterItemSource).DataSource;\r\n FTitle := (Source as TTMSFNCKanbanBoardDatabaseAdapterItemSource).Title;\r\n FText := (Source as TTMSFNCKanbanBoardDatabaseAdapterItemSource).Title;\r\n FColumn := (Source as TTMSFNCKanbanBoardDatabaseAdapterItemSource).Column;\r\n FDBKey := (Source as TTMSFNCKanbanBoardDatabaseAdapterItemSource).DBKey;\r\n FAutoIncrementDBKey := (Source as TTMSFNCKanbanBoardDatabaseAdapterItemSource).AutoIncrementDBKey;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.BeginUpdate;\r\nbegin\r\n Inc(FUpdateCount);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardDatabaseAdapterItemSource.CheckDataSet: Boolean;\r\nbegin\r\n Result := False;\r\n\r\n if (DBKey = '') or (Column = '') then\r\n begin\r\n raise Exception.Create('DBKey/Column are not set in TTMSFNCKanbanBoardDatabaseAdapter item source.');\r\n Exit;\r\n end;\r\n\r\n if Assigned(DataSource) then\r\n if Assigned(DataSource.DataSet) then\r\n Result := DataSource.DataSet.Active;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.ClearItems(ADBKey: String; ADeleteItem: TTMSFNCKanbanBoardItem = nil);\r\nvar\r\n I, K: Integer;\r\n a: TTMSFNCKanbanBoardAdapter;\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n a := FAdapter;\r\n if not Assigned(a) then\r\n Exit;\r\n\r\n if Assigned(a.KanbanBoard) then\r\n begin\r\n a.KanbanBoard.BeginUpdate;\r\n for I := TTMSFNCCustomKanbanBoardOpen(a.KanbanBoard).Columns.Count - 1 downto 0 do\r\n begin\r\n for K := TTMSFNCCustomKanbanBoardOpen(a.KanbanBoard).Columns[I].Items.Count - 1 downto 0 do\r\n begin\r\n it := TTMSFNCCustomKanbanBoardOpen(a.KanbanBoard).Columns[I].Items[K];\r\n if (it.DBKey = ADBKey) and (it <> ADeleteItem) then\r\n TTMSFNCCustomKanbanBoardOpen(a.KanbanBoard).Columns[I].Items.Delete(K);\r\n end;\r\n end;\r\n a.KanbanBoard.EndUpdate;\r\n end;\r\nend;\r\n\r\nconstructor TTMSFNCKanbanBoardDatabaseAdapterItemSource.Create(AAdapter: TTMSFNCKanbanBoardAdapter);\r\nbegin\r\n FUpdateCount := 0;\r\n FAutoIncrementDBKey := True;\r\n FAdapter := AAdapter;\r\n FDataLink := TTMSFNCKanbanBoardDatabaseAdapterItemDataLink.Create(Self);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.DeleteItem(\r\n AItem: TTMSFNCKanbanBoardItem);\r\nvar\r\n ds: TDataSet;\r\nbegin\r\n if not CheckDataSet or not Assigned(AItem) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n BeginUpdate;\r\n ds := DataSource.DataSet;\r\n if Assigned(ds) then\r\n begin\r\n ds.DisableControls;\r\n LocateItem(ds, AItem); \r\n try\r\n ds.Delete;\r\n except\r\n ds.EnableControls;\r\n EndUpdate;\r\n raise Exception.Create('Could not delete record from dataset.');\r\n end;\r\n ds.EnableControls;\r\n end;\r\n EndUpdate;\r\nend;\r\n\r\ndestructor TTMSFNCKanbanBoardDatabaseAdapterItemSource.Destroy;\r\nbegin\r\n FDataLink.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.EndUpdate;\r\nbegin\r\n Dec(FUpdateCount);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardDatabaseAdapterItemSource.GetDataSource: TDataSource;\r\nbegin\r\n Result := FDataLink.DataSource;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.InsertItem(AItem: TTMSFNCKanbanBoardItem);\r\nvar\r\n ds: TDataSet;\r\n b: TBookmark;\r\n k: String;\r\n fdbk: TField;\r\nbegin\r\n if not CheckDataSet then\r\n Exit;\r\n\r\n BeginUpdate;\r\n ds := DataSource.DataSet;\r\n if Assigned(ds) then\r\n begin\r\n ds.DisableControls;\r\n b := ds.GetBookmark;\r\n try\r\n try\r\n ds.Append;\r\n except\r\n ds.GotoBookmark(b);\r\n ds.EnableControls;\r\n ds.FreeBookmark(b);\r\n EndUpdate;\r\n raise Exception.Create('Could not append new record.');\r\n end;\r\n\r\n fdbk := nil;\r\n if DBKey <> '' then\r\n fdbk := ds.FieldByName(DBKey);\r\n\r\n if not AutoIncrementDBKey then\r\n begin\r\n k := AItem.DBKey;\r\n if Assigned(FAdapter) and (FAdapter is TTMSFNCKanbanBoardDatabaseAdapter) then\r\n (FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).DoItemCreateDBKey(AItem, k);\r\n\r\n if Assigned(fdbk) then\r\n fdbk.AsString := k;\r\n end;\r\n\r\n if Assigned(fdbk) then\r\n AItem.DBKey := fdbk.AsString;\r\n\r\n WriteItem(AItem);\r\n AItem.DBKey := fdbk.AsString;\r\n finally\r\n ds.GotoBookmark(b);\r\n ds.EnableControls;\r\n ds.FreeBookmark(b);\r\n end;\r\n end;\r\n EndUpdate;\r\n\r\n if Assigned(FAdapter) and (FAdapter is TTMSFNCKanbanBoardDatabaseAdapter) and not IsUpdating then\r\n (FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).DoItemInserted(AItem);\r\nend;\r\n\r\nfunction TTMSFNCKanbanBoardDatabaseAdapterItemSource.IsUpdating: Boolean;\r\nbegin\r\n Result := FUpdateCount > 0;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.LocateItem(ADataSet: TDataSet; AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned((FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).OnItemLocate) then\r\n (FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).OnItemLocate(Self, AItem)\r\n else\r\n begin\r\n if Assigned(ADataSet) then \r\n ADataSet.Locate(DBKey, AItem.DBKey, []);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.ReadItem(AItem: TTMSFNCKanbanBoardItem);\r\nvar\r\n ds: TDataSet;\r\n b: TBookmark;\r\nbegin\r\n if not CheckDataSet or not Assigned(AItem) then\r\n Exit;\r\n\r\n BeginUpdate;\r\n ds := DataSource.DataSet;\r\n if Assigned(ds) then\r\n begin\r\n ds.DisableControls;\r\n b := ds.GetBookmark;\r\n try\r\n if ds.State = dsBrowse then\r\n LocateItem(ds, AItem);\r\n\r\n if FAdapter is TTMSFNCKanbanBoardDatabaseAdapter then\r\n (FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).ReadDBItem(AItem);\r\n finally\r\n ds.GotoBookmark(b);\r\n ds.EnableControls;\r\n ds.FreeBookmark(b);\r\n end;\r\n end;\r\n EndUpdate;\r\n\r\n if Assigned(FAdapter) and (FAdapter is TTMSFNCKanbanBoardDatabaseAdapter) and not IsUpdating then\r\n (FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).DoItemRead(AItem);\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.SelectItem(AItem: TTMSFNCKanbanBoardItem);\r\nvar\r\n ds: TDataSet;\r\nbegin\r\n if not CheckDataSet or not Assigned(AItem) then\r\n Exit;\r\n\r\n if IsUpdating then\r\n Exit;\r\n\r\n BeginUpdate;\r\n ds := DataSource.DataSet;\r\n LocateItem(ds, AItem);\r\n EndUpdate;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.SetAutoIncrementDBKey(\r\n const Value: Boolean);\r\nbegin\r\n FAutoIncrementDBKey := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.SetDataSource(const Value: TDataSource);\r\nbegin\r\n if FDataLink.DataSource <> Value then\r\n FDataLink.DataSource := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.SetDBKey(const Value: String);\r\nbegin\r\n FDBKey := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.SetColumn(\r\n const Value: String);\r\nbegin\r\n FColumn := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.SetText(const Value: String);\r\nbegin\r\n FText := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.SetTitle(const Value: String);\r\nbegin\r\n FTitle := Value;\r\nend;\r\n\r\nprocedure TTMSFNCKanbanBoardDatabaseAdapterItemSource.WriteItem(AItem: TTMSFNCKanbanBoardItem);\r\nvar\r\n ds: TDataSet;\r\n b: TBookmark;\r\nbegin\r\n if not CheckDataSet then\r\n Exit;\r\n\r\n BeginUpdate;\r\n ds := DataSource.DataSet;\r\n if Assigned(ds) then\r\n begin\r\n ds.DisableControls;\r\n b := ds.GetBookmark;\r\n try\r\n if ds.State = dsBrowse then\r\n begin\r\n try\r\n LocateItem(ds, AItem);\r\n ds.Edit;\r\n except\r\n ds.GotoBookmark(b);\r\n ds.EnableControls;\r\n ds.FreeBookmark(b);\r\n EndUpdate;\r\n raise Exception.Create('Could not put dataset in edit mode.');\r\n end;\r\n end;\r\n\r\n if (ds.State = dsEdit) or (ds.State = dsInsert) then\r\n begin\r\n if FAdapter is TTMSFNCKanbanBoardDatabaseAdapter then\r\n (FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).WriteDBItem(AItem);\r\n try\r\n ds.Post;\r\n except\r\n ds.GotoBookmark(b);\r\n ds.EnableControls;\r\n ds.FreeBookmark(b);\r\n EndUpdate;\r\n raise Exception.Create('Could not post to dataset.');\r\n end;\r\n end;\r\n finally\r\n ds.GotoBookmark(b);\r\n ds.EnableControls;\r\n ds.FreeBookmark(b);\r\n end;\r\n end;\r\n EndUpdate;\r\n\r\n if (FAdapter is TTMSFNCKanbanBoardDatabaseAdapter) and not IsUpdating then\r\n (FAdapter as TTMSFNCKanbanBoardDatabaseAdapter).DoItemUpdated(AItem);\r\nend;\r\n\r\nend.\r\n","{$mode objfpc}\r\n{$h+}\r\nunit JSONDataset;\r\n\r\ninterface\r\n\r\nuses\r\n Types, JS, DB, Classes, SysUtils;\r\n\r\ntype\r\n\r\n { TJSONFieldMapper }\r\n // This class is responsible for mapping the field objects of the records.\r\n TJSONFieldMapper = Class(TObject)\r\n Public\r\n // Return row TJSONData instance with data for field 'FieldName' or 'FieldIndex'.\r\n Function GetJSONDataForField(Const FieldName : String; FieldIndex : Integer; Row : JSValue) : JSValue; virtual; abstract;\r\n // Same, but now based on TField.\r\n Function GetJSONDataForField(F : TField; Row : JSValue) : JSValue; virtual;\r\n // Set data for field 'FieldName' or 'FieldIndex' to supplied TJSONData instance in row\r\n procedure SetJSONDataForField(Const FieldName : String; FieldIndex : Integer; Row,Data : JSValue); virtual; abstract;\r\n // Set data for field TField to supplied TJSONData instance\r\n procedure SetJSONDataForField(F : TField; Row,Data : JSValue); virtual;\r\n // Create a new row.\r\n Function CreateRow : JSValue; virtual; abstract;\r\n end;\r\n\r\n // JSON has no date/time type, so we use a string field.\r\n // ExtJS provides the date/time format in it's field config: 'dateFormat'\r\n // The below field classes store this in the NNNFormat field.\r\n { TJSONDateField }\r\n\r\n TJSONDateField = Class(TDateField)\r\n private\r\n FDateFormat: String;\r\n Published\r\n Property DateFormat : String Read FDateFormat Write FDateFormat;\r\n end;\r\n\r\n { TJSONTimeField }\r\n\r\n TJSONTimeField = Class(TTimeField)\r\n private\r\n FTimeFormat: String;\r\n Published\r\n Property TimeFormat : String Read FTimeFormat Write FTimeFormat;\r\n end;\r\n\r\n { TJSONDateTimeField }\r\n\r\n TJSONDateTimeField = Class(TDateTimeField)\r\n private\r\n FDateTimeFormat: String;\r\n Published\r\n Property DateTimeFormat : String Read FDateTimeFormat Write FDateTimeFormat;\r\n end;\r\n\r\n { TBaseJSONDataSet }\r\n\r\n { TJSONIndex }\r\n\r\n TJSONIndex = Class\r\n FList : TJSArray; // Indexes of elements in FRows.\r\n FRows : TJSArray;\r\n FDataset : TDataset;\r\n private\r\n function GetRecordIndex(aListIndex : Integer): NativeInt;\r\n protected\r\n Function GetCount: Integer; virtual;\r\n Procedure CreateIndex; Virtual; abstract;\r\n Property List : TJSArray Read FList;\r\n Property Rows : TJSArray Read FRows;\r\n Property Dataset : TDataset Read FDataset;\r\n Public\r\n Constructor Create(aDataset: TDataset; aRows : TJSArray);\r\n // Append remainder of FRows to FList.\r\n Procedure AppendToIndex; virtual; abstract;\r\n // Delete aListIndex from list, not from row. Return Recordindex of deleted record.\r\n Function Delete(aListIndex : Integer) : Integer; virtual;\r\n // Append aRecordIndex to list. Return ListIndex of appended record.\r\n Function Append(aRecordIndex : Integer) : Integer; virtual; abstract;\r\n // Insert record into list. By default, this does an append. Return ListIndex of inserted record\r\n Function Insert(aCurrentIndex, aRecordIndex : Integer) : Integer; virtual;\r\n // Record at index aCurrentIndex has changed. Update index and return new listindex.\r\n Function Update(aCurrentIndex, aRecordIndex : Integer) : Integer; virtual; abstract;\r\n // Find list index for Record at index aCurrentIndex. Return -1 if not found.\r\n Function FindRecord(aRecordIndex : Integer) : Integer; virtual; abstract;\r\n // index of record in FRows based on aListIndex in List.\r\n Property RecordIndex[aListIndex : Integer] : NativeInt Read GetRecordIndex;\r\n // Number of records in index. This can differ from FRows, e.g. when filtering.\r\n Property Count : Integer Read GetCount;\r\n end;\r\n\r\n { TDefaultJSONIndex }\r\n\r\n TDefaultJSONIndex = Class(TJSONIndex)\r\n public\r\n Procedure CreateIndex; override;\r\n Procedure AppendToIndex; override;\r\n Function Append(aRecordIndex : Integer) : Integer; override;\r\n Function Insert(aCurrentIndex, aRecordIndex : Integer) : Integer; override;\r\n Function FindRecord(aRecordIndex : Integer) : Integer; override;\r\n Function Update(aCurrentIndex, aRecordIndex : Integer) : Integer; override;\r\n end;\r\n\r\n // basic JSON dataset. Does nothing ExtJS specific.\r\n TBaseJSONDataSet = class (TDataSet)\r\n private\r\n FMUS: Boolean;\r\n FOwnsData : Boolean;\r\n FDefaultIndex : TJSONIndex; // Default index, built from array\r\n FCurrentIndex : TJSONIndex; // Currently active index.\r\n FCurrent: Integer; // Record Index in the current IndexList\r\n // Possible metadata to configure fields from.\r\n FMetaData : TJSObject;\r\n // This will contain the rows.\r\n FRows : TJSArray;\r\n // Deleted rows\r\n FDeletedRows : TJSArray;\r\n FFieldMapper : TJSONFieldMapper;\r\n // When editing, this object is edited.\r\n FEditIdx : Integer;\r\n FEditRow : JSValue;\r\n FUseDateTimeFormatFields: Boolean;\r\n procedure SetMetaData(AValue: TJSObject);\r\n procedure SetRows(AValue: TJSArray);\r\n protected\r\n // dataset virtual methods\r\n function AllocRecordBuffer: TDataRecord; override;\r\n procedure FreeRecordBuffer(var Buffer: TDataRecord); override;\r\n procedure InternalInitRecord(var Buffer: TDataRecord); override;\r\n function GetRecord(Var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;\r\n function GetRecordSize: Word; override;\r\n procedure AddToRows(AValue: TJSArray);\r\n procedure InternalClose; override;\r\n procedure InternalDelete; override;\r\n procedure InternalFirst; override;\r\n procedure InternalLast; override;\r\n procedure InternalOpen; override;\r\n procedure InternalPost; override;\r\n procedure InternalInsert; override;\r\n procedure InternalEdit; override;\r\n procedure InternalCancel; override;\r\n procedure InternalInitFieldDefs; override;\r\n procedure InternalSetToRecord(Buffer: TDataRecord); override;\r\n function GetFieldClass(FieldType: TFieldType): TFieldClass; override;\r\n function IsCursorOpen: Boolean; override;\r\n // Bookmark operations\r\n function BookmarkValid(ABookmark: TBookmark): Boolean; override;\r\n procedure GetBookmarkData(Buffer: TDataRecord; var Data: TBookmark); override;\r\n function GetBookmarkFlag(Buffer: TDataRecord): TBookmarkFlag; override;\r\n procedure InternalGotoBookmark(ABookmark: TBookmark); override;\r\n procedure SetBookmarkFlag(Var Buffer: TDataRecord; Value: TBookmarkFlag); override;\r\n procedure SetBookmarkData(Var Buffer: TDataRecord; Data: TBookmark); override;\r\n function GetRecordCount: Integer; override;\r\n procedure SetRecNo(Value: Integer); override;\r\n function GetRecNo: Integer; override;\r\n Protected\r\n // New methods.\r\n // Called when dataset is closed. If OwnsData is true, metadata and rows are freed.\r\n Procedure FreeData; virtual;\r\n // Fill default list.\r\n procedure AppendToIndexes; virtual;\r\n Procedure CreateIndexes; virtual;\r\n // Convert MetaData object to FieldDefs.\r\n Procedure MetaDataToFieldDefs; virtual; abstract;\r\n // Initialize Date/Time info in all date/time fields. Called during InternalOpen\r\n procedure InitDateTimeFields; virtual;\r\n // Convert JSON date S to DateTime for Field F\r\n function ConvertDateTimeField(S: String; F: TField): TDateTime; virtual;\r\n // Format JSON date to from DT for Field F\r\n function FormatDateTimeField(DT : TDateTime; F: TField): String; virtual;\r\n // Create fieldmapper. A descendent MUST implement this.\r\n Function CreateFieldMapper : TJSONFieldMapper; virtual; abstract;\r\n // If True, then the dataset will free MetaData and FRows when it is closed.\r\n Property OwnsData : Boolean Read FownsData Write FOwnsData;\r\n // set to true if unknown field types should be handled as string fields.\r\n Property MapUnknownToStringType : Boolean Read FMUS Write FMUS;\r\n // Metadata\r\n Property MetaData : TJSObject Read FMetaData Write SetMetaData;\r\n // Rows\r\n Property Rows : TJSArray Read FRows Write SetRows;\r\n // Fieldmapper\r\n Property FieldMapper : TJSONFieldMapper Read FFieldMapper;\r\n // FieldClass\r\n Property UseDateTimeFormatFields : Boolean Read FUseDateTimeFormatFields Write FUseDateTimeFormatFields;\r\n public\r\n constructor Create (AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetFieldData(Field: TField; Buffer: TDatarecord): JSValue; override;\r\n procedure SetFieldData(Field: TField; var Buffer: TDatarecord; AValue : JSValue); override;\r\n function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; override;\r\n end;\r\n\r\n TJSONDataset = Class(TBaseJSONDataset)\r\n published\r\n Property FieldDefs;\r\n // redeclared data set properties\r\n property Active;\r\n property BeforeOpen;\r\n property AfterOpen;\r\n property BeforeClose;\r\n property AfterClose;\r\n property BeforeInsert;\r\n property AfterInsert;\r\n property BeforeEdit;\r\n property AfterEdit;\r\n property BeforePost;\r\n property AfterPost;\r\n property BeforeCancel;\r\n property AfterCancel;\r\n property BeforeDelete;\r\n property AfterDelete;\r\n property BeforeScroll;\r\n property AfterScroll;\r\n property OnCalcFields;\r\n property OnDeleteError;\r\n property OnEditError;\r\n property OnFilterRecord;\r\n property OnNewRecord;\r\n property OnPostError;\r\n end;\r\n\r\n { TJSONObjectFieldMapper }\r\n // Fieldmapper to be used when the data is in an object\r\n TJSONObjectFieldMapper = Class(TJSONFieldMapper)\r\n Public\r\n procedure SetJSONDataForField(Const FieldName : String; FieldIndex : Integer; Row,Data : JSValue); override;\r\n Function GetJSONDataForField(Const FieldName : String; FieldIndex : Integer; Row : JSValue) : JSValue; override;\r\n Function CreateRow : JSValue; override;\r\n end;\r\n\r\n { TJSONArrayFieldMapper }\r\n // Fieldmapper to be used when the data is in an array\r\n TJSONArrayFieldMapper = Class(TJSONFieldMapper)\r\n Public\r\n procedure SetJSONDataForField(Const FieldName : String; FieldIndex : Integer; Row,Data : JSValue); override;\r\n Function GetJSONDataForField(Const FieldName : String; FieldIndex : Integer; Row : JSValue) : JSValue; override;\r\n Function CreateRow : JSValue; override;\r\n end;\r\n\r\n EJSONDataset = Class(EDatabaseError);\r\n \r\nimplementation\r\n\r\nuses DateUtils;\r\n\r\n{ TDefaultJSONIndex }\r\n\r\nprocedure TDefaultJSONIndex.CreateIndex;\r\n\r\nVar\r\n I : Integer;\r\n\r\nbegin\r\n For I:=0 to FRows.length-1 do\r\n FList[i]:=I;\r\nend;\r\n\r\nprocedure TDefaultJSONIndex.AppendToIndex;\r\n\r\nVar\r\n I,L : Integer;\r\n\r\nbegin\r\n L:=FList.Length;\r\n FList.Length:=FRows.Length;\r\n For I:=L to FRows.Length-1 do\r\n FList[i]:=I;\r\nend;\r\n\r\nfunction TDefaultJSONIndex.Append(aRecordIndex: Integer): Integer;\r\nbegin\r\n Result:=FList.Push(aRecordIndex)-1;\r\nend;\r\n\r\nfunction TDefaultJSONIndex.Insert(aCurrentIndex, aRecordIndex: Integer\r\n ): Integer;\r\nbegin\r\n FList.splice(aCurrentIndex, 0, aRecordIndex);\r\n Result:=aCurrentIndex;\r\nend;\r\n\r\nfunction TDefaultJSONIndex.FindRecord(aRecordIndex: Integer): Integer;\r\nbegin\r\n Result:=FList.indexOf(aRecordIndex);\r\nend;\r\n\r\nfunction TDefaultJSONIndex.Update(aCurrentIndex, aRecordIndex: Integer\r\n ): Integer;\r\nbegin\r\n If RecordIndex[aCurrentIndex]<>aRecordIndex then\r\n DatabaseErrorFmt('Inconsistent record index in default index, expected %d, got %d.',[aCurrentIndex,RecordIndex[aCurrentIndex]],Dataset);\r\nend;\r\n\r\n{ TJSONIndex }\r\n\r\nconstructor TJSONIndex.Create(aDataset: TDataset; aRows: TJSArray);\r\nbegin\r\n FRows:=aRows;\r\n FList:=TJSArray.New(FRows.length);\r\n FDataset:=aDataset;\r\n CreateIndex;\r\nend;\r\n\r\nfunction TJSONIndex.Delete(aListIndex: Integer): Integer;\r\n\r\nVar\r\n a : TJSArray;\r\n\r\nbegin\r\n A:=FList.Splice(aListIndex,1);\r\n If a.Length>0 then\r\n Result:=Integer(A[0])\r\n else\r\n Result:=-1;\r\nend;\r\n\r\nfunction TJSONIndex.Insert(aCurrentIndex, aRecordIndex: Integer): Integer;\r\nbegin\r\n Result:=Append(aRecordIndex);\r\nend;\r\n\r\nfunction TJSONIndex.GetCount: Integer;\r\nbegin\r\n Result:=FList.Length;\r\nend;\r\n\r\nfunction TJSONIndex.GetRecordIndex(aListIndex : Integer): NativeInt;\r\nbegin\r\n if isUndefined(FList[aListIndex]) then\r\n Result:=-1\r\n else\r\n Result:=NativeInt(FList[aListIndex]);\r\nend;\r\n\r\n\r\n\r\n{ TJSONFieldMapper }\r\n\r\nfunction TJSONFieldMapper.GetJSONDataForField(F: TField; Row: JSValue ): JSValue;\r\nbegin\r\n // This supposes that Index is correct, i.e. the field positions have not been changed.\r\n Result:=GetJSONDataForField(F.FieldName,F.Index,Row);\r\nend;\r\n\r\nprocedure TJSONFieldMapper.SetJSONDataForField(F: TField; Row,Data: JSValue);\r\nbegin\r\n SetJSONDataForField(F.FieldName,F.Index,Row,Data);\r\nend;\r\n\r\n\r\n{ TJSONArrayFieldMapper }\r\n\r\nprocedure TJSONArrayFieldMapper.SetJSONDataForField(const FieldName: String;\r\n FieldIndex: Integer; Row, Data: JSValue);\r\nbegin\r\n TJSValueDynArray(Row)[FieldIndex]:=Data;\r\nend;\r\n\r\nfunction TJSONArrayFieldMapper.GetJSONDataForField(Const FieldName: String;\r\n FieldIndex: Integer; Row: JSValue): JSValue;\r\nbegin\r\n Result:=TJSValueDynArray(Row)[FieldIndex];\r\nend;\r\n\r\nfunction TJSONArrayFieldMapper.CreateRow: JSValue;\r\n\r\nbegin\r\n Result:=TJSArray.New;\r\nend;\r\n\r\n{ TJSONObjectFieldMapper }\r\n\r\nprocedure TJSONObjectFieldMapper.SetJSONDataForField(const FieldName: String;\r\n FieldIndex: Integer; Row, Data: JSValue);\r\nbegin\r\n TJSObject(Row).Properties[FieldName]:=Data;\r\nend;\r\n\r\nfunction TJSONObjectFieldMapper.GetJSONDataForField(const FieldName: String;\r\n FieldIndex: Integer; Row: JSValue): JSValue;\r\nbegin\r\n Result:=TJSObject(Row).Properties[FieldName];\r\nend;\r\n\r\nfunction TJSONObjectFieldMapper.CreateRow: JSValue;\r\nbegin\r\n Result:=TJSObject.New;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.SetMetaData(AValue: TJSObject);\r\nbegin\r\n CheckInActive;\r\n FMetaData:=AValue;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.AddToRows(AValue: TJSArray);\r\n\r\nbegin\r\n if FRows=Nil then\r\n FRows:=AValue\r\n else\r\n begin\r\n FRows:=FRows.Concat(AValue);\r\n AppendToIndexes;\r\n end;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.SetRows(AValue: TJSArray);\r\nbegin\r\n if AValue=FRows then exit;\r\n CheckInActive;\r\n FRows:=Nil;\r\n AddToRows(AValue);\r\nend;\r\n\r\n\r\nfunction TBaseJSONDataSet.AllocRecordBuffer: TDataRecord;\r\nbegin\r\n Result.data:=TJSObject.New;\r\n Result.bookmark:=null;\r\n Result.state:=rsNew;\r\nend;\r\n\r\n// the next two are particularly ugly.\r\nprocedure TBaseJSONDataSet.InternalInitRecord(var Buffer: TDataRecord);\r\nbegin\r\n// Writeln('TBaseJSONDataSet.InternalInitRecord');\r\n Buffer.Data:=FFieldMapper.CreateRow;\r\n Buffer.bookmark:=null;\r\n Buffer.state:=rsNew;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.FreeRecordBuffer (var Buffer: TDataRecord);\r\nbegin\r\n Buffer.Data:=Null;\r\n Buffer.bookmark:=null;\r\n Buffer.state:=rsNew;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.GetBookmarkData(Buffer: TDataRecord; var Data: TBookmark);\r\nbegin\r\n Data.Data:=Buffer.bookmark;\r\nend;\r\n\r\nfunction TBaseJSONDataSet.GetBookmarkFlag(Buffer: TDataRecord): TBookmarkFlag;\r\nbegin\r\n Result :=Buffer.BookmarkFlag;\r\nend;\r\n\r\nfunction TBaseJSONDataSet.GetRecNo: Integer;\r\n\r\nVar\r\n bkmIdx : Integer;\r\n\r\nbegin\r\n bkmIdx:=Integer(ActiveBuffer.bookmark);\r\n Result:=FCurrentIndex.FindRecord(bkmIdx)+1;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalInitFieldDefs;\r\nbegin\r\n If Assigned(FMetaData) then\r\n MetaDataToFieldDefs;\r\n if (FieldDefs.Count=0) then\r\n Raise EJSONDataset.Create('No fields found');\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.FreeData;\r\nbegin\r\n If FOwnsData then\r\n begin\r\n FRows:=Nil;\r\n FMetaData:=Nil;\r\n end;\r\n if (FCurrentIndex<>FDefaultIndex) then\r\n FreeAndNil(FCurrentIndex)\r\n else\r\n FCurrentIndex:=Nil;\r\n FreeAndNil(FDefaultindex);\r\n FreeAndNil(FFieldMapper);\r\n FCurrentIndex:=Nil;\r\n FDeletedRows:=Nil;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.AppendToIndexes;\r\n\r\nbegin\r\n FDefaultIndex.AppendToIndex;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.CreateIndexes;\r\n\r\nbegin\r\n FDefaultIndex:=TDefaultJSONIndex.Create(Self,FRows);\r\n AppendToIndexes;\r\n FCurrentIndex:=FDefaultIndex;\r\nend;\r\n\r\nfunction TBaseJSONDataSet.GetRecord(Var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult;\r\n\r\nVar\r\n BkmIdx : Integer;\r\n\r\nbegin\r\n Result := grOK; // default\r\n case GetMode of\r\n gmNext: // move on\r\n if fCurrent < fCurrentIndex.Count - 1 then\r\n Inc (fCurrent)\r\n else\r\n Result := grEOF; // end of file\r\n gmPrior: // move back\r\n if fCurrent > 0 then\r\n Dec (fCurrent)\r\n else\r\n Result := grBOF; // begin of file\r\n gmCurrent: // check if empty\r\n if fCurrent >= fCurrentIndex.Count then\r\n Result := grEOF;\r\n end;\r\n if Result = grOK then // read the data\r\n begin\r\n BkmIdx:=FCurrentIndex.RecordIndex[FCurrent];\r\n Buffer.Data:=FRows[bkmIdx];\r\n Buffer.BookmarkFlag := bfCurrent;\r\n Buffer.Bookmark:=BkmIdx;\r\n end;\r\nend;\r\n\r\nfunction TBaseJSONDataSet.GetRecordCount: Integer;\r\nbegin\r\n Result:=FCurrentIndex.Count;\r\nend;\r\n\r\nfunction TBaseJSONDataSet.GetRecordSize: Word;\r\nbegin\r\n Result := 0; // actual data without house-keeping\r\nend;\r\n\r\n\r\nprocedure TBaseJSONDataSet.InternalClose;\r\nbegin\r\n // disconnet and destroy field objects\r\n BindFields (False);\r\n if DefaultFields then\r\n DestroyFields;\r\n FreeData;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalDelete;\r\n\r\nVar\r\n Idx : Integer;\r\n\r\nbegin\r\n Idx:=FCurrentIndex.Delete(FCurrent);\r\n if (Idx<>-1) then\r\n begin\r\n // Add code here to Delete from other indexes as well.\r\n // ...\r\n // Add to array of deleted records.\r\n if Not Assigned(FDeletedRows) then\r\n FDeletedRows:=TJSArray.New(FRows[idx])\r\n else\r\n FDeletedRows.Push(FRows[Idx]);\r\n FRows[Idx]:=Undefined;\r\n end;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalFirst;\r\nbegin\r\n FCurrent := -1;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalGotoBookmark(ABookmark: TBookmark);\r\nbegin\r\n if isNumber(ABookmark.Data) then\r\n FCurrent:=FCurrentIndex.FindRecord(Integer(ABookmark.Data));\r\n// Writeln('Fcurrent', FCurrent,' from ',ABookmark.Data);\r\nend;\r\n\r\n\r\nprocedure TBaseJSONDataSet.InternalInsert;\r\n\r\nVar\r\n I : Integer;\r\n D : TFieldDef;\r\n\r\nbegin\r\n// Writeln('TBaseJSONDataSet.InternalInsert');\r\n FEditRow:=ActiveBuffer.Data;\r\n For I:=0 to FieldDefs.Count-1 do\r\n begin\r\n D:=FieldDefs[i];\r\n FFieldMapper.SetJSONDataForField(D.Name,D.Index,FEditRow,Null);\r\n end;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalEdit;\r\n\r\nbegin\r\n// Writeln('TBaseJSONDataSet.InternalEdit: ');\r\n FEditIdx:=FCurrentIndex.RecordIndex[FCurrent];\r\n if not isUndefined(Rows[FEditIdx]) then\r\n FEditRow:=TJSJSON.parse(TJSJSON.stringify(Rows[FEditIdx]))\r\n else\r\n FEditRow:=TJSObject.new;\r\n// Writeln('TBaseJSONDataSet.InternalEdit: ',FEditRow);\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalCancel;\r\nbegin\r\n FEditIdx:=-1;\r\n FEditRow:=Nil;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalLast;\r\nbegin\r\n // The first thing that will happen is a GetPrior Record.\r\n FCurrent:=FCurrentIndex.Count;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InitDateTimeFields;\r\n\r\nbegin\r\n // Do nothing\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalOpen;\r\nbegin\r\n FreeAndNil(FFieldMapper);\r\n FFieldMapper:=CreateFieldMapper;\r\n IF (FRows=Nil) then // opening from fielddefs ?\r\n begin\r\n FRows:=TJSArray.New;\r\n OwnsData:=True;\r\n end;\r\n CreateIndexes;\r\n InternalInitFieldDefs;\r\n if DefaultFields then\r\n CreateFields;\r\n BindFields (True);\r\n InitDateTimeFields;\r\n FCurrent := -1;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalPost;\r\n\r\nVar\r\n Idx : integer;\r\n B : TBookmark;\r\n\r\nbegin\r\n GetBookMarkData(ActiveBuffer,B);\r\n if (State=dsInsert) then\r\n begin // Insert or Append\r\n Idx:=FRows.push(FEditRow)-1;\r\n if GetBookMarkFlag(ActiveBuffer)=bfEOF then\r\n begin // Append\r\n FDefaultIndex.Append(Idx);\r\n // Must replace this by updating all indexes\r\n if (FCurrentIndex<>FDefaultIndex) then\r\n FCurrentIndex.Append(Idx);\r\n end\r\n else // insert\r\n begin\r\n FCurrent:=FDefaultIndex.Insert(FCurrent,Idx);\r\n // Must replace this by updating all indexes.\r\n // Note that this will change current index.\r\n if (FCurrentIndex<>FDefaultIndex) then\r\n FCurrent:=FCurrentIndex.Insert(FCurrent,Idx);\r\n end;\r\n end\r\n else\r\n begin // Edit\r\n if (FEditIdx=-1) then\r\n DatabaseErrorFmt('Failed to retrieve record index for record %d',[FCurrent]);\r\n // Update source record\r\n Idx:=FEditIdx;\r\n FRows[Idx]:=FEditRow;\r\n FDefaultIndex.Update(FCurrent,Idx);\r\n // Must replace this by updating all indexes.\r\n // Note that this will change current index.\r\n if (FCurrentIndex<>FDefaultIndex) then\r\n FCurrentIndex.Update(FCurrent,Idx);\r\n end;\r\n FEditIdx:=-1;\r\n FEditRow:=Nil;\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.InternalSetToRecord(Buffer: TDataRecord);\r\nbegin\r\n FCurrent:=FCurrentIndex.FindRecord(Integer(Buffer.Bookmark));\r\nend;\r\n\r\nfunction TBaseJSONDataSet.GetFieldClass(FieldType: TFieldType): TFieldClass;\r\nbegin\r\n If UseDateTimeFormatFields and (FieldType in [ftDate,ftDateTime,ftTime]) then\r\n case FieldType of\r\n ftDate : Result:=TJSONDateField;\r\n ftDateTime : Result:=TJSONDateTimeField;\r\n ftTime : Result:=TJSONTimeField;\r\n end\r\n else\r\n Result:=inherited GetFieldClass(FieldType);\r\nend;\r\n\r\nfunction TBaseJSONDataSet.IsCursorOpen: Boolean;\r\nbegin\r\n Result := Assigned(FDefaultIndex);\r\nend;\r\n\r\nfunction TBaseJSONDataSet.BookmarkValid(ABookmark: TBookmark): Boolean;\r\nbegin\r\n Result:=isNumber(ABookmark.Data);\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.SetBookmarkData(var Buffer: TDataRecord; Data: TBookmark);\r\nbegin\r\n Buffer.Bookmark:=Data.Data;\r\n// Writeln('Set Bookmark from: ',Data.Data);\r\nend;\r\n\r\nfunction TBaseJSONDataSet.ConvertDateTimeField(S : String; F : TField) : TDateTime;\r\n\r\nVar\r\n Ptrn : string;\r\n\r\nbegin\r\n Result:=0;\r\n Case F.DataType of\r\n ftDate : Ptrn:=TJSONDateField(F).DateFormat;\r\n ftTime : Ptrn:=TJSONTimeField(F).TimeFormat;\r\n ftDateTime : Ptrn:=TJSONDateTimeField(F).DateTimeFormat;\r\n end;\r\n If (Ptrn='') then\r\n Case F.DataType of\r\n ftDate : Result:=StrToDate(S);\r\n ftTime : Result:=StrToTime(S);\r\n ftDateTime : Result:=StrToDateTime(S);\r\n end\r\n else\r\n begin\r\n Result:=ScanDateTime(ptrn,S,1);\r\n end;\r\nend;\r\n\r\nfunction TBaseJSONDataSet.FormatDateTimeField(DT: TDateTime; F: TField\r\n ): String;\r\n\r\nVar\r\n Ptrn : string;\r\nbegin\r\n Result:='';\r\n Case F.DataType of\r\n ftDate : Ptrn:=TJSONDateField(F).DateFormat;\r\n ftTime : Ptrn:=TJSONTimeField(F).TimeFormat;\r\n ftDateTime : Ptrn:=TJSONDateTimeField(F).DateTimeFormat;\r\n end;\r\n If (Ptrn='') then\r\n Case F.DataType of\r\n ftDate : Result:=DateToStr(DT);\r\n ftTime : Result:=TimeToStr(DT);\r\n ftDateTime : Result:=DateTimeToStr(DT);\r\n end\r\n else\r\n Result:=FormatDateTime(ptrn,DT);\r\nend;\r\n\r\nfunction TBaseJSONDataSet.GetFieldData(Field: TField; Buffer: TDatarecord): JSValue;\r\n\r\nvar\r\n R : JSValue;\r\n\r\nbegin\r\n if (FEditIdx=Buffer.Bookmark) then\r\n R:=FEditRow\r\n else\r\n R:=Buffer.data;\r\n Result:=FFieldMapper.GetJSONDataForField(Field,R);\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.SetFieldData(Field: TField; var Buffer: TDatarecord; AValue : JSValue);\r\n\r\nbegin\r\n FFieldMapper.SetJSONDataForField(Field,FEditRow,AValue);\r\n SetModified(True);\r\n// FFieldMapper.SetJSONDataForField(Field,Buffer.Data,AValue);\r\nend;\r\n\r\nprocedure TBaseJSONDataSet.SetBookmarkFlag(var Buffer: TDataRecord; Value: TBookmarkFlag);\r\n\r\nbegin\r\n Buffer.BookmarkFlag := Value;\r\nend;\r\n\r\nfunction TBaseJSONDataSet.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint;\r\n\r\nbegin\r\n if isNumber(Bookmark1.Data) and isNumber(Bookmark2.Data) then\r\n Result := Integer(Bookmark2.Data) - Integer(Bookmark1.Data)\r\n else\r\n begin\r\n if isNumber(Bookmark1.Data) then\r\n Result := -1\r\n else\r\n if isNumber(Bookmark2.Data) then\r\n Result := 1\r\n else\r\n Result := 0;\r\n end;\r\nend;\r\n\r\n\r\nprocedure TBaseJSONDataSet.SetRecNo(Value: Integer);\r\nbegin\r\n if (Value < 1) or (Value > FCurrentIndex.Count) then\r\n raise EJSONDataset.CreateFmt('%s: SetRecNo: index %d out of range',[Name,Value]);\r\n FCurrent := Value - 1;\r\n Resync([]); \r\n DoAfterScroll;\r\nend;\r\n\r\nconstructor TBaseJSONDataSet.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FownsData:=True;\r\n UseDateTimeFormatFields:=False;\r\n FEditIdx:=-1;\r\nend;\r\n\r\ndestructor TBaseJSONDataSet.Destroy;\r\nbegin\r\n FEditIdx:=-1;\r\n FreeData;\r\n inherited;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright (c) 2018 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.CDS;\r\n\r\ninterface\r\n\r\nuses\r\n Classes, DB, jsondataset, Web, js, WEBLib.Controls;\r\n\r\ntype\r\n TClientDataSet = class;\r\n\r\n TClientDataSource = class(TDataSource)\r\n private\r\n FParent: TControl;\r\n published\r\n property Parent: TControl read FParent write FParent;\r\n property Left;\r\n property Top;\r\n end;\r\n\r\n TConnectErrorEvent = procedure(Sender: TObject; ErrorCode: integer) of object;\r\n\r\n TClientConnection = class(TComponent)\r\n private\r\n FReq: TJSXMLHttpRequest;\r\n FActive: boolean;\r\n FURI: string;\r\n FDS: TClientDataSet;\r\n FParent: TControl;\r\n FDataNode: string;\r\n FAutoOpen: boolean;\r\n FOnConnectError: TConnectErrorEvent;\r\n FBeforeConnect: TNotifyEvent;\r\n FAfterConnect: TNotifyEvent;\r\n protected\r\n procedure SetActive(const Value: boolean);\r\n function onLoad(Event: TEventListenerEvent): boolean;\r\n procedure RegisterDataSet(const value: TClientDataSet);\r\n procedure DoBeforeConnect;\r\n procedure DoAfterConnect;\r\n procedure DoError(ErrorCode: integer);\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n published\r\n property Parent: TControl read FParent write FParent;\r\n property Left;\r\n property Top;\r\n\r\n property Active: boolean read FActive write SetActive;\r\n property AutoOpenDataSet: boolean read FAutoOpen write FAutoOpen;\r\n property DataNode: string read FDataNode write FDataNode;\r\n property URI: string read FURI write FURI;\r\n property AfterConnect: TNotifyEvent read FAfterConnect write FAfterConnect;\r\n property BeforeConnect: TNotifyEvent read FBeforeConnect write FBeforeConnect;\r\n property OnConnectError: TConnectErrorEvent read FOnConnectError write FOnConnectError;\r\n end;\r\n\r\n TClientDataSet = class(TBaseJSONDataSet)\r\n private\r\n FConnection: TClientConnection;\r\n FParent: TControl;\r\n protected\r\n procedure SetConnection(const Value: TClientConnection);\r\n function CreateFieldMapper : TJSONFieldMapper; override;\r\n procedure InitFieldDefs; override;\r\n public\r\n procedure AfterLoadDFMValues; override;\r\n property Rows;\r\n published\r\n property Parent: TControl read FParent write FParent;\r\n property Left;\r\n property Top;\r\n property Connection: TClientConnection read FConnection write SetConnection;\r\n end;\r\n\r\n\r\nimplementation\r\n\r\n{ TClientDataSet }\r\n\r\nprocedure TClientDataSet.AfterLoadDFMValues;\r\nbegin\r\n inherited;\r\n InitFieldDefs;\r\nend;\r\n\r\nfunction TClientDataSet.CreateFieldMapper : TJSONFieldMapper;\r\nbegin\r\n Result := TJSONObjectFieldMapper.Create;\r\nend;\r\n\r\nprocedure TClientDataSet.InitFieldDefs;\r\nvar\r\n i: integer;\r\nbegin\r\n FieldDefs.Clear;\r\n\r\n for i := 0 to ComponentCount - 1 do\r\n begin\r\n if Components[i] is TStringField then\r\n FieldDefs.Add((Components[i] as TStringField).FieldName, ftString, (Components[i] as TStringField).Size);\r\n\r\n if Components[i] is TBooleanField then\r\n FieldDefs.Add((Components[i] as TBooleanField).FieldName, ftBoolean, 0);\r\n\r\n if Components[i] is TIntegerField then\r\n FieldDefs.Add((Components[i] as TIntegerField).FieldName, ftInteger, 0);\r\n\r\n if Components[i] is TFloatField then\r\n FieldDefs.Add((Components[i] as TFloatField).FieldName, ftFloat, 0);\r\n end;\r\n\r\nend;\r\n\r\nprocedure TClientDataSet.SetConnection(const Value: TClientConnection);\r\nbegin\r\n if Assigned(Value) then\r\n Value.RegisterDataSet(Self);\r\nend;\r\n\r\n\r\n{ TClientConnection }\r\n\r\nprocedure TClientConnection.SetActive(const Value: boolean);\r\nbegin\r\n if (FURI <> '') and (Value) then\r\n begin\r\n DoBeforeConnect;\r\n\r\n FActive := Value;\r\n FReq := TJSXMLHttpRequest.New;\r\n FReq.addEventListener('load', @onLoad);\r\n FReq.open('GET', FURI, true);\r\n FReq.send;\r\n end;\r\nend;\r\n\r\nprocedure TClientConnection.RegisterDataSet(const Value: TClientDataSet);\r\nbegin\r\n FDS := Value;\r\nend;\r\n\r\nconstructor TClientConnection.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FDS := nil;\r\n FAutoOpen := true;\r\nend;\r\n\r\nprocedure TClientConnection.DoAfterConnect;\r\nbegin\r\n if Assigned(AfterConnect) then\r\n AfterConnect(Self);\r\nend;\r\n\r\nprocedure TClientConnection.DoBeforeConnect;\r\nbegin\r\n if Assigned(BeforeConnect) then\r\n BeforeConnect(Self);\r\nend;\r\n\r\nprocedure TClientConnection.DoError(ErrorCode: integer);\r\nbegin\r\n if Assigned(OnConnectError) then\r\n OnConnectError(Self, ErrorCode);\r\nend;\r\n\r\nfunction TClientConnection.onLoad(Event: TEventListenerEvent): boolean;\r\nvar\r\n J: TJSObject;\r\n JA: TJSArray;\r\nbegin\r\n if (FReq.status = 200) then\r\n begin\r\n J := TJSJSON.parseObject(FReq.responseText);\r\n\r\n if (FDataNode <> '') then\r\n JA := TJSArray(J.Properties[FDataNode])\r\n else\r\n JA := TJSArray(J);\r\n\r\n if Assigned(FDS) then\r\n begin\r\n FDS.Rows := ja;\r\n\r\n if FAutoOpen then\r\n FDS.Open;\r\n end;\r\n\r\n DoAfterConnect;\r\n\r\n end\r\n else\r\n DoError(FReq.status);\r\n\r\n Result := true;\r\nend;\r\n\r\n\r\nend.","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCPanel;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomControl, Types, WEBLib.TMSFNCTypes, WEBLib.Controls,\r\n WEBLib.TMSFNCBitmapContainer, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCPopup\r\n ,WEBLib.TMSFNCGraphicsTypes\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n ,Generics.Collections, UITypes\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n ,fgl\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr.\r\n MINSECTIONHEIGHT = 16;\r\n\r\n // version history\r\n // v1.0.0.0 : first release\r\n\r\ntype\r\n TTMSFNCCustomPanel = class;\r\n\r\n TTMSFNCPanelButton = (pbCompact, pbClose, pbExpander, pbDropDown);\r\n TTMSFNCPanelButtons = set of TTMSFNCPanelButton;\r\n TTMSFNCPanelCloseAction = (pcaNone, pcaFree, pcaHide);\r\n TTMSFNCPanelDropDownAction = (pddaNone, pddaPopup);\r\n TTMSFNCPanelExpandAction = (peaNone, peaExpand);\r\n TTMSFNCPanelCompactAction = (pcNone, pcCompact);\r\n\r\n TTMSFNCPanelElement = class(TPersistent)\r\n private\r\n FOnChanged: TNotifyEvent;\r\n FText: string;\r\n FSize: Single;\r\n FWordWrapping: Boolean;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n FFont: TTMSFNCGraphicsFont;\r\n FShowButtons: Boolean;\r\n FButtons: TTMSFNCPanelButtons;\r\n FVisible: Boolean;\r\n FButtonSpacing: Single;\r\n FButtonSize: Single;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FStretchText: Boolean;\r\n FDropDownControl: TControl;\r\n FDropDownHeight: Single;\r\n FDropDownWidth: Single;\r\n procedure SetText(const Value: string);\r\n function IsSizeStored: Boolean;\r\n procedure SetSize(const Value: Single);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetButtons(const Value: TTMSFNCPanelButtons);\r\n procedure SetShowButtons(const Value: Boolean);\r\n procedure SetVisible(const Value: Boolean);\r\n function IsButtonSizeStored: Boolean;\r\n function IsButtonSpacingStored: Boolean;\r\n procedure SetButtonSize(const Value: Single);\r\n procedure SetButtonSpacing(const Value: Single);\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetStretchText(const Value: Boolean);\r\n procedure SetDropDownControl(const Value: TControl);\r\n function IsDropDownHeightStored: Boolean;\r\n function IsDropDownWidthStored: Boolean;\r\n protected\r\n procedure Changed;\r\n procedure FontChanged(Sender: TObject);\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n function IsHTML: Boolean; virtual;\r\n public\r\n property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;\r\n constructor Create; virtual;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n published\r\n property StretchText: Boolean read FStretchText write SetStretchText default True;\r\n property Text: string read FText write SetText;\r\n property Size: Single read FSize write SetSize stored IsSizeStored nodefault;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign default gtaCenter;\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign default gtaCenter;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping default True;\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming default gttNone;\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property Visible: Boolean read FVisible write SetVisible default True;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n property ShowButtons: Boolean read FShowButtons write SetShowButtons default True;\r\n property Buttons: TTMSFNCPanelButtons read FButtons write SetButtons default [];\r\n property ButtonSize: Single read FButtonSize write SetButtonSize stored IsButtonSizeStored nodefault;\r\n property ButtonSpacing: Single read FButtonSpacing write SetButtonSpacing stored IsButtonSpacingStored nodefault;\r\n property DropDownControl: TControl read FDropDownControl write SetDropDownControl;\r\n property DropDownWidth: Single read FDropDownWidth write FDropDownWidth stored IsDropDownWidthStored nodefault;\r\n property DropDownHeight: Single read FDropDownHeight write FDropDownHeight stored IsDropDownHeightStored nodefault;\r\n end;\r\n\r\n TTMSFNCPanelHeader = class(TTMSFNCPanelElement)\r\n end;\r\n\r\n TTMSFNCPanelFooter = class(TTMSFNCPanelElement)\r\n public\r\n constructor Create; override;\r\n published\r\n property Visible default False;\r\n property ShowButtons default False;\r\n end;\r\n\r\n TTMSFNCPanelButtonState = (bsNormal, bsHover, bsDown);\r\n {$IFDEF WEBLIB}\r\n TTMSFNCPanelButtonStates = class(TList)\r\n private\r\n function GetItem(Index: Integer): TTMSFNCPanelButtonState;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCPanelButtonState);\r\n public\r\n property Items[Index: Integer]: TTMSFNCPanelButtonState read GetItem write SetItem; default;\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCPanelButtonStates = TList;\r\n {$ENDIF}\r\n\r\n TTMSFNCPanelDownButton = record\r\n Button: TTMSFNCPanelButton;\r\n Down: Boolean;\r\n end;\r\n\r\n TTMSFNCPanelExpandState = (pesCollapsed, pesExpanded);\r\n TTMSFNCPanelCompactState = (pcsCollapsed, pcsExpanded);\r\n\r\n TTMSFNCPanelAnchorClickEvent = procedure(Sender: TObject; AAnchor: String) of object;\r\n\r\n TTMSFNCPanelSection = class(TCollectionItem)\r\n private\r\n FOwner: TTMSFNCCustomPanel;\r\n FSize: Single;\r\n FTag: NativeInt;\r\n FText: string;\r\n FControl: TControl;\r\n procedure SetSize(const Value: Single);\r\n function IsSizeStored: Boolean;\r\n procedure SetText(const Value: string);\r\n procedure SetControl(const Value: TControl);\r\n protected\r\n procedure Changed;\r\n procedure UpdateControlBounds;\r\n public\r\n constructor Create(ACollection: TCollection); override;\r\n procedure Assign(Source: TPersistent); override;\r\n destructor Destroy; override;\r\n published\r\n property Text: string read FText write SetText;\r\n property Size: Single read FSize write SetSize stored IsSizeStored nodefault;\r\n property Control: TControl read FControl write SetControl;\r\n property Tag: NativeInt read FTag write FTag default 0;\r\n end;\r\n\r\n {$IFDEF WEBLIB}\r\n TTMSFNCPanelSections = class(TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TTMSFNCPanelSections = class({$IFDEF LCLLIB}specialize {$ENDIF}TTMSFNCOwnedCollection)\r\n {$ENDIF}\r\n private\r\n FOwner: TTMSFNCCustomPanel;\r\n FOnChanged: TNotifyEvent;\r\n function GetItem(Index: Integer): TTMSFNCPanelSection;\r\n procedure SetItem(Index: Integer; const Value: TTMSFNCPanelSection);\r\n protected\r\n procedure Changed;\r\n property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;\r\n public\r\n constructor Create(AOwner: TTMSFNCCustomPanel);\r\n function Add: TTMSFNCPanelSection;\r\n function Insert(Index: Integer): TTMSFNCPanelSection;\r\n property Items[Index: Integer]: TTMSFNCPanelSection read GetItem write SetItem; default;\r\n end;\r\n\r\n TTMSFNCPanelSectionsAppearance = class(TPersistent)\r\n private\r\n FFont: TTMSFNCGraphicsFont;\r\n FFill: TTMSFNCGraphicsFill;\r\n FStroke: TTMSFNCGraphicsStroke;\r\n FOnChange: TNotifyEvent;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n protected\r\n procedure Changed;\r\n procedure FillChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure FontChanged(Sender: TObject);\r\n property OnChange: TNotifyEvent read FOnChange write FOnChange;\r\n public\r\n procedure Assign(Source: TPersistent); override;\r\n constructor Create; virtual;\r\n destructor Destroy; override;\r\n published\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property Fill: TTMSFNCGraphicsFill read FFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read FStroke write SetStroke;\r\n end;\r\n\r\n TTMSFNCCustomPanel = class(TTMSFNCCustomControl, ITMSFNCBitmapContainer)\r\n private\r\n FOldHeight: Single;\r\n FOldWidth: Single;\r\n FPopup: TTMSFNCPopup;\r\n FExpandState: TTMSFNCPanelExpandState;\r\n FCompactState: TTMSFNCPanelCompactState;\r\n FHeaderDownButton, FFooterDownButton: TTMSFNCPanelDownButton;\r\n FHeaderButtonStates, FFooterButtonStates: TTMSFNCPanelButtonStates;\r\n FHeaderAnchor, FFooterAnchor: String;\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n FHeader: TTMSFNCPanelHeader;\r\n FFooter: TTMSFNCPanelFooter;\r\n FOnHeaderDropDownButtonClick: TNotifyEvent;\r\n FOnHeaderExpandButtonClick: TNotifyEvent;\r\n FOnHeaderCloseButtonClick: TNotifyEvent;\r\n FOnHeaderAnchorClick: TTMSFNCPanelAnchorClickEvent;\r\n FOnFooterAnchorClick: TTMSFNCPanelAnchorClickEvent;\r\n FOnFooterDropDownButtonClick: TNotifyEvent;\r\n FOnFooterExpandButtonClick: TNotifyEvent;\r\n FOnFooterCloseButtonClick: TNotifyEvent;\r\n FCloseAction: TTMSFNCPanelCloseAction;\r\n FDropDownAction: TTMSFNCPanelDropDownAction;\r\n FExpandAction: TTMSFNCPanelExpandAction;\r\n FCompactAction: TTMSFNCPanelCompactAction;\r\n FSections: TTMSFNCPanelSections;\r\n FSectionsAppearance: TTMSFNCPanelSectionsAppearance;\r\n FOnHeaderCompactButtonClick: TNotifyEvent;\r\n FOnFooterCompactButtonClick: TNotifyEvent;\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n procedure SetFooter(const Value: TTMSFNCPanelFooter);\r\n procedure SetHeader(const Value: TTMSFNCPanelHeader);\r\n procedure SetCloseAction(const Value: TTMSFNCPanelCloseAction);\r\n procedure SetDropDownAction(const Value: TTMSFNCPanelDropDownAction);\r\n procedure SetExpandAction(const Value: TTMSFNCPanelExpandAction);\r\n procedure SetCompactAction(const Value: TTMSFNCPanelCompactAction);\r\n procedure SetSections(const Value: TTMSFNCPanelSections);\r\n procedure SetSectionsAppearance(\r\n const Value: TTMSFNCPanelSectionsAppearance);\r\n protected\r\n procedure ApplyStyle; override;\r\n procedure ResetToDefaultStyle; override;\r\n function GetElementRect(ARect: TRectF; AElement: TTMSFNCPanelElement): TRectF; virtual;\r\n function GetTextRect(ARect: TRectF; AElement: TTMSFNCPanelElement): TRectF; virtual;\r\n function GetSectionRect(ARect: TRectF): TRectF; virtual;\r\n function GetButtonsRect(ARect: TRectF; AElement: TTMSFNCPanelElement): TRectF; virtual;\r\n function XYToAnchor(X, Y: Single; AElement: TTMSFNCPanelElement): string; virtual;\r\n function XYToButton(X, Y: Single; AElement: TTMSFNCPanelElement; var AButton: TTMSFNCPanelButton): Boolean; virtual;\r\n function ClearButtonStates(AHoverOnly: Boolean = False): Boolean; virtual;\r\n function GetButtonRect(ARect: TRectF; AElement: TTMSFNCPanelElement; AButton: TTMSFNCPanelButton): TRectF;\r\n function GetCollapsedHeight: Single; virtual;\r\n function GetCollapsedWidth: Single; virtual;\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure FooterChanged(Sender: TObject);\r\n procedure HeaderChanged(Sender: TObject);\r\n procedure SectionsChanged(Sender: TObject);\r\n procedure SectionsAppearanceChanged(Sender: TObject);\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n procedure DrawSections(AGraphics: TTMSFNCGraphics; ARect: TRectF); virtual;\r\n procedure DrawElement(AGraphics: TTMSFNCGraphics; AElement: TTMSFNCPanelElement; ATextRect: TRectF; ARect: TRectF; AButtonsRect: TRectF; AButtonStates: TTMSFNCPanelButtonStates); virtual;\r\n procedure HandleMouseLeave; override;\r\n procedure UpdateControlAfterResize; override;\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleDropDownAction(AButton: TTMSFNCPanelButton; AElement: TTMSFNCPanelElement); virtual;\r\n procedure HandleCloseAction(AElement: TTMSFNCPanelElement); virtual;\r\n procedure HandleExpandAction(AElement: TTMSFNCPanelElement); virtual;\r\n procedure HandleCompactAction(AElement: TTMSFNCPanelElement); virtual;\r\n procedure DoHeaderAnchorClick(AAnchor: String); virtual;\r\n procedure DoHeaderCloseButtonClick; virtual;\r\n procedure DoHeaderExpandButtonClick; virtual;\r\n procedure DoHeaderDropDownButtonClick; virtual;\r\n procedure DoHeaderCompactButtonClick; virtual;\r\n procedure DoFooterAnchorClick(AAnchor: String); virtual;\r\n procedure DoFooterCloseButtonClick; virtual;\r\n procedure DoFooterExpandButtonClick; virtual;\r\n procedure DoFooterDropDownButtonClick; virtual;\r\n procedure DoFooterCompactButtonClick; virtual;\r\n procedure UpdateControlBounds; virtual;\r\n {$IFDEF CMNWEBLIB}\r\n procedure AlignControls(AControl: TControl; var Rect: TRect); override;\r\n {$ENDIF}\r\n property SectionsAppearance: TTMSFNCPanelSectionsAppearance read FSectionsAppearance write SetSectionsAppearance;\r\n property Sections: TTMSFNCPanelSections read FSections write SetSections;\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n property Header: TTMSFNCPanelHeader read FHeader write SetHeader;\r\n property Footer: TTMSFNCPanelFooter read FFooter write SetFooter;\r\n property CloseAction: TTMSFNCPanelCloseAction read FCloseAction write SetCloseAction default pcaHide;\r\n property DropDownAction: TTMSFNCPanelDropDownAction read FDropDownAction write SetDropDownAction default pddaPopup;\r\n property ExpandAction: TTMSFNCPanelExpandAction read FExpandAction write SetExpandAction default peaExpand;\r\n property CompactAction: TTMSFNCPanelCompactAction read FCompactAction write SetCompactAction default pcCompact;\r\n property OnHeaderAnchorClick: TTMSFNCPanelAnchorClickEvent read FOnHeaderAnchorClick write FOnHeaderAnchorClick;\r\n property OnHeaderCloseButtonClick: TNotifyEvent read FOnHeaderCloseButtonClick write FOnHeaderCloseButtonClick;\r\n property OnHeaderExpandButtonClick: TNotifyEvent read FOnHeaderExpandButtonClick write FOnHeaderExpandButtonClick;\r\n property OnHeaderCompactButtonClick: TNotifyEvent read FOnHeaderCompactButtonClick write FOnHeaderCompactButtonClick;\r\n property OnHeaderDropDownButtonClick: TNotifyEvent read FOnHeaderDropDownButtonClick write FOnHeaderDropDownButtonClick;\r\n property OnFooterAnchorClick: TTMSFNCPanelAnchorClickEvent read FOnFooterAnchorClick write FOnFooterAnchorClick;\r\n property OnFooterCloseButtonClick: TNotifyEvent read FOnFooterCloseButtonClick write FOnFooterCloseButtonClick;\r\n property OnFooterExpandButtonClick: TNotifyEvent read FOnFooterExpandButtonClick write FOnFooterExpandButtonClick;\r\n property OnFooterCompactButtonClick: TNotifyEvent read FOnFooterCompactButtonClick write FOnFooterCompactButtonClick;\r\n property OnFooterDropDownButtonClick: TNotifyEvent read FOnFooterDropDownButtonClick write FOnFooterDropDownButtonClick;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure Expand(ACompact: Boolean = False);\r\n procedure Collapse(ACompact: Boolean = False);\r\n procedure Compact;\r\n procedure CompactAndCollapse;\r\n procedure Restore;\r\n property ExpandState: TTMSFNCPanelExpandState read FExpandState write FExpandState;\r\n property CompactState: TTMSFNCPanelCompactState read FCompactState write FCompactState;\r\n {$IFDEF FMXLIB}\r\n procedure SetBounds(X, Y, AWidth, AHeight: Single); override;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n procedure SetBounds(X, Y, {%H-}AWidth, {%H-}AHeight: Integer); override;\r\n {$ENDIF}\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCPanel = class(TTMSFNCCustomPanel)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n function GetVersion: string; override;\r\n published\r\n property BitmapContainer;\r\n property Version: String read GetVersion;\r\n property Fill;\r\n property Sections;\r\n property SectionsAppearance;\r\n property Stroke;\r\n property Header;\r\n property Footer;\r\n property CloseAction;\r\n property DropDownAction;\r\n property ExpandAction;\r\n property CompactAction;\r\n property OnHeaderAnchorClick;\r\n property OnHeaderCloseButtonClick;\r\n property OnHeaderExpandButtonClick;\r\n property OnHeaderCompactButtonClick;\r\n property OnHeaderDropDownButtonClick;\r\n property OnFooterAnchorClick;\r\n property OnFooterCloseButtonClick;\r\n property OnFooterExpandButtonClick;\r\n property OnFooterCompactButtonClick;\r\n property OnFooterDropDownButtonClick;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math, SysUtils, WEBLib.TMSFNCUtils, WEBLib.TMSFNCStyles;\r\n\r\n{ TTMSFNCCustomPanel }\r\n\r\n{$IFDEF FMXLIB}\r\nprocedure TTMSFNCCustomPanel.SetBounds(X, Y, AWidth, AHeight: Single);\r\n{$ENDIF}\r\n{$IFDEF CMNWEBLIB}\r\nprocedure TTMSFNCCustomPanel.AlignControls(AControl: TControl; var Rect: TRect);\r\nbegin\r\n if Header.Visible then\r\n Rect.Top := Rect.Top + Round(Header.Size);\r\n\r\n if Footer.Visible then\r\n Rect.Bottom := Rect.Bottom - Round(Footer.Size);\r\n\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetBounds(X, Y, AWidth, AHeight: Integer);\r\n{$ENDIF}\r\nbegin\r\n inherited SetBounds(X, Y, AWidth, AHeight);\r\n UpdateControlBounds;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.ClearButtonStates(AHoverOnly: Boolean = False): Boolean;\r\nvar\r\n I: Integer;\r\n st: TTMSFNCPanelButtonState;\r\nbegin\r\n Result := False;\r\n for I := 0 to FHeaderButtonStates.Count - 1 do\r\n begin\r\n st := FHeaderButtonStates[I];\r\n if st <> bsNormal then\r\n Result := True;\r\n\r\n if (AHoverOnly and (st = bsHover)) or not AHoverOnly then\r\n FHeaderButtonStates[I] := bsNormal;\r\n end;\r\n\r\n for I := 0 to FFooterButtonStates.Count - 1 do\r\n begin\r\n st := FFooterButtonStates[I];\r\n if st <> bsNormal then\r\n Result := True;\r\n\r\n if (AHoverOnly and (st = bsHover)) or not AHoverOnly then\r\n FFooterButtonStates[I] := bsNormal;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.Collapse(ACompact: Boolean = False);\r\nbegin\r\n if ACompact then\r\n begin\r\n if FCompactState = pcsExpanded then\r\n begin\r\n FOldWidth := Width;\r\n Width := Round(GetCollapsedWidth);\r\n FCompactState := pcsCollapsed;\r\n end;\r\n end\r\n else\r\n begin\r\n if FExpandState = pesExpanded then\r\n begin\r\n FOldHeight := Height;\r\n Height := Round(GetCollapsedHeight);\r\n FExpandState := pesCollapsed;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.Compact;\r\nbegin\r\n Collapse(True);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.CompactAndCollapse;\r\nbegin\r\n Collapse(False);\r\n Collapse(True);\r\nend;\r\n\r\nconstructor TTMSFNCCustomPanel.Create(AOwner: TComponent);\r\nvar\r\n I: TTMSFNCPanelButton;\r\nbegin\r\n inherited;\r\n FSectionsAppearance := TTMSFNCPanelSectionsAppearance.Create;\r\n FSectionsAppearance.OnChange := @SectionsAppearanceChanged;\r\n FSections := TTMSFNCPanelSections.Create(Self);\r\n FSections.OnChanged := @SectionsChanged;\r\n\r\n FFooter := TTMSFNCPanelFooter.Create;\r\n if IsDesignTime then\r\n FFooter.Text := 'Footer';\r\n\r\n FFooter.OnChanged := @FooterChanged;\r\n FHeader := TTMSFNCPanelHeader.Create;\r\n if IsDesignTime then\r\n FHeader.Text := 'Header';\r\n\r\n FHeader.OnChanged := @HeaderChanged;\r\n\r\n FHeaderButtonStates := TTMSFNCPanelButtonStates.Create;\r\n for I := Low(TTMSFNCPanelButton) to High(TTMSFNCPanelButton) do\r\n FHeaderButtonStates.Add(bsNormal);\r\n\r\n FFooterButtonStates := TTMSFNCPanelButtonStates.Create;\r\n for I := Low(TTMSFNCPanelButton) to High(TTMSFNCPanelButton) do\r\n FFooterButtonStates.Add(bsNormal);\r\n\r\n FCloseAction := pcaHide;\r\n FExpandAction := peaExpand;\r\n FCompactAction := pcCompact;\r\n FDropDownAction := pddaPopup;\r\n\r\n FPopup := TTMSFNCPopup.Create(Self);\r\n FPopup.Placement := ppAbsolute;\r\n FPopup.PlacementControl := Self;\r\n\r\n FExpandState := pesExpanded;\r\n FCompactState := pcsExpanded;\r\n\r\n Width := 200;\r\n Height := 275;\r\nend;\r\n\r\ndestructor TTMSFNCCustomPanel.Destroy;\r\nbegin\r\n FHeaderButtonStates.Free;\r\n FFooterButtonStates.Free;\r\n FFooter.Free;\r\n FHeader.Free;\r\n FSections.Free;\r\n FSectionsAppearance.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoFooterAnchorClick(AAnchor: String);\r\nbegin\r\n if Assigned(OnFooterAnchorClick) then\r\n OnFooterAnchorClick(Self, AAnchor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoFooterCloseButtonClick;\r\nbegin\r\n if Assigned(OnFooterCloseButtonClick) then\r\n OnFooterCloseButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoFooterCompactButtonClick;\r\nbegin\r\n if Assigned(OnFooterCompactButtonClick) then\r\n OnFooterCompactButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoFooterDropDownButtonClick;\r\nbegin\r\n if Assigned(OnFooterDropDownButtonClick) then\r\n OnFooterDropDownButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoFooterExpandButtonClick;\r\nbegin\r\n if Assigned(OnFooterExpandButtonClick) then\r\n OnFooterExpandButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoHeaderAnchorClick(AAnchor: String);\r\nbegin\r\n if Assigned(OnHeaderAnchorClick) then\r\n OnHeaderAnchorClick(Self, AAnchor);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoHeaderCloseButtonClick;\r\nbegin\r\n if Assigned(OnHeaderCloseButtonClick) then\r\n OnHeaderCloseButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoHeaderCompactButtonClick;\r\nbegin\r\n if Assigned(OnHeaderCompactButtonClick) then\r\n OnHeaderCompactButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoHeaderDropDownButtonClick;\r\nbegin\r\n if Assigned(OnHeaderDropDownButtonClick) then\r\n OnHeaderDropDownButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DoHeaderExpandButtonClick;\r\nbegin\r\n if Assigned(OnHeaderExpandButtonClick) then\r\n OnHeaderExpandButtonClick(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n inherited;\r\n AGraphics.BitmapContainer := BitmapContainer;\r\n DrawSections(AGraphics, GetSectionRect(ARect));\r\n DrawElement(AGraphics, Header, GetTextRect(ARect, Header), GetElementRect(ARect, Header), GetButtonsRect(ARect, Header), FHeaderButtonStates);\r\n DrawElement(AGraphics, Footer, GetTextRect(ARect, Footer), GetElementRect(ARect, Footer), GetButtonsRect(ARect, Footer), FFooterButtonStates);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DrawElement(AGraphics: TTMSFNCGraphics;\r\n AElement: TTMSFNCPanelElement; ATextRect, ARect, AButtonsRect: TRectF; AButtonStates: TTMSFNCPanelButtonStates);\r\nvar\r\n tr: TRectF;\r\n btnr: TRectF;\r\n br: TRectF;\r\n I: TTMSFNCPanelButton;\r\n e, c: Integer;\r\nbegin\r\n if not AElement.Visible then\r\n Exit;\r\n\r\n AGraphics.Fill.Assign(AElement.Fill);\r\n AGraphics.Stroke.Assign(AElement.Stroke);\r\n AGraphics.DrawRectangle(ARect);\r\n\r\n if FCompactState = pcsExpanded then\r\n begin\r\n tr := ATextRect;\r\n InflateRectEx(tr, -3, -3);\r\n AGraphics.Font.AssignSource(AElement.Font);\r\n AGraphics.DrawText(tr, AElement.Text, AElement.WordWrapping, AElement.HorizontalTextAlign, AElement.VerticalTextAlign, AElement.Trimming);\r\n end;\r\n\r\n if AElement.ShowButtons and (AElement.Buttons <> []) then\r\n begin\r\n btnr := AButtonsRect;\r\n for I := Low(TTMSFNCPanelButton) to High(TTMSFNCPanelButton) do\r\n begin\r\n if (I in AElement.Buttons) and (((I = pbCompact) and (FCompactState = pcsCollapsed)) or (FCompactState = pcsExpanded)) then\r\n begin\r\n br := RectF(Round(btnr.Right - AElement.ButtonSpacing - AElement.ButtonSize), Round(btnr.Top + ((btnr.Bottom - btnr.Top) - AElement.ButtonSize) / 2), Round(btnr.Right - AElement.ButtonSpacing),\r\n Round(btnr.Top + ((btnr.Bottom - btnr.Top) - AElement.ButtonSize) / 2 + AElement.ButtonSize));\r\n\r\n e := Integer(FExpandState);\r\n c := Integer(FCompactState);\r\n\r\n case I of\r\n pbCompact: AGraphics.DrawCompactButton(br, TTMSFNCGraphicsCompactState(c), AButtonStates[Integer(I)] = bsDown, AButtonStates[Integer(I)] = bsHover, True, AdaptToStyle);\r\n pbClose: AGraphics.DrawCloseButton(br, AButtonStates[Integer(I)] = bsDown, AButtonStates[Integer(I)] = bsHover, True, AdaptToStyle);\r\n pbExpander: AGraphics.DrawExpanderButton(br, TTMSFNCGraphicsExpanderState(e), AButtonStates[Integer(I)] = bsDown, AButtonStates[Integer(I)] = bsHover, True, AdaptToStyle);\r\n pbDropDown: AGraphics.DrawDropDownButton(br, AButtonStates[Integer(I)] = bsDown, AButtonStates[Integer(I)] = bsHover, True, True, AdaptToStyle);\r\n end;\r\n\r\n btnr.Right := btnr.Right - AElement.ButtonSpacing - AElement.ButtonSize;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.DrawSections(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nvar\r\n i: Integer;\r\n sec: TTMSFNCPanelSection;\r\n y: Single;\r\n br: TRectF;\r\nbegin\r\n y := 0;\r\n AGraphics.Fill.Assign(SectionsAppearance.Fill);\r\n AGraphics.Stroke.Assign(SectionsAppearance.Stroke);\r\n AGraphics.Font.AssignSource(SectionsAppearance.Font);\r\n for i := 0 to Sections.Count - 1 do\r\n begin\r\n sec := Sections[i];\r\n br := RectF(ARect.Left, ARect.Top + y, ARect.Right, ARect.Top + y + Max(MINSECTIONHEIGHT, AGraphics.CalculateTextHeight(sec.Text) + 4));\r\n AGraphics.DrawRectangle(br, gcrmShiftLeftAndExpandHeight);\r\n InflateRectEx(br, -2, -2);\r\n AGraphics.DrawText(br, sec.Text);\r\n y := y + sec.Size;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.Expand(ACompact: Boolean = False);\r\nbegin\r\n if ACompact then\r\n begin\r\n if FCompactState = pcsCollapsed then\r\n begin\r\n Width := Round(FOldWidth);\r\n FCompactState := pcsExpanded;\r\n end;\r\n end\r\n else\r\n begin\r\n if FExpandState = pesCollapsed then\r\n begin\r\n Height := Round(FOldHeight);\r\n FExpandState := pesExpanded;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.FooterChanged(Sender: TObject);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if Header.Visible then\r\n Padding.Top := Header.Size;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Realign;\r\n {$ENDIF}\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n Header.Stroke.Color := Stroke.Color;\r\n Footer.Stroke.Color := Stroke.Color;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleHeaderFillColor(c) then\r\n begin\r\n Header.Fill.Kind := gfkSolid;\r\n Header.Fill.Color := c;\r\n Footer.Fill.Kind := gfkSolid;\r\n Footer.Fill.Color := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleHeaderFillColorTo(c) then\r\n begin\r\n Header.Fill.Kind := gfkGradient;\r\n Header.Fill.ColorTo := c;\r\n Footer.Fill.Kind := gfkGradient;\r\n Footer.Fill.ColorTo := c;\r\n end;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleTextFontColor(c) then\r\n begin\r\n Header.Font.Color := c;\r\n Footer.Font.Color := c;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if (Source is TTMSFNCCustomPanel) then\r\n begin\r\n FHeader.Assign((Source as TTMSFNCCustomPanel).Header);\r\n FFooter.Assign((Source as TTMSFNCCustomPanel).Footer);\r\n FCloseAction := (Source as TTMSFNCCustomPanel).CloseAction;\r\n FDropDownAction := (Source as TTMSFNCCustomPanel).DropDownAction;\r\n FExpandAction := (Source as TTMSFNCCustomPanel).ExpandAction;\r\n FCompactAction := (Source as TTMSFNCCustomPanel).CompactAction;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := FBitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetButtonRect(ARect: TRectF;\r\n AElement: TTMSFNCPanelElement; AButton: TTMSFNCPanelButton): TRectF;\r\nvar\r\n I: TTMSFNCPanelButton;\r\n br: TRectF;\r\n btnr: TRectF;\r\nbegin\r\n btnr := GetButtonsRect(ARect, AElement);\r\n for I := Low(TTMSFNCPanelButton) to High(TTMSFNCPanelButton) do\r\n begin\r\n if (I in AElement.Buttons) and (((I = pbCompact) and (FCompactState = pcsCollapsed)) or (FCompactState = pcsExpanded)) then\r\n begin\r\n br := RectF(Round(btnr.Right - AElement.ButtonSpacing - AElement.ButtonSize), Round(btnr.Top + ((btnr.Bottom - btnr.Top) - AElement.ButtonSize) / 2), Round(btnr.Right - AElement.ButtonSpacing),\r\n Round(btnr.Top + ((btnr.Bottom - btnr.Top) - AElement.ButtonSize) / 2 + AElement.ButtonSize));\r\n btnr.Right := btnr.Right - AElement.ButtonSpacing - AElement.ButtonSize;\r\n if I = AButton then\r\n begin\r\n Result := br;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetButtonsRect(ARect: TRectF; AElement: TTMSFNCPanelElement): TRectF;\r\nvar\r\n I: TTMSFNCPanelButton;\r\nbegin\r\n if AElement = Header then\r\n Result := RectF(ARect.Right, ARect.Top, ARect.Right, ARect.Top + AElement.Size)\r\n else if AElement = Footer then\r\n Result := RectF(ARect.Right, ARect.Bottom - AElement.Size, ARect.Right, ARect.Bottom);\r\n\r\n if AElement.ShowButtons and (AElement.Buttons <> []) then\r\n begin\r\n for I := Low(TTMSFNCPanelButton) to High(TTMSFNCPanelButton) do\r\n if (I in AElement.Buttons) and (((I = pbCompact) and (FCompactState = pcsCollapsed)) or (FCompactState = pcsExpanded)) then\r\n Result.Left := Result.Left - AElement.ButtonSpacing - AElement.ButtonSize;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetCollapsedHeight: Single;\r\nbegin\r\n Result := 0;\r\n if Header.Visible then\r\n Result := Result + Header.Size;\r\n\r\n if Footer.Visible then\r\n Result := Result + Footer.Size;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetCollapsedWidth: Single;\r\nbegin\r\n Result := Header.ButtonSize + Header.ButtonSpacing * 2;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetElementRect(ARect: TRectF;\r\n AElement: TTMSFNCPanelElement): TRectF;\r\nbegin\r\n if AElement = Header then\r\n Result := RectF(ARect.Left, ARect.Top, ARect.Right, ARect.Top + AElement.Size)\r\n else if AElement = Footer then\r\n Result := RectF(ARect.Left, ARect.Bottom - AElement.Size, ARect.Right, ARect.Bottom);\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetSectionRect(ARect: TRectF): TRectF;\r\nbegin\r\n Result := ARect;\r\n if Header.Visible then\r\n Result.Top := Result.Top + Header.Size;\r\n\r\n if Footer.Visible then\r\n Result.Bottom := Result.Bottom - Footer.Size;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.GetTextRect(ARect: TRectF; AElement: TTMSFNCPanelElement): TRectF;\r\nvar\r\n x: Single;\r\nbegin\r\n if AElement.StretchText then\r\n x := ARect.Right\r\n else\r\n x := GetButtonsRect(ARect, AElement).Left;\r\n\r\n if AElement = Header then\r\n Result := RectF(ARect.Left, ARect.Top, x, ARect.Top + AElement.Size)\r\n else if AElement = Footer then\r\n Result := RectF(ARect.Left, ARect.Bottom - AElement.Size, x, ARect.Bottom);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleCloseAction(AElement: TTMSFNCPanelElement);\r\nbegin\r\n case CloseAction of\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n pcaFree: Self.DisposeOf;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n pcaFree: Self.Free;\r\n {$ENDIF}\r\n pcaHide: Visible := False;\r\n end;\r\n\r\n if AElement = Header then\r\n DoHeaderCloseButtonClick\r\n else if AElement = Footer then\r\n DoFooterCloseButtonClick\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleCompactAction(AElement: TTMSFNCPanelElement);\r\nbegin\r\n case CompactAction of\r\n pcCompact:\r\n begin\r\n case FCompactState of\r\n pcsCollapsed: Expand(True);\r\n pcsExpanded: Collapse(True);\r\n end;\r\n end;\r\n end;\r\n\r\n if AElement = Header then\r\n DoHeaderCompactButtonClick\r\n else if AElement = Footer then\r\n DoFooterCompactButtonClick\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleDropDownAction(AButton: TTMSFNCPanelButton; AElement: TTMSFNCPanelElement);\r\nvar\r\n br: TRectF;\r\n pt: TPointF;\r\nbegin\r\n case DropDownAction of\r\n pddaPopup:\r\n begin\r\n if Assigned(AElement.DropDownControl) then\r\n begin\r\n br := GetButtonRect(LocalRect, AElement, AButton);\r\n pt := LocalToScreenEx(PointF(br.Left, br.Top + (br.Bottom - br.Top)));\r\n AElement.DropDownControl.Width := Round(AElement.DropDownWidth);\r\n AElement.DropDownControl.Height := Round(AElement.DropDownHeight);\r\n FPopup.DropDownHeight := AElement.DropDownHeight;\r\n FPopup.DropDownWidth := AElement.DropDownWidth;\r\n FPopup.ContentControl := AElement.DropDownControl;\r\n FPopup.FocusedControl := AElement.DropDownControl;\r\n\r\n FPopup.PlacementRectangle.Left := pt.X;\r\n FPopup.PlacementRectangle.Top := pt.Y;\r\n FPopup.PlacementRectangle.Right := pt.X + FPopup.DropDownWidth;\r\n FPopup.PlacementRectangle.Bottom := pt.Y + FPopup.DropDownHeight;\r\n\r\n FPopup.Popup;\r\n end\r\n end;\r\n end;\r\n\r\n if AElement = Header then\r\n DoHeaderDropDownButtonClick\r\n else if AElement = Footer then\r\n DoFooterDropDownButtonClick\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleExpandAction(AElement: TTMSFNCPanelElement);\r\nbegin\r\n case ExpandAction of\r\n peaExpand:\r\n begin\r\n case FExpandState of\r\n pesCollapsed: Expand;\r\n pesExpanded: Collapse;\r\n end;\r\n end;\r\n end;\r\n\r\n if AElement = Header then\r\n DoHeaderExpandButtonClick\r\n else if AElement = Footer then\r\n DoFooterExpandButtonClick\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nvar\r\n hb, fb: Boolean;\r\n hbtn, fbtn: TTMSFNCPanelButton;\r\nbegin\r\n inherited;\r\n CaptureEx;\r\n FHeaderDownButton.Down := False;\r\n FFooterDownButton.Down := False;\r\n fb := False;\r\n hbtn := pbClose;\r\n hb := XYToButton(X, Y, Header, hbtn);\r\n if not hb then\r\n begin\r\n fbtn := pbClose;\r\n fb := XYToButton(X, Y, Footer, fbtn);\r\n if fb then\r\n begin\r\n FFooterButtonStates[Integer(fbtn)] := bsDown;\r\n FFooterDownButton.Down := True;\r\n FFooterDownButton.Button := fbtn;\r\n end;\r\n end\r\n else\r\n begin\r\n FHeaderButtonStates[Integer(hbtn)] := bsDown;\r\n FHeaderDownButton.Down := True;\r\n FHeaderDownButton.Button := hbtn;\r\n end;\r\n\r\n if not hb and not fb then\r\n begin\r\n FHeaderAnchor := XYToAnchor(X, Y, Header);\r\n if FHeaderAnchor = '' then\r\n FFooterAnchor := XYToAnchor(X, Y, Footer)\r\n end;\r\n\r\n if fb or hb then\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleMouseLeave;\r\nbegin\r\n inherited;\r\n if ClearButtonStates then\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleMouseMove(Shift: TShiftState; X, Y: Single);\r\nvar\r\n h, f: String;\r\n hb, fb, c: Boolean;\r\n hbtn, fbtn: TTMSFNCPanelButton;\r\nbegin\r\n inherited;\r\n c := False;\r\n hb := False;\r\n fb := False;\r\n if not FHeaderDownButton.Down and not FFooterDownButton.Down then\r\n begin\r\n c := ClearButtonStates(True);\r\n fb := False;\r\n hbtn := pbClose;\r\n hb := XYToButton(X, Y, Header, hbtn);\r\n if not hb then\r\n begin\r\n fbtn := pbClose;\r\n fb := XYToButton(X, Y, Footer, fbtn);\r\n if fb then\r\n FFooterButtonStates[Integer(fbtn)] := bsHover;\r\n end\r\n else\r\n FHeaderButtonStates[Integer(hbtn)] := bsHover;\r\n end;\r\n\r\n if not hb and not fb then\r\n begin\r\n h := XYToAnchor(X, Y, Header);\r\n if h = '' then\r\n f := XYToAnchor(X, Y, Footer);\r\n\r\n if (h <> '') or (f <> '') then\r\n Cursor := crHandPoint\r\n else\r\n Cursor := crDefault;\r\n end;\r\n\r\n if fb or hb or c then\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HandleMouseUp(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nvar\r\n hb, fb: Boolean;\r\n hbtn, fbtn: TTMSFNCPanelButton;\r\nbegin\r\n inherited;\r\n ReleaseCaptureEx;\r\n if (FFooterAnchor = '') and (FHeaderAnchor = '') then\r\n begin\r\n hbtn := pbClose;\r\n hb := XYToButton(X, Y, Header, hbtn);\r\n if not hb then\r\n begin\r\n fbtn := pbClose;\r\n fb := XYToButton(X, Y, Footer, fbtn);\r\n if fb and (fbtn = FFooterDownButton.Button) and FFooterDownButton.Down then\r\n begin\r\n case fbtn of\r\n pbCompact: HandleCompactAction(Footer);\r\n pbClose: HandleCloseAction(Footer);\r\n pbExpander: HandleExpandAction(Header);\r\n pbDropDown: HandleDropDownAction(fbtn, Footer);\r\n end;\r\n end;\r\n end\r\n else if (hbtn = FHeaderDownButton.Button) and FHeaderDownButton.Down then\r\n begin\r\n case hbtn of\r\n pbCompact: HandleCompactAction(Header);\r\n pbClose: HandleCloseAction(Header);\r\n pbExpander: HandleExpandAction(Header);\r\n pbDropDown: HandleDropDownAction(hbtn, Header);\r\n end;\r\n end;\r\n end\r\n else\r\n begin\r\n if FHeaderAnchor <> '' then\r\n DoHeaderAnchorClick(FHeaderAnchor);\r\n if FFooterAnchor <> '' then\r\n DoFooterAnchorClick(FFooterAnchor);\r\n end;\r\n\r\n FFooterAnchor := '';\r\n FHeaderAnchor := '';\r\n FHeaderDownButton.Down := False;\r\n FFooterDownButton.Down := False;\r\n if ClearButtonStates then\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.HeaderChanged(Sender: TObject);\r\nbegin\r\n {$IFDEF FMXLIB}\r\n if Header.Visible then\r\n Padding.Top := Header.Size;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n Realign;\r\n {$ENDIF}\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nvar\r\n I: Integer;\r\nbegin\r\n inherited;\r\n if not (csDestroying in ComponentState) and (Operation = opRemove) and (AComponent = FBitmapContainer) then\r\n FBitmapContainer := nil;\r\n\r\n if not (csDestroying in ComponentState) and (Operation = opRemove) then\r\n begin\r\n for i := 0 to Sections.Count - 1 do\r\n begin\r\n if AComponent = Sections[i].FControl then\r\n Sections[i].FControl := nil;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.ResetToDefaultStyle;\r\nbegin\r\n inherited;\r\n Header.Stroke.Color := gcSilver;\r\n Footer.Stroke.Color := gcSilver;\r\n Header.Fill.Kind := gfkSolid;\r\n Header.Fill.Color := MakeGraphicsColor(228, 228, 228);\r\n Footer.Fill.Kind := gfkSolid;\r\n Footer.Fill.Color := MakeGraphicsColor(228, 228, 228);\r\n Header.Font.Color := gcBlack;\r\n Footer.Font.Color := gcBlack;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.Restore;\r\nbegin\r\n Expand(False);\r\n Expand(True);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SectionsAppearanceChanged(Sender: TObject);\r\nbegin\r\n UpdateControlBounds;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SectionsChanged(Sender: TObject);\r\nbegin\r\n UpdateControlBounds;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nbegin\r\n FBitmapContainer := Value;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetCloseAction(\r\n const Value: TTMSFNCPanelCloseAction);\r\nbegin\r\n FCloseAction := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetDropDownAction(\r\n const Value: TTMSFNCPanelDropDownAction);\r\nbegin\r\n FDropDownAction := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetCompactAction(\r\n const Value: TTMSFNCPanelCompactAction);\r\nbegin\r\n FCompactAction := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetExpandAction(\r\n const Value: TTMSFNCPanelExpandAction);\r\nbegin\r\n FExpandAction := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetFooter(const Value: TTMSFNCPanelFooter);\r\nbegin\r\n FFooter.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetHeader(const Value: TTMSFNCPanelHeader);\r\nbegin\r\n FHeader.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetSections(const Value: TTMSFNCPanelSections);\r\nbegin\r\n FSections.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.SetSectionsAppearance(\r\n const Value: TTMSFNCPanelSectionsAppearance);\r\nbegin\r\n FSectionsAppearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n UpdateControlBounds;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPanel.UpdateControlBounds;\r\nvar\r\n I: Integer;\r\nbegin\r\n for I := 0 to Sections.Count - 1 do\r\n Sections[I].UpdateControlBounds;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.XYToAnchor(X, Y: Single;\r\n AElement: TTMSFNCPanelElement): string;\r\nvar\r\n g: TTMSFNCGraphics;\r\n ha, va: TTMSFNCGraphicsTextAlign;\r\nbegin\r\n Result := '';\r\n if AElement.IsHTML then\r\n begin\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n g.BitmapContainer := BitmapContainer;\r\n try\r\n ha := AElement.HorizontalTextAlign;\r\n va := AElement.VerticalTextAlign;\r\n Result := g.DrawText(GetTextRect(LocalRect, AElement), AElement.Text, AElement.WordWrapping, ha, va, AElement.Trimming, 0, -1, -1, True, True, X, Y);\r\n finally\r\n g.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomPanel.XYToButton(X, Y: Single;\r\n AElement: TTMSFNCPanelElement; var AButton: TTMSFNCPanelButton): Boolean;\r\nvar\r\n I: TTMSFNCPanelButton;\r\n br: TRectF;\r\n btnr: TRectF;\r\nbegin\r\n Result := False;\r\n\r\n if not AElement.ShowButtons or (AElement.Buttons = []) then\r\n Exit;\r\n\r\n btnr := GetButtonsRect(LocalRect, AElement);\r\n for I := Low(TTMSFNCPanelButton) to High(TTMSFNCPanelButton) do\r\n begin\r\n if (I in AElement.Buttons) and (((I = pbCompact) and (FCompactState = pcsCollapsed)) or (FCompactState = pcsExpanded)) then\r\n begin\r\n br := RectF(btnr.Right - AElement.ButtonSpacing - AElement.ButtonSize, btnr.Top + ((btnr.Bottom - btnr.Top) - AElement.ButtonSize) / 2, btnr.Right - AElement.ButtonSpacing,\r\n btnr.Top + ((btnr.Bottom - btnr.Top) - AElement.ButtonSize) / 2 + AElement.ButtonSize);\r\n\r\n if PtInRectEx(br, PointF(X, Y)) then\r\n begin\r\n AButton := I;\r\n Result := True;\r\n Break;\r\n end;\r\n\r\n btnr.Right := btnr.Right - AElement.ButtonSpacing - AElement.ButtonSize;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCPanel }\r\n\r\nfunction TTMSFNCPanel.GetVersion: string;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCPanel.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCPanel);\r\nend;\r\n\r\n{ TTMSFNCPanelElement }\r\n\r\nprocedure TTMSFNCPanelElement.Assign(Source: TPersistent);\r\nbegin\r\n if (Source is TTMSFNCPanelElement) then\r\n begin\r\n FText := (Source as TTMSFNCPanelElement).Text;\r\n FSize := (Source as TTMSFNCPanelElement).Size;\r\n FHorizontalTextAlign := (Source as TTMSFNCPanelElement).HorizontalTextAlign;\r\n FVerticalTextAlign := (Source as TTMSFNCPanelElement).VerticalTextAlign;\r\n FWordWrapping := (Source as TTMSFNCPanelElement).WordWrapping;\r\n FTrimming := (Source as TTMSFNCPanelElement).Trimming;\r\n FFont.AssignSource((Source as TTMSFNCPanelElement).Font);\r\n FShowButtons := (Source as TTMSFNCPanelElement).ShowButtons;\r\n FButtons := (Source as TTMSFNCPanelElement).Buttons;\r\n FVisible := (Source as TTMSFNCPanelElement).Visible;\r\n FButtonSpacing := (Source as TTMSFNCPanelElement).ButtonSpacing;\r\n FButtonSize := (Source as TTMSFNCPanelElement).ButtonSize;\r\n FStretchText := (Source as TTMSFNCPanelElement).StretchText;\r\n FDropDownWidth := (Source as TTMSFNCPanelElement).DropDownWidth;\r\n FDropDownHeight := (Source as TTMSFNCPanelElement).DropDownHeight;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.Changed;\r\nbegin\r\n if Assigned(OnChanged) then\r\n OnChanged(Self);\r\nend;\r\n\r\nconstructor TTMSFNCPanelElement.Create;\r\nbegin\r\n FSize := 28;\r\n FVisible := True;\r\n FStretchText := True;\r\n FHorizontalTextAlign := gtaCenter;\r\n FVerticalTextAlign := gtaCenter;\r\n FWordWrapping := True;\r\n FTrimming := gttNone;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @FontChanged;\r\n FShowButtons := True;\r\n FButtons := [];\r\n FButtonSpacing := 4;\r\n FButtonSize := 20;\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(228, 228, 228));\r\n FFill.OnChanged := @FillChanged;\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FStroke.OnChanged := @StrokeChanged;\r\n FDropDownWidth := 100;\r\n FDropDownHeight := 120;\r\nend;\r\n\r\ndestructor TTMSFNCPanelElement.Destroy;\r\nbegin\r\n FFont.Free;\r\n FFill.Free;\r\n FStroke.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.FillChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.FontChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nfunction TTMSFNCPanelElement.IsButtonSizeStored: Boolean;\r\nbegin\r\n Result := ButtonSize <> 20;\r\nend;\r\n\r\nfunction TTMSFNCPanelElement.IsButtonSpacingStored: Boolean;\r\nbegin\r\n Result := ButtonSpacing <> 4;\r\nend;\r\n\r\nfunction TTMSFNCPanelElement.IsDropDownHeightStored: Boolean;\r\nbegin\r\n Result := DropDownHeight <> 120;\r\nend;\r\n\r\nfunction TTMSFNCPanelElement.IsDropDownWidthStored: Boolean;\r\nbegin\r\n Result := DropDownWidth <> 100;\r\nend;\r\n\r\nfunction TTMSFNCPanelElement.IsHTML: Boolean;\r\nbegin\r\n Result := TTMSFNCUtils.IsHTML(Text);\r\nend;\r\n\r\nfunction TTMSFNCPanelElement.IsSizeStored: Boolean;\r\nbegin\r\n Result := Size <> 28;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetButtons(const Value: TTMSFNCPanelButtons);\r\nbegin\r\n if FButtons <> Value then\r\n begin\r\n FButtons := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetButtonSize(const Value: Single);\r\nbegin\r\n if FButtonSize <> Value then\r\n begin\r\n FButtonSize := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetButtonSpacing(const Value: Single);\r\nbegin\r\n if FButtonSpacing <> Value then\r\n begin\r\n FButtonSpacing := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetDropDownControl(const Value: TControl);\r\nbegin\r\n if Value = nil then\r\n begin\r\n if Assigned(FDropDownControl) then\r\n FDropDownControl.Visible := True;\r\n end;\r\n\r\n FDropDownControl := Value;\r\n if Assigned(FDropDownControl) then\r\n begin\r\n FDropDownControl.Visible := False;\r\n DropDownWidth := FDropDownControl.Width;\r\n DropDownHeight := FDropDownControl.Height;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.AssignSource(Value);\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetShowButtons(const Value: Boolean);\r\nbegin\r\n if FShowButtons <> Value then\r\n begin\r\n FShowButtons := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetSize(const Value: Single);\r\nbegin\r\n if FSize <> Value then\r\n begin\r\n FSize := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetStretchText(const Value: Boolean);\r\nbegin\r\n if FStretchText <> Value then\r\n begin\r\n FStretchText := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetText(const Value: string);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetTrimming(\r\n const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetVisible(const Value: Boolean);\r\nbegin\r\n if FVisible <> Value then\r\n begin\r\n FVisible := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelElement.StrokeChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\n{ TTMSFNCPanelFooter }\r\n\r\nconstructor TTMSFNCPanelFooter.Create;\r\nbegin\r\n inherited;\r\n FShowButtons := False;\r\n FVisible := False;\r\nend;\r\n\r\n{ TTMSFNCPanelSection }\r\n\r\nprocedure TTMSFNCPanelSection.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCPanelSection then\r\n begin\r\n FText := (Source as TTMSFNCPanelSection).Text;\r\n FSize := (Source as TTMSFNCPanelSection).Size;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSection.Changed;\r\nbegin\r\n if Assigned(FOwner) then\r\n FOwner.Invalidate;\r\nend;\r\n\r\nconstructor TTMSFNCPanelSection.Create(ACollection: TCollection);\r\nbegin\r\n inherited;\r\n if Assigned(Collection) then\r\n FOwner := (Collection as TTMSFNCPanelSections).FOwner;\r\n FSize := 48;\r\n Changed;\r\nend;\r\n\r\ndestructor TTMSFNCPanelSection.Destroy;\r\nbegin\r\n inherited;\r\n Changed;\r\nend;\r\n\r\nfunction TTMSFNCPanelSection.IsSizeStored: Boolean;\r\nbegin\r\n Result := Size <> 48;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSection.SetControl(const Value: TControl);\r\nvar\r\n i: Integer;\r\n Panel: TTMSFNCCustomPanel;\r\nbegin\r\n if (FControl <> Value) then\r\n begin\r\n\r\n if Assigned(Value) then\r\n begin\r\n Panel := FOwner;\r\n if Assigned(Panel) then\r\n begin\r\n for i := 0 to Panel.Sections.Count - 1 do\r\n begin\r\n if Panel.Sections[i].Control = Value then\r\n Panel.Sections[i].Control := nil;\r\n end;\r\n\r\n if Value.Parent <> Panel then\r\n Value.Parent := Panel;\r\n end;\r\n end;\r\n\r\n FControl := Value;\r\n\r\n if Assigned(FControl) then\r\n UpdateControlBounds;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSection.SetSize(const Value: Single);\r\nbegin\r\n if FSize <> Value then\r\n begin\r\n FSize := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSection.SetText(const Value: string);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n Changed;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSection.UpdateControlBounds;\r\nvar\r\n i: Integer;\r\n ARect: TRectF;\r\n Panel: TTMSFNCCustomPanel;\r\n g: TTMSFNCGraphics;\r\n h: Single;\r\nbegin\r\n if Assigned(FControl) then\r\n begin\r\n Panel := FOwner;\r\n if Assigned(Panel) then\r\n begin\r\n ARect := Panel.GetSectionRect(Panel.LocalRect);\r\n\r\n for i := 0 to Index - 1 do\r\n ARect.Top := ARect.Top + Panel.Sections[i].FSize;\r\n\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n try\r\n g.Font.AssignSource(Panel.SectionsAppearance.Font);\r\n h := Max(MINSECTIONHEIGHT, g.CalculateTextHeight(Text) + 4);\r\n finally\r\n g.Free;\r\n end;\r\n\r\n ARect.Top := ARect.Top + h - 1;\r\n\r\n if Index <> Panel.Sections.Count - 1 then\r\n ARect.Bottom := ARect.Top + FSize - h + 1;\r\n\r\n if not EqualRectEx(ConvertToRectF(FControl.BoundsRect), ARect) then\r\n begin\r\n {$IFDEF CMNWEBLIB}\r\n FControl.BoundsRect := ConvertToRect(ARect);\r\n {$ELSE}\r\n FControl.BoundsRect := ARect;\r\n {$ENDIF}\r\n Panel.Invalidate;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\n{ TTMSFNCPanelSections }\r\n\r\nfunction TTMSFNCPanelSections.Add: TTMSFNCPanelSection;\r\nbegin\r\n Result := TTMSFNCPanelSection(inherited Add);\r\nend;\r\n\r\nprocedure TTMSFNCPanelSections.Changed;\r\nbegin\r\n if Assigned(OnChanged) then\r\n OnChanged(Self);\r\nend;\r\n\r\nconstructor TTMSFNCPanelSections.Create(AOwner: TTMSFNCCustomPanel);\r\nbegin\r\n inherited Create(AOwner, TTMSFNCPanelSection);\r\n FOwner := AOwner;\r\nend;\r\n\r\nfunction TTMSFNCPanelSections.GetItem(Index: Integer): TTMSFNCPanelSection;\r\nbegin\r\n Result := TTMSFNCPanelSection(inherited Items[Index]);\r\nend;\r\n\r\nfunction TTMSFNCPanelSections.Insert(index: Integer): TTMSFNCPanelSection;\r\nbegin\r\n Result := TTMSFNCPanelSection(inherited Insert(Index));\r\nend;\r\n\r\nprocedure TTMSFNCPanelSections.SetItem(Index: Integer; const Value: TTMSFNCPanelSection);\r\nbegin\r\n inherited SetItem(Index, Value);\r\nend;\r\n\r\n{ TTMSFNCPanelSectionsAppearance }\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.Assign(Source: TPersistent);\r\nbegin\r\n if Source is TTMSFNCPanelSectionsAppearance then\r\n begin\r\n FFill.Assign((Source as TTMSFNCPanelSectionsAppearance).Fill);\r\n FStroke.Assign((Source as TTMSFNCPanelSectionsAppearance).Stroke);\r\n FFont.AssignSource((Source as TTMSFNCPanelSectionsAppearance).Font);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.Changed;\r\nbegin\r\n if Assigned(OnChange) then\r\n OnChange(Self);\r\nend;\r\n\r\nconstructor TTMSFNCPanelSectionsAppearance.Create;\r\nbegin\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @FontChanged;\r\n FFill := TTMSFNCGraphicsFill.Create(gfkSolid, MakeGraphicsColor(240, 240, 240));\r\n FFill.OnChanged := @FillChanged;\r\n FStroke := TTMSFNCGraphicsStroke.Create;\r\n FStroke.OnChanged := @StrokeChanged;\r\nend;\r\n\r\ndestructor TTMSFNCPanelSectionsAppearance.Destroy;\r\nbegin\r\n FFill.Free;\r\n FStroke.Free;\r\n FFont.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.FillChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.FontChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.SetFill(\r\n const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n FFill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.SetFont(\r\n const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.AssignSource(Value);\r\nend;\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.SetStroke(\r\n const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n FStroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCPanelSectionsAppearance.StrokeChanged(Sender: TObject);\r\nbegin\r\n Changed;\r\nend;\r\n\r\n{$IFDEF WEBLIB}\r\nfunction TTMSFNCPanelButtonStates.GetItem(Index: Integer): TTMSFNCPanelButtonState;\r\nbegin\r\n Result := TTMSFNCPanelButtonState(inherited Items[Index]);\r\nend;\r\n\r\nprocedure TTMSFNCPanelButtonStates.SetItem(Index: Integer; const Value: TTMSFNCPanelButtonState);\r\nbegin\r\n// inherited Items[Index] := Value;\r\n inherited Put(Index, Value);\r\nend;\r\n{$ENDIF}\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCCustomPicker;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomSelector, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCGraphicsTypes,\r\n WEBLib.TMSFNCCustomControl, WEBLib.TMSFNCPopup, WEBLib.TMSFNCTypes, WEBLib.Controls\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCLLIB}\r\n , UITypes, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n , FMX.Edit, FMX.Types\r\n {$ENDIF}\r\n , WEBLib.StdCtrls, WEBLib.ExtCtrls\r\n ;\r\n\r\ntype\r\n TTMSFNCCustomPickerBeforeDraw = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; var ADefaultDraw: Boolean) of object;\r\n TTMSFNCCustomPickerAfterDraw = procedure(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF) of object;\r\n\r\n TTMSFNCCustomPicker = class(TTMSFNCCustomControl)\r\n private\r\n FContent: string;\r\n FEdit: TEdit;\r\n FTimer: TTimer;\r\n FDown: Boolean;\r\n FPopup: TTMSFNCPopup;\r\n FSelector: TTMSFNCCustomSelector;\r\n FOnItemBeforeDrawText: TTMSFNCCustomSelectorItemBeforeDrawText;\r\n FOnAfterDraw: TTMSFNCCustomSelectorAfterDraw;\r\n FOnItemAfterDrawBackground: TTMSFNCCustomSelectorItemAfterDrawBackground;\r\n FOnItemSelected: TTMSFNCCustomSelectorItemSelected;\r\n FOnItemAfterDrawText: TTMSFNCCustomSelectorItemAfterDrawText;\r\n FOnBeforeDraw: TTMSFNCCustomSelectorBeforeDraw;\r\n FOnItemBeforeDrawBackground: TTMSFNCCustomSelectorItemBeforeDrawBackground;\r\n FDropDownHeight: Single;\r\n FDropDownWidth: Single;\r\n FOnItemDeselected: TTMSFNCCustomSelectorItemDeselected;\r\n FOnItemClick: TTMSFNCCustomSelectorItemClick;\r\n FOnItemBeforeDrawContent: TTMSFNCCustomSelectorItemBeforeDrawContent;\r\n FOnItemAfterDrawContent: TTMSFNCCustomSelectorItemAfterDrawContent;\r\n FOnPickerBeforeDraw: TTMSFNCCustomPickerBeforeDraw;\r\n FOnPickerAfterDraw: TTMSFNCCustomPickerAfterDraw;\r\n FShowFocus: Boolean;\r\n FOnClosePopup: TNotifyEvent;\r\n FOnPopup: TNotifyEvent;\r\n FOnEditChange: TNotifyEvent;\r\n FEditable: Boolean;\r\n procedure CalcSize;\r\n function GetAppearance: TTMSFNCCustomSelectorAppearance;\r\n function GetColumns: Integer;\r\n function GetItems: TTMSFNCCustomSelectorItems;\r\n function GetRows: Integer;\r\n function GetSelectedItemIndex: Integer;\r\n procedure SetAppearance(const Value: TTMSFNCCustomSelectorAppearance);\r\n procedure SetColumns(const Value: Integer);\r\n procedure SetItems(const Value: TTMSFNCCustomSelectorItems);\r\n procedure SetRows(const Value: Integer);\r\n procedure SetSelectedItemIndex(const Value: Integer);\r\n function GetFill: TTMSFNCGraphicsFill;\r\n function GetStroke: TTMSFNCGraphicsStroke;\r\n procedure SetFill(const Value: TTMSFNCGraphicsFill);\r\n procedure SetStroke(const Value: TTMSFNCGraphicsStroke);\r\n procedure SetDropDownHeight(const Value: Single);\r\n procedure SetDropDownWidth(const Value: Single);\r\n function IsDropDownHeightStored: Boolean;\r\n function IsDropDownWidthStored: Boolean;\r\n function GetPopup: TTMSFNCPopup;\r\n function GetSelector: TTMSFNCCustomSelector;\r\n procedure SetShowFocus(const Value: Boolean);\r\n procedure SetEditable(const Value: Boolean);\r\n procedure SetContent(const Value: String);\r\n protected\r\n function GetVersion: String; override;\r\n function GetContent: String; virtual;\r\n procedure ApplyStyle; override;\r\n procedure DoExit; override;\r\n procedure DoEnter; override;\r\n procedure UpdateEditText(AText: string); virtual;\r\n procedure DoItemSelected(Sender: TObject; AItemIndex: Integer); virtual;\r\n procedure DoItemDeselected(Sender: TObject; AItemIndex: Integer); virtual;\r\n procedure DoItemClick(Sender: TObject; AItemIndex: Integer); virtual;\r\n procedure DoItemBeforeDrawBackground(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var AAllowDraw: Boolean); virtual;\r\n procedure DoItemAfterDrawBackground(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer); virtual;\r\n procedure DoItemBeforeDrawContent(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var AAllowDraw: Boolean); virtual;\r\n procedure DoItemAfterDrawContent(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer); virtual;\r\n procedure DoItemBeforeDrawText(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; var AText: String; var AAllowDraw: Boolean); virtual;\r\n procedure DoItemAfterDrawText(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; AItemIndex: Integer; AText: String); virtual;\r\n procedure DoBeforeDraw(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF; var AAllowDraw: Boolean); reintroduce; virtual;\r\n procedure DoAfterDraw(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF); reintroduce; virtual;\r\n procedure DoPickerBeforeDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF; var ADefaultDraw: Boolean); virtual;\r\n procedure DoPickerAfterDraw(AGraphics: TTMSFNCGraphics; ARect: TRectF); virtual;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n procedure SelectFirstValue; virtual;\r\n procedure SelectLastValue; virtual;\r\n procedure SelectNextValue; virtual;\r\n procedure SelectPreviousValue; virtual;\r\n procedure DoPopup(Sender: TObject);\r\n procedure DoClosePopup(Sender: TObject);\r\n procedure EnterTimerChanged(Sender: TObject);\r\n procedure EditChange(Sender: TObject);\r\n procedure DoEditChange; virtual;\r\n procedure HandleDialogKey(var Key: Word; Shift: TShiftState); override;\r\n procedure InitializePopup; virtual;\r\n\r\n function CreateSelector: TTMSFNCCustomSelector; virtual;\r\n function GetFocusedControl: TControl; virtual;\r\n procedure AssignEvents; virtual;\r\n procedure DrawContent({%H-}AGraphics: TTMSFNCGraphics; {%H-}ARect: TRectF); virtual;\r\n procedure DrawBackground(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n procedure HandleMouseDown({%H-}Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseUp({%H-}Button: TTMSFNCMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Single); override;\r\n procedure HandleKeyUp(var Key: Word; Shift: TShiftState); override;\r\n procedure HandleKeyDown(var Key: Word; Shift: TShiftState); override;\r\n property Fill: TTMSFNCGraphicsFill read GetFill write SetFill;\r\n property Stroke: TTMSFNCGraphicsStroke read GetStroke write SetStroke;\r\n property DropDownHeight: Single read FDropDownHeight write SetDropDownHeight stored IsDropDownHeightStored nodefault;\r\n property DropDownWidth: Single read FDropDownWidth write SetDropDownWidth stored IsDropDownWidthStored nodefault;\r\n property Appearance: TTMSFNCCustomSelectorAppearance read GetAppearance write SetAppearance;\r\n property SelectedItemIndex: Integer read GetSelectedItemIndex write SetSelectedItemIndex default -1;\r\n property Rows: Integer read GetRows write SetRows default 4;\r\n property ShowFocus: Boolean read FShowFocus write SetShowFocus default True;\r\n property Columns: Integer read GetColumns write SetColumns default 4;\r\n property Items: TTMSFNCCustomSelectorItems read GetItems write SetItems;\r\n property OnPickerBeforeDraw: TTMSFNCCustomPickerBeforeDraw read FOnPickerBeforeDraw write FOnPickerBeforeDraw;\r\n property OnPickerAfterDraw: TTMSFNCCustomPickerAfterDraw read FOnPickerAfterDraw write FOnPickerAfterDraw;\r\n property OnItemSelected: TTMSFNCCustomSelectorItemSelected read FOnItemSelected write FOnItemSelected;\r\n property OnItemDeselected: TTMSFNCCustomSelectorItemDeselected read FOnItemDeselected write FOnItemDeselected;\r\n property OnItemClick: TTMSFNCCustomSelectorItemClick read FOnItemClick write FOnItemClick;\r\n property OnItemBeforeDrawBackground: TTMSFNCCustomSelectorItemBeforeDrawBackground read FOnItemBeforeDrawBackground write FOnItemBeforeDrawBackground;\r\n property OnItemAfterDrawBackground: TTMSFNCCustomSelectorItemAfterDrawBackground read FOnItemAfterDrawBackground write FOnItemAfterDrawBackground;\r\n property OnItemBeforeDrawContent: TTMSFNCCustomSelectorItemBeforeDrawContent read FOnItemBeforeDrawContent write FOnItemBeforeDrawContent;\r\n property OnItemAfterDrawContent: TTMSFNCCustomSelectorItemAfterDrawContent read FOnItemAfterDrawContent write FOnItemAfterDrawContent;\r\n property OnBeforeDraw: TTMSFNCCustomSelectorBeforeDraw read FOnBeforeDraw write FOnBeforeDraw;\r\n property OnAfterDraw: TTMSFNCCustomSelectorAfterDraw read FOnAfterDraw write FOnAfterDraw;\r\n property OnItemBeforeDrawText: TTMSFNCCustomSelectorItemBeforeDrawText read FOnItemBeforeDrawText write FOnItemBeforeDrawText;\r\n property OnItemAfterDrawText: TTMSFNCCustomSelectorItemAfterDrawText read FOnItemAfterDrawText write FOnItemAfterDrawText;\r\n property Editable: Boolean read FEditable write SetEditable default False;\r\n property OnEditChange: TNotifyEvent read FOnEditChange write FOnEditChange;\r\n property OnClosePopup: TNotifyEvent read FOnClosePopup write FOnClosePopup;\r\n property OnPopup: TNotifyEvent read FOnPopup write FOnPopup;\r\n property Version: String read GetVersion;\r\n property Content: String read GetContent write SetContent;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n procedure DropDown; virtual;\r\n property Popup: TTMSFNCPopup read GetPopup;\r\n property Selector: TTMSFNCCustomSelector read GetSelector;\r\n property Edit: TEdit read FEdit;\r\n end;\r\n\r\n TTMSFNCDefaultPicker = class(TTMSFNCCustomPicker)\r\n published\r\n property Fill;\r\n property Stroke;\r\n property Version;\r\n property OnPopup;\r\n property OnClosePopup;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, WEBLib.TMSFNCUtils;\r\n\r\ntype\r\n TTMSFNCOpenCustomSelector = class(TTMSFNCCustomSelector)\r\n public\r\n property Appearance;\r\n property Columns;\r\n property Rows;\r\n property Items;\r\n property SelectedItemIndex;\r\n property OnItemSelected;\r\n property OnItemDeselected;\r\n property OnItemClick;\r\n property OnItemBeforeDrawBackground;\r\n property OnItemAfterDrawBackground;\r\n property OnItemBeforeDrawContent;\r\n property OnItemAfterDrawContent;\r\n property OnItemBeforeDrawText;\r\n property OnItemAfterDrawText;\r\n property OnBeforeDraw;\r\n property OnAfterDraw;\r\n end;\r\n\r\n{ TTMSFNCCustomPicker }\r\n\r\nconstructor TTMSFNCCustomPicker.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FTimer := TTimer.Create(Self);\r\n FTimer.Interval := 1;\r\n FTimer.OnTimer := EnterTimerChanged;\r\n FTimer.Enabled := False;\r\n\r\n FEdit := TEdit.Create(Self);\r\n FEdit.TabStop := True;\r\n {$IFDEF FMXLIB}\r\n FEdit.Margins.Left := 1;\r\n FEdit.Margins.Top := 1;\r\n FEdit.Margins.Right := 15;\r\n FEdit.Margins.Bottom := 1;\r\n FEdit.Align := TAlignLayout.Client;\r\n FEdit.Stored := False;\r\n FEdit.OnChangeTracking := EditChange;\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n {$IFDEF VCLLIB}\r\n FEdit.AlignWithMargins := True;\r\n FEdit.Margins.Left := 1;\r\n FEdit.Margins.Top := 1;\r\n FEdit.Margins.Right := 15;\r\n FEdit.Margins.Bottom := 1;\r\n {$ENDIF}\r\n {$IFDEF WEBLIB}\r\n FEdit.AlignWithMargins := True;\r\n FEdit.Margins.Left := 1;\r\n FEdit.Margins.Top := 1;\r\n FEdit.Margins.Right := 15;\r\n FEdit.Margins.Bottom := 1;\r\n {$ENDIF}\r\n {$IFDEF LCLLIB}\r\n FEdit.BorderSpacing.Left := 1;\r\n FEdit.BorderSpacing.Top := 1;\r\n FEdit.BorderSpacing.Right := 15;\r\n FEdit.BorderSpacing.Bottom := 1;\r\n {$ENDIF}\r\n FEdit.Align := alClient;\r\n FEdit.OnChange := @EditChange;\r\n {$ENDIF}\r\n\r\n FDropDownWidth := 135;\r\n FDropDownHeight := 135;\r\n FShowFocus := True;\r\n {$IFDEF FMXLIB}\r\n AutoCapture := True;\r\n {$ENDIF}\r\n FSelector := CreateSelector;\r\n AssignEvents;\r\n\r\n FPopup := TTMSFNCPopup.Create(Self);\r\n FPopup.PlacementControl:= Self;\r\n FPopup.DragWithParent := True;\r\n FPopup.FocusedControl := GetFocusedControl;\r\n FPopup.ContentControl := FSelector;\r\n FPopup.DropDownWidth := FDropDownWidth;\r\n FPopup.DropDownHeight := FDropDownHeight;\r\n FPopup.OnPopup := DoPopup;\r\n FPopup.OnClosePopup := DoClosePopup;\r\n\r\n Width := 60;\r\n Height := 22;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.CreateSelector: TTMSFNCCustomSelector;\r\nbegin\r\n Result := TTMSFNCCustomSelector.Create(Self);\r\nend;\r\n\r\ndestructor TTMSFNCCustomPicker.Destroy;\r\nbegin\r\n if Assigned(FSelector) then\r\n FreeAndNil(FSelector);\r\n if Assigned(FPopup) then\r\n FreeAndNil(FPopup);\r\n inherited;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetAppearance: TTMSFNCCustomSelectorAppearance;\r\nbegin\r\n Result := TTMSFNCOpenCustomSelector(FSelector).Appearance;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetColumns: Integer;\r\nbegin\r\n Result := TTMSFNCOpenCustomSelector(FSelector).Columns;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetContent: String;\r\nbegin\r\n if Assigned(FEdit) and Assigned(FEdit.Parent) and Editable then\r\n Result := FEdit.Text\r\n else\r\n Result := FContent;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SelectFirstValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SelectLastValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SelectNextValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SelectPreviousValue;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetAppearance(\r\n const Value: TTMSFNCCustomSelectorAppearance);\r\nbegin\r\n TTMSFNCOpenCustomSelector(FSelector).Appearance.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetColumns(const Value: Integer);\r\nbegin\r\n TTMSFNCOpenCustomSelector(FSelector).Columns := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetContent(const Value: String);\r\nbegin\r\n FContent := Value;\r\n UpdateEditText(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetDropDownHeight(const Value: Single);\r\nbegin\r\n FDropDownHeight := Value;\r\n if Assigned(FPopup) then\r\n FPopup.DropDownHeight := FDropDownHeight;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetDropDownWidth(const Value: Single);\r\nbegin\r\n FDropDownWidth := Value;\r\n if Assigned(FPopup) then\r\n FPopup.DropDownWidth := FDropDownWidth;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetEditable(const Value: Boolean);\r\nbegin\r\n if FEditable <> Value then\r\n begin\r\n FEditable := Value;\r\n if Assigned(FEdit) then\r\n begin\r\n if FEditable then\r\n begin\r\n FEdit.Parent := Self;\r\n end\r\n else\r\n FEdit.Parent := nil;\r\n\r\n FEdit.Visible := FEditable;\r\n UpdateEditText(Content);\r\n end;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetFill(const Value: TTMSFNCGraphicsFill);\r\nbegin\r\n TTMSFNCOpenCustomSelector(FSelector).Fill.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetItems(const Value: TTMSFNCCustomSelectorItems);\r\nbegin\r\n TTMSFNCOpenCustomSelector(FSelector).Items.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetRows(const Value: Integer);\r\nbegin\r\n TTMSFNCOpenCustomSelector(FSelector).Rows := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetSelectedItemIndex(const Value: Integer);\r\nbegin\r\n TTMSFNCOpenCustomSelector(FSelector).SelectedItemIndex := Value;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetShowFocus(const Value: Boolean);\r\nbegin\r\n if FShowFocus <> Value then\r\n begin\r\n FShowFocus := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.SetStroke(const Value: TTMSFNCGraphicsStroke);\r\nbegin\r\n TTMSFNCOpenCustomSelector(FSelector).Stroke.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.UpdateEditText(AText: string);\r\nbegin\r\n if Assigned(FEdit) and Assigned(FEdit.Parent) and Editable then\r\n FEdit.Text := AText;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.ApplyStyle;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.AssignEvents;\r\nbegin\r\n if Assigned(FSelector) then\r\n begin\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemSelected := DoItemSelected;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemDeselected := DoItemDeselected;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemClick := DoItemClick;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemBeforeDrawBackground := DoItemBeforeDrawBackground;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemAfterDrawBackground := DoItemAfterDrawBackground;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemBeforeDrawContent := DoItemBeforeDrawContent;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemAfterDrawContent := DoItemAfterDrawContent;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemBeforeDrawText := DoItemBeforeDrawText;\r\n TTMSFNCOpenCustomSelector(FSelector).OnItemAfterDrawText := DoItemAfterDrawText;\r\n TTMSFNCOpenCustomSelector(FSelector).OnBeforeDraw := DoBeforeDraw;\r\n TTMSFNCOpenCustomSelector(FSelector).OnAfterDraw := DoAfterDraw;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.CalcSize;\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DropDown;\r\nbegin\r\n if not FPopup.IsOpen then\r\n begin\r\n CalcSize;\r\n FPopup.IsOpen := True;\r\n end\r\n else\r\n FPopup.IsOpen := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.EditChange(Sender: TObject);\r\nbegin\r\n Content := FEdit.Text;\r\n DoEditChange;\r\n if Assigned(OnEditChange) then\r\n OnEditChange(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.EnterTimerChanged(Sender: TObject);\r\nbegin\r\n FEdit.SetFocus;\r\n FTimer.Enabled := False;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.HandleMouseUp(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single);\r\nbegin\r\n FDown := False;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.HandleDialogKey(var Key: Word;\r\n Shift: TShiftState);\r\nbegin\r\n if Shift <> [] then\r\n Exit;\r\n\r\n if Editable and FEdit.IsFocused then\r\n begin\r\n case Key of\r\n KEY_F4:\r\n begin\r\n if not (ssAlt in Shift) then\r\n DropDown;\r\n end;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.HandleKeyDown(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n case Key of\r\n KEY_HOME: SelectFirstValue;\r\n KEY_END: SelectLastValue;\r\n KEY_UP, KEY_LEFT: SelectPreviousValue;\r\n KEY_DOWN, KEY_RIGHT: SelectNextValue;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.HandleKeyUp(var Key: Word; Shift: TShiftState);\r\nbegin\r\n inherited;\r\n if Shift <> [] then\r\n Exit;\r\n\r\n case Key of\r\n KEY_SPACE, KEY_RETURN, KEY_F4: DropDown;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n if CanFocus then\r\n SetFocus;\r\n\r\n if (Button = {$IFNDEF WEBLIB}TTMSFNCMouseButton.{$ENDIF}mbLeft) then\r\n begin\r\n FDown := True;\r\n Invalidate;\r\n DropDown;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoAfterDraw(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n if Assigned(OnAfterDraw) then\r\n OnAfterDraw(Self, AGraphics, ARect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoBeforeDraw(Sender: TObject; AGraphics: TTMSFNCGraphics; ARect: TRectF;\r\n var AAllowDraw: Boolean);\r\nbegin\r\n if Assigned(OnBeforeDraw) then\r\n OnBeforeDraw(Self, AGraphics, ARect, AAllowDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoClosePopup(Sender: TObject);\r\nbegin\r\n if Assigned(OnClosePopup) then\r\n OnClosePopup(Self);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoEditChange;\r\nbegin\r\n\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoEnter;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoExit;\r\nbegin\r\n inherited;\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n a: Boolean;\r\n r, rf: TRectF;\r\nbegin\r\n inherited;\r\n a := True;\r\n DoPickerBeforeDraw(AGraphics, ARect, a);\r\n if a then\r\n begin\r\n DrawBackground(AGraphics, ARect);\r\n r := ARect;\r\n r.Right := r.Right - 15;\r\n DrawContent(AGraphics, r);\r\n if ShowFocus and IsFocused then\r\n begin\r\n rf := ARect;\r\n InflateRectEx(rf, -1, -1);\r\n AGraphics.DrawFocusRectangle(rf);\r\n end;\r\n DoPickerAfterDraw(AGraphics, ARect);\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DrawBackground(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nbegin\r\n {$IFDEF CMNWEBLIB}\r\n AGraphics.DrawDropDownButton(ARect, FDown, Focused, True, False, AdaptToStyle);\r\n {$ENDIF}\r\n {$IFDEF FMXLIB}\r\n AGraphics.DrawDropDownButton(ARect, FDown, IsFocused, True, False, AdaptToStyle);\r\n {$ENDIF}\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DrawContent(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemAfterDrawContent(Sender: TObject; AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemAfterDrawContent) then\r\n OnItemAfterDrawContent(Self, AGraphics, ARect, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemAfterDrawBackground(Sender: TObject; AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemAfterDrawBackground) then\r\n OnItemAfterDrawBackground(Self, AGraphics, ARect, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemAfterDrawText(Sender: TObject; AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; AText: String);\r\nbegin\r\n if Assigned(OnItemAfterDrawText) then\r\n OnItemAfterDrawText(Self, AGraphics, ARect, AItemIndex, AText);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemBeforeDrawBackground(Sender: TObject; AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; var AAllowDraw: Boolean);\r\nbegin\r\n if Assigned(OnItemBeforeDrawBackground) then\r\n OnItemBeforeDrawBackground(Self, AGraphics, ARect, AItemIndex, AAllowDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemBeforeDrawContent(Sender: TObject; AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; var AAllowDraw: Boolean);\r\nbegin\r\n if Assigned(OnItemBeforeDrawContent) then\r\n OnItemBeforeDrawContent(Self, AGraphics, ARect, AItemIndex, AAllowDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemBeforeDrawText(Sender: TObject; AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; AItemIndex: Integer; var AText: String;\r\n var AAllowDraw: Boolean);\r\nbegin\r\n if Assigned(OnItemBeforeDrawText) then\r\n OnItemBeforeDrawText(Self, AGraphics, ARect, AItemIndex, AText, AAllowDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemClick(Sender: TObject; AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemClick) then\r\n OnItemClick(Self, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemDeselected(Sender: TObject; AItemIndex: Integer);\r\nbegin\r\n if Assigned(OnItemDeselected) then\r\n OnItemDeselected(Self, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoItemSelected(Sender: TObject; AItemIndex: Integer);\r\nbegin\r\n UpdateEditText('');\r\n if Assigned(OnItemSelected) then\r\n OnItemSelected(Self, AItemIndex);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoPickerAfterDraw(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF);\r\nbegin\r\n if Assigned(OnPickerAfterDraw) then\r\n OnPickerAfterDraw(Self, AGraphics, ARect);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoPickerBeforeDraw(AGraphics: TTMSFNCGraphics;\r\n ARect: TRectF; var ADefaultDraw: Boolean);\r\nbegin\r\n if Assigned(OnPickerBeforeDraw) then\r\n OnPickerBeforeDraw(Self, AGraphics, ARect, ADefaultDraw);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.DoPopup(Sender: TObject);\r\nbegin\r\n InitializePopup;\r\n if Assigned(FSelector) then\r\n TTMSFNCOpenCustomSelector(FSelector).CalculateItems;\r\n if Assigned(OnPopup) then\r\n OnPopup(Self);\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetFill: TTMSFNCGraphicsFill;\r\nbegin\r\n Result := TTMSFNCOpenCustomSelector(FSelector).Fill;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetFocusedControl: TControl;\r\nbegin\r\n Result := nil;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetItems: TTMSFNCCustomSelectorItems;\r\nbegin\r\n Result := TTMSFNCOpenCustomSelector(FSelector).Items;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetPopup: TTMSFNCPopup;\r\nbegin\r\n Result := FPopup;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetRows: Integer;\r\nbegin\r\n Result := TTMSFNCOpenCustomSelector(FSelector).Rows;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetSelectedItemIndex: Integer;\r\nbegin\r\n Result := TTMSFNCOpenCustomSelector(FSelector).SelectedItemIndex;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetSelector: TTMSFNCCustomSelector;\r\nbegin\r\n Result := FSelector;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetStroke: TTMSFNCGraphicsStroke;\r\nbegin\r\n Result := TTMSFNCOpenCustomSelector(FSelector).Stroke;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomPicker.InitializePopup;\r\nbegin\r\n if Assigned(FPopup) then\r\n FPopup.AdaptToStyle := AdaptToStyle;\r\n if Assigned(FSelector) then\r\n FSelector.AdaptToStyle := AdaptToStyle;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.IsDropDownHeightStored: Boolean;\r\nbegin\r\n Result := DropDownHeight <> 135;\r\nend;\r\n\r\nfunction TTMSFNCCustomPicker.IsDropDownWidthStored: Boolean;\r\nbegin\r\n Result := DropDownWidth <> 135;\r\nend;\r\n\r\nend.\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016\t\t }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCColorPicker;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomPicker, WEBLib.Controls, WEBLib.TMSFNCColorSelector, WEBLib.TMSFNCCustomSelector,\r\n WEBLib.TMSFNCGraphics, WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphicsTypes\r\n {$IFNDEF LCLLIB}\r\n , Types\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 0; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr.\r\n\r\ntype\r\n TTMSFNCCustomColorPicker = class(TTMSFNCDefaultPicker)\r\n private\r\n FColorSelector: TTMSFNCColorSelector;\r\n FOnColorSelected: TTMSFNCCustomSelectorColorSelected;\r\n FCloseOnSelection: Boolean;\r\n FOnColorDeselected: TTMSFNCCustomSelectorColorDeselected;\r\n function GetSelectedColor: TTMSFNCGraphicsColor;\r\n procedure SetSelectedColor(const Value: TTMSFNCGraphicsColor);\r\n function GetItems: TTMSFNCColorSelectorItems;\r\n procedure SetItems(const Value: TTMSFNCColorSelectorItems);\r\n function GetMode: TTMSFNCCustomColorSelectorMode;\r\n procedure SetMode(const Value: TTMSFNCCustomColorSelectorMode);\r\n protected\r\n procedure DoColorSelected; virtual;\r\n procedure ColorSelected(Sender: TObject; AColor: TTMSFNCGraphicsColor);\r\n procedure ColorDeselected(Sender: TObject; AColor: TTMSFNCGraphicsColor);\r\n procedure DrawContent(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n procedure SelectFirstValue; override;\r\n procedure SelectLastValue; override;\r\n procedure SelectNextValue; override;\r\n procedure SelectPreviousValue; override;\r\n function GetVersion: String; override;\r\n function CreateSelector: TTMSFNCCustomSelector; override;\r\n function GetFocusedControl: TControl; override;\r\n property CloseOnSelection: Boolean read FCloseOnSelection write FCloseOnSelection default True;\r\n property OnColorSelected: TTMSFNCCustomSelectorColorSelected read FOnColorSelected write FOnColorSelected;\r\n property OnColorDeselected: TTMSFNCCustomSelectorColorDeselected read FOnColorDeselected write FOnColorDeselected;\r\n property SelectedColor: TTMSFNCGraphicsColor read GetSelectedColor write SetSelectedColor default gcNull;\r\n property Items: TTMSFNCColorSelectorItems read GetItems write SetItems;\r\n property Mode: TTMSFNCCustomColorSelectorMode read GetMode write SetMode default csmSimple;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n end;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCColorPicker = class(TTMSFNCCustomColorPicker)\r\n protected\r\n procedure RegisterRuntimeClasses; override;\r\n published\r\n property DropDownWidth;\r\n property DropDownHeight;\r\n property Appearance;\r\n property Rows;\r\n property Columns;\r\n property Items;\r\n property Mode;\r\n property CloseOnSelection;\r\n property OnColorSelected;\r\n property OnColorDeselected;\r\n property SelectedColor;\r\n property OnItemSelected;\r\n property OnItemDeselected;\r\n property OnItemClick;\r\n property SelectedItemIndex;\r\n property OnPickerBeforeDraw;\r\n property OnPickerAfterDraw;\r\n property OnItemBeforeDrawBackground;\r\n property OnItemAfterDrawBackground;\r\n property OnItemBeforeDrawContent;\r\n property OnItemAfterDrawContent;\r\n property OnBeforeDraw;\r\n property OnAfterDraw;\r\n property OnItemBeforeDrawText;\r\n property OnItemAfterDrawText;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math, WEBLib.TMSFNCUtils;\r\n\r\n{ TTMSFNCCustomColorPicker }\r\n\r\nprocedure TTMSFNCCustomColorPicker.ColorDeselected(Sender: TObject;\r\n AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if Assigned(OnColorDeSelected) then\r\n OnColorDeSelected(Self, AColor);\r\n\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.ColorSelected(Sender: TObject;\r\n AColor: TTMSFNCGraphicsColor);\r\nbegin\r\n if CloseOnSelection and not Selector.BlockChange then\r\n DropDown;\r\n if Assigned(OnColorSelected) then\r\n OnColorSelected(Self, AColor);\r\n\r\n Invalidate;\r\nend;\r\n\r\nconstructor TTMSFNCCustomColorPicker.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FCloseOnSelection := True;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorPicker.CreateSelector: TTMSFNCCustomSelector;\r\nbegin\r\n FColorSelector := TTMSFNCColorSelector.Create(Self);\r\n FColorSelector.OnColorSelected := ColorSelected;\r\n FColorSelector.OnColorDeselected := ColorDeselected;\r\n FColorSelector.InitializeDefault;\r\n Result := FColorSelector;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.DoColorSelected;\r\nbegin\r\n if Assigned(OnColorSelected) then\r\n OnColorSelected(Self, SelectedColor);\r\n\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.DrawContent(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nvar\r\n r: TRectF;\r\n I, J: Integer;\r\n st: TTMSFNCGraphicsSaveState;\r\nbegin\r\n R := ARect;\r\n InflateRectEx(R, -3.5, -3.5);\r\n OffsetRectEx(R, 0.5, 0.5);\r\n st := AGraphics.SaveState;\r\n try\r\n AGraphics.ClipRect(R);\r\n AGraphics.Stroke.Kind := gskNone;\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.Stroke.Width := 1;\r\n AGraphics.Fill.Color := MakeGraphicsColor(255, 255, 255);\r\n AGraphics.DrawRectangle(R);\r\n AGraphics.Fill.Color := MakeGraphicsColor(211 , 211 , 211 );\r\n for I := 0 to Trunc((R.Right - R.Left) / 5) + 1 do\r\n for J := 0 to Trunc((R.Bottom - R.Top) / 5) + 1 do\r\n if Odd(I + J) then\r\n AGraphics.DrawRectangle(RectF(I * 5, J * 5, (I + 1) * 5, (J + 1) * 5), gcrmNone);\r\n\r\n AGraphics.Fill.Kind := gfkSolid;\r\n AGraphics.Fill.Color := SelectedColor;\r\n AGraphics.Stroke.Color := gcBlack;\r\n AGraphics.Stroke.Kind := gskSolid;\r\n AGraphics.DrawRectangle(R);\r\n finally\r\n AGraphics.RestoreState(st);\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorPicker.GetFocusedControl: TControl;\r\nbegin\r\n Result := FColorSelector;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorPicker.GetItems: TTMSFNCColorSelectorItems;\r\nbegin\r\n Result := FColorSelector.Items;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorPicker.GetMode: TTMSFNCCustomColorSelectorMode;\r\nbegin\r\n Result := FColorSelector.Mode;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorPicker.GetSelectedColor: TTMSFNCGraphicsColor;\r\nbegin\r\n Result := FColorSelector.SelectedColor;\r\nend;\r\n\r\nfunction TTMSFNCCustomColorPicker.GetVersion: String;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.SetItems(\r\n const Value: TTMSFNCColorSelectorItems);\r\nbegin\r\n FColorSelector.Items.Assign(Value);\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.SelectFirstValue;\r\nbegin\r\n inherited;\r\n if FColorSelector.Items.Count > 0 then\r\n begin\r\n FColorSelector.SelectedItemIndex := 0;\r\n DoColorSelected;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.SelectLastValue;\r\nbegin\r\n inherited;\r\n if FColorSelector.Items.Count > 0 then\r\n begin\r\n FColorSelector.SelectedItemIndex := FColorSelector.Items.Count - 1;\r\n DoColorSelected;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.SelectNextValue;\r\nbegin\r\n inherited;\r\n if FColorSelector.Items.Count > 0 then\r\n begin\r\n if FColorSelector.SelectedItemIndex = -1 then\r\n FColorSelector.SelectedItemIndex := 0\r\n else\r\n FColorSelector.SelectedItemIndex := Min(FColorSelector.Items.Count - 1, FColorSelector.SelectedItemIndex + 1);\r\n\r\n DoColorSelected;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.SelectPreviousValue;\r\nbegin\r\n inherited;\r\n if FColorSelector.Items.Count > 0 then\r\n begin\r\n if FColorSelector.SelectedItemIndex = -1 then\r\n FColorSelector.SelectedItemIndex := 0\r\n else\r\n FColorSelector.SelectedItemIndex := Max(0, FColorSelector.SelectedItemIndex - 1);\r\n\r\n DoColorSelected;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.SetMode(\r\n const Value: TTMSFNCCustomColorSelectorMode);\r\nbegin\r\n FColorSelector.Mode := Value;\r\n case Mode of\r\n csmSimple:\r\n begin\r\n DropDownWidth := 135;\r\n DropDownHeight := 135;\r\n end;\r\n csmExtended:\r\n begin\r\n DropDownWidth := 200;\r\n DropDownHeight := 135;\r\n end;\r\n {$IFDEF FMXLIB}\r\n csmExtendedMore:\r\n begin\r\n DropDownWidth := 200;\r\n DropDownHeight := 175;\r\n end;\r\n {$ENDIF}\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCCustomColorPicker.SetSelectedColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n FColorSelector.SelectedColor := Value;\r\n Invalidate;\r\nend;\r\n\r\n{ TTMSFNCColorPicker }\r\n\r\nprocedure TTMSFNCColorPicker.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCColorPicker);\r\nend;\r\n\r\nend.\r\n\r\n","{********************************************************************}\r\n{ }\r\n{ written by TMS Software }\r\n{ copyright © 2016 }\r\n{ Email : info@tmssoftware.com }\r\n{ Web : http://www.tmssoftware.com }\r\n{ }\r\n{ The source code is given as is. The author is not responsible }\r\n{ for any possible damage done due to the use of this code. }\r\n{ The complete source code remains property of the author and may }\r\n{ not be distributed, published, given or sold in any form as such. }\r\n{ No parts of the source code can be included in any other component }\r\n{ or application without written authorization of the author. }\r\n{********************************************************************}\r\n\r\nunit WEBLib.TMSFNCHTMLText;\r\n\r\n{$I WEBLib.TMSFNCDefines.inc}\r\n\r\n{$IFDEF CMNLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$DEFINE CMNWEBLIB}\r\n{$ENDIF}\r\n\r\ninterface\r\n\r\nuses\r\n Classes, WEBLib.TMSFNCCustomControl, WEBLib.TMSFNCBitmapContainer, \r\n WEBLib.TMSFNCGraphics, WEBLib.TMSFNCGraphicsTypes, WEBLib.TMSFNCTypes, WEBLib.Controls\r\n {$IFNDEF LCLLIB}\r\n {$IFNDEF WEBLIB}\r\n ,UITypes, Types\r\n {$ENDIF}\r\n {$ENDIF}\r\n ;\r\n\r\nconst\r\n MAJ_VER = 1; // Major version nr.\r\n MIN_VER = 1; // Minor version nr.\r\n REL_VER = 0; // Release nr.\r\n BLD_VER = 0; // Build nr.\r\n\r\n // version history\r\n // v1.0.0.0 : First release\r\n // v1.1.0.0 : New : Support for float left & float right images\r\n // : New : Support for float left text\r\n // : New : Support for loading images from file\r\n // : New : Stroke property exposed\r\n\r\n\r\ntype\r\n TTMSFNCHTMLTextAnchorClickEvent = procedure(Sender: TObject; AAnchor: string) of object;\r\n\r\n TTMSFNCHTMLText = class;\r\n\r\n {$IFNDEF LCLLIB}\r\n [ComponentPlatformsAttribute(TMSPlatformsWeb)]\r\n {$ENDIF}\r\n TTMSFNCHTMLText = class(TTMSFNCCustomControl, ITMSFNCBitmapContainer)\r\n private\r\n FDisableAdjustSize: Boolean;\r\n FBitmapContainer: TTMSFNCBitmapContainer;\r\n FOnAnchorClick: TTMSFNCHTMLTextAnchorClickEvent;\r\n FURLColor: TTMSFNCGraphicsColor;\r\n FShadowOffset: Integer;\r\n FShadowColor: TTMSFNCGraphicsColor;\r\n FDisplayHTML: Boolean;\r\n FURLUnderline: Boolean;\r\n FText: String;\r\n FFont: TTMSFNCGraphicsFont;\r\n FWordWrapping: Boolean;\r\n FAutoSize: Boolean;\r\n FVerticalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FHorizontalTextAlign: TTMSFNCGraphicsTextAlign;\r\n FAutoOpenURL: Boolean;\r\n FAutoSizeSpacing: Single;\r\n FAutoHeight: Boolean;\r\n FAutoWidth: Boolean;\r\n FTrimming: TTMSFNCGraphicsTextTrimming;\r\n procedure SetShadowOffset(const Value: integer);\r\n procedure SetURLColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetShadowColor(const Value: TTMSFNCGraphicsColor);\r\n procedure SetBitmapContainer(const Value: TTMSFNCBitmapContainer);\r\n procedure SetText(const Value: String);\r\n procedure SetDisplayHTML(const Value: Boolean);\r\n procedure SetURLUnderline(const Value: Boolean);\r\n procedure SetFont(const Value: TTMSFNCGraphicsFont);\r\n procedure SetWordWrapping(const Value: Boolean);\r\n procedure SetAS(const Value: Boolean);\r\n procedure SetHorizontalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n procedure SetVerticalTextAlign(const Value: TTMSFNCGraphicsTextAlign);\r\n function IsAutoSizeSpacingStored: Boolean;\r\n procedure SetAutoSizeSpacing(const Value: Single);\r\n function GetBitmapContainer: TTMSFNCBitmapContainer;\r\n procedure SetAutoHeight(const Value: Boolean);\r\n procedure SetAutoWidth(const Value: Boolean);\r\n procedure SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\n protected\r\n function GetVersion: string; override;\r\n function CanDrawDesignTime: Boolean; virtual;\r\n procedure ChangeDPIScale(M, D: Integer); override;\r\n procedure RegisterRuntimeClasses; override;\r\n procedure ApplyStyle; override;\r\n procedure ResetToDefaultStyle; override;\r\n procedure ApplyAutoSize; virtual;\r\n procedure FillChanged(Sender: TObject);\r\n procedure DoFontChanged(Sender: TObject);\r\n procedure StrokeChanged(Sender: TObject);\r\n procedure Notification(AComponent: TComponent; Operation: TOperation); override;\r\n procedure HandleMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState; X, Y: Single); override;\r\n procedure HandleMouseMove(Shift: TShiftState; X, Y: Single); override;\r\n procedure DoAnchorClick(Anchor: string);\r\n procedure DrawHTMLText(AGraphics: TTMSFNCGraphics); virtual;\r\n public\r\n constructor Create(AOwner: TComponent); override;\r\n destructor Destroy; override;\r\n function GetTextRect: TRectF; virtual;\r\n procedure Assign(Source: TPersistent); override;\r\n procedure DoMouseMove({%H-}Shift: TShiftState; X, Y: Single);\r\n procedure DoMouseDown({%H-}Button: TTMSFNCMouseButton; {%H-}Shift: TShiftState; X, Y: Single);\r\n procedure UpdateControlAfterResize; override;\r\n function IsHTML: boolean;\r\n procedure Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF); override;\r\n published\r\n property AutoSize: Boolean read FAutoSize write SetAS {$IFNDEF WEBLIB}default False{$ENDIF};\r\n property AutoHeight: Boolean read FAutoHeight write SetAutoHeight {$IFNDEF WEBLIB}default True{$ENDIF};\r\n property AutoWidth: Boolean read FAutoWidth write SetAutoWidth {$IFNDEF WEBLIB}default True{$ENDIF};\r\n property AutoSizeSpacing: Single read FAutoSizeSpacing write SetAutoSizeSpacing {$IFNDEF WEBLIB}stored IsAutoSizeSpacingStored nodefault{$ENDIF};\r\n property AutoOpenURL: Boolean read FAutoOpenURL write FAutoOpenURL {$IFNDEF WEBLIB}default True{$ENDIF};\r\n property BitmapContainer: TTMSFNCBitmapContainer read GetBitmapContainer write SetBitmapContainer;\r\n property DisplayHTML: Boolean read FDisplayHTML write SetDisplayHTML {$IFNDEF WEBLIB}default True{$ENDIF};\r\n property Font: TTMSFNCGraphicsFont read FFont write SetFont;\r\n property HorizontalTextAlign: TTMSFNCGraphicsTextAlign read FHorizontalTextAlign write SetHorizontalTextAlign {$IFNDEF WEBLIB}default gtaCenter{$ENDIF};\r\n property Trimming: TTMSFNCGraphicsTextTrimming read FTrimming write SetTrimming {$IFNDEF WEBLIB}default gttNone{$ENDIF};\r\n property ShadowColor: TTMSFNCGraphicsColor read FShadowColor write SetShadowColor {$IFNDEF WEBLIB}default gcGray{$ENDIF};\r\n property ShadowOffset: integer read FShadowOffset write SetShadowOffset {$IFNDEF WEBLIB}default 1{$ENDIF};\r\n property Fill;\r\n property Stroke;\r\n property Text: String read FText write SetText;\r\n property URLColor: TTMSFNCGraphicsColor read FURLColor write SetURLColor {$IFNDEF WEBLIB}default gcBlue{$ENDIF};\r\n property URLUnderline: Boolean read FURLUnderline write SetURLUnderline {$IFNDEF WEBLIB}default True{$ENDIF};\r\n property VerticalTextAlign: TTMSFNCGraphicsTextAlign read FVerticalTextAlign write SetVerticalTextAlign {$IFNDEF WEBLIB}default gtaCenter{$ENDIF};\r\n property Version: String read GetVersion;\r\n property WordWrapping: Boolean read FWordWrapping write SetWordWrapping {$IFNDEF WEBLIB}default False{$ENDIF};\r\n property OnAnchorClick: TTMSFNCHTMLTextAnchorClickEvent read FOnAnchorClick write FOnAnchorClick;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n SysUtils, WEBLib.TMSFNCUtils, WEBLib.TMSFNCStyles, WEBLib.Graphics;\r\n\r\n{ TTMSFNCHTMLText }\r\n\r\nprocedure TTMSFNCHTMLText.ApplyAutoSize;\r\nvar\r\n R: TRectF;\r\nbegin\r\n if not FDisableAdjustSize and not (csLoading in ComponentState) then\r\n begin\r\n FDisableAdjustSize := True;\r\n try\r\n if FAutoSize and (Text <> '') then\r\n begin\r\n R := GetTextRect;\r\n {$IFDEF FMXLIB}\r\n if AutoHeight and AutoWidth then\r\n SetBounds(Position.X, Position.Y, R.Width + R.Left * 2 + Font.Size / 3, R.Height + R.Top * 2)\r\n else if AutoWidth then\r\n SetBounds(Position.X, Position.Y, R.Width + R.Left * 2 + Font.Size / 3, Height)\r\n else if AutoHeight then\r\n SetBounds(Position.X, Position.Y, Width, R.Height + R.Top * 2);\r\n {$ENDIF}\r\n {$IFDEF CMNWEBLIB}\r\n if AutoHeight and AutoWidth then\r\n SetBounds(Left, Top, Round((R.Right - R.Left) + R.Left * 2 + Font.Size / 3), Round((R.Bottom - R.Top) + R.Top * 2))\r\n else if AutoWidth then\r\n SetBounds(Left, Top, Round((R.Right - R.Left) + R.Left * 2 + Font.Size / 3), Height)\r\n else if AutoHeight then\r\n SetBounds(Left, Top, Width, Round((R.Bottom - R.Top) + R.Top * 2));\r\n {$ENDIF}\r\n end;\r\n finally\r\n FDisableAdjustSize := False;\r\n end;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCHTMLText.CanDrawDesignTime: Boolean;\r\nbegin\r\n Result := True;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.ChangeDPIScale(M, D: Integer);\r\nbegin\r\n inherited;\r\n Font.Height := TTMSFNCUtils.MulDivInt(Font.Height, M, D);\r\nend;\r\n\r\nconstructor TTMSFNCHTMLText.Create(AOwner: TComponent);\r\nbegin\r\n inherited;\r\n FURLColor := gcBlue;\r\n FTrimming := gttNone;\r\n FURLUnderline := True;\r\n FDisplayHTML := True;\r\n FShadowOffset := 1;\r\n FAutoOpenURL := True;\r\n FShadowColor := gcGray;\r\n FWordWrapping := False;\r\n FAutoSize := False;\r\n FAutoHeight := True;\r\n FAutoWidth := True;\r\n FHorizontalTextAlign := gtaCenter;\r\n FVerticalTextAlign := gtaCenter;\r\n FFont := TTMSFNCGraphicsFont.Create;\r\n FFont.OnChanged := @DoFontChanged;\r\n FAutoSizeSpacing := 0;\r\n Stroke.Color := gcNull;\r\n\r\n if IsDesignTime then\r\n begin\r\n Text := 'TTMSFNCHTMLText';\r\n DisableBackground;\r\n end;\r\n\r\n Width := 100;\r\n Height := 50;\r\nend;\r\n\r\ndestructor TTMSFNCHTMLText.Destroy;\r\nbegin\r\n FFont.Free;\r\n inherited;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.DoAnchorClick(Anchor: string);\r\nbegin\r\n if AutoOpenURL then\r\n TTMSFNCUtils.OpenURL(Anchor);\r\n\r\n if Assigned(OnAnchorClick) then\r\n OnAnchorClick(Self, Anchor);\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.DoMouseDown(Button: TTMSFNCMouseButton; Shift: TShiftState;\r\n X, Y: Single);\r\nvar\r\n Anchor: String;\r\n g: TTMSFNCGraphics;\r\n r: TRectF;\r\nbegin\r\n if IsHTML then\r\n begin\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n g.BitmapContainer := BitmapContainer;\r\n try\r\n if AutoSize then\r\n begin\r\n if AutoWidth and AutoHeight then\r\n r := RectF(AutoSizeSpacing, AutoSizeSpacing, Width, Height)\r\n else if AutoWidth then\r\n r := RectF(AutoSizeSpacing, 0, Width, Height)\r\n else if AutoHeight then\r\n r := RectF(0, AutoSizeSpacing, Width, Height);\r\n end\r\n else\r\n r := LocalRect;\r\n\r\n Anchor := g.DrawText(r, Text, WordWrapping, HorizontalTextAlign, VerticalTextAlign, Trimming, 0, -1, -1, True, True, X, Y);\r\n if Anchor <> '' then\r\n DoAnchorClick(Anchor);\r\n finally\r\n g.free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.DoMouseMove(Shift: TShiftState; X, Y: Single);\r\nvar\r\n Anchor: string;\r\n g: TTMSFNCGraphics;\r\n r: TRectF;\r\nbegin\r\n inherited;\r\n if IsHTML then\r\n begin\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n g.BitmapContainer := BitmapContainer;\r\n try\r\n if AutoSize then\r\n begin\r\n if AutoWidth and AutoHeight then\r\n r := RectF(AutoSizeSpacing, AutoSizeSpacing, Width, Height)\r\n else if AutoWidth then\r\n r := RectF(AutoSizeSpacing, 0, Width, Height)\r\n else if AutoHeight then\r\n r := RectF(0, AutoSizeSpacing, Width, Height);\r\n end\r\n else\r\n r := LocalRect;\r\n\r\n Anchor := g.DrawText(r, Text, WordWrapping, HorizontalTextAlign, VerticalTextAlign, Trimming, 0, -1, -1, True, True, X, Y);\r\n if (Anchor <> '') then\r\n Cursor := crHandPoint\r\n else\r\n Cursor := crDefault;\r\n finally\r\n g.Free;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.DrawHTMLText(AGraphics: TTMSFNCGraphics);\r\nvar\r\n r: TRectF;\r\nbegin\r\n AGraphics.Font.AssignSource(Font);\r\n AGraphics.URLColor := URLColor;\r\n AGraphics.URLUnderline := URLUnderline;\r\n if AutoSize then\r\n begin\r\n if AutoWidth and AutoHeight then\r\n r := RectF(AutoSizeSpacing, AutoSizeSpacing, Width, Height)\r\n else if AutoWidth then\r\n r := RectF(AutoSizeSpacing, 0, Width, Height)\r\n else if AutoHeight then\r\n r := RectF(0, AutoSizeSpacing, Width, Height);\r\n end\r\n else\r\n r := LocalRect;\r\n AGraphics.DrawText(r, Text, WordWrapping, HorizontalTextAlign, VerticalTextAlign, Trimming, 0, -1, -1, DisplayHTML);\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.FillChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.DoFontChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nfunction TTMSFNCHTMLText.GetBitmapContainer: TTMSFNCBitmapContainer;\r\nbegin\r\n Result := FBitmapContainer;\r\nend;\r\n\r\nfunction TTMSFNCHTMLText.GetTextRect: TRectF;\r\nvar\r\n g: TTMSFNCGraphics;\r\n R: TRectF;\r\n w, h: Single;\r\nbegin\r\n g := TTMSFNCGraphics.CreateBitmapCanvas;\r\n g.OptimizedHTMLDrawing := OptimizedHTMLDrawing;\r\n g.BitmapContainer := BitmapContainer;\r\n try\r\n g.Font.AssignSource(Font);\r\n if WordWrapping then\r\n R := RectF(0, 0, Width, 10000)\r\n else\r\n R := RectF(0, 0, 10000, 10000);\r\n\r\n Result := g.CalculateText(Text, R, WordWrapping, DisplayHTML);\r\n w := Result.Right - Result.Left;\r\n h := Result.Bottom - Result.Top;\r\n Result.Right := Result.Left + w + AutoSizeSpacing * 2;\r\n Result.Bottom := Result.Top + h + AutoSizeSpacing * 2;\r\n finally\r\n g.Free;\r\n end;\r\nend;\r\n\r\nfunction TTMSFNCHTMLText.GetVersion: string;\r\nbegin\r\n Result := GetVersionNumber(MAJ_VER, MIN_VER, REL_VER, BLD_VER);\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.HandleMouseDown(Button: TTMSFNCMouseButton;\r\n Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n DoMouseDown(Button, Shift, X, Y);\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.HandleMouseMove(Shift: TShiftState; X, Y: Single);\r\nbegin\r\n inherited;\r\n DoMouseMove(Shift, X, Y);\r\nend;\r\n\r\nfunction TTMSFNCHTMLText.IsAutoSizeSpacingStored: Boolean;\r\nbegin\r\n Result := AutoSizeSpacing <> 0;\r\nend;\r\n\r\nfunction TTMSFNCHTMLText.IsHTML: boolean;\r\nbegin\r\n if not DisplayHTML then\r\n Result := False\r\n else\r\n Result := (AnsiPos(' 0) or (AnsiPos('/>', Text) > 0) or (AnsiPos('
', UpperCase(Text)) > 0);\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetAS(const Value: Boolean);\r\nbegin\r\n if FAutoSize <> Value then\r\n begin\r\n FAutoSize := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetAutoHeight(const Value: Boolean);\r\nbegin\r\n if FAutoHeight <> Value then\r\n begin\r\n FAutoHeight := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetAutoSizeSpacing(const Value: Single);\r\nbegin\r\n if FAutoSizeSpacing <> Value then\r\n begin\r\n FAutoSizeSpacing := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetAutoWidth(const Value: Boolean);\r\nbegin\r\n if FAutoWidth <> Value then\r\n begin\r\n FAutoWidth := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetBitmapContainer(\r\n const Value: TTMSFNCBitmapContainer);\r\nbegin\r\n FBitmapContainer := Value;\r\n ApplyAutoSize;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetDisplayHTML(const Value: Boolean);\r\nbegin\r\n if FDisplayHTML <> Value then\r\n begin\r\n FDisplayHTML := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetFont(const Value: TTMSFNCGraphicsFont);\r\nbegin\r\n FFont.AssignSource(Value);\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetHorizontalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FHorizontalTextAlign <> Value then\r\n begin\r\n FHorizontalTextAlign := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetShadowColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if (FShadowColor <> Value) then\r\n begin\r\n FShadowColor := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetShadowOffset(const Value: integer);\r\nbegin\r\n if (FShadowOffset <> Value) then\r\n begin\r\n FShadowOffset := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetText(const Value: String);\r\nbegin\r\n if FText <> Value then\r\n begin\r\n FText := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetTrimming(const Value: TTMSFNCGraphicsTextTrimming);\r\nbegin\r\n if FTrimming <> Value then\r\n begin\r\n FTrimming := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetURLColor(const Value: TTMSFNCGraphicsColor);\r\nbegin\r\n if (FURLColor <> Value) then\r\n begin\r\n FURLColor := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetURLUnderline(const Value: Boolean);\r\nbegin\r\n if FURLUnderline <> Value then\r\n begin\r\n FURLUnderline := Value;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetVerticalTextAlign(\r\n const Value: TTMSFNCGraphicsTextAlign);\r\nbegin\r\n if FVerticalTextAlign <> Value then\r\n begin\r\n FVerticalTextAlign := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.SetWordWrapping(const Value: Boolean);\r\nbegin\r\n if FWordWrapping <> Value then\r\n begin\r\n FWordWrapping := Value;\r\n ApplyAutoSize;\r\n Invalidate;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.StrokeChanged(Sender: TObject);\r\nbegin\r\n Invalidate;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.ApplyStyle;\r\nvar\r\n c: TTMSFNCGraphicsColor;\r\nbegin\r\n inherited;\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundFillColor(c) then\r\n Fill.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleBackgroundStrokeColor(c) then\r\n Stroke.Color := c;\r\n\r\n c := gcNull;\r\n if TTMSFNCStyles.GetStyleTextFontColor(c) then\r\n Font.Color := c;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.Assign(Source: TPersistent);\r\nbegin\r\n inherited;\r\n if Source is TTMSFNCHTMLText then\r\n begin\r\n FTrimming := (Source as TTMSFNCHTMLText).Trimming;\r\n FAutoSize := (Source as TTMSFNCHTMLText).AutoSize;\r\n FAutoWidth := (Source as TTMSFNCHTMLText).AutoWidth;\r\n FAutoHeight := (Source as TTMSFNCHTMLText).AutoHeight;\r\n FAutoSizeSpacing := (Source as TTMSFNCHTMLText).AutoSizeSpacing;\r\n FAutoOpenURL := (Source as TTMSFNCHTMLText).AutoOpenURL;\r\n FDisplayHTML := (Source as TTMSFNCHTMLText).DisplayHTML;\r\n FFont.AssignSource((Source as TTMSFNCHTMLText).Font);\r\n FHorizontalTextAlign := (Source as TTMSFNCHTMLText).HorizontalTextAlign;\r\n FShadowColor := (Source as TTMSFNCHTMLText).ShadowColor;\r\n FShadowOffset := (Source as TTMSFNCHTMLText).ShadowOffset;\r\n FText := (Source as TTMSFNCHTMLText).Text;\r\n FURLColor := (Source as TTMSFNCHTMLText).URLColor;\r\n FURLUnderline := (Source as TTMSFNCHTMLText).URLUnderline;\r\n FVerticalTextAlign := (Source as TTMSFNCHTMLText).VerticalTextAlign;\r\n FWordWrapping := (Source as TTMSFNCHTMLText).WordWrapping;\r\n end;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.RegisterRuntimeClasses;\r\nbegin\r\n inherited;\r\n RegisterClass(TTMSFNCHTMLText);\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.ResetToDefaultStyle;\r\nbegin\r\n inherited;\r\n Fill.Color := gcWhite;\r\n Stroke.Color := gcSilver;\r\n Font.Color := gcBlack;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.Notification(AComponent: TComponent;\r\n Operation: TOperation);\r\nbegin\r\n inherited;\r\n if (Operation = opRemove) and (AComponent = FBitmapContainer) then\r\n FBitmapContainer := nil;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.UpdateControlAfterResize;\r\nbegin\r\n inherited;\r\n ApplyAutoSize;\r\nend;\r\n\r\nprocedure TTMSFNCHTMLText.Draw(AGraphics: TTMSFNCGraphics; ARect: TRectF);\r\nbegin\r\n inherited;\r\n AGraphics.BitmapContainer := BitmapContainer;\r\n DrawHTMLText(AGraphics);\r\n if IsDesignTime and CanDrawDesignTime then\r\n AGraphics.DrawFocusRectangle(ARect, gcBlack);\r\nend;\r\n\r\nend.\r\n","unit UBL;\r\n\r\ninterface\r\n\r\n{$IFDEF LCL}\r\n{$mode objfpc}{$H+}{$modeswitch advancedrecords}\r\n{$ENDIF}\r\n\r\nuses\r\n {$IFDEF VCL}\r\n Classes, SysUtils, VCL.TMSFNCKanbanBoard, VCL.TMSFNCCustomControl, VCL.TMSFNCKanbanBoardDatabaseAdapter, VCL.TMSFNCBitmapContainer,\r\n Generics.Collections, VCL.TMSFNCGraphics, VCL.TMSFNCGraphicsTypes, VCL.TMSFNCUtils, VCL.Forms, Data.DB, DataSnap.DBClient, VCL.TMSFNCPanel, VCL.TMSFNCColorPicker,\r\n VCL.TMSFNCEdit, VCL.TMSFNCHTMLText, VCL.TMSFNCColorSelector, VCL.StdCtrls, VCL.TMSFNCTypes, UITypes;\r\n {$ENDIF}\r\n\r\n {$IFDEF FMX}\r\n Classes, SysUtils, FMX.TMSFNCKanbanBoard, FMX.TMSFNCCustomControl, FMX.TMSFNCKanbanBoardDatabaseAdapter, FMX.TMSFNCBitmapContainer,\r\n Generics.Collections, FMX.TMSFNCGraphics, FMX.TMSFNCGraphicsTypes, FMX.TMSFNCUtils, FMX.Forms, Data.DB, DataSnap.DBClient, FMX.TMSFNCPanel, FMX.TMSFNCColorPicker,\r\n FMX.TMSFNCEdit, FMX.Memo, FMX.TMSFNCHTMLText, FMX.TMSFNCColorSelector, FMX.TMSFNCTypes, UITypes;\r\n {$ENDIF}\r\n\r\n {$IFDEF LCL}\r\n Classes, SysUtils, LCLTMSFNCCustomControl, LCLTMSFNCKanbanBoard, LCLTMSFNCKanbanBoardDataBaseAdapter, LCLTMSFNCBitmapContainer,\r\n LCLTMSFNCGraphicsTypes, LCLTMSFNCUTils, DateUtils, Forms, LCLTMSFNCPanel, LCLTMSFNCColorPicker,\r\n LCLTMSFNCEdit, LCLTMSFNCHTMLText, LCLTMSFNCColorSelector, memds, db, Dialogs, Controls, StdCtrls, LCLTMSFNCTypes;\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n Web, Classes, DateUtils, Contnrs, SysUtils, WEBLib.TMSFNCCustomComponent, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCBitmapContainer,\r\n WEBLib.TMSFNCTypes, WEBLib.TMSFNCGraphicsTypes, WEBLib.TMSFNCUtils, WEBLib.TMSFNCCustomControl,\r\n WEBLib.TMSFNCKanbanBoard, WEBLib.TMSFNCKanbanBoardDataBaseAdapter, WEBLib.Forms, DB, WEBLib.CDS, WEBLib.TMSFNCPanel,\r\n WEBLib.TMSFNCColorPicker, WEBLib.TMSFNCEdit, WEBLib.TMSFNCHTMLText, WEBLib.TMSFNCColorSelector, WEBLib.StdCtrls,\r\n WEBLib.Controls;\r\n {$ENDIF}\r\n\r\ntype\r\n {$IFDEF LCL}\r\n TKanbanBoardDataSet = TMemDataSet;\r\n {$ENDIF}\r\n {$IFNDEF LCL}\r\n TKanbanBoardDataSet = TClientDataSet;\r\n {$ENDIF}\r\n\r\n TKanbanBoardLogic = class\r\n private\r\n FBlockUpdate: Boolean;\r\n cl: TTMSFNCGraphicsColor;\r\n FForm: TCustomForm;\r\n FKanbanBoard: TTMSFNCKanbanBoard;\r\n FKanbanBoardDatabaseAdapter: TTMSFNCKanbanBoardDatabaseAdapter;\r\n FDataSet: TKanbanBoardDataset;\r\n FDataSource: TDatasource;\r\n FTitle: TTMSFNCEdit;\r\n FText: TMemo;\r\n FColor: TTMSFNCColorPicker;\r\n protected\r\n procedure PopulateDataset;\r\n procedure DoCustomizeColumn(Sender: TObject; {%H-}AColumn: TTMSFNCKanbanBoardColumn; ATableView: TTMSFNCKanbanBoardTableView);\r\n procedure DoFieldsToItem(Sender: TObject; AFields: TFields; AItem: TTMSFNCKanbanBoardItem);\r\n procedure DoHeaderCompactButtonClicked(Sender: TObject);\r\n procedure DoSelectItem(Sender: TObject; {%H-}AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem);\r\n procedure TextChanged(Sender: TObject);\r\n procedure TitleChanged(Sender: TObject);\r\n procedure ColorSelected(Sender: TObject; AColor: TTMSFNCGraphicsColor);\r\n {$IFDEF FMX}\r\n procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n {$ENDIF}\r\n {$IFNDEF FMX}\r\n procedure FormKeyDown(Sender: TObject; var {%H-}Key: Word; {%H-}Shift: TShiftState);\r\n {$ENDIF}\r\n procedure FormShow(Sender: TObject);\r\n public\r\n destructor Destroy; override;\r\n procedure InitKanbanBoard(AForm: TCustomForm; ABitmapContainer: TTMSFNCBitmapContainer);\r\n procedure ReloadKanbanBoard;\r\n end;\r\n\r\nimplementation\r\n\r\nuses\r\n Math;\r\n\r\ntype\r\n TCustomFormOpen = class(TCustomForm);\r\n\r\nprocedure TKanbanBoardLogic.ColorSelected(Sender: TObject;\r\n AColor: TTMSFNCGraphicsColor);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n if FBlockUpdate then\r\n Exit;\r\n\r\n it := FKanbanBoard.SelectedItem;\r\n if Assigned(it) then\r\n it.Color := AColor;\r\nend;\r\n\r\ndestructor TKanbanBoardLogic.Destroy;\r\nbegin\r\n inherited;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.DoCustomizeColumn(Sender: TObject;\r\n AColumn: TTMSFNCKanbanBoardColumn; ATableView: TTMSFNCKanbanBoardTableView);\r\nbegin\r\n if Assigned(ATableView) then\r\n begin\r\n ATableView.TreeView.GroupsAppearance.BottomStroke.Color := cl;\r\n ATableView.TreeView.GroupsAppearance.TopStroke.Color := cl;\r\n end;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.DoFieldsToItem(Sender: TObject; AFields: TFields;\r\n AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n AItem.Expandable := True;\r\n AItem.UseDefaultAppearance := False;\r\n AItem.Color := AFields.FieldByName('Color').AsInteger;\r\n AItem.MarkColor := gcOrange;\r\n if AItem.Color = gcIndianred then\r\n begin\r\n AItem.TitleColor := gcWhite;\r\n AItem.TextColor := gcWhite;\r\n end;\r\n\r\n case AFields.FieldByName('Priority').AsInteger of\r\n 1: AItem.MarkType := [kbmtLeft];\r\n 2: AItem.MarkType := [kbmtTop];\r\n 3: AItem.MarkType := [kbmtRight];\r\n 4: AItem.MarkType := [kbmtBottom];\r\n 5: AItem.MarkType := [kbmtLeft, kbmtTop, kbmtRight, kbmtBottom];\r\n end;\r\n\r\n if Odd(Random(10)) then\r\n AItem.MarkColor := gcBlue\r\n else\r\n AItem.MarkColor := gcRed;\r\nend;\r\n\r\n{$IFDEF FMX}\r\nprocedure TKanbanBoardLogic.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);\r\n{$ENDIF}\r\n{$IFNDEF FMX}\r\nprocedure TKanbanBoardLogic.FormKeyDown(Sender: TObject; var {%H-}Key: Word; {%H-}Shift: TShiftState);\r\n{$ENDIF}\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n it := FKanbanBoard.SelectedItem;\r\n if Assigned(it) and Assigned(it.Column) and Assigned(it.Column.TableView) and Assigned(it.Column.TableView.TreeView){ and (it.Column.TableView.TreeView.Focused)} then\r\n begin\r\n case Key of\r\n KEY_DELETE:\r\n begin\r\n if (TTMSFNCUtils.Message('Do you want to delete the selected item?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) = mrYes) then\r\n it.Column.Items.Delete(it.Index);\r\n end;\r\n KEY_INSERT: FKanbanBoard.SelectedItem := it.Column.Items.Add;\r\n end;\r\n end;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.FormShow(Sender: TObject);\r\nbegin\r\n ReloadKanbanBoard;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.DoHeaderCompactButtonClicked(Sender: TObject);\r\nvar\r\n I: Integer;\r\n p: TTMSFNCPanel;\r\nbegin\r\n p := Sender as TTMSFNCPanel;\r\n {$IFDEF FMX}\r\n for I := 0 to p.ControlsCount - 1 do\r\n {$ENDIF}\r\n {$IFNDEF FMX}\r\n for I := 0 to p.ControlCount - 1 do\r\n {$ENDIF}\r\n p.Controls[I].Visible := (p.CompactState = pcsExpanded);\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.DoSelectItem(Sender: TObject;\r\n AColumn: TTMSFNCKanbanBoardColumn; AItem: TTMSFNCKanbanBoardItem);\r\nbegin\r\n if Assigned(AItem) then\r\n begin\r\n FBlockUpdate := True;\r\n FTitle.Text := AItem.Title;\r\n FText.Text := AItem.Text;\r\n FColor.SelectedColor := AItem.Color;\r\n FBlockUpdate := False;\r\n end;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.InitKanbanBoard(AForm: TCustomForm; ABitmapContainer: TTMSFNCBitmapContainer);\r\nvar\r\n c: TTMSFNCKanbanBoardColumn;\r\n p: TTMSFNCPanel;\r\n l, lt: TTMSFNCHTMLText;\r\n h: TTMSFNCHTMLText;\r\nbegin\r\n FForm := AForm;\r\n\r\n p := TTMSFNCPanel.Create(FForm);\r\n p.Parent := FForm;\r\n p.ControlAlignment := caLeft;\r\n p.Width := 300;\r\n p.Header.Buttons := [pbCompact];\r\n p.Header.Text := 'Settings';\r\n\r\n h := TTMSFNCHTMLText.Create(p);\r\n h.Parent := p;\r\n h.AutoSize := True;\r\n h.Text := 'Supported interactions:
  • Drag & Drop
  • Selection
  • Expand/Collapse
  • Sorting
  • Filtering
  • Delete / Insert key to delete / add items
';\r\n h.ShowAcceleratorChar := False;\r\n h.HorizontalTextAlign := gtaLeading;\r\n h.Left := 5;\r\n h.Top := Round(p.Header.Size) + 5;\r\n h.Width := p.Width - 5;\r\n h.Height := 125;\r\n\r\n lt := TTMSFNCHTMLText.Create(p);\r\n lt.Parent := p;\r\n lt.AutoSize := True;\r\n lt.Text := 'Title:';\r\n lt.Left := 5;\r\n lt.Top := h.Top + h.Height + 10;\r\n\r\n FTitle := TTMSFNCEdit.Create(p);\r\n FTitle.Parent := p;\r\n {$IFDEF FMX}\r\n FTitle.Position.X := Max(lt.Left + lt.Width, 50) + 10;\r\n FTitle.Position.Y := lt.Top;\r\n FTitle.Width := p.Width - 10 - FTitle.Position.X;\r\n {$ENDIF}\r\n {$IFNDEF FMX}\r\n FTitle.Left := Max(lt.Left + lt.Width, 50) + 10;\r\n FTitle.Top := lt.Top;\r\n FTitle.Width := p.Width - 10 - FTitle.Left;\r\n {$ENDIF}\r\n\r\n l := TTMSFNCHTMLText.Create(p);\r\n l.Parent := p;\r\n l.AutoSize := True;\r\n l.Text := 'Text:';\r\n l.Left := 5;\r\n l.Top := lt.Top + lt.Height + 10;\r\n\r\n FText := TMemo.Create(p);\r\n FText.Parent := p;\r\n {$IFDEF FMX}\r\n FText.Position.X := Max(l.Left + l.Width, 50) + 10;\r\n FText.Position.Y := l.Top;\r\n FText.Width := p.Width - 10 - FText.Position.X;\r\n {$ENDIF}\r\n {$IFNDEF FMX}\r\n FText.Left := Max(l.Left + l.Width, 50) + 10;\r\n FText.Top := l.Top;\r\n FText.Width := p.Width - 10 - FText.Left;\r\n {$ENDIF}\r\n FText.Height := 150;\r\n FText.WordWrap := True;\r\n\r\n l := TTMSFNCHTMLText.Create(p);\r\n l.Parent := p;\r\n l.AutoSize := True;\r\n l.Text := 'Color:';\r\n l.Left := 5;\r\n {$IFDEF FMX}\r\n l.Top := FText.Position.Y + FText.Height + 10;\r\n {$ENDIF}\r\n {$IFNDEF FMX}\r\n l.Top := FText.Top + FText.Height + 10;\r\n {$ENDIF}\r\n\r\n FColor := TTMSFNCColorPicker.Create(p);\r\n FColor.Parent := p;\r\n FColor.Left := Max(l.Left + l.Width, 50) + 10;\r\n FColor.Top := l.Top;\r\n FColor.Width := p.Width - 10 - FColor.Left;\r\n FColor.Mode := csmExtended;\r\n\r\n FKanbanBoard := TTMSFNCKanbanBoard.Create(FForm);\r\n FKanbanBoard.BeginUpdate;\r\n\r\n cl := MakeGraphicsColor(240, 240, 240);\r\n\r\n FKanbanBoard.BitmapContainer := ABitmapContainer;\r\n FKanbanBoard.Parent := FForm;\r\n FKanbanBoard.ControlAlignment := caClient;\r\n FKanbanBoard.ColumnsAppearance.Margins.Left := 50;\r\n FKanbanBoard.ColumnsAppearance.Margins.Top := 50;\r\n FKanbanBoard.ColumnsAppearance.HeaderFill.Color := cl;\r\n FKanbanBoard.ColumnsAppearance.HeaderStroke.Color := cl;\r\n FKanbanBoard.ColumnsAppearance.FooterFill.Color := cl;\r\n FKanbanBoard.ColumnsAppearance.FooterStroke.Color := cl;\r\n FKanbanBoard.ColumnsAppearance.Fill.Color := cl;\r\n FKanbanBoard.ColumnsAppearance.Stroke.Color := cl;\r\n TTMSFNCUtils.SetFontSize(FKanbanBoard.ColumnsAppearance.HeaderFont, 20);\r\n\r\n FKanbanBoard.ItemsAppearance.SelectedFill.Color := gcLightsteelblue;\r\n FKanbanBoard.ItemsAppearance.SelectedStroke.Color := cl;\r\n TTMSFNCUtils.SetFontSize(FKanbanBoard.ItemsAppearance.TitleFont, 16);\r\n FKanbanBoard.ItemsAppearance.Fill.Color := gcWhite;\r\n FKanbanBoard.ItemsAppearance.Stroke.Color := cl;\r\n\r\n FKanbanBoard.Fill.Color := cl;\r\n FKanbanBoard.Stroke.Color := cl;\r\n\r\n FKanbanBoard.Interaction.DragDropMode := kbdmMove;\r\n\r\n FKanbanBoardDatabaseAdapter := TTMSFNCKanbanBoardDatabaseAdapter.Create(AForm);\r\n\r\n FKanbanBoardDatabaseAdapter.Parent := AForm;\r\n FKanbanBoardDatabaseAdapter.Visible := False;\r\n\r\n FDataSet := TKanbanBoardDataSet.Create(FForm);\r\n FDataSet.FieldDefs.Add('ID', ftInteger, 0, True);\r\n FDataSet.FieldDefs.Add('Title', ftString, 255, True);\r\n FDataSet.FieldDefs.Add('Description', ftString, 255, False);\r\n FDataSet.FieldDefs.Add('Priority', ftInteger, 0, False);\r\n FDataSet.FieldDefs.Add('Status', ftInteger, 0, False);\r\n FDataSet.FieldDefs.Add('Color', ftInteger, 0, False);\r\n {$IFNDEF WEBLIB}\r\n {$IFNDEF LCL}\r\n FDataSet.CreateDataSet;\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n FDataSet.Open;\r\n {$ENDIF}\r\n\r\n {$IFDEF LCL}\r\n FDataSet.Open;\r\n {$ENDIF}\r\n\r\n FDataSource := TDataSource.Create(FForm);\r\n FDataSource.DataSet := FDataSet;\r\n\r\n PopulateDataset;\r\n\r\n FKanbanBoardDatabaseAdapter.KanbanBoard := FKanbanBoard;\r\n FKanbanBoardDatabaseAdapter.Item.DataSource := FDataSource;\r\n FKanbanBoardDatabaseAdapter.Item.Title := 'Title';\r\n FKanbanBoardDatabaseAdapter.Item.Text := 'Description';\r\n FKanbanBoardDatabaseAdapter.Item.DBKey := 'ID';\r\n FKanbanBoardDatabaseAdapter.Item.Column := 'Status';\r\n\r\n c := FKanbanBoard.Columns.Add;\r\n c.HeaderText := 'TO DO';\r\n c.Expandable := True;\r\n\r\n c := FKanbanBoard.Columns.Add;\r\n c.HeaderText := 'IN PROGRESS';\r\n c.Expandable := True;\r\n c.Sorting := kbsNormal;\r\n c.ShowFilterButton := True;\r\n c.Width := c.Width + 50;\r\n\r\n c := FKanbanBoard.Columns.Add;\r\n c.HeaderText := 'DONE';\r\n\r\n {$IFDEF LCL}\r\n FKanbanBoard.OnSelectItem := @DoSelectItem;\r\n FKanbanBoard.OnCustomizeColumn := @DoCustomizeColumn;\r\n FKanbanBoardDatabaseAdapter.OnFieldsToItem := @DoFieldsToItem;\r\n FColor.OnColorSelected := @ColorSelected;\r\n p.OnHeaderCompactButtonClick := @DoHeaderCompactButtonClicked;\r\n FTitle.OnChange := @TitleChanged;\r\n FText.OnChange := @TextChanged;\r\n TCustomFormOpen(FForm).OnKeyDown := @FormKeyDown;\r\n TCustomFormOpen(FForm).OnShow := @FormShow;\r\n {$ENDIF}\r\n {$IFNDEF LCL}\r\n FKanbanBoard.OnSelectItem := DoSelectItem;\r\n FKanbanBoard.OnCustomizeColumn := DoCustomizeColumn;\r\n FKanbanBoardDatabaseAdapter.OnFieldsToItem := DoFieldsToItem;\r\n FColor.OnColorSelected := ColorSelected;\r\n p.OnHeaderCompactButtonClick := DoHeaderCompactButtonClicked;\r\n FTitle.OnChange := TitleChanged;\r\n FText.OnChange := TextChanged;\r\n TCustomFormOpen(FForm).OnKeyDown := FormKeyDown;\r\n TCustomFormOpen(FForm).OnShow := FormShow;\r\n {$IFNDEF FMX}\r\n {$IFNDEF WEBLIB}\r\n FForm.KeyPreview := True;\r\n {$ENDIF}\r\n {$ENDIF}\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n Application.OnImageCacheReady := FormShow;\r\n {$ENDIF}\r\n\r\n FKanbanBoardDatabaseAdapter.Active := True;\r\n FDataSet.Active := True;\r\n FKanbanBoard.EndUpdate;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.PopulateDataset;\r\nvar\r\n idx: Integer;\r\n\r\n procedure AddRecord(var AIndex: Integer; ATitle, ADescription: String; APriority, AStatus, AColor: TTMSFNCGraphicsColor);\r\n begin\r\n FDataSet.Append;\r\n FDataSet.FieldByName('ID').AsInteger := idx;\r\n FDataSet.FieldByName('Title').AsString := ATitle;\r\n FDataSet.FieldByName('Description').AsString := ADescription;\r\n FDataSet.FieldByName('Priority').AsInteger := APriority;\r\n FDataSet.FieldByName('Status').AsInteger := AStatus;\r\n FDataSet.FieldByName('Color').AsInteger := AColor;\r\n FDataSet.Post;\r\n Inc(AIndex);\r\n end;\r\n\r\nbegin\r\n FDataSet.DisableControls;\r\n try\r\n idx := 0;\r\n\r\n AddRecord(idx, 'TMS FNC Kanban Release', 'Finish documentation

', 0, 0, gcWhite);\r\n AddRecord(idx, 'TMS FNC Kanban Release', '', 0, 2, gcWhite);\r\n AddRecord(idx, 'ADD NEW', 'New FNC Component', 0, 1, MakeGraphicsColor(153, 204, 0));\r\n AddRecord(idx, 'FIX', 'Fix issue in FNC Core', 1, 0, gcWhite);\r\n AddRecord(idx, 'FNC', 'Interface Support
', 3, 1, MakeGraphicsColor(0, 204, 255));\r\n AddRecord(idx, 'FNC', 'Convert Calendar and Date-Picker to FMX, VCL and WEB
', 0, 1, gcWhite);\r\n AddRecord(idx, 'JQWidgets', 'Create a JQWidgets grid demo with CSS styling', 0, 0, MakeGraphicsColor(255, 102, 0));\r\n AddRecord(idx, 'Documentation', 'Finish documentation for TMS WEB Core
', 4, 1, MakeGraphicsColor(255, 204, 0));\r\n AddRecord(idx, 'Landing page', 'Add new blog post to WEB landing page', 4, 0, gcWhite);\r\n AddRecord(idx, 'Landing page', 'Add new image to WEB landing page, image is attached below.

', 0, 2, gcWhite);\r\n\r\n FDataSet.First;\r\n finally\r\n FDataSet.EnableControls;\r\n end;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.ReloadKanbanBoard;\r\nbegin\r\n FKanbanBoard.BeginUpdate;\r\n FKanbanBoard.EndUpdate;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.TextChanged(Sender: TObject);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n if FBlockUpdate then\r\n Exit;\r\n\r\n it := FKanbanBoard.SelectedItem;\r\n if Assigned(it) then\r\n it.Text := FText.Text;\r\nend;\r\n\r\nprocedure TKanbanBoardLogic.TitleChanged(Sender: TObject);\r\nvar\r\n it: TTMSFNCKanbanBoardItem;\r\nbegin\r\n if FBlockUpdate then\r\n Exit;\r\n\r\n it := FKanbanBoard.SelectedItem;\r\n if Assigned(it) then\r\n it.Title := FTitle.Text;\r\nend;\r\n\r\nend.\r\n","unit UDemo;\r\n\r\ninterface\r\n\r\n{$IFDEF LCL}\r\n{$mode objfpc}{$H+}{$modeswitch advancedrecords}\r\n{$ENDIF}\r\n\r\nuses\r\n {$IFDEF VCL}\r\n Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,\r\n Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, UBL,\r\n VCL.TMSFNCCustomControl, VCL.TMSFNCKanbanBoard, VCL.TMSFNCKanbanBoardDatabaseAdapter,\r\n VCL.TMSFNCTypes, VCL.TMSFNCUtils, VCL.TMSFNCGraphics, VCL.TMSFNCGraphicsTypes,\r\n VCL.TMSFNCCustomComponent, VCL.TMSFNCCustomScrollControl,\r\n VCL.TMSFNCBitmapContainer;\r\n {$ENDIF}\r\n\r\n {$IFDEF WEBLIB}\r\n SysUtils, Classes, WEBLib.Graphics,\r\n WEBLib.Forms, WEBLib.Dialogs, WEBLib.StdCtrls, UBL,\r\n WEBLib.TMSFNCCustomControl, WEBLib.TMSFNCKanbanBoard, WEBLib.TMSFNCKanbanBoardDatabaseAdapter,\r\n WEBLib.TMSFNCTypes, WEBLib.TMSFNCUtils, WEBLib.TMSFNCGraphics, WEBLib.TMSFNCGraphicsTypes,\r\n WEBLib.TMSFNCCustomComponent, WEBLib.TMSFNCCustomScrollControl, WEBLib.Controls,\r\n WEBLib.TMSFNCBitmapContainer;\r\n {$ENDIF}\r\n\r\n {$IFDEF FMX}\r\n System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,\r\n FMX.Types, FMX.Forms, FMX.Controls, FMX.Graphics, FMX.Dialogs, UBL,\r\n FMX.TMSFNCCustomControl, FMX.TMSFNCKanbanBoard, FMX.TMSFNCTypes, FMX.TMSFNCUtils, FMX.TMSFNCGraphics,\r\n FMX.TMSFNCGraphicsTypes, FMX.TMSFNCKanbanBoardDatabaseAdapter,\r\n FMX.TMSFNCCustomComponent, FMX.TMSFNCBitmapContainer;\r\n {$ENDIF}\r\n\r\n {$IFDEF LCL}\r\n Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, UBL, LCLTMSFNCBitmapContainer;\r\n {$ENDIF}\r\n\r\ntype\r\n {$IFDEF WEBLIB}\r\n TForm1 = class(TForm)\r\n TMSFNCBitmapContainer1: TTMSFNCBitmapContainer;\r\n procedure FormCreate(Sender: TObject);\r\n procedure FormDestroy(Sender: TObject);\r\n private\r\n FKanbanBoardLogic: TKanbanBoardLogic;\r\n protected\r\n procedure LoadDFMValues; override;\r\n public\r\n end;\r\n {$ENDIF}\r\n {$IFNDEF WEBLIB}\r\n TForm1 = class(TForm)\r\n TMSFNCBitmapContainer1: TTMSFNCBitmapContainer;\r\n procedure FormCreate(Sender: TObject);\r\n procedure FormDestroy(Sender: TObject);\r\n private\r\n FKanbanBoardLogic: TKanbanBoardLogic;\r\n public\r\n end;\r\n {$ENDIF}\r\n\r\nvar\r\n Form1: TForm1;\r\n\r\nimplementation\r\n\r\n{$IFDEF FMX}\r\n{$R *.fmx}\r\n{$ENDIF}\r\n{$IFDEF VCL}\r\n{$R *.dfm}\r\n{$ENDIF}\r\n{$IFDEF WEBLIB}\r\n{$ENDIF}\r\n{$IFDEF LCL}\r\n{$R *.lfm}\r\n{$ENDIF}\r\n\r\nprocedure TForm1.FormCreate(Sender: TObject);\r\nbegin\r\n FKanbanBoardLogic := TKanbanBoardLogic.Create;\r\n FKanbanBoardLogic.InitKanbanBoard(Self, TMSFNCBitmapContainer1);\r\nend;\r\n\r\nprocedure TForm1.FormDestroy(Sender: TObject);\r\nbegin\r\n FKanbanBoardLogic.Free;\r\nend;\r\n\r\nprocedure TForm1.LoadDFMValues;\r\nbegin\r\n inherited LoadDFMValues;\r\n\r\n TMSFNCBitmapContainer1 := TTMSFNCBitmapContainer.Create(Self);\r\n\r\n TMSFNCBitmapContainer1.BeforeLoadDFMValues;\r\n try\r\n Name := 'Form1';\r\n Caption := 'TMS FNC Kanban Board Demo';\r\n Height := 561;\r\n Width := 1234;\r\n Color := clBtnFace;\r\n Font.Charset := DEFAULT_CHARSET;\r\n Font.Color := clWindowText;\r\n Font.Height := -11;\r\n Font.Name := 'Tahoma';\r\n Font.Style := [];\r\n OnCreate := FormCreate;\r\n TMSFNCBitmapContainer1.SetParentComponent(Self);\r\n TMSFNCBitmapContainer1.Name := 'TMSFNCBitmapContainer1';\r\n TMSFNCBitmapContainer1.Left := 384;\r\n TMSFNCBitmapContainer1.Top := 288;\r\n TMSFNCBitmapContainer1.Width := 26;\r\n TMSFNCBitmapContainer1.Height := 26;\r\n TMSFNCBitmapContainer1.Visible := True;\r\n with TMSFNCBitmapContainer1.Items.Add do\r\n begin\r\n Bitmap.LoadFromFile('UDemo.TMSFNCBitmapContainer1.Items.Bitmap.png');\r\n Name := 'button_duplicate.png';\r\n Tag := 0;\r\n end;\r\n with TMSFNCBitmapContainer1.Items.Add do\r\n begin\r\n Bitmap.LoadFromFile('UDemo.TMSFNCBitmapContainer1.Items.Bitmap_1.png');\r\n Name := 'button_high-priority.png';\r\n Tag := 0;\r\n end;\r\n with TMSFNCBitmapContainer1.Items.Add do\r\n begin\r\n Bitmap.LoadFromFile('UDemo.TMSFNCBitmapContainer1.Items.Bitmap_2.png');\r\n Name := 'button_low-priority.png';\r\n Tag := 0;\r\n end;\r\n with TMSFNCBitmapContainer1.Items.Add do\r\n begin\r\n Bitmap.LoadFromFile('UDemo.TMSFNCBitmapContainer1.Items.Bitmap_3.png');\r\n Name := 'flowers.png';\r\n Tag := 0;\r\n end;\r\n finally\r\n TMSFNCBitmapContainer1.AfterLoadDFMValues;\r\n end;\r\nend;\r\n\r\nend.\r\n","program TMSWeb_FNCKanbanBoard;\r\n\r\nuses\r\n WEBLib.Forms,\r\n UBL in '..\\..\\Shared Code\\Business Logic\\Kanban Board\\UBL.pas',\r\n UDemo in '..\\..\\Shared Code\\Form Unit\\Kanban Board\\UDemo.pas'{*.html};\r\n\r\n{$R *.res}\r\n\r\nbegin\r\n Application.Initialize;\r\n Application.MainFormOnTaskbar := True;\r\n Application.CreateForm(TForm1, Form1);\r\n Application.Run;\r\nend.\r\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1nCA;;;AAQY,oBAAG;pBACH,oBAAG;pBAON,iBAAG;jBACA,oBAAI;pBAGR,gBAAG;hBAgCU;AAMd;;AACH;AACA;AACA;AACA;;AAHA;AACA;AACA;AACA;;AAJG;aACH,kBACA,IACA,CADA,kBACA,IACA,CADA,kBACA,8BADA,CADA;5GAFG;;AAYE;;;;;AAqlBiB;;AAKA;;AAKJ;AAEpB;AAFoB;AAoBa;;AAKA;;AAKN;AAAZ;AAGjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEE,eAAU,sBAAiB,CAAC,cAAY,CAAC,GAAD,EAAM,GAAnB;7DAZZ;AAAY;AAoBK;AAAjB;AAEf,UAAa,oBAAF,wBAAP,MAAO,EAAX;9DAEE,gBAAK,IAAL;pBACI,eAAC;RAHP;PAMF;AACA;AACA;AAEE,eAAQ;fAZO;AAAiB;AAjpBzB;AAuCM,uBAAG,CAAC;xBAMT,gFAEiB,iBACP,UACC,UAJX;;;rHAEiB,qCAAU,OA3D9B,oBA2D8B,GAAgB,cAA1B,EA3FlB,WA2FkB;9FACP,kCA5FX,WA4FW;7CACC,mCA7FZ,WA6FY;9CAJX;AAiEO;AA0HJ;AAEb;AAFa;AAKD;AAEZ;AAFY;AAKG;AAEf;AAFe;AAUH;AAEZ;AAFY;AAKE;AAEd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAVc;AA3Fa,mCAAyB;nCAwMxC;AAAH;AAKP,aAAQ,UAAM,CAAC,CAAD;zBALP;AAAG;AAhGC;AAEb;AACA;AAHa;AAMA;AAEb;AACA;AAHa;AAMG;AAEd;AAEA,QAAa,CAAJ,CAAL,KAAK,GAAC,CAAD,CAAI,IAAS,CAAL,KAAK,GAAQ,OAAD,OAAP,CAAT,CAAqB,IAAQ,CAAJ,IAAI,IAAE,CAAF,CAA1C,EAAoD,MAApD;xEACA,QAAG;RACH,UAAG,SAAI,CAAC,EAAE,EAAE,KAAK,GAAC,CAAX,CAAa,GAAC,WAAI,CAAC,EAAE,KAAK,GAAC,IAAT,CAAzB;hEANc;AASJ;AAEZ;AAFY;AAaI;AAEd;AAEA,QAAG,SAAS,KAAC,EAAb,EAAqB,MAArB;hCACA,QAAG;RACH,QAAG,KAAK,GAAC,CAAT;jBACE,iBAAQ,SAAS,GAAC,CAAlB;9BACG,cAAG,KAAK,GAAQ,CAAD,OAAf;9BACH,iBAAQ,CAAC,GAAC,SAAV;9BAEA,qBAAyB,CAAjB,SAAI,CAAC,EAAE,EAAE,KAAK,GAAC,CAAX,CAAa,GAAC,SAAD,CAAU,GAAC,SAAI,CAAC,EAAE,MAAa,CAAD,OAAf,CAAxC;zFAXY;AA+LD;AAGf;AAHe;AAvHF;AAGX;AAGA,aAAM,CAAN;dACA,QAAG,MAAM,CAAC,CAAD;hBACT,QAAG,KAAK,CAAC,CAAD,CAAI,IAAK,CAAD,CAAC,KAAE,QAAG,CAAC,CAAD,CAAL,CAAjB;vCACE,eAAM,CAAN;hBAEA,iBAAI,UAAK,CAAC,CAAD,CAAT;9BAXS;AA2EA;AAGX;AAEA,aAAM,CAAN;dACA,QAAG,MAAM,CAAC,CAAD;hBACT,QAAG,KAAK,CAAC,CAAD,CAAR;hBACE,eAAM,CAAN;hBACG,cAAK,CAAD,CAAC,GAAC,CAAD,CAAI,IAAK,CAAD,CAAC,GAAC,KAAD,CAAd;pCACH,eAAM,CAAN;hBAEA,gBAAG,UAAK,CAAC,CAAD,CAAR;7BAZS;AAeA;AAEX;AAEA,aAAM,CAAN;dACA,QAAG,MAAM,CAAC,CAAD;hBACT,QAAG,KAAK,CAAC,CAAD,CAAR;hBACE,eAAM,CAAN;hBACG,cAAG,CAAC,GAAC,UAAL;5BACH,eAAM,CAAN;hBAEA,gBAAG,UAAK,CAAC,CAAD,CAAR;7BAXS;AAcA;AAGX;AAEA,QAAG,MAAM,CAAC,CAAD;hBACT,QAAG,KAAK,CAAC,CAAD,CAAR;hBACE,eAAM,CAAN;;hBAGA,eAAM,CAAN;hBACA,YAAG,CAAH;;bAXS;AAqBQ;AAAZ;AAEP;AAEA,aAAQ;bACR,aAAO,SAAK,8BAAZ;pDAAI;AAAa,eAAQ,MAAM,GAAC,CAAD;;zBALxB;AAAY;AAQJ;AAEjB;AAFiB;AA2LjB;AACE,mBAAU;nBADZ;AA9vBA;ACAA,wBAES,UAFT;;;lCAKkB,0BAAgB;1BAClB,wBAAkB;xBAChB,0BAAgB;1BACd,4BAAc;5BACjB,yBAAiB;zBACjB,yBAAiB;zBAChB,0BAAgB;1BAChB,0BAAgB;1BACT,iCAAS;jCAEpB,sBAAoB;tBACjB,yBAAiB;zBAClB,wBAAkB;xBAEjB,yBAAiB;zBACX,+BAAW;/BACd,4BAAc;5BAOd,4BAAc;5BA5BlC;ACAA,oBAIS,UAJT;;;9BAOY;AAQC;AASL;;AACJ;AAAG;;AAAH;AAAG;;AADC;aACJ,gBAAG;7BADC;;4CACJ,IFCK,YEDF,IFCE,WEFD;3EAID;;AACH;AAAM;AAAK;AAAO;;AAAlB;AAAM;AAAK;AAAO;;AADf;aACH,sBAAM,IAAK,CAAL,oBAAK,IAAO,CAAP,wBAAO,+BAAP,CAAL;zHADH;;AAyBM;AAAJ;AAEP,UAAM,KAAN,GAAa;lBACb,UAAM,IAAN,GAAY;jBACZ,UAAM,MAAN,GAAc;nBACd,UAAM,OAAN,GAAe;pBALR;AAAI;AAgBC;AAAL;AAEP,UAAM,EAAN,GAAU;fACV,UAAM,EAAN,GAAU;fAHH;AAAK;AArEd;ACAA,iBAOS,kBAPT;;;nCA2yBkB;AAElB;AAFkB;AAyBA;AAElB;AAFkB;AAKH;AAGf;AAHe;AAWK;AAEpB;AAFoB;AA1FN;AAyMO;AAAZ;AAGP;AAGA,QAAG,WAAM,CAAC,EAAD,CAAT;vBACE,eAAQ;;fAGR,UAAG,MAAQ,CAAC,EAAD;nBACX,UAAI,CAAC,KAAC,QAAN;xBACE,iBAAQ;jBACL,gBAAI,CAAC,KAAC,SAAN;/BACH,iBAAQ;jBACL,gBAAI,CAAC,KAAC,QAAN;9BAEH,YAAG,WAAO,CAAC,EAAD,CAAV;3BACE,mBAAQ;nBAER,uBAAQ;hBAEP,UAAI,CAAC,KAAC,QAAN,EACH,IAAG,cAAS,CAAC,EAAD,CAAZ;vDACE,iBAAQ;jBAER,qBAAQ,0BAJP;;/CAtBA;AAAY;AAn8BrB;ACAA,uBAIS,2BAJT;;;;lDAo6DoB;AAElB;AAEA,QAAW;RACX,QAAG,CAAC,KAAC,IAAL,EAAc,MAAd;1BACQ,YAAM,IAAN;hBACR,KAAC,SAAC;dAPgB;AAv3DT;;;AAEP;AAFO;AA04DiB;AAE1B,sBAAU;tBAFgB;AAKG;AAG7B,sBAAU,WAAM,CAAC,IAAI,IAAL;1CAHa;AA/4DpB;AAyBH;;AAMO;;AA2BA;;AAmfF;AAEb;AAFa;AAKI;AAEjB;AAFiB;AA2oBC;AAElB;AAFkB;AAKA;AAElB;AAFkB;AAKC;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAbmB;AAqBC;AAEpB;AACA;AACA;AACA;AACA;AANoB;AAmBC;AAErB;AAFqB;AAKE;AAAd;AAKP,aAAQ,gBAAW,CAAC,GAAG,EAAJ;nCALZ;AAAc;AA0UR;AAAN;AAEL;AAAM;AAAO;AAAO;AAAM;AAC1B;AAAG;AACH;AACA;AAAM;AACN;AACA;AACA;AASiB;AAAV;AAEL;AAEmB;AAGnB;AACA;AAEA,YAAG,KAAK,KAAE,CAAC,CAAX,EAAkB,MAAlB;hCACA,iBAAQ;jBACR,eAAmB,CAAP,CAAL,KAAK,IAAE,GAAF,CAAO,IACF,CAAV,GAAG,QAAC,SAAD,CAAO,IAAE,GAAF,CADE,CACK,IAAe,CAAV,GAAG,QAAC,SAAD,CAAO,IAAE,GAAF,CADvC,EACqD,KAAJ,IAAG;9GACpD,YAAG,KAAK,GAAC,GAAT,EACE,mBAAa,CAAC,EAAgB,GAAjB,CADf;nDAEA,YAAG,GAAG,QAAC,SAAD,CAAO,KAAC,GAAd;zCAGE,cAAG,KAAK,KAAC,CAAC,CAAV;1BACE,mBAAM;;nBAGN,mBAAM;nBACF,iBAAJ,IAAG;;rBAGL,cAAS,CAAL,KAAK,GAAC,MAAD,CAAS,IAAQ,CAAJ,IAAI,GAAK,YAAC,IAAD,MAAL,CAA1B,EACE,mBAAa,CAAC,EAAgB,GAAjB,CADf;7FAGA,mBAAQ,IAAI,GAAC,CAAD;3BAEZ,cAAG,YAAQ,CAAC,IAAI,CAAC,IAAD,CAAL,CAAa,IAAI,gBAAS,CAAC,IAAI,CAAC,IAAD,CAAL,CAArC;tEACE,oBAAc,WAAC,IAAI,CAAC,IAAD,CAAL;zCAEd,gBAAA,mBAAa,CAAC,EAAgB,GAAjB;zCACX,eAAJ,IAAG;;nBAIH,cAAI,MAAM,GAAC,KAAX;5BAEE,0BAAI,CAAC,eAAI,CAAC,IAAI,OAAO,KAAK,GAAC,MAAlB,EAA0B;;;;rDAAM;;;;DAArC;hBAEJ,gBAAG,IAAI,GAAC,CAAR,EAAe,mBAAc,CAAC,EAAgB,GAAjB,CAA7B;zCAGA,cAAO,CAAC;;1BA3CO;AA+CF;AAGjB,YAAG,GAAG,QAAC,SAAD,CAAO,KAAE,GAAf;zCACE;AAEA,sBAAO;tBACT,YAAG,GAAG,QAAC,SAAD,CAAO,KAAC,GAAd;zCAEE,cAAG,KAAK,KAAC,CAAC,CAAV,EAAiB,mBAAa,CAAC,EAAkB,GAAnB,CAA9B;tDACA,kBAAO;lBACP,kBAAO,CAAC;nBACJ,eAAJ,IAAG;VALL;TAPiB;AAgBD;AAGhB,YAAG,GAAG,QAAC,SAAD,CAAO,KAAC,GAAd;zCAEE,iBAAM;jBACF,eAAJ,IAAG;VAGH,aAAM;tBATQ;AAYC;AAGjB;AACA,YAAG,KAAK,KAAE,CAAC,CAAX;xBAEE,kBAAO;lBACP,kBAAO,CAAC;VAHV;TAJiB;AAWD;AAGhB,YAAG,GAAG,QAAC,SAAD,CAAO,KAAC,GAAd;zCAEM,eAAJ,IAAG;nBACD;AACF,cAAG,KAAK,KAAC,CAAC,CAAV,EACC,QAAO,CADR;rCAEA,iBAAM;RANR;TAHgB;AAelB,cAAO,CAAC;fACR,cAAO,CAAC;fACR,aAAM,CAAC;dACP,cAAO,CAAC;fACJ,WAAJ,IAAG;fACH,UAAG,GAAG,QAAC,SAAD,CAAO,KAAC,GAAd;vCAEE,iBAAQ;jBACR;OAHF;PAKA;AACA;AACA;AACA;AACA,eAAQ,iBAAM,CAAC,GAAG,QAAC,SAAD,CAAJ;tDAvHP;AAAU;AA2HF;AAAR;AAOP,eAAQ;fACR,UAAG,KAAK,KAAC,CAAC,CAAV;tBACE,gBAAO;hBAEP,oBAAO;pBACT,eAAQ,KAAK,GAAC,CAAD;xBACb,UAAS,CAAL,KAAK,GAAK,YAAC,IAAD,MAAL,CAAa,IAA6B,CAAzB,mBAAY,CAAC,IAAI,CAAC,KAAD,CAAL,CAAa,KAAE,EAAF,CAAnD;vFAEG,YAAG,GAAH,EACC,mBAAa,CAAC,EAAkB,GAAnB,CADd;3CAEI,cAAJ,IAAG;lBACH;OALH;PAOA,eAAQ;fApBD;AAAQ;AAwBjB,aAAQ;bACR,UAAY,GAAD;bACX,YAAO;ZACP,aAAQ;bACR,aAAQ;bACR,WAAM,KAAK,IAAE,GAAb;vBAEE,aAAY,CAAL,KAAK,IAAE,GAAF,CAAO,IAAe,CAAV,GAAG,QAAC,SAAD,CAAO,KAAE,GAAF,CAAlC,EACM,KAAJ,IAAG;zEACL,UAAG,KAAK,GAAC,MAAT,EACE,SAAQ,MAAM,GAAC,eAAI,CAAC,IAAI,OAAO,KAAK,GAAC,MAAlB,CADrB;tFAEA,UAAG,KAAK,GAAC,GAAT;rBAEE,gBAAO;hBAIF;AACH,YADG,KACH;jBACM,kBAAQ,CAAC,+BAAW,IAAZ;tDACR,kBAAO,aAAQ,CAAU,WAAC,IAAI,CAAC,KAAD,CAAL,CAAV;vDACf,kBAAO,QAAG,CAAC,KAAD;hCACV,kBAAO,IAAI,GAAQ,KAAD,OAAP;rCACX,cAAG,KAAK,QAAC,CAAD,CAAG,KAAE,GAAb;rCACE,oBAAO,uBAAY,CAAC,IAAI,KAAL,CAAW,GAAC,KAAD;9DAG9B,gBAAA,iBAAM,CAAC,uBAAY,CAAC,IAAI,KAAK,GAAC,CAAX,EAAc;;;;1DAAM,CAAjC;PAEd,UAZG,KAYH;xBACM,kBAAQ,CAAC,+BAAW,IAAZ;tDACR,cAAY,WAAC,IAAI,CAAC,KAAD,CAAL,CAAa,GAAC,CAA1B,EACE,mBAAa,CAAC,EAAkB,GAAnB,CADf;rEAEA,kBAAO,aAAQ,CAAU,WAAC,IAAI,CAAC,KAAD,CAAL,CAAV;vDACf,kBAAO,QAAG,CAAC,KAAD;hCACV,kBAAO,IAAI,GAAQ,KAAD,OAAP;rCACX,kBAAO,uBAAY,CAAC,IAAI,KAAL,CAAW,GAAC,KAAD;nDAEpC,UArBG,KAqBH;xBACM,cAAG,QAAQ,CAAC,6BAAS,KAAV,CAAiB,IAAG,QAAQ,CAAC,+BAAW,IAAZ,CAAvC,EACE,QAAO,gBAAW,CAAO,cAAC,IAAI,CAAC,KAAD,CAAL,EAAc,0BAAQ,KAAK,IAAlC,CADpB;5LAGN,UAzBG,KAyBH;xBACM,cAAG,QAAQ,CAAC,6BAAS,KAAV,CAAiB,IAAG,QAAQ,CAAC,+BAAW,IAAZ,CAAvC,EACE,QAAO,gBAAW,CAAO,cAAC,IAAI,CAAC,KAAD,CAAL,EAAc,0BAAQ,KAAK,IAAlC,CADpB;5LAGN,UA7BG,KA6BH;xBACM,cAAG,QAAQ,CAAC,6BAAS,KAAV,CAAiB,IAAG,QAAQ,CAAC,+BAAW,IAAZ,CAAvC,EACE,QAAO,gBAAW,CAAO,cAAC,IAAI,CAAC,KAAD,CAAL,EAAc,4BAAU,KAAK,CAApC,CADpB;3LAGN,UAjCG,KAiCH;xBACM,cAAG,QAAQ,CAAC,6BAAS,KAAV,CAAiB,IAAG,QAAQ,CAAC,+BAAW,IAAZ,CAAvC,EACE,QAAO,gBAAW,CAAO,cAAC,IAAI,CAAC,KAAD,CAAL,EAAc,2BAAS,KAAK,IAAnC,CADpB;7LAGN,UArCG,KAqCH;xBACM,cAAG,QAAQ,CAAC,6BAAS,KAAV,CAAiB,IAAG,QAAQ,CAAC,+BAAW,IAAZ,CAAvC,EACE,QAAO,gBAAW,CAAO,cAAC,IAAI,CAAC,KAAD,CAAL,EAAc,6BAAW,KAAK,IAArC,CADpB;/LAGN,UAzCG,KAyCH;xBACM,kBAAQ,CAAC,8BAAU,IAAX;rDACR,eAAU,KAAC,IAAI,CAAC,KAAD,CAAL;/BACV,kBAAc,EAAD;pBACb,cAAQ,CAAJ,IAAI,KAAE,CAAC,CAAH,CAAM,IAAU,CAAL,KAAK,GAAC,IAAD,CAAxB,EACE,QAAO,IADT;3DAEA,kBAAO,eAAI,CAAC,GAAG,EAAE,KAAN;nCAEjB,UAjDG,KAiDH;xBACM,kBAAQ,CAAC,+BAAW,IAAZ;tDACR,kBAAO,aAAQ,CAAU,WAAC,IAAI,CAAC,KAAD,CAAL,EAAc,EAAxB;jDAErB,UArDG,KAqDH;xBACM,kBAAQ,CAAC,+BAAW,IAAZ;tDACR,eAAa,WAAC,IAAI,CAAC,KAAD,CAAL;rCACb,kBAAO;lBACP,cAAG,IAAI,GAAC,KAAR;1BACE,oBAAO,aAAQ,CAAC,GAAG,KAAJ;;1CAIf,oBAAO;pBACP,mBAAiC,CAAb,CAAH,CAAG,IAAU,CAAL,KAAK,GAAC,CAAD,CAAV,CAAa,IAAE,EAAF,CAAM,IAAU,CAAL,KAAK,GAAC,EAAD,CAAjD,EACM,KAAJ,IAAG;xEACL,gBAAG,KAAK,GAAC,IAAT,EACE,OAAM,KADR;1CAEA,oBAAO,aAAQ,CAAC,GAAG,IAAJ;;hCAGvB,UAtEG,KAsEH,UAAK,QAAO,GAAZ;7CAEF,YAAG,KAAK,KAAE,CAAC,CAAX,EACE,IAAU,KAAD,OAAO,GAAC,KAAjB,EACE,IAAG,CAAI,IAAP;7DACE,kBAAO,uBAAY,CAAC,IAAI,KAAK,GAAQ,KAAD,OAAjB,CAAyB,GAAC,KAAD;3EAE5C,sBAAO,KAAK,GAAC,uBAAY,CAAC,IAAI,KAAK,GAAQ,KAAD,OAAjB,CAL/B;/EAMA,iBAAQ,MAAM,GAAC,KAAD;xBApFhB;PAsFI,WAAJ,IAAG;fACH,eAAQ;;fAtQH;AAAM;AAsRR,cAAG,cAAI,KAAH,GAAK,GAAQ,KAAH,GAAK,IAAK,EAArB;rDACA,iBAAS,aAAN,MAAQ,cAAI,KAAH,GAAK,EAAN,CAAF;7DACd,YAAG;ZAJa;AAAZ;AAMP;AACA;AAAG;AAEH,UAAc,KAAD;fACb,QAAG,GAAI,GAAE,CAAT,EACM,OAAC,KADP;7BAEA,YAAS;ZACT,aAAQ;bACR,QAAG;RACH,WAAM,CAAC,IAAE,GAAT;nBAEE,UAAG,KAAH;fAEE,YAAG,CAAc,CAAT,KAAK,YAAC,KAAD,CAAI,IAAG,KAAH,CAAjB,EAAgC,aAAhC;9DACA,gBAAS;TAEN,UAAG,SAAU,IAAc,CAAT,KAAK,QAAC,KAAD,CAAI,KAAE,GAAF,CAA3B;3DAEH,YAAG,UAAH;tBAEE,cAAG,CAAE,IAAG,GAAR,EAAiB,aAAjB;rCACA,kBAAS;TAHX;FAOA,UAAG,CAAc,CAAT,KAAK,YAAC,KAAD,CAAI,IAAG,QAAH,CAAjB,EAAmC,aAAnC;tEACF,UAAG,CAAC,GAAC,CAAD;;fAEN,aAAQ;bAlCD;AAAY;AA7rDD;AAsxDE;AAAb;AAGP;AACA;AAGA,cAAS;dACT,QAAG,oCAAa,IAAG,KAAnB,EACE,UAAS,GADX;pEAEA,QAAG,oCAAa,IAAG,KAAnB,EACE,UAAS,OAAO,GAAC,GADnB;9EAEA,eAAoB,OAAQ,QAAQ,CAAW,IAAV,MAAU,CAAI,iBAAW,GAAf,EAAoB,MAA/B;tEACpC,aAAkB,SAAU,QAAQ,CAAW,IAAV,MAAU,CAAI,SAAS,OAAb,EAAsB,QAAjC;pEAb7B;AAAa;AA/2CL;AAAR;AAEP,aAAY;bAFL;AAAQ;AA45FG;AAAX;AAGP,gBAAkB;hBAClB;AAAE;AACF;AAGA,QAAG;RACH,QAAG,eAAI,CAAC,EAAE,EAAE,CAAL;7BACP,QAAI,CAAC,KAAC,GAAN;jBACE,cAAO;dACJ,cAAI,CAAC,KAAC,GAAN;vBACH,cAAO;dACJ,cAAI,CAAC,KAAC,GAAN,EACH,QAAO,CADJ;lCAEL,QAAG,KAAK,KAAE,EAAV,EACE,iBAAM,CAAC;;;;/BAAE,EAAE,CAAL,CADR;bAEA,QAAG,QAAQ,CAAC,EAAE,KAAH;xBACX,aAAQ,CAAI,KAAO,CAAC,CAAD;rBACnB,QAAG,MAAH,EACE,QAAc,WAAC,CAAD,CAAd,CADF;tCApBO;AAAW;AAwBA;AAAX;AAGP;AAGA,QAAG,kBAAW,CAAC,EAAE;;;;rBAAH,CAAd;TACE,eAAQ;fAER,mBAAQ;nBATH;AAAW;AAwBH;AAAR;AAGP;AAGA,QAAG,CAAI,kBAAW,CAAC,EAAE;;;;tBAAH,CAAlB,EACE,MAAM,kBAAa,QAAC,aAAS,CAAC,iCAAmB,CAAC,CAAD,CAApB,CAAT,CADtB;/FAEA,aAAQ;bARD;AAAQ;AAkBE;AAAV;AAGP;AAGA,QAAG,CAAI,kBAAW,CAAC,EAAE;;;;tBAAH,CAAlB,EACE,MAAM,kBAAa,QAAC,aAAS,CAAC,iCAAmB,CAAC,CAAD,CAApB,CAAT,CADtB;/FAEA,aAAQ;bARD;AAAU;AAuHR,kBAAG;lBAFG;AAAR;AAIP,QAAG,MAAM,KAAC,CAAV,EACE,SAAQ,CADV;hCAEA,aAAQ;bACR,WAAM,KAAK,GAAC,CAAZ;pBAEE,eAAQ,SAAS,QAAe,CAAP,CAAN,KAAM,GAAI,EAAJ,CAAO,GAAC,CAAD,KAAf,CAAkB,GAAC,MAAD;hEACnC,cAAS,KAAM,KAAI,CAAJ;;zBAEjB,WAAc,MAAD,OAAQ,GAAC,MAAtB,EACE,SAAQ,GAAG,GAAC,MAAD;xDAbN;AAAQ;AAr8GH;AA4fK;AAAV;AAEP,aAAQ,gBAAW,CAAC,MAAM,4BAAU,GAAG,CAApB;pEAFZ;AAAU;AAi2BC;AAAX;AAGP;AAGA,SAAI;TACC;AACH,QADG,KACH;bACE,eAAQ,wBAAkB,CAAC,MAAM,UAAU,EAAjB;1DAC5B,cAHG,KAGH;nBACE,eAAQ,yBAAmB,CAAC,MAAM,UAAU,OAAO,EAAxB;lEAC7B,cALG,KAKH;nBACE,eAAQ,sBAAgB,CAAC,MAAM,OAAO,EAAd;rDAC1B,cAPG,KAOH;nBACE,eAAQ,uBAAiB,CAAC,MAAM,OAAO,GAAG,sBAAjB;7EAC3B,cATG,KASH,mCACC,SAAQ,0BAAoB,CAAC,MAAM,OAAO,GAAG,sBAAjB,CAD7B;jIAGF,QAAwB,CAAd,CAAN,MAAM,KAAE,4BAAF,CAAc,IAAmB,CAAP,MAAD,OAAQ,GAAC,CAAD,CAAnB,CAAuB,IAAc,CAAT,MAAM,QAAC,CAAD,CAAG,KAAC,GAAD,CAA7D,EACE,+BAAyB,CAAC;;;;jIAAO,EAAR,CAD3B;ZAnBO;AAAW;AA51BE;AAAb;AAGP;AACA;AAGA,QAAG;RAEH,QAAI,sBAAkB,KAAE,EAAxB,EACE,IAAG,kBAAa,CAAC,EAAE,uBAAkB,GAAG,cAAC,oCAAD,CAAxB,CADlB;9IAEA,QAAI,qBAAgB,KAAE,GAAtB,EACE,IAAG,kBAAa,CAAC,EAAE,sBAAiB,IAAI,EAAxB,CADlB;7FAEA,QAAG,UAAU,CAAC,CAAD;pBACb,aAAQ,CAAI,KAAO,CAAC,CAAD;rBACnB,QAAG,MAAH,EACE,QAAW,cAAC,CAAD,CAAX,CADF;zCAfO;AAAa;AAlfpB;AAAc;AAs5BE;AAAT;AAEP,QAAG,CAAI,iBAAY,CAAC,EAAE;;;;rBAAH,CAAnB,EACE,MAAM,kBAAa,QAAC,aAAS,CAAC,8BAAgB,CAAC,CAAD,CAAjB,CAAT,CADtB;5FAFO;AAAS;AAoBA;AAAT;AAEP,QAAG,WAAH;nBAEE;AACA,UAAG,CAAH;XACE,iBAAQ,iBAAY,CAAC,CAAD;pCAEpB,qBAAQ,kBAAa,CAAC,CAAD;pCAEvB,UAAG,CAAH;hBACE,eAAQ;fAER,mBAAQ;nBAbL;AAAS;AA2BG;AAAZ;AAEP;AACA;AACA;AACA;AAEA,WAAM,cAAS,CAAC,CAAD;3BACf,oBAAG,CAAC,KAAK;;;;jBAAE;;;;DAAR;RACH,aAAQ;bACR,QAAG,IAAI,KAAC,CAAR;lBACE,gBAAQ,CAAC,KAAE,GAAX;;zBAGE;AACA,eAAU,SAAsB,mBAAC,iBAAD,0BAAhC;tFAAI;AACF,YAAG,IAAI,KAAC,cAAS,CAAC,iBAAY,CAAC,CAAD,CAAb,CAAjB;zDAEI,oBAAO,IAAP;xBACA;SAHJ;;TAKF,eAAU,SAAuB,mBAAC,kBAAD,0BAAjC;vFAAI;AACF,YAAG,IAAI,KAAC,cAAS,CAAC,kBAAa,CAAC,CAAD,CAAd,CAAjB;1DAEI,oBAAO,KAAP;zBACA;SAHJ;;TAKF,eAAQ;;fA3BL;AAAY;AAxqBE;AAGrB;AAGA,QAAG,kCAAkC,GAAC,YAAY,WAAb;pEACrC,QAAmB,cAAH,eAAb,YAAa,CAAhB,EACE,IAAI,CAAD,CAAC,GAAC,KAAD,CAAM,GAAW,YAAa,SADpC;3FAIF;AAME,QAAG,UAAU,KAAC,IAAd;3BAjBqB;AAuBR;AAEb,UAAM,WAAM,QAAC,YAAM,CAAC,iBAAD,CAAN;5DAFA;AA/PH;;AACP;AACA;;AADA;AACA;;AAFO;aACP,sBACA;nCAFO;;AAMV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIW,qBAAG;rBACH,qBAAG;rBACJ,oBAAI;pBACH,qBAAG;rBACJ,oBAAI,EAAY,GAAE,EAAF;3BAChB,oBAAI,IAAW,GAAE,EAAF;7BACd,qBAAG,KAAW,GAAE,IAAF;jCACd,qBAAe;rBAMjB,mBAAG;nBAMZ;AACA;AACA;AACA;AACA;AAQe;AAq3G2B;AAAnB;AAEvB,eAAmB;fAFI;AAAmB;AA8BD;AAAlB;AAEvB,eAAmB;fAFI;AAAkB;AAoBE;AAApB;AAEvB,eAAmB;fAFI;AAAoB;AA8BH;AAE/B,wBAAT,GAA0B;3BAFc;AAKG;AAElC,2BAAT,GAA6B;9BAFc;AA8BD;AAEjC,0BAAT,GAA4B;7BAFc;AAyBE;AAEnC,4BAAT,GAA8B;/BAFc;AAeJ;AAE/B,wBAAT,GAA0B;3BAFc;AAhhHzB;AA4Df;AAEA;AAmvDuB;AAAhB;AAGP,aAAQ,eAAU,CAAC,KAAK,YAAC,GAAS,KAAK,SAAC,EAAK,GAAC,CAAD,CAAG,KAAK,QAAC,EAApC,CAA0C,GACpD,eAAU,CAAC,KAAK,SAAC,GAAM,KAAK,WAAC,GAAQ,KAAK,WAAC,GAAQ,KAAK,gBAAC,EAA/C,CAD0C;xLAHrD;AAAgB;AAgIG;AAAnB;AAGP;AAEA,QAAG,QAAS,GAAS,QAAT;3BACZ,QAAG,CAAC,GAAC,CAAL;bACE,UAAG,CAAC,GAAC,GAAD;jBAEJ,cAAG,CAAC,GAAC,GAAD;rBACN,UAAM,KAAN,GAAe,gBAAK,CAAC,QAAG,CAAC,gBAAK,CAAC,CAAD,CAAN,CAAW,GAAI,QAAnB;3EACpB,UAAM,KAAN,GAAe,MAAU,GAAY,WAAT,gBAAK,CAAC,CAAD,CAAI,GAAI,QAAJ,CAAZ;rEAXlB;AAAmB;AA9GN;AAAb;AAGP;AAAG;AAEH,aACqC,CAAhB,CADa,CAAjB,CAAJ,CAAJ,IAAI,GAAC,CAAD,CAAI,IAAS,CAAJ,IAAI,GAAC,KAAD,CAAT,CAAiB,IACnB,CAAN,KAAM,IAAG,CAAH,CADmB,CACb,IAAU,CAAL,KAAK,IAAE,EAAF,CAAV,CAAgB,IACzB,CAAH,GAAG,GAAC,CAAD,CADyB,CACrB,IAAQ,CAAH,GAAG,IAAE,cAAS,CAAW,CAAV,eAAU,CAAC,IAAD,CAAX,EAAkB,SAAlB,CAAX,CAAR;7JACjB,QAAG,MAAH;dAEI,UAAG,KAAM,GAAE,CAAX;nBACK,aAAJ,IAAU;;jBAGJ,aAAJ,IAAU;jBACN,YAAJ,IAAG;;hBAEN,UAAS,WAAL,IAAK,GAAI,GAAJ;/BACT,WAAK,IAAK,GAAK,CAAH,GAAG,GAAC,CAAD,CAAL;3BACV,eAA2C,CAAlB,CAAN,CAAJ,CAAN,MAAM,GAAC,CAAD,CAAI,KAAI,CAAJ,CAAM,GAAY,CAAL,CAAJ,IAAI,GAAC,EAAD,CAAK,KAAI,CAAJ,CAAZ,CAAkB,GAA0B,WAAJ,CAAhB,CAAH,GAAG,GAAU,KAAV,CAAgB,GAAC,CAAD,CAAI,GAAI,CAAJ,CAA1B,CAAgC,GAAW,GAAtF;zGAGA,eAAQ,UAAK,GAAE,MAAf;7BAdJ;LARQ;AAAa;AA0BA;AAAb;AAGP,aAA+B,CAAb,CAAL,CAAJ,IAAI,GAAC,EAAD,CAAK,IAAQ,CAAH,GAAG,GAAC,EAAD,CAAR,CAAa,IAAQ,CAAH,GAAG,GAAC,EAAD,CAAR,CAAa,IAAS,CAAJ,IAAI,GAAC,IAAD,CAAT;zEAC5C,QAAG,MAAH,EACE,SAA6E,CAAnB,CAApB,CAAR,CAAL,IAAK,GAAC,OAAD,CAAQ,GAAc,CAAJ,GAAI,GAAC,KAAD,CAAd,CAAoB,GAAc,CAAJ,GAAI,GAAC,IAAD,CAAd,CAAmB,GAAC,IAAD,CAAM,GAAC,QAApF,CADF;jGAJO;AAAa;AAWH;AAAV;AAGP,QAAG,CAAI,kBAAa,CAAC,KAAK,MAAM,IAAI;;;;nCAAhB,CAApB,EACE,MAAM,kBAAa,QAAC,aAAS,CAAC,6CACJ,CAAC,aAAQ,CAAC,IAAD,EAAO,aAAQ,CAAC,KAAD,EAAQ,aAAQ,CAAC,GAAD,CAAxC,CADG,CAAT,CADtB;rKAHO;AAAU;AAWA;AAAV;AAGP,QAAG,CAAI,kBAAa,CAAC,KAAK,OAAO,OAAO,YAAY;;;;nDAAhC,CAApB,EACE,MAAM,kBAAa,QAAC,aAAS,CAAC,gDACJ,CAAC,aAAQ,CAAC,IAAD,EAAO,aAAQ,CAAC,MAAD,EAAS,aAAQ,CAAC,MAAD,EAAS,aAAQ,CAAC,WAAD,CAA1D,CADG,CAAT,CADtB;vMAHO;AAAU;AAzDK;AAAf;AAGP,QAAG,IAAK,GAAE,CAAV;hBACE,eAAU,gBAAK,CAAC,IAAD,CAAO,GAAE,QAAG,CAAC,eAAI,CAAC,IAAD,CAAL,CAAL;vEAEtB,mBAAU,gBAAK,CAAC,IAAD,CAAO,GAAE,QAAG,CAAC,eAAI,CAAC,IAAD,CAAL,CAAL;3EANjB;AAAe;AAqEJ;AAElB;AAAG;AAAG;AAAG;AAET,QAAG,IAAK,IAAG,CAAC,MAAZ;vBAEE,eAAQ,CAAR;hBACA,gBAAS,CAAT;jBACA,cAAO,CAAP;;fAIA,UAAG,IAAI,GAAC,CAAR;lBACE,eAAO,IAAI,GAAG,CAAD,CAAC,GAAa,CAAX,QAAW,GAAC,CAAD,CAAb,CAAH;1CAEX,mBAAM,IAAI,GAAG,CAAD,CAAC,GAAa,CAAX,QAAW,GAAC,CAAD,CAAb,CAAH;9CACZ,UAAG,IAAI,GAAC,gBAAR,EACE,OAAM,gBADR;1DAGA,UAA6B,CAAV,CAAZ,gBAAK,CAAC,IAAD,CAAO,GAAE,MAAF,CAAU,IAAI,CAAJ,CAAM,GAAC,CAAD;tDACnC,WAAO,WAAF,CAAE,GAAI,MAAJ;hCACP,UAAI,CAAE,GAAS,CAAP,MAAO,GAAW,EAAX,CAAT;3BACN,WAAM,CAAE,KAAI,CAAJ;lBACR,UAAkB,WAAL,CAAN,CAAH,EAAG,IAAI,CAAJ,CAAM,GAAE,CAAF,CAAK,GAAI,IAAJ;3CAClB,WAAqB,CAAJ,CAAP,CAAH,EAAG,IAAI,CAAJ,CAAO,GAAE,CAAF,CAAI,GAAM,CAAJ,IAAI,GAAC,CAAD,CAAN,CAAU,KAAI,CAAJ;/CAC/B,WAAe,WAAJ,CAAJ,CAAF,CAAE,GAAE,EAAF,CAAI,GAAC,CAAD,CAAI,GAAI,GAAJ;1CACf,WAA0B,WAAV,CAAH,CAAL,CAAF,CAAE,GAAE,EAAF,CAAK,GAAC,CAAD,CAAG,GAAK,CAAH,GAAG,GAAC,EAAD,CAAL,CAAU,GAAI,CAAJ;vDAC1B,WAAS,CAAJ,GAAI,GAAW,EAAX,CAAe,GAAE,CAAF;zBACxB,UAAG,EAAG,GAAE,EAAR;jBACK,UAAJ,IAAO;;dAGA,UAAJ,IAAO;dACH,UAAJ,IAAG;;dAEP,eAAM,EAAN;jBACA,gBAAO,EAAP;lBACA,cAAK,EAAL;;hBArCgB;AA0CI;AAAf;AAEP,mBAAU,CAAC,SAAS,KAAK,MAAM,GAArB;3CACV,YAAK,cAAS,CAAC,QAAD,CAAd;pCACA,aAAQ,eAAU,CAAC,UAAD;vCAJX;AAAe;AAgDJ;AAElB;AAEA,QAAK,wBAAmB,CAAC,IAAD,CAAM;tCAC9B,aAAY,WAAF,CAAE,GAAI,OAAJ,CAAZ;pCACA,QAAK,CAAE,GAAI,OAAJ;nBACP,eAAY,WAAF,CAAE,GAAI,KAAJ,CAAZ;pCACA,QAAK,CAAE,GAAI,KAAJ;jBACP,eAAY,WAAF,CAAE,GAAI,IAAJ,CAAZ;nCACA,QAAK,CAAE,GAAI,IAAJ;hBACP,oBAAe,CAAf;rBAXkB;AA+BF;AAAT;AAEP,aAAU,CAAE,GAAyB,CAAL,CAAhB,gBAAK,CAAC,QAAD,CAAW,GAAE,CAAF,CAAK,GAAI,CAAJ,CAAzB;vDACZ,QAAI,MAAM,IAAE,CAAZ,EACM,MAAJ,IAAW,CADb;hCAHO;AAAS;AAcL;AAAJ;AAGP,aAAQ,gBAAK,CAAC,UAAD;xCAHN;AAAI;AALD;AAAH;AAEP,aAAQ,qBAAgB,CAAS,IAAR,IAAQ,EAAT;7CAFjB;AAAG;AAqDO;AAAV;AAEP,aAAsB,CAAN,CAAL,IAAK,GAAI,CAAJ,CAAM,KAAE,CAAF,CAAK,IAAyB,CAAN,CAAR,CAAL,IAAK,GAAI,GAAJ,CAAQ,KAAG,CAAH,CAAM,IAAiB,CAAR,CAAL,IAAK,GAAI,GAAJ,CAAQ,KAAE,CAAF,CAAjB,CAAzB;jFAFpB;AAAU;AA8MD;AAAT;AAEP,aAAU,gBAAS,CAAC,EAAE,qBAAgB,MAAnB;3DAFZ;AAAS;AAdA;AAAT;AAEP;AAEA,aAAQ,kBAAY,CAAC;;;;vBAAI,EAAE,UAAU,SAAjB;9BACpB,QAAI,GAAG,KAAE,EAAT,EACE,MAAM,kBAAa,QAAC,YAAM,CAAC,GAAD,CAAN,CADtB;tEALO;AAAS;AA0OA;AAAT;AAEN,aAAS,gBAAS,CAAC,EAAG,kBAAJ;lDAFZ;AAAS;AAXA;AAAT;AAGP;AAGA,aAAQ,kBAAY,CAAC;;;;vBAAI,EAAS,CAAD,QAAI,SAAjB;7BACpB,QAAI,GAAG,KAAE,EAAT,EACE,MAAM,kBAAa,QAAC,YAAM,CAAC,GAAD,CAAN,CADtB;tEAPO;AAAS;AA6FI;AAAb;AAGP;AAAS;AACT;AAEA,iBAAc,sBAAgB,CAAC,EAAG;;;;jCAAS;;;;DAAb;RACzB;AACH,QADG,KACH;bAAG,eAAQ,cAAS,CAAC,EAAD;hCACpB,cAFG,KAEH;nBAAG,UAAW,OAAD,OAAU,GAAE,CAAtB;5BACE,iBAAU,gBAAS,CAAC,QAAQ,qBAAgB,kBAAzB;jFAEnB,qBAAU,cAAS,CAAC,OAAD;3CACxB,cANG,KAMH,QAAG,SAAU,oBAAe,CAAC,gBAAS,CAAC,QAAQ,qBAAgB,kBAAzB,EACR,cAAS,CAAC,OAAD,CADX,CAA5B;nJAbK;AAAa;AAkBC;AAAd;AAEW;AAGhB,eAAQ,MAAM,GAAC,eAAI,CAAC,UAAU,KAAK,GAAhB,CAAL;3DAHE;AAMG;AAInB,eAAQ,MAAM,GAAC,IAAD;5BAJK;AAOH;AAEhB;AAGA,UAAG,aAAQ,CAAC,KAAD;7BACX,aAAc,CAAD,OAAG,GAAC,MAAjB,EACE,IAAG,GAAG,GAAC,CAAD;3CACR,iBAAW,CAAC,CAAD;nBARK;AAYlB;AAAM;AAAO;AAAK;AAAW;AAAM;AAAQ;AAAQ;AAE9B;AAEnB;AAAO;AAAiB;AACxB;AACA;AACA;AACA;AACA;AAAE;AAAc;AAEhB,UAAG,OAAQ,GAAE,CAAb,EACE,MADF;7BAEA,sBAAiB;tBACjB,kBAAoB,SAAD;3BACnB,gBAAW;hBACX,mBAAc;nBAEd,UAAG;VACH,aAAM,CAAC,IAAE,SAAT;3BAEE,gBAAS,SAAS,QAAC,KAAD;tCACb;AACH,aADG,KACH,aAAM,CADH,KACG,SAAN;9CAEM,WAAJ,IAAG;fACH,iBAAS,CAAF,CAAE,GAAE,SAAF,CAAa,IAAiB,CAAZ,SAAS,QAAC,KAAD,CAAG,KAAE,KAAF,CAAvC,EACM,CAAJ,IAAG;rEAEP,WAPG,KAOH,aAAK,CAPF,KAOE,SAAL;rDAEE,cAA8C,CAAJ,CAAtC,gBAAW,CAAC,eAAI,CAAC,UAAU,EAAE,CAAb,EAAgB,MAArB,CAA2B,KAAC,CAAD,CAAI,IACH,CAAvC,gBAAW,CAAC,eAAI,CAAC,UAAU,EAAE,CAAb,EAAgB,MAArB,CAA4B,KAAC,CAAD,CADG,CACC,IACH,CAAxC,gBAAW,CAAC,eAAI,CAAC,UAAU,EAAE,CAAb,EAAgB,QAArB,CAA6B,KAAC,CAAD,CAF5C;vNAIE,sBAAW;tBACX;WALF;FAFF;TAWE,SAAJ,IAAG;;bAEL,cAAS;dACT,wBAAmB;xBACnB,sBAAiB;tBACjB,aAAM,aAAc,IAAG,SAAvB;vCAEE,gBAAS,cAAS,CAAC,SAAS,QAAC,iBAAD,CAAV,CAA0B,QAAC,CAAD;5EAE5C,gBAAS;hBACT,YAAK,aAAc,GAAE,CAAF;7BACd;AACH,aADG,KACH,aAAM,CADH,KACG,SAAN;9CAEE,iBAAS,CAAF,CAAE,GAAE,SAAF,CAAa,IAAiB,CAAZ,SAAS,QAAC,KAAD,CAAG,KAAE,KAAF,CAAvC,EACM,CAAJ,IAAG;9EACD,WAAJ,IAAG;fACH,kBAAS,CAAE,GAAE,aAAF;nCACX,kBAAQ,CAAC,aAAc,GAAE,CAAF,CAAK,KAAM,GAAE,CAA5B;rCAEV,UATG,KASH;xBAEE,cAAG,gBAAW,CAAC,eAAI,CAAC,UAAU,cAAc,CAAzB,EAA6B,MAAlC,CAA0C,KAAE,CAA1D;vFAEE,oBAAS;pBACT,gBAAG,IAAK,GAAE,EAAV;zBACE,yBAAW,CAAC,iBAAD;3CAEX,kBAAA,WAAW,CAAC,iBAAD;pCAEV,UAAG,gBAAW,CAAC,eAAI,CAAC,UAAU,cAAc,CAAzB,EAA6B,QAAlC,CAA2C,KAAE,CAA3D;hGAEH,oBAAS;pBACT,gBAAG,IAAK,GAAE,EAAV;zBAAkB,sBAAQ,CAAC,cAAe,CAAhB;tCACR,kBAAA,QAAQ,CAAC,aAAa,GAAC,CAAD,CAAI,CAAlB;nCAEvB,UAAG,gBAAW,CAAC,eAAI,CAAC,UAAU,cAAc,CAAzB,EAA6B,MAAlC,CAAyC,KAAE,CAAzD;9FAEH,oBAAS;pBACT,gBAAG,IAAK,GAAE,EAAV;zBAAkB,sBAAQ,CAAC,cAAe,CAAhB;tCACrB,kBAAA,QAAQ,CAAC,aAAa,GAAC,CAAD,CAAI,CAAlB;nCAGb,YAAM,kBAAa,QAAC,YAAM,CAAC,oCAAD,CAAN;1FAExB,UAlCG,KAkCH;xBAGE,qBAAW,CAAC,kBAAD;/BAEb,UAvCG,KAuCH;xBAAK,qBAAW,CAAC,kBAAD;xCAChB,4BAxCG,KAwCH,aAAK,CAxCF,KAwCE,SAAL,KAAU,CAxCP,KAwCO,SAAV,KAAe,CAxCZ,KAwCY,SAAf,KAAoB,CAxCjB,KAwCiB,SAApB,KAAyB,CAxCtB,KAwCsB,SAAzB,KAA8B,CAxC3B,KAwC2B,SAA9B,KAAmC,CAxChC,KAwCgC,SAAnC,KAAwC,CAxCrC,KAwCqC,SAAxC,KAA6C,CAxC1C,KAwC0C,SAA7C,KAAkD,CAxC/C,KAwC+C,SAAlD;jPAGE,iBAAS,CAAF,CAAE,IAAG,SAAH,CAAc,IAA6B,CAAxB,cAAS,CAAC,SAAS,QAAC,KAAD,CAAV,CAAe,KAAE,KAAF,CAApD,EACM,CAAJ,IAAG;/FACL,kBAAS,CAAE,GAAE,aAAF;nCAEN;AACH,cADG,KACH;nBAAK,oBAAQ,CAAC,cAAe,KAAhB;xCACb,oBAFG,KAEH;zBACE,gBAAG,KAAM,GAAE,CAAX;zBACE,sBAAQ,CAAC,KAAM,CAAP;7BAER,kBAAA,QAAQ,CAAC,IAAK,GAAI,GAAJ,CAAS,CAAf;5BAEZ,UARG,KAQH;1BACL,gBAAG,UAAW,IAA2B,CAAP,CAAd,aAAc,KAAE,GAAF,CAAO,IAAG,QAAH,CAAzC;nEACE,sBAAQ,CAAC,MAAO,GAAkC,CAA1B,CAAL,IAAK,GAAsB,CAApB,gBAAK,CAAC,QAAG,CAAC,QAAD,CAAJ,CAAe,GAAC,EAAD,CAAtB,CAA0B,GAAC,EAAD,CAAlC,CAAuC,CAA/C;7FAEH,sBAAoB,CAAhB,eAAgB,KAAE,GAAF,CAAO,IAAG,QAA9B;3DAEE,kBAAG,KAAM,KAAE,CAAX;7BACE,wBAAQ,CAAC,OAAQ,CAAT;jCAER,oBAAA,QAAQ,CAAC,OAAQ,CAAT;;rCAIL;AACH,kBADG,KACH;vBAAG,wBAAQ,CAAC,MAAO,CAAR;hCACX,wBAFG,KAEH;7BAAG,wBAAQ,CAAC,MAAO,CAAR;hCACX,wBAHG,KAGH;7BAAG,2BAAW,CAAC,oBAAe,CAAC,SAAD,CAAhB;;3DAEd,2BAAW,CAAC,mBAAc,CAAC,SAAD,CAAf;;;/CAIjB,UA9BG,KA8BH;1BACO;AACH,gBADG,KACH;rBAAG,sBAAQ,CAAC,IAAK,CAAN;5BACX,sBAFG,KAEH;3BAAG,sBAAQ,CAAC,IAAK,CAAN;5BACX,sBAHG,KAGH;3BAAG,yBAAW,CAAC,kBAAa,CAAC,aAAD,CAAd;3DACd,sBAJG,KAIH;3BAAG,yBAAW,CAAC,iBAAY,CAAC,aAAD,CAAb;1DACd,sBALG,KAKH;3BAAG,yBAAW,CAAC,qBAAiB,OAAO,GAAC,CAAD,CAAI,KAA7B;;hEAEd,yBAAW,CAAC,oBAAgB,OAAO,GAAC,CAAD,CAAI,KAA5B;;pDAGf,UAzCG,KAyCH;1BACL,gBAAG,UAAH;1BACE,sBAAQ,CAAC,IAAK,GAAsB,CAApB,gBAAK,CAAC,QAAG,CAAC,QAAD,CAAJ,CAAe,GAAC,EAAD,CAAtB,CAA2B,CAAjC;3EAEV,sBAAG,OAAH;7BAES,oBAAO,IAAK,GAAI,EAAJ;7BACZ,kBAAG,GAAG,KAAC,CAAP,EAAc,MAAK,EAAnB;rCACA,kBAAG,KAAM,KAAE,CAAX;7BACE,wBAAQ,CAAC,IAAK,CAAN;9BAER,oBAAA,QAAQ,CAAC,IAAK,CAAN;;lCAGV,kBAAG,KAAM,KAAE,CAAX;7BACZ,wBAAQ,CAAC,KAAM,CAAP;/BAEM,oBAAA,QAAQ,CAAC,KAAM,CAAP;;nCAEd,oBA5DG,KA4DH;zBAAK,gBAAG,UAAH;1BACL,sBAAQ,CAAC,MAAO,GAAkC,CAA1B,CAAL,IAAK,GAAsB,CAApB,gBAAK,CAAC,QAAG,CAAC,QAAD,CAAJ,CAAe,GAAC,EAAD,CAAtB,CAA0B,GAAC,EAAD,CAAlC,CAAuC,CAA/C;7FAEjB,sBAAG,KAAM,KAAE,CAAX;jCACgB,sBAAQ,CAAC,OAAQ,CAAT;/BAER,kBAAA,QAAQ,CAAC,OAAQ,CAAT;nCACf,oBAnEG,KAmEH;zBAAK,gBAAG,UAAH;1BACL,sBAAQ,CAAC,MAAO,GAAgD,CAAtC,CAAP,MAAO,GAAkC,CAA1B,CAAL,IAAK,GAAsB,CAApB,gBAAK,CAAC,QAAG,CAAC,QAAD,CAAJ,CAAe,GAAC,EAAD,CAAtB,CAA0B,GAAC,EAAD,CAAlC,CAAsC,GAAC,EAAD,CAAhD,CAAqD,CAA7D;/GAEV,sBAAG,KAAM,KAAE,CAAX;jCACS,sBAAQ,CAAC,OAAQ,CAAT;/BAER,kBAAA,QAAQ,CAAC,OAAQ,CAAT;nCACf,oBA1EG,KA0EH;zBAAK,gBAAG,KAAM,KAAE,CAAX;3BACE,sBAAQ,CAAC,YAAa,CAAd;pCAEtB,kBAAA,QAAQ,CAAC,YAAa,CAAd;xCACD,oBA9EG,KA8EH;zBAAK,gBAAG,KAAM,KAAE,CAAX;3BACZ,yBAAW,CAAC,qBAAiB,OAAO,GAAC,CAAD,CAAI,IAA7B;/DAEJ,kBAAA,WAAW,CAAC,oBAAgB,OAAO,GAAC,CAAD,CAAI,IAA5B;lEACX,oBAlFG,KAkFH;zBACO,uBAAW,CAAC,qBAAiB,OAAO,GAAC,CAAD,CAAI,KAA7B;9DACX,gBAAa,CAAL,CAAJ,IAAI,KAAE,CAAF,CAAK,IAAU,CAAN,MAAM,KAAE,CAAF,CAAV,CAAe,IAAU,CAAN,MAAM,KAAE,CAAF,CAAtC;lEAEG,yBAAW,CAAC,GAAD;7BACX,yBAAW,CAAC,oBAAgB,OAAO,GAAC,CAAD,CAAI,IAA5B;jDAHd;FAMP,UA1FG,KA0FH;1BACO,uBAAW,CAAC,qBAAiB,OAAO,GAAC,CAAD,CAAI,KAA7B;9DACX,uBAAW,CAAC,GAAD;3BACX,uBAAW,CAAC,oBAAgB,OAAO,GAAC,CAAD,CAAI,IAA5B;jDAHlB;XAMT,0BAAiB;1BACV,4BAAmB;;5BAGnB,qBAAW,CAAC,KAAD;;3BAEX,qBAAJ,IAAmB;;zBAtMF;AA2MrB,wBAAe,CAAC,SAAU;;;;zBAAM;;;;AAAO;;;;AAAK;;;;DAA7B;RACf,mBAAU,CAAC,SAAU;;;;pBAAM;;;;AAAQ;;;;AAAQ;;;;DAAjC;RAEV,QAAG,SAAU,KAAG,EAAhB;xBACE,iBAAW,CAAC,UAAW,EAAG,KAAf;nCAEX,UAAA,WAAW,CAAC,IAAK,EAAG,KAAT;jCA9ON;AAAc;AAyPF;AAAZ;AAEP,aAAQ,mBAAY,CAAC,EAAE,MAAM,qBAAgB,MAAzB;pEAFb;AAAY;AAWA;AAAZ;AAIP;AAGA,aAAe,CAAD,OAAG,KAAE,CAAF;3BACjB,QAAG,MAAH;dAEE,gBAAO,kBAAY,CAAC;;;;xBAAI,EAAE,UAAU,SAAjB,CAAnB;jCACA,eAAS,GAAG,KAAC,EAAD;pBAHd;LARO;AAAY;AArsFnB,wBAAwB;xBACxB,uBAAuB;vBACvB,0BAA0B;1BAC1B,wBAA0B;xBAs5FX;AAAR;AAGP,aAAiB,CAAR,QAAQ,KAAE,IAAF,CAAO,IAAI,QAAQ,kBAAkB,CAAC,IAAI,IAAL,CAA9B;xEAHjB;AAAQ;AA0fjB;AACE,0BAAkB,oBAAe,QAAC;tDAElC,qBAAY,CAAC,CAAD,CAAZ,GAAmB;3BACnB,qBAAY,CAAC,CAAD,CAAZ,GAAmB;3BACnB,qBAAY,CAAC,CAAD,CAAZ,GAAmB;3BACnB,qBAAY,CAAC,CAAD,CAAZ,GAAmB;3BACnB,qBAAY,CAAC,CAAD,CAAZ,GAAmB;3BACnB,qBAAY,CAAC,CAAD,CAAZ,GAAmB;3BACnB,qBAAY,CAAC,CAAD,CAAZ,GAAmB;3BACnB,sBAAa,CAAC,CAAD,CAAb,GAAoB;5BACpB,sBAAa,CAAC,CAAD,CAAb,GAAoB;5BACpB,sBAAa,CAAC,CAAD,CAAb,GAAoB;5BACpB,sBAAa,CAAC,CAAD,CAAb,GAAoB;5BACpB,sBAAa,CAAC,CAAD,CAAb,GAAoB;5BACpB,sBAAa,CAAC,CAAD,CAAb,GAAoB;5BACpB,sBAAa,CAAC,CAAD,CAAb,GAAoB;5BACpB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAsB;9BACtB,wBAAe,CAAC,CAAD,CAAf,GAAuB;9BACvB,wBAAe,CAAC,EAAD,CAAf,GAAuB;/BACvB,wBAAe,CAAC,EAAD,CAAf,GAAuB;/BACvB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAqB;7BACrB,uBAAc,CAAC,CAAD,CAAd,GAAsB;7BACtB,uBAAc,CAAC,EAAD,CAAd,GAAsB;9BACtB,uBAAc,CAAC,EAAD,CAAd,GAAsB;9BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAsB;3BACtB,kBAAS,CAAC,CAAD,CAAM,CAAC,CAAD,CAAf,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAM,CAAC,EAAD,CAAf,GAAuB;5BACvB,kBAAS,CAAC,CAAD,CAAM,CAAC,EAAD,CAAf,GAAuB;5BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAuB;3BACvB,kBAAS,CAAC,CAAD,CAAO,CAAC,CAAD,CAAhB,GAAwB;3BACxB,kBAAS,CAAC,CAAD,CAAO,CAAC,EAAD,CAAhB,GAAwB;5BACxB,kBAAS,CAAC,CAAD,CAAO,CAAC,EAAD,CAAhB,GAAwB;5BACxB,6BAAmB,CAAC,CAAD,CAAnB,GAA8B;nCAC9B,6BAAmB,CAAC,CAAD,CAAnB,GAA6B;nCAE7B,yBAAiB;zBACjB,yBAAiB;zBACjB,2BAAmB;3BACnB,0BAAkB;1BAClB,2BAAmB;3BACnB,0BAAkB;1BAClB,4BAAoB;5BACpB,6BAAqB;7BACrB,wBAAgB;xBAChB,wBAAgB;xBAChB,qCAA2B;rCA9E7B;AAn4HA;;;AAiiBc;AAuBD,sBAAG;tBA0mBO;AAErB,QAAS,WAAC,iBAAD,CAAc,KAAC,CAAxB;3CAEY,uBAAD,sBAAC,qBAAa,CAAd;nEACT,uBAAY,CAAC,CAAD,CAAZ,GAAiB;xBAHnB;LAKA,QAAS,WAAC,kBAAD,CAAe,KAAC,CAAzB;5CAEY,wBAAD,sBAAC,sBAAc,CAAf;rEACT,wBAAa,CAAC,CAAD,CAAb,GAAkB;zBAHpB;LAPqB;AAgJN,0BAAK;1BACH,4BAAG;5BACH,4BAAG;5BAEC;AAKhB;AACJ,QADI,KACJ;bAAkB,YAAM,kBAAa,QAAC,aAAS,CAAC,6BAAe,CAAC,GAAD,CAAhB,CAAT;vFACtC,cAFI,KAEJ;nBAAoB,YAAM,kBAAa,QAAC,aAAS,CAAC,+BAAiB,CAAC,GAAD,CAAlB,CAAT;zFACxC,cAHI,KAGJ,QAAoB,MAAM,kBAAa,QAAC,aAAS,CAAC,+BAAiB,CAAC,GAAD,CAAlB,CAAT,CAAxC;/GARoB;AAaZ,oBAAG;pBAEY;AAAjB;AAGP;AAGA,QAAG,cAAG,CAAC,IAAI,CAAL;5BACN,QAAG,CAAC,GAAC,CAAL;bACE,eAAqB,CAAb,eAAI,CAAC,EAAE,EAAE,CAAC,GAAC,CAAP,CAAS,GAAC,EAAD,CAAG,GAAC,eAAI,CAAC,EAAE,CAAC,GAAC,CAAD,CAAU,CAAD,OAAG,GAAC,CAAjB,CAAL;xFAExB,mBAAQ;nBAVH;AAAiB;AAaC;AAAlB;AAGP;AAAG;AAAI;AAAG;AAGV,QAAc,CAAV,SAAU,KAAE,CAAC,CAAH,CAAM,IAAc,CAAV,SAAU,GAAE,EAAF,CAAlC,EACG,YAAa,EADhB;9DAGuB,UAApB,GAAC,qBAAM,SAAS,GAAC,CAAhB;/CAEJ,aAAQ,aAAQ,CAAC,MAAD;jCAChB,QAAG,cAAG,CAAC,IAAI,MAAL;jCACN,QAAG,CAAC,KAAC,CAAL,EACE,aADF;9BAGA,SAAI,cAAG,CAAC,IAAI,MAAL;lCACP,QAAG,EAAE,KAAC,CAAN;hBAEE,eAAQ,uBAAiB,CAAC,OAAO,EAAR;hDACzB;KAHF;LAMA,QAAG,EAAE,GAAC,CAAD;dACL,eAAY;fACZ,WAAO,CAAE,IAAU,MAAD,OAAlB;7BAEE,iBAAwB,CAAJ,CAAR,QAAQ,GAAC,EAAD,CAAI,GAAM,MAAD,YAAQ,CAAD,IAAP,CAAL,CAAgB,GAAK,GAAD,aAAJ;hFACpC,OAAJ,IAAG;;XAEL,QAAG,MAAM,QAAG,CAAF,EAAE,GAAC,CAAD,KAAH,CAAO,KAAE,GAAlB,EACE,WAAY,CAAC,QADf;jEAEA,QAAe,CAAV,CAAD,CAAC,GAAC,QAAD,CAAU,GAAE,EAAF,CAAM,IAAc,CAAT,QAAS,GAAE,CAAC,CAAH,CAAnC;hDAGY,YAAD,oBAAC,OAAO,EAAE,GAAC,CAAX;7CACT,UAAG,QAAS,IAAG,CAAf;vBAGE,iBAAS,SAAa,QAAR,QAAQ,GAAC,CAAD,qBAAtB;nEAAI;AAEF,gBAAM,iBAAN,OAAO,MAAM,MAAM,QAAE,CAAD,CAAC,GAAC,CAAD,KAAF,CAAb;xEACF,WAAJ,IAAG;;fAEL,cAAM,iBAAN,OAAO,MAAM,GAAP;/CACN,YAAK;ZACL,YAAG,MAAM,QAAC,KAAD,CAAI,KAAE,GAAf,EACM,CAAJ,IAAG,CADL;hDAEA,eAAwB,CAAP,CAAV,MAAM,QAAC,KAAD,CAAI,KAAE,GAAF,CAAO,IAAO,CAAF,CAAE,GAAS,MAAD,OAAR,CAAP,CAAyB,IAAgC,CAA3B,eAAI,CAAC,OAAO,CAAC,GAAC,CAAD,CAAU,EAAD,OAAlB,CAAuB,KAAE,EAAF,CAAjF,EAGW,iBAAM,CAAC;;;;jIAAO,EAAE,CAAV;;hBAKjB,yBAAM,CAAC,eAAI,CAAC,QAAQ,EAAE,CAAC,QAAZ,EAAsB;;;;lDAAO,CAAC,GAAC,CAApC;lBACN,cAAM,iBAAN,OAAQ,CAAD,CAAC,GAAC,QAAD,MAAc,MAAM,QAAW,CAAT,CAAD,CAAC,GAAC,QAAD,CAAS,GAAC,CAAD,KAAX,CAAtB;hGACN,cAAM,iBAAN,OAAO,MAAM,GAAP;/CACN,YAAG,QAAS,KAAG,CAAC,CAAhB,EACE,MAAM,iBAAN,OAAiB,CAAT,CAAD,CAAC,GAAC,QAAD,CAAS,GAAC,CAAD,MAAO,GAAlB,CADR;;xFAIF,UAAY,MAAD;hBACX,aAAS,CAAF,CAAE,GAAE,CAAF,CAAK,IAAe,CAAV,MAAM,QAAC,KAAD,CAAI,KAAE,GAAF,CAA7B,EACM,CAAJ,IAAG;7DACL,UAAG,MAAM,QAAC,KAAD,CAAI,KAAE,GAAf,EACM,CAAJ,IAAG,CADL;9CAEA,UAAM,CAAF,CAAE,KAAE,CAAF,CAAK,IAAU,CAAJ,CAAD,CAAC,KAAC,CAAD,CAAI,IAAe,CAAV,MAAM,QAAC,CAAD,CAAI,KAAE,GAAF,CAAf,CAArB;hEACE,iBAAU;jBAEV,YAAU,MAAD,oBAAC,OAAO,CAAR;;9CAMX,aAAM,MAAM,QAAG,CAAF,EAAE,GAAC,CAAD,KAAH,CAAO,KAAE,GAArB;hDAES,yBAAM,CAAC;;;;bAAO,EAAE,GAAC,CAAD,CAAG,CAAb;rBACT,UAAJ,IAAG;;dAGL,UAAG,MAAM,QAAG,CAAF,EAAE,GAAC,CAAD,KAAH,CAAO,KAAE,EAAlB;5CAES,yBAAM,CAAC;;;;bAAO,EAAE,GAAC,CAAD,CAAG,CAAb;rBACT,UAAJ,IAAG;PAHL;PAMA,UAAG,MAAM,QAAG,CAAF,EAAE,GAAC,CAAD,KAAH,CAAM,KAAC,GAAhB;7CACS,yBAAM,CAAC;;;;bAAO,EAAE,GAAC,CAAD,CAAG,CAAb;rBAEb,YAAI,EAAJ,IAAG;lBACL,aAAM,MAAM,QAAG,CAAF,EAAE,GAAC,CAAD,KAAH,CAAO,KAAE,GAArB,EAES,iBAAM,CAAC;;;;zDAAO,EAAE,GAAC,CAAD,CAAG,CAAb;;nBAEjB,aAAQ,uBAAiB,CAAC,OAAO,EAAR;9CAjGlB;AAAkB;AAoGC;AAAnB;AAGP;AAEA,SAAI;TACJ,QAAc,CAAV,SAAU,KAAE,CAAC,CAAH,CAAM,IAAc,CAAV,SAAU,GAAE,EAAF,CAAlC,EACE,YAAa,EADf;9DAEuB,UAApB,GAAC,qBAAM,SAAS,GAAC,CAAhB;/CAEJ,WAAM,MAAM,QAAC,CAAD,CAAI,KAAE,GAAlB,EACS,iBAAM,CAAC;;;;9CAAQ,EAAG,CAAZ;ZACf,QAAG,cAAG,CAAC,IAAI,MAAL;jCACN,QAAG,CAAC,KAAC,CAAL;fAEE,eAAQ,uBAAiB,CAAC,OAAO,EAAR;hDACzB;KAHF;LAKI,KAAJ,IAAO;TACP,QAAG,MAAO,GAAE,CAAZ,EACE,SAAQ,CADV;9BAEA,aAA2B,CAAJ,CAAR,MAAD,OAAS,GAAE,CAAF,CAAI,GAAE,MAAF,CAAS,GAAE,CAAF;/CACpC,QAAG,MAAO,GAAE,CAAZ;lBACE,uBAAM,CAAC,eAAI,CAAC,OAAO,EAAE,CAAC,MAAX,EAAmB;;;;/CAAO,CAA/B;ZAEN,iBAAc,CAAP,MAAO,GAAE,CAAF,CAAK,IAAe,CAAV,MAAM,QAAC,KAAD,CAAI,KAAE,GAAF,CAAlC;/DAES,uBAAM,CAAC;;;;bAAQ,EAAG,CAAZ;dACb,UAAG,CAAE,GAAS,MAAD,OAAb;3BAES,yBAAM,CAAC;;;;bAAQ,CAAE,GAAE,CAAF,CAAK,CAAhB;pBACb;OAHF;PAKI,YAAJ,IAAG;;hBAEP,aAAQ,uBAAiB,CAAC,OAAO,EAAR;9CAnClB;AAAmB;AAsCH;AAAhB;AAGP,QAAG,MAAO,KAAE,CAAC,CAAb;rBACE,eAAU;fACP,cAAG,MAAO,GAAE,EAAZ,EACH,SAAU,EADP;tCAEe,UAAjB,GAAC,qBAAM,EAAE,MAAR;1CACJ,QAAU,CAAN,MAAM,KAAE,EAAF,CAAM,IAAc,CAAT,MAAM,QAAC,CAAD,CAAG,KAAC,GAAD,CAA9B,EACE,iBAAM,CAAC;;;;hEAAO,EAAE,CAAV,CADR;bAEA,aAAQ,uBAAiB,CAAC,OAAO,EAAR;9CAVlB;AAAgB;AAcC;AAAjB;AAGP;AAGA,QAAG,MAAO,KAAE,CAAC,CAAb;rBACE,eAAU;fACP,cAAG,MAAO,GAAE,EAAZ,EACH,SAAU,EADP;tCAEe,UAAjB,GAAC,qBAAM,EAAE,MAAR;1CACJ,QAAU,CAAN,MAAM,KAAE,EAAF,CAAM,IAAc,CAAT,MAAM,QAAC,CAAD,CAAG,KAAC,GAAD,CAA9B,EACE,iBAAM,CAAC;;;;hEAAO,EAAE,CAAV,CADR;bAEA,QAAG,cAAG,CAAC,IAAI,MAAL;jCACN,aAAQ,uBAAiB,CAAC,OAAO,EAAR;9CACrB,KAAJ,IAAM;TACN,QAAM,CAAF,EAAE,KAAE,EAAF,CAAM,IAAO,CAAF,EAAE,KAAE,MAAF,CAAnB,EACE,OAAO,CAAC,GAAC,CAAT;pDAEE,UAAI,MAAM,QAAE,CAAD,CAAC,GAAC,CAAD,KAAF,CAAM,KAAG,GAAnB,EACE,iBAAM,CAAC,GAAI;;;;xDAAQ,CAAb,CADR;bAEI,OAAJ,IAAO;NALX;LAhBO;AAAiB;AAyBQ;AAAzB;AAKP;AACA;AACA;AAGA,aAAQ;bACR,eAAY;fACZ,SAAM;TACN,aAAQ,gBAAkB,QAAC,YAAD,4BAA1B;7EAAI;AAEF,eAAqB,CAAV,YAAM,YAAC,KAAD,CAAI,IAAG,cAAC,GAAK,gBAAI,GAAK,EAAf,CAAH,CAAwB,IAAU,CAAN,YAAM,KAAC,EAAD,CAAV;nHAC7C,UAAG,CAAI,MAAP,EACE,KADF;;xBAGF,QAAI,MAAJ,EACE,iBAAM,CAAC,OAAQ,EAAG,CAAZ,CADR;7CAnBO;AAAyB;AAuBL;AAApB;AAGP;AACA;AAGC,QAAG,MAAO,KAAE,CAAC,CAAb;rBACE,eAAU;fACP,cAAG,MAAO,GAAE,EAAZ,EACH,SAAU,EADP;tCAEe,UAAjB,GAAC,qBAAM,EAAE,MAAR;1CACJ,eAAU,MAAM,QAAC,CAAD,CAAI,KAAE,GAAF;vCACpB,QAAG,QAAH,EACS,iBAAM,CAAC;;;;3BAAQ,EAAG,CAAZ,CADf;bAEA,QAAK,cAAG,CAAC,IAAK,MAAN;jCACR,QAAG,CAAE,KAAG,CAAR;fACE,eAAQ,uBAAiB,CAAC,OAAO,EAAR;hDAEzB,cAAY,MAAD,OAAQ,GAAC,CAAD;/BACjB,KAAJ,IAAO;TACP,WAAO,CAAE,GAAE,CAAX;hBAEE,UAAG,sBAAiB,KAAE,MAAtB,EACE,iBAAM,CAAC,mBAAc,qBAAC,GAAmB;;;;/FAAQ,CAA3C,CADR;bAEI,OAAJ,IAAO;;XAET,QAAmB,CAAR,MAAD,OAAS,GAAE,CAAF,CAAK,IAAI,QAA5B,EACE,WAAY,CAAI,+BAAyB,CAAC;;;;5EAAO,EAAR,CAD3C;ZAEA,QAAG,CAAI,QAAP;jBACO;AACH,UADG,KACH;fAAG,iBAAU,mBAAe,GAAE,MAAF;7CAC5B,gBAFG,KAEH;rBAAG,iBAAU,MAAO,GAAE,mBAAF;7CACpB,gBAHG,KAGH;rBAAG,iBAAyB,CAAf,mBAAe,GAAE,GAAF,CAAM,GAAE,MAAF;rDAClC,gBAJG,KAIH,QAAG,SAAiB,CAAP,MAAO,GAAE,GAAF,CAAM,GAAE,mBAA5B;;1EAGG;AACH,UADG,KACH;fAAG,iBAA+B,CAAjB,CAAJ,GAAI,GAAE,mBAAF,CAAiB,GAAE,MAAF,CAAS,GAAE,GAAF;7DAC3C,gBAFG,KAEH;rBAAG,iBAAc,CAAJ,GAAI,GAAE,mBAAF,CAAiB,GAAE,MAAF;rDAClC,gBAHG,KAGH;rBAAG,iBAAyB,CAAf,mBAAe,GAAE,GAAF,CAAM,GAAE,MAAF;rDAClC,gBAJG,KAIH;rBAAG,iBAAyB,CAAf,mBAAe,GAAE,MAAF,CAAS,GAAE,GAAF;rDACrC,gBALG,KAKH;rBAAG,iBAAuB,CAAT,CAAJ,GAAI,GAAE,MAAF,CAAS,GAAE,mBAAF,CAAiB,GAAE,GAAF;7DAC3C,gBANG,KAMH;rBAAG,iBAAc,CAAJ,GAAI,GAAE,MAAF,CAAS,GAAE,mBAAF;rDAC1B,gBAPG,KAOH;rBAAG,iBAAiB,CAAP,MAAO,GAAE,GAAF,CAAM,GAAE,mBAAF;rDAC1B,gBARG,KAQH;rBAAG,iBAAiB,CAAP,MAAO,GAAE,mBAAF,CAAiB,GAAE,GAAF;rDACrC,gBATG,KASH;rBAAG,iBAAuB,CAAT,CAAJ,GAAI,GAAE,MAAF,CAAS,GAAE,GAAF,CAAM,GAAE,mBAAF;7DAChC,gBAVG,KAUH;rBAAG,iBAA+B,CAAjB,CAAJ,GAAI,GAAE,mBAAF,CAAiB,GAAE,GAAF,CAAM,GAAE,MAAF;7DACxC,gBAXG,KAWH;rBAAI,iBAAuB,CAAN,CAAP,MAAO,GAAE,GAAF,CAAM,GAAE,mBAAF,CAAiB,GAAE,GAAF;7DAC5C,gBAZG,KAYH;rBAAI,iBAA+B,CAAN,CAAf,mBAAe,GAAE,GAAF,CAAM,GAAE,MAAF,CAAS,GAAE,GAAF;7DAC5C,gBAbG,KAaH;rBAAI,iBAA+B,CAAN,CAAf,mBAAe,GAAE,GAAF,CAAM,GAAE,GAAF,CAAM,GAAE,MAAF;7DACzC,gBAdG,KAcH;rBAAI,iBAAuB,CAAN,CAAP,MAAO,GAAE,GAAF,CAAM,GAAE,GAAF,CAAM,GAAE,mBAAF;7DACjC,gBAfG,KAeH;rBAAI,iBAAqC,CAAN,CAAjB,CAAJ,GAAI,GAAE,mBAAF,CAAiB,GAAE,GAAF,CAAM,GAAE,MAAF,CAAS,GAAE,GAAF;rEAClD,gBAhBG,KAgBH,SAAI,SAA6B,CAAN,CAAT,CAAJ,GAAI,GAAE,MAAF,CAAS,GAAE,GAAF,CAAM,GAAE,mBAAF,CAAiB,GAAE,GAApD;;3FAEJ,QAAG,EAAE,KAAC,EAAN;jBAvDM;AAAoB;AA4bjB,qBAAG;rBAmeb,+BAAkD,IAAI,GAAtD;tCAeU,mBAAG;nBACP,eAAG;fAJU;AAAZ;AAMc;AAGnB,mBAAU,WAAM,CAAC,iCAAmB,CAAC,OAAD,CAApB,CAAhB;1EAHmB;AAOpB;AACA;AAAE;AAAE;AAAE;AAAG;AAAG;AACZ;AAAE;AAAE;AACJ;AACA;AAAG;AAAG;AAAG;AACT;AACA;AACA;AAGS,UAAD,sBAAC,SAAO,CAAR;1CACT,aAAQ;bACR,UAAY,CAAD;XACX,iBAAU,EAAV;nBACA,WAAU,CAAH,GAAG,GAAC,CAAD,CAAI,IAA2B,CAAtB,cAAG,CAAC,CAAC,QAAC,OAAD,EAAM,UAAR,CAAmB,GAAC,CAAD,CAAzC,EACM,GAAJ,IAAG;nFACL,QAAI,GAAG,KAAC,CAAR;jBAEE,iBAAW,CAAC,CAAD;nBACX;KAHF;LAKA,4BAAyB;5BACzB,QAAG,SAAU,KAAE,MAAf,EACE,IAAI,kBAAa,KAAE,MAAnB;/DACE,kBAAa;lBAEb,sBAAW,GAJf;zBAMA,SAAM,cAAS,CAAC,SAAD;jCAEf,SAAI;TACJ,SAAI;TACJ,SAAI;TACJ,YAAO;ZACP,QAAG;RACH,WAAQ,CAAD,CAAC,GAAQ,EAAD,OAAP,CAAa,IAAU,CAAL,KAAK,GAAC,CAAD,CAA/B;zCAEO,OAAJ,IAAG;XACI,kBAAF,EAAE,QAAC,KAAD;jCACL,UADK,KACL;fACE,YAAG,EAAE,KAAC,CAAN;pBAEO,eAAJ,IAAG;nBACH,eAAI;NAHP;TAKF,gBAPK,KAOL;rBACE,YAAG,EAAE,KAAC,CAAN;pBAEO,eAAJ,IAAG;nBACH,eAAI;NAHP;TAKF,gBAbK,KAaL,UACE,IAAG,EAAE,KAAC,CAAN;3CAEO,aAAJ,IAAG;jBACH,aAAI;NAJT;;PASL,SAAI,IAAK,GAAL,CAAU,OAAV,CAAU,EAAd,EACE,MAAM,CAAC,CAAD,CAAN,GAAa;zCACf,SAAM;TACN,QAAK;RACL,aAAS,SAAK,gCAAd;tDAAI;AAED,UAAG,cAAG,CAAC,CAAC,QAAC,KAAD,EAAI,MAAN,CAAa,GAAC,CAApB,EACE,KAAM,EAAG,GAAE,CAAC,QAAC,KAAD,CADd;/EAKA,UAAc,CAAV,SAAU,KAAG,GAAH,CAAQ,IAAU,CAAL,CAAC,QAAC,KAAD,CAAI,KAAE,GAAF,CAAhC,EACE,QADF;pEAEA,UAAS,CAAL,CAAC,QAAC,KAAD,CAAI,KAAE,SAAF,CAAa,IAAc,CAAP,CAAF,CAAE,KAAE,GAAF,CAAO,IAAqB,CAAhB,cAAG,CAAC,CAAC,QAAC,KAAD,EAAI,MAAN,CAAa,GAAC,CAAD,CAArB,CAApC;1GAEO,SAAJ,IAAG;bACH,YAAG,CAAC,GAAC,CAAL;jBAGI,qBAAW,CAAC,CAAD;vBACX;SAJJ;TAOA,YAAK,CAAD,CAAC,KAAC,EAAD,CAAK,IAAe,CAAH,EAAD,OAAI,GAAC,CAAD,CAAzB,EAAkC,wBAAyB,IAA3D;vEACA,wBAAG,CAAC,GAAU,CAAC,MAAP,WAAM;;;;jCAAK;;;;DAAhB;ZACH,YAAG,CAAC,KAAE,CAAN;nBAGI,qBAAW,CAAC,CAAD;vBACX;SAJJ;TAMA,aAAM;NAEJ,UAAI,cAAG,CAAC,CAAC,QAAC,KAAD,EAAI,MAAN,CAAa,KAAC,CAArB;7DAGH,mBAAW,CAAC,CAAD;rBACX;OAJG;;PAQP,QAAS,CAAL,KAAK,GAAC,CAAD,CAAI,IAAM,CAAD,CAAC,GAAC,KAAD,CAAnB;lCAEC,iBAAW,CAAC,CAAD;nBACX;KAHD;LAMD,mBAAU,CAAC,YAAK;;;;vBAAG;;;;AAAG;;;;DAAZ;RACV,QAAG,CAAC,KAAC,CAAL;fAEG,UAAG,MAAM,CAAC,EAAD;nBACT,UAAG,MAAM,CAAC,EAAD;nBACT,UAAG,MAAM,CAAC,EAAD;;nBAIV,UAAG;VACH,UAAG,CAAC,GAAC,CAAL;fAEG,YAAG,MAAM,CAAC,CAAD;pBACT,YAAK;LAGP,UAAG,EAAE,GAAC,EAAN;xBAEG,YAAG,MAAM,CAAC,CAAD;pBACT,YAAG,MAAM,CAAC,CAAD;;pBAIT,YAAG,MAAM,CAAC,CAAD;pBACT,YAAG,MAAM,CAAC,CAAD;;;pBAGf,QAAY,CAAN,CAAF,CAAE,IAAG,CAAH,CAAM,IAAO,CAAF,CAAE,GAAE,GAAF,CAAP,CAAc,IAAI,CAAI,qBAAlC;zDAEE,WAAM,EAAG,GAAE,8BAAF;9CACL,OAAJ,IAAU,WAAH,EAAG,GAAI,GAAJ,CAAQ,GAAE,GAAF;rCAClB,UAA8B,CAA1B,8BAA0B,GAAE,CAAF,CAAK,IAAO,CAAF,CAAE,GAAE,EAAF,CAA1C,EACM,CAAJ,IAAO,GADT;/DAJF;LAOA,QAAG,CAAI,kBAAa,CAAC,EAAG,EAAG,EAAG;;;;1BAAV,CAApB,EACE,aAAU,6BAAV,CADF;tDA1JO;AAAY;AAyLV,kBAAG;lBACL,gBAAG;hBACH,gBAAG;hBACJ,eAAG;fACJ,cAAG;dACH,cAAG;dACF,eAAG;fAaA,iBAAG;jBAtBO;AAAZ;AAeN;AACA;AAGsB;AAAb;AAKN;AAAK;AAAQ;AAAS;AAAK;AAAW;AACtC;AACA;AAAc;AACd;AACA;AACA;AACA;AAGD,eAAU;fACV,eAAQ,CAAR;hBACA,oBAAe;pBACf,kBAAa;lBACb,WAAI,IAAG,GAAH,CAAa,OAAb,CAAa,EAAjB,EACC,gBAAU,CAAC,CAAD,CAAV,GAAe;rDAChB,YAAO;ZAEP,aAAW,CAAJ,GAAI,GAAE,GAAF,CAAO,IAAY,CAAP,CAAC,QAAC,OAAD,CAAM,KAAC,GAAD,CAA9B,EAA2C,GAAJ,IAAG;hEAC1C,eAAU;fAEV,UAAmB,CAAX,CAAJ,GAAI,GAAM,CAAJ,GAAI,GAAE,CAAF,CAAN,CAAW,IAAW,CAAP,CAAC,QAAC,OAAD,CAAM,KAAE,SAAF,CAAX,CAAwB,IAAW,CAAP,CAAC,QAAC,OAAD,CAAM,KAAE,qBAAF,CAAtD;nHAGE;OAHF;PAKA,qBAAiB,cAAG,CAAC,CAAC,QAAC,OAAD,EAAM,QAAR,CAAe,GAAC,CAAD;nEACnC,aAAO,GAAI,IAAG,GAAd;vBAIE,kBAAW,CAAC,QAAC,OAAD;lCACZ,YAAG,cAAG,CAAC,QAAQ,QAAT,CAAgB,GAAC,CAAvB;hDAOE,cAAI,CAAK,YAAsC,IAAc,CAAV,SAAU,GAAE,CAAF,CAA7D;9CAGG;WAHH;XAKA,mBAAU;nBACV,cAAI,OAAQ,KAAG,GAAf;7BAAyB,oCAAyB;pCAAY,wCAAyB,CAAC;zCACxF,iBAAW,CAAJ,GAAI,GAAE,GAAF,CAAO,IAA2B,CAAtB,cAAG,CAAC,CAAC,QAAK,CAAJ,GAAI,GAAE,CAAF,KAAL,EAAU,QAAZ,CAAmB,GAAC,CAAD,CAA7C;tFAGE,gBAA0B,CAAtB,qBAAsB,KAAE,CAAC,CAAH,CAAM,IAAY,CAAP,CAAC,QAAC,OAAD,CAAM,KAAG,GAAH,CAA5C,EAAyD,wBAAyB,GAAlF;1GACI,eAAJ,IAAG;;nBAEL,cAAI,qBAAsB,KAAE,CAAC,CAA7B,EAAqC,wBAAyB,GAA9D;vEACA,oBAAY,CAAD,CAAC,GAAE,GAAF,CAAM,GAAE,qBAAF;rDAIlB,cAAY,CAAR,OAAQ,IAAG,CAAH,CAAM,IAAmB,CAAN,CAAR,OAAQ,IAAG,CAAH,CAAM,IAAe,CAAV,SAAU,KAAE,CAAF,CAAf,CAArC;rEAEE,4BAAG,CAAC,eAAI,CAAC,EAAE,sBAAuB,OAA1B,EAAoC;;;;7DAAO;;;;DAAhD;hBAGH,4BAAU,CAAC,SAAD,CAAV,GAAyB;1CACrB,qBAAJ,IAAG;zBACH,2BAAgB;;3BAKhB;;SAGC,UAAI,OAAQ,KAAE,GAAd,EAKA;nBAAI,OAAQ,KAAE,SAAd;tCAGH,cAAG,YAAa,IAAc,CAAV,SAAU,GAAE,CAAF,CAA9B;7CAGE;WAHF;XAKA,yBAAgB;zBAChB,wBAAe;fAEZ,UAAI,OAAQ,KAAE,qBAAd;pDAGH,cAAgB,CAAb,YAAa,IAAG,WAAH,CAAe,IAAc,CAAV,SAAU,KAAG,CAAH,CAA7C;hEAGG;WAHH;XAKA,yBAAgB;zBAChB,wBAAe;;xBAOf,cAAS,CAAL,UAAK,KAAG,CAAH,CAAc,IAAG,YAA1B;hDAGE;WAHF;XAKA,mBAAU;nBACV,yBAAc,qBAAgB,GAAC,GAAD;pDAC9B,cAAG,SAAS,KAAE,MAAd,EACE,eAAc,YAAY,GAAC,SAD7B;3EAEA,iBAAqB,CAAV,CAAJ,GAAI,GAAM,CAAJ,GAAI,GAAC,CAAD,CAAN,CAAU,IAAiC,CAA5B,cAAG,CAAC,CAAC,QAAK,CAAJ,GAAI,GAAE,CAAF,KAAL,EAAU,YAAZ,CAAyB,KAAC,CAAD,CAAjC,CACnB,IAA2B,CAAtB,cAAG,CAAC,CAAC,QAAK,CAAJ,GAAI,GAAE,CAAF,KAAL,EAAU,QAAZ,CAAmB,KAAC,CAAD,CAD7B,EACwC,GAAJ,IAAG;zKACvC,oBAAa,CAAF,CAAE,GAAE,GAAF,CAAM,GAAE,MAAF;tCAGnB,oBAAW,eAAI,CAAC,EAAE,CAAC,GAAC,MAAD,CAAS,OAAb;xDAKf,cAAI,gBAAW,CAAC,QAAS,iBAAV,CAAwB,KAAE,CAAzC;/DAAiD,qBAAQ,CAAR;tBAC5C,oBAAI,gBAAW,CAAC,QAAS,iBAAV,CAAwB,KAAE,CAAzC;rEAAiD,qBAAQ,CAAR;tBACjD,oBAAI,gBAAW,CAAC,QAAS,IAAV,CAAgB,KAAE,CAAjC;xDAAyC,qBAAQ,CAAR;tBACzC,oBAAI,gBAAW,CAAC,QAAS,IAAV,CAAgB,KAAE,CAAjC;xDAAyC,qBAAQ,CAAR;;tBAI5C;;AAGF,cAAI,SAAU,KAAE,CAAhB;7BAEE,2BAAgB;;3BAKhB,wBAAa,CAAO,GAAE,CAAF;7BACpB,2BAAgB;;;3BAGhB,WAAJ,IAAG;;fAML,UAAwB,CAAV,CAAV,SAAU,KAAE,CAAF,CAAU,IAAwB,CAAd,CAAL,UAAK,KAAG,CAAH,CAAc,IAA+B,CAAN,CAAnB,gBAAU,CAAC,CAAD,CAAS,GAAE,EAAF,CAAM,IAAuB,CAAnB,gBAAU,CAAC,CAAD,CAAS,KAAE,CAAF,CAAvB,CAA/B,CAAxB,CAAqF,IAAG,YAAhH,EACE,aADF;nJAEA,eAAU;fA5JH;AAAa;AAgKb,cAAD,sBAAC,aAAW,CAAZ;lDACT,QAAG,SAAU,KAAE,MAAf,EACG,IAAI,kBAAa,KAAE,MAAnB;/DACE,kBAAa;lBAEb,sBAAW,GAJhB;zBAKA,WAAQ;XACR,QAAG,CAAI,aAAa,CAAC;;;;dAAY;;;;DAAb,CAApB;TAEE,mBAAU,WAAM,CAAC,oCAAsB,CAAC,CAAD,CAAvB,CAAhB;vEACA;KAHF;LAKA,QAAQ,CAAJ,IAAI,KAAC,CAAD,CAAU,IAAuB,CAAlB,UAAU,CAAC,CAAD,CAAQ,KAAE,EAAF,CAAzC;9CAAwD,gBAAU,CAAC,CAAD,CAAd,IAAwB;vBACvE,cAAQ,CAAJ,IAAI,KAAC,CAAD,CAAU,IAAuB,CAAlB,UAAU,CAAC,CAAD,CAAQ,KAAC,EAAD,CAAzC,EAAmD,UAAU,CAAC,CAAD,CAAV,GAAoB,CAAvE;vEAEL,QAAG,CAAI,kBAAa,CAAC,UAAU,CAAC,CAAD,EAAU,UAAU,CAAC,CAAD,EAAS,UAAU,CAAC,CAAD,EAAS,UAAU,CAAC,CAAD,EAAU;;;;5EAA/E,CAApB,EAEE,aAAU,WAAM,CAAC,oCAAsB,CAAC,CAAD,CAAvB,CAAhB,CAFF;7EAlMO;AAAY;AA0OT,qBAAG;rBAfU;AAAhB;AAkBP;AACA;AAEA,aAAU;bACV,gBAAW,EAAX;lBACA,gBAAW,EAAX;lBACA,kBAAe,SAAI,CAAC,WAAD;vCACnB,QAAU,WAAD,OAAc,KAAE,CAAzB,EAAgC,aAAhC;/CACA,QAAyB,CAAP,CAAd,kBAAc,KAAE,GAAF,CAAO,IAAmB,CAAd,kBAAc,KAAE,GAAF,CAAnB,CAA0B,IAA2B,CAAtB,cAAG,CAAC,IAAK,WAAN,CAAmB,GAAE,CAAF,CAA9E;/GAEE,kBAAS,WAAT;7BAMI,aAAC;RARP;LAUA,QAAG;RAEH,QAAI,kBAAa,KAAE,GAAnB;lCAEE,aAAQ,CAAD,CAAC,GAAQ,WAAD,OAAP,CAAsB,IAAK,CAAqC,CAAhC,cAAG,CAAC,WAAW,QAAE,CAAD,CAAC,GAAC,CAAD,KAAF,EAAM,YAAlB,CAA6B,GAAC,CAAD,CAAxE,EACM,CAAJ,IAAG;;nHAIL,UAAG,cAAG,CAAC,mBAAe,WAAhB;vDACN,UAAI,CAAC,KAAE,CAAP,EACE;nBACM,SAAJ,IAAG;NADL,QAEY,EAAJ,CAAD,CAAC,KAAC,CAAD,CAAI,IAAkC,CAA9B,cAAG,CAAC,WAAW,QAAC,KAAD,EAAI,YAAhB,CAA2B,GAAC,CAAD,CAAlC,CAFZ,CADF;;5FAMF,QAAI,CAAC,KAAC,CAAN,EACE,IAAU,WAAD,OADX;vCAEA,gBAAS,eAAI,CAAC,YAAY,EAAE,CAAf,CAAb;hDACA,gBAAS,SAAI,CAAC,eAAI,CAAC,YAAY,CAAC,GAAC,CAAD,CAAG,GAAjB,CAAL,CAAb;jEACA,QAAW,aAAD,OAAS,KAAE,CAArB;lCACE,eAAQ;;fAGR,eAAQ;fAIR,UAAmC,CAAjB,CAAb,kBAAa,KAAE,kBAAF,CAAiB,IAAgC,CAA3B,cAAG,CAAC,mBAAc,aAAf,CAAwB,GAAE,CAAF,CAAhC,CAChC,IAAkC,CAAhB,CAAb,kBAAa,KAAC,kBAAD,CAAgB,IAAK,CAAI,iBAAY,CAAC,cAAS;;;;5LAAV,CAArB,CADrC;ZAGE,oBAAW,aAAX;jCACA,oBAAW,EAAX;fAJF;;PAhEK;AAAgB;AAt1FzB;ACAA,sBAIS,yCAJT;;;;/DAUc,mEAAmB,UL4DxB,2BK5DwB,CAAnB;zGAMF;;AACM;;AACD;;AAML;;AAkBH;;;AAEL;AACA;AACA;AAJK;;AAEL,gBAFK;;;hBA0wBW;AAAH;AAEf,UAAU,CAAN,KAAM,GAAE,CAAF,CAAK,IAAU,CAAN,KAAM,IAAG,WAAH,CAAzB,EACE,oBAAe,CAAC,KAAD,CADjB;5EAEA,eAAQ,UAAK,CAAC,KAAD;/BAJE;AAAG;AAOC;AAEnB,UAAU,CAAN,KAAM,GAAE,CAAF,CAAK,IAAU,CAAN,KAAM,IAAG,WAAH,CAAzB,EACE,oBAAe,CAAC,KAAD,CADjB;5EAEA,gBAAK,CAAC,KAAD,CAAL,GAAgB;1BAJG;AAOQ;AAE3B,UAAI,WAAY,GAAE,WAAlB,EACG,iBAAM,CAAC,iCAAwB,gBAAzB,CADT;zGAEA,UAAG,WAAY,KAAE,cAAjB,EACE,MADF;hDAEU,gBAAD,sBAAC,qBAAM,WAAP;tEACT,uBAAa;vBAPc;AAUH;AAExB,UAAI,QAAS,GAAE,CAAf,EACE,iBAAK,CAAC,8BAAqB,aAAtB,CADP;tFAEA,UAAG,QAAS,GAAE,WAAd;hCAEE,YAAG,QAAS,GAAE,cAAd,EACE,gBAAW,CAAC,QAAD,CADb;1DAFF;PAKA,oBAAU;pBATc;AAYO;AAE/B,uBAAK,CAAC,8BAAqB,UAAtB;hEAF0B;AAKP;AAExB;AACU;AAHc;AAkBN;AAAH;AAEf,UAAG,WAAO,KAAE,cAAZ,EACE,aADF;vDAEA,gBAAK,CAAC,WAAD,CAAL,GAAiB;hCACjB,eAAU;fACN,iBAAJ,IAAG;rBANY;AAAG;AASG;AAErB,UAAW,WAAC,UAAD,KAAX;pCAEE,qBAAQ,CAAC,CAAD;vBACR,wBAAW,CAAC,CAAD;nBAHb;PAFqB;AASC;AAEtB,UAAS,CAAL,KAAK,GAAC,CAAD,CAAI,IAAS,CAAL,KAAK,IAAE,WAAF,CAAtB,EACE,iBAAM,CAAC,8BAAqB,UAAtB,CADR;5GAEA,oBAAU,WAAM,GAAC,CAAD;nCACF,gBAAD,QAAO,MAAM,CAAb;/BACT,oBAAJ,IAAG;xBANmB;AASK;AAE3B,YAAM,eAAU,QAAC,aAAS,CAAC,IAAI,CAAC,IAAD,CAAL,CAAT;5DAFU;AAkBN;AAAN;AAEf;AAEA,UAAG,WAAO,GAAE,cAAZ,EAA+B,OAAC,IAAhC;nDACA,gBAAW;hBACX,UAAG,cAAU,GAAE,CAAf,EAAsB,UAAW,OAAQ,GAAE,CAA3C;nDACA,UAAG,cAAU,GAAE,CAAf,EAAsB,UAAW,OAAO,GAAC,CAAzC;nDACA,UAAG,cAAU,GAAE,GAAf,EAA4B,OAAJ,IAAa,cAAU,KAAI,CAAnD;/DACA,sBAAW,CAAC,cAAU,GAAE,OAAb;/CACX,eAAU;fAVK;AAAM;AAwCC;AAAP;AAGf;AAGA,eAAQ;fACR,UAAG;VACH,aAAa,CAAN,MAAM,GAAC,CAAD,CAAI,IAAkB,CAAb,UAAK,CAAC,MAAD,CAAQ,IAAE,IAAF,CAAnC,EACM,MAAJ,IAAG;rEACL,UAAG,MAAM,IAAE,CAAX,EACE,SAAQ,CAAC,CADX;lCAVe;AAAO;AAeI;AAAX;AAGf,UAAG,SAAS,KAAC,kCAAb;1DACE,iBAAQ,YAAO,CAAC,IAAD;;lCAGf,iBAAQ,WAAK,GAAC,CAAD;hCACb,eAAc,CAAP,MAAO,IAAE,CAAF,CAAK,IAAkB,CAAb,UAAK,CAAC,MAAD,CAAQ,IAAE,IAAF,CAArC,EACE,SAAQ,MAAO,GAAE,CAAF;;jFATJ;AAAW;AAcJ;AAEtB,UAAU,CAAN,KAAM,GAAE,CAAF,CAAK,IAAU,CAAN,KAAM,GAAE,WAAF,CAAzB,EACE,iBAAK,CAAC,8BAAqB,UAAtB,CADP;3GAES,gBAAM,OAAO,CAAC,MAAO,EAAG,IAAX;pCAClB,oBAAJ,IAAG;xBACC,iBAAJ,IAAG;rBANmB;AASH;AAAJ;AAEf,UAAG,WAAO,KAAE,CAAZ;3BACE,iBAAU;jBAEV,qBAAU,QAAK,CAAC,WAAO,GAAE,CAAV;7CALF;AAAI;AAQC;AAEpB;AAEA,UAAa,CAAT,QAAS,GAAE,CAAF,CAAK,IAAa,CAAT,QAAS,GAAQ,CAAN,WAAM,GAAE,CAAF,CAAR,CAA/B,EACE,iBAAK,CAAC,8BAAqB,aAAtB,CADP;1HAEA,UAAa,CAAT,QAAS,GAAE,CAAF,CAAK,IAAa,CAAT,QAAS,GAAQ,CAAN,WAAM,GAAC,CAAD,CAAR,CAA/B,EACE,iBAAK,CAAC,8BAAqB,aAAtB,CADP;1HAEA,UAAG,QAAQ,KAAC,QAAZ,EAA0B,MAA1B;vCACA,aAAM,UAAK,CAAC,QAAD;hCAEF,gBAAM,OAAO,CAAC,SAAS,CAAV;lCACb,gBAAM,OAAO,CAAC,SAAS,EAAE,IAAZ;vCAZF;AA4BC;AAAN;AAEf,eAAU,YAAO,CAAC,IAAD;hCACjB,UAAG,MAAO,KAAG,CAAC,CAAd,EACE,WAAM,CAAC,MAAD,CADR;5CAHe;AAAM;AAp+Bd;AAkDU;AAkBZ;;;AAEH;AAFG;;AAEH,gBAFG;;;hBAqoCW;AAAH;AAEb,eAAU,UAAK,IAAI,CAAC,KAAD;nCAFN;AAAG;AAKC;AACf;AAEF,UAAK,QAAG,CAAC,KAAD;xBACR,gBAAK,IAAI,CAAC,MAAO,IAAR;/BACT,UAAG,mBAAQ,CAAC,CAAD,CAAX,EACE,WAAM,CAAC,EAAG,gCAAJ,CADR;jFAEA,UAAG,mBAAQ,CAAC,IAAD,CAAX,EACE,WAAM,CAAC,KAAM,8BAAP,CADR;rFAPiB;AAWG;AAEpB,UAAG,mBAAQ,CAAC,MAAD,CAAX;rCACA,UAAG,MAAM,KAAC,kCAAV;vDAHoB;AAgBE;AAEtB,UAAG,QAAS,GAAE,UAAK,OAAnB;tCACE,eAAM,UAAK,OAAO,GAAE,QAApB,EACE,WAAM,CAAC,UAAK,OAAO,GAAE,CAAf;9EAER,YAAA,UAAK,SAAS,CAAC,QAAD;xCANM;AASD;AAAR;AAEb,eAAU,UAAK;zBAFF;AAAQ;AAUC;AAEZ;AACV,mBAAS,YAAO,QAAC;vCAHK;AAMA;AAEtB,UAAY,UAAD,QAAX,EACE,YADF;1CAEA,6BAAU,CAAC;;;;pBAAD;VAJY;AAoBN;AAAH;AAEb,eAAU,UAAK,IAAI,CAAC,IAAD;lCACnB,UAAG,mBAAQ,CAAC,IAAD,CAAX,EACE,WAAM,CAAC,KAAM,8BAAP,CADR;rFAHa;AAAG;AAOG;AAEnB,aAAO,UAAK,OAAM,GAAC,CAAnB,EACE,WAAM,CAAC,eAAK,GAAC,CAAP;nEAHW;AAMC;AAElB;AAGF,UAAG,UAAK,IAAI,CAAC,KAAD;9BACZ,gBAAK,OAAO,CAAC,KAAD;7BACZ,UAAG,mBAAQ,CAAC,CAAD,CAAX,EACE,WAAM,CAAC,EAAG,gCAAJ,CADR;jFAPoB;AA8CA;AAAP;AAEb,eAAU,UAAK,QAAQ,CAAC,IAAD;tCAFV;AAAO;AAKA;AAEpB,gBAAK,OAAO,CAAC,MAAO,IAAR;lCACZ,UAAG,mBAAQ,CAAC,IAAD,CAAX,EACE,WAAM,CAAC,KAAK,8BAAN,CADR;rFAHoB;AA6BD;AAAN;AAEb,eAAU,YAAO,CAAC,IAAD;hCACjB,UAAG,MAAO,KAAG,CAAC,CAAd,EACE,IAAoB,OAAT,CAAC,MAAD,CADb;5CAHa;AAAM;AA/yCd;AAkDM;AAgxCoB;AAE/B;AAEA,UAAG,MAAM,KAAE,IAAX;zBACE,qBAAY,MAAM;3BAElB,yBAAY;zBACd,YAAM,0BAAa,QAAC,YAAM,CAAuC,CAAT,CAAX,CAAlB,kBAAkB,GAAC,UAAD,CAAW,GAAC,QAAD,CAAS,GAAC,eAAD,CAAU,GAAC,GAAlD,CAAN;pIARW;AAWH;AAE5B,UAAI,YAAY,CAAC,IAAD;3BAFY;AAKD;AAAR;AAEnB,eAAQ;fAFW;AAAQ;AAKD;AAE1B,UAAG,MAAM,KAAE,IAAX;zBACE,cAAM,SAAS,CAAC,IAAD;5BAEf,YAAA,gBAAW,CAAC,IAAD;jCALa;AAryCf;AAmBU;;;AAEnB;AAFmB;;AAEnB,0BAFmB;;;1BAsae;AAAP;AAE7B,eAAQ,CAAC;hBACT,UAAY,oBAAD,QAAX,EACE,SAAQ,oBAAe,UADzB;/EAH6B;AAAO;AAOC;AAAR;AAG7B,eAAQ,CAAC;hBACT,UAAY,oBAAD,QAAX,EACE,SAAQ,oBAAe,WADzB;hFAJ6B;AAAQ;AAQM;AAAd;AAE7B,eAAQ;fACR,UAAG,iBAAY,CAAC,IAAK,GAAN,CAAf,EACE,SAAQ,CADV;hDAH6B;AAAc;AAOI;;AAErC;AACV,YAAI,eAAQ,KAAE,IAAd,EACE,eAAQ,aAAa,CAAC,sCAAY;;;;7FAAb,CADvB;bAH+C;AA1b7C;AA0b6C;;AA5b1B;;;AA2Bb;;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXM;AA4gDgB;AAAR;AAGhB;AACA;AAGA,eAAQ;fACR,UAAG,gBAAW,CAAC,IAAD;/BACd,UAAG,CAAC,KAAE,CAAC,CAAP,EACE,iBAAY,CAAC,EAAE;;;;7BAAE;;;;DAAL,CADd;XATgB;AAAQ;AAjJK;AAE7B;AACA,wBAAY;xBAHiB;AA4ZA;AAG7B;AACA;AAGA;AACE;AACA,YAAG,OAAH,EACE,YADF;jCAEA,YAAG;ZACH,eAAM,qBAAiB,CAAC,MAAM;;;;9BAAE;;;;DAAT,CAAvB,EACE,QAAG,CAAC,CAAD;zBANP;AAQE;AARF;AAP6B;AA1YD;AAAZ;AAEhB;AACA,eAAQ;fAHQ;AAAY;AANC;AAE7B;AACA,wBAAY;xBAHiB;AAtCO;AAApB;AAGhB;AACA,eAAQ;fAJQ;AAAoB;AAsVd;AAEtB,YAAM,qBAAgB,QAAC,aAAS,CAAC,IAAI,CAAC,qBAAQ,CAAC,IAAD,CAAT,CAAL,CAAT;zFAFD;AAKK;AAAX;AAGhB,eAAQ;fAHQ;AAAW;AAQF;AAAT;AAGhB,UAAG,KAAK,KAAC,CAAT;rBACA,eAAQ;fAJQ;AAAS;AAOC;AAAV;AAGhB;AACA;AAAE;AAGF;AAEA,UAAG,eAAU,KAAE,qBAAf;nDACE,aAAI;;bAEC;AACH,YADG,KACH;jBAAW,eAAI;fACf,kBAFG,KAEH;vBAAW,eAAI;fACf,kBAHG,KAGH,4CAAW,KAAI,IAAf;;5EAEJ,eAAQ;fACR,eAAO,SAAU,QAAL,eAAK,GAAC,CAAD,qBAAjB;xEAAI;AAEF,YAAG,QAAO,CAAC,CAAD;tBACV,iBAAQ,MAAM,GAAC,CAAD;3BACd,YAAK,CAAD,CAAC,GAAM,CAAL,eAAK,GAAC,CAAD,CAAN,CAAU,IAAG,CAAI,2BAAtB,EACE,SAAQ,MAAM,GAAC,EADjB;;7FAtBc;AAAU;AAyCA;AAI1B,UAAG,KAAK,KAAC,CAAT,EAAgB,MAAhB;7BACA,UAAG,OAAO,KAAC,IAAX,EAAoB,MAApB;lCAL0B;AAsDC;AAG3B;AACA,uBAAY,CAAC,MAAM,IAAP;lCAJe;AAcI;AAI/B,UAAG,QAAH;lBAJ+B;AA+NF;AAAb;AAEhB,eAAQ,wBAAW,CAAC,GAAG,EAAJ;7CAFH;AAAa;AAveI;AAC/B;AAAE;AACF;AAEH;AACA;AAEA,UAAG;VACH,UAAG;VACH,kBAAW;lBAOX;AACC;AACA,YAAG,qBAAH;jCAEE,iBAAM,CAAC,IAAS,MAAD,OAAf;nCAEC,gBAAa,CAAV,SAAU,IAAM,CAAD,CAAC,IAAS,MAAD,OAAR,CAAN,CAAwB,IAAc,CAAT,MAAM,QAAC,KAAD,CAAG,KAAC,eAAD,CAAnD,EAAyE,CAAJ,IAAG,CAAxE;zGAGA,gBAAG,CAAC,IAAS,MAAD,OAAZ;lCACC,kBAAG,MAAM,QAAC,KAAD,CAAG,KAAC,eAAb;1DAEC,oBAAG,CAAC,GAAC,CAAD;zBACJ,uBAAQ,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IACM,CAAd,CAAT,MAAM,QAAC,KAAD,CAAG,KAAE,eAAF,CAAc,IACA,CAAlB,CAAF,CAAD,CAAC,GAAC,CAAD,CAAE,IAAS,MAAD,OAAR,CAAkB,IAAgB,CAAX,MAAM,QAAE,CAAD,CAAC,GAAC,CAAD,KAAF,CAAK,KAAC,eAAD,CAAhB,CADA,CADhC;/KAGC,sBAAK,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IAAc,CAAT,MAAM,QAAC,KAAD,CAAG,KAAC,eAAD,CAArC;xFAA2D,qBAAJ,IAAM;zBACN,wBAAI,CAAJ,IAAG;;7BAG3D,wBAAG,CAAE,0BAAc,CAAC,eAAI,CAAC,OAAO,CAAC,GAAC,CAAD,CAAI,CAAD,CAAC,GAAC,CAAD,CAAE,GAAC,CAAhB,EACJ,eAAU,GAAC,eAAD,CAAY,gBAAY,cAAC,4CAAD,CADnC,CAAhB;5MAEH,oBAAG,CAAC,GAAC,CAAD;;zBAGJ,oBAAG;pBACH,uBAAQ,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IACV,CAAT,MAAM,QAAC,KAAD,CAAG,KAAE,eAAF,CADhB,EACqC,CAAJ,IAAG;hGACpC,wBAAG,CAAE,eAAI,CAAC,OAAO,EAAE,CAAC,GAAC,CAAZ,CAAN;xDACH,oBAAG;;;pBAGJ,kBAAG,SAAH,EAAkB,QAAG,CAAC,EAAD,CAArB;;zCAGD,wBAAW;;;xBAKZ,iBAAM,CAAC,IAAS,MAAD,OAAf;nCAEC,gBAAa,CAAV,SAAU,IAAM,CAAD,CAAC,IAAS,MAAD,OAAR,CAAN,CAAwB,IAAc,CAAT,MAAM,QAAC,KAAD,CAAG,KAAC,eAAD,CAAnD,EAAyE,CAAJ,IAAG,CAAxE;zGAGA,mBAAQ,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IAAmB,CAAV,MAAD,YAAQ,CAAD,IAAP,CAAW,IAAM,GAAD,aAAL,CAA7C,EAAgE,CAAJ,IAAG;hGAG/D,gBAAG,CAAC,IAAS,MAAD,OAAZ;lCACC,kBAAG,MAAM,QAAC,KAAD,CAAG,KAAC,eAAb;1DAEC,oBAAG,CAAC,GAAC,CAAD;zBACJ,uBAAQ,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IACM,CAAd,CAAT,MAAM,QAAC,KAAD,CAAG,KAAE,eAAF,CAAc,IACA,CAAlB,CAAF,CAAD,CAAC,GAAC,CAAD,CAAE,IAAS,MAAD,OAAR,CAAkB,IAAgB,CAAX,MAAM,QAAE,CAAD,CAAC,GAAC,CAAD,KAAF,CAAK,KAAC,eAAD,CAAhB,CADA,CADhC;/KAGC,sBAAK,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IAAc,CAAT,MAAM,QAAC,KAAD,CAAG,KAAC,eAAD,CAArC;xFAA2D,qBAAJ,IAAM;zBACN,wBAAI,CAAJ,IAAG;;7BAG3D,wBAAG,CAAE,0BAAc,CAAC,eAAI,CAAC,OAAO,CAAC,GAAC,CAAD,CAAI,CAAD,CAAC,GAAC,CAAD,CAAE,GAAC,CAAhB,EACJ,eAAU,GAAC,eAAD,CAAY,gBAAY,cAAC,4CAAD,CADnC,CAAhB;5MAEH,oBAAG,CAAC,GAAC,CAAD;;zBAGJ,oBAAG;pBACH,uBAA0B,CAAlB,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IACL,CAAV,MAAD,YAAQ,CAAD,IAAP,CAAW,GAAK,GAAD,aAAJ,CADK,CACM,IAChB,CAAT,MAAM,QAAC,KAAD,CAAG,KAAE,eAAF,CAFhB,EAEqC,CAAJ,IAAG;nJACpC,wBAAG,CAAE,eAAI,CAAC,OAAO,EAAE,CAAC,GAAC,CAAZ,CAAN;xDACH,oBAAG;;;pBAGJ,kBAAG,SAAH,EAAkB,QAAG,CAAC,EAAD,CAArB;;zCAID,mBAAQ,CAAD,CAAC,IAAS,MAAD,OAAR,CAAkB,IAAmB,CAAV,MAAD,YAAQ,CAAD,IAAP,CAAW,IAAM,GAAD,aAAL,CAA7C,EAAgE,CAAJ,IAAG;hGAE/D,wBAAW;;;xBA9Ef;AAkFE;AAlFF;AAhBkC;AA7NC;AAGlC,UAAG,CAAI,wBAAP;nCAEE,0BAAY;1BACZ,0BAAY;1BACZ,mCAAqB;nCACrB,oBAAM;pBACN,mCAAqB;nCACrB,0BAAY;nBAPd;PAHkC;AAkbF;AAAhB;AAGhB;AAGA,YAAG,EAAH;dACA,eAAQ;fACR,UAAkB,CAAN,KAAD,OAAO,GAAC,OAAD,CAAG,GAAC,CAAtB,EACE,aADF;rDAEA,WAAc,KAAM,QAAQ,CAAC,oBAAU,OAAC,GAAC,CAAb,CAAe,GAAC,CAAD;7DAC3C,UAAI,EAAE,GAAC,CAAP,EACE,KAAW,KAAD,OAAO,GAAC,CADpB;vCAEA,YAAG,eAAI,CAAC,MAAM,QAAE,EAAE,GAAC,OAAZ,CAAP;vDACA,YAAG,EAAE,GAAQ,mBAAD,OAAZ;3CACA,eAAQ;fAfQ;AAAgB;AAmEP;AAEf;AACV,0BAAc;1BAHW;AAPA;AAGf;AAHe;AAaN;AAAH;AAGhB,eAAQ;fACR,iBAAO,CAAC,gBAAM,CAAP;nCAJS;AAAG;AAeM;AAAT;AAGhB,eAAQ,QAAG,CAAC,CAAD;zBACX,oBAAO,CAAC,OAAS,OAAV;nCAJS;AAAS;AAqCE;AAEzB;AAEF,eAAY,SAAqB,QAAhB,UAAU,SAAC,EAAK,GAAC,CAAD,qBAAjC;9EAAI;AACF,YAA+D,UAAhD,CAAC,UAAU,KAAC,MAAD,EAAS,UAAU,UAAQ,CAAC,MAAD,CAAtC;;1EALU;AA+CJ;AAGvB;AAGA,UAAa,aAAH,eAAP,MAAO,CAAV;7CAEE,YAAY;ZACZ;AACA;AACE;AACA,qCAAqB,CAAC;tCACtB,4BAAY,CAAC;7BACb,4BAAY,CAAC;7BACb,qCAAqB,CAAC;tCACtB,sBAAM,CAAC;vBACP,4BAAY,CAAC;7BACb,yBAAU,CAAC,CAAD;3BARZ;AAUE;AAVF;OAcA,MAAgB,kCAAC,MAAD;rDAxBK;AA6BK;AAG3B,UAAG,iBAAa,KAAE,CAAlB,EAAyB,mBAAc,CAAC,IAAD,CAAvC;5DACI,uBAAJ,IAAG;3BAJwB;AASF;AAG1B,UAAG,iBAAY,GAAC,CAAhB,EACO,iBAAJ,IAAG,CADN;vDAEA,UAAG,iBAAY,KAAC,CAAhB,EACE,mBAAc,CAAC,KAAD,CADhB;7DAL0B;AAsEH;AAAP;AAEhB,eAAQ;fACR,aAAa,CAAN,MAAM,GAAC,eAAD,CAAQ,IAAqC,CAAhC,kBAAa,CAAC,QAAO,CAAC,MAAD,EAAS,CAAjB,CAAmB,KAAE,CAAF,CAA1D,EAAkE,SAAQ,MAAM,GAAC,CAAD;9GAChF,UAAG,MAAM,KAAC,eAAV,EAAqB,SAAQ,CAAC,CAA9B;jDAJgB;AAAO;AAQI;AAAX;AAEhB;AACA;AAEA;AACA,eAAQ;fACR,aAAO,MAAM,GAAC,eAAd;rCAEE,YAAG,QAAO,CAAC,MAAD;3BACV,cAAK,cAAG,CAAC,yBAAoB,CAArB,CAAuB,GAAC,CAAD;5DAC/B,YAAO,CAAH,GAAG,IAAE,CAAF,CAAK,IAAsC,CAAjC,kBAAa,CAAC,KAAK,eAAI,CAAC,EAAE,EAAE,GAAL,CAAV,CAAoB,KAAC,CAAD,CAAlD,EACE,aADF;lGAEI,cAAJ,IAAG;;lBAEL,eAAQ,CAAC;hBAfO;AAAW;AAhkBE;AAE3B;AAGF;AACA,iBAAQ,QAAO,CAAC,KAAD,CAAf;hCACA,UAAG,cAAG,CAAC,yBAAoB,YAArB;9DACN,UAAG,CAAC,KAAE,CAAN;jBAEE,kBAAO,eAAI,CAAC,aAAO,EAAE,CAAC,GAAC,CAAZ,CAAX;vDAEA,mBAAQ,eAAI,CAAC,aAAO,CAAC,GAAC,CAAD,CAAU,YAAD,OAAQ,GAAC,CAA3B,CAAZ;vEAGA,gBAAO,EAAP;zBAf2B;AAr+CrB;AAyGG;;AACR;AACA;;AADA;AACA;;AAFQ;aACR,4BACA;zCAFQ;;AAaA;AAHM;AAGN;;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAVS;;AAET,gBAFS;hBAIT,oBAJS;pBAKT,sBALS;;;tBAi/DyB;AAGpC;AACA;AAGA,UAAG,UAAK,CAAC,MAAD,CAAQ;5BAChB,UAAG,UAAK,CAAC,MAAD,CAAQ;5BAChB,gBAAK,CAAC,MAAD,CAAQ,QAAb,GAAuB,UAAK,CAAC,MAAD,CAAQ;rDACpC,gBAAK,CAAC,MAAD,CAAQ,QAAb,GAAuB,UAAK,CAAC,MAAD,CAAQ;rDACpC,gBAAK,CAAC,MAAD,CAAQ,QAAb,GAAuB;nCACvB,gBAAK,CAAC,MAAD,CAAQ,QAAb,GAAuB;nCAZa;AAeR;AAAT;AAEnB,eAAQ,eAAW,IAAG,cAAC,+BAAQ,8BAAT,CAAH;9GAFA;AAAS;AAYJ;AAGxB;AAGA,WAAI;XACJ,UAAG,EAAE,IAAE,GAAP;nBACE,aAAI,EAAE,GAAK,WAAH,EAAG,GAAI,CAAJ,CAAL;pCACH,gBAAG,EAAE,KAAC,CAAN;xBACH,aAAI;bAEJ,iBAAI,EAAE,GAAC,CAAD;vBACR,sBAAW,CAAC,EAAD;zBAba;AAgBS;AAGjC;AAGA,UAAG,SAAU,GAAE,WAAf;jCAEI,YAAG,iBAAH;7BAEI,mBAAO,iBAAmB,QAAN,WAAM,GAAC,CAAD,qBAA1B;hFAAI;AAEA,sBAAK,CAAC,CAAD,CAAG,QAAR,GAAkB;pCAClB,mCAAU,CAAS,CAAH,GAAL,UAAK,CAAC,CAAD,GAAG;;;;vCAAT;;;hBAKd,mBAAO,iBAAmB,QAAN,WAAM,GAAC,CAAD,qBAA1B;hFAAI;AACF,sBAAK,CAAC,CAAD,CAAG,QAAR,GAAkB;;;pCAExB,sBAAQ;fAfZ;PAiBA,UAAG,CAAI,SAAP,EACE,gBAAW,CAAC,CAAD,CADb;zCAvBiC;AA4BJ;AAK7B;AAAO;AAAI;AAKX,UAAK,CAAF,CAAE,GAAE,CAAF,CAAI,IAAG,CAAZ;tBACE,YAAG,CAAE,GAAE,CAAP,EACE,IAAG,SAAS,CAAC,KAAM,EAAG,CAAV,CAAa,GAAE,CAA3B,EACE,kBAAa,CAAC,EAAG,CAAJ,CAFjB;vEAIA;OALF;PAQA,WAAM;XACN,WAAM;XAEN,cAAS,CAAE,GAAE,iBAAM,CAAC,CAAE,GAAE,CAAL,CAAR;1CAEX,aAAM,EAAG,GAAE,EAAX;pBACE,eAAU,CAAH,EAAG,GAAE,KAAF,CAAS,IAAgC,CAA3B,SAAS,CAAC,KAAM,GAAI,KAAX,CAAkB,IAAG,CAAH,CAAnD,EACM,EAAJ,IAAG;tEAEL,eAAU,CAAH,EAAG,GAAE,KAAF,CAAS,IAAgC,CAA3B,SAAS,CAAC,KAAM,GAAI,KAAX,CAAkB,GAAE,CAAF,CAAnD,EACM,EAAJ,IAAG;rEAEL,0BAAa,CAAC,GAAI,EAAL;hCAEb,YAAG,KAAM,KAAE,EAAX;xBACE,kBAAS;lBACN,kBAAG,KAAM,KAAE,EAAX,EACH,QAAS,EADN;;1CAIP,UAAS,CAAN,KAAM,GAAE,CAAF,CAAI,IAAG,CAAhB,EACE,cAAS,CAAC,EAAG,KAAM,GAAE,CAAF,CAAK,SAAf,CADX;jEAEA,UAAS,CAAN,KAAM,GAAE,CAAF,CAAI,IAAG,CAAhB,EACE,cAAS,CAAC,KAAM,GAAE,CAAF,CAAK,EAAG,SAAf,CADX;jEAxC6B;AAmEA;AAG7B,UAAG,KAAH;fACE,0BAAW,8BAAX;xDAEA,8BAAW,8BAAX;5DAN2B;AAyLG;AAEhC,UAAG,eAAU,KAAC,MAAd,EAA0B,MAA1B;5CACA,UAAI,MAAM,KAAC,8BAAX,EACE,WADF;hEAEA,wBAAY;xBALoB;AAQF;AAE9B,UAAU,CAAN,MAAM,GAAC,CAAD,CAAI,IAAU,CAAN,MAAM,IAAE,WAAF,CAAxB,EACE,UAAK,CAAC,8BAAgB,MAAjB,CADP;nGAF8B;AAtTG;AAEjC,2BAAgB,CAAC,OAAQ,MAAT;zCAFiB;AAgIN;AAG3B,UAAI,iBAAY,KAAC,CAAjB;jCAEC,YAAY,cAAD,QAAX,EACE,cAAS,CAAC,IAAD,CADX;jDAFD;PAH2B;AAYC;AAG5B,UAAG,iBAAY,KAAC,CAAhB,EACE,IAAY,gBAAD,QAAX,EACE,gBAAW,CAAC,IAAD,CAFf;vFAH4B;AAUN;AAAH;AAGnB,qBAAU,CAAC,KAAD;3BACV,eAAQ,UAAK,CAAC,KAAD,CAAO;hCAJD;AAAG;AASQ;AAAX;AAGnB,eAAc,WAAC,UAAD;pCAHK;AAAW;AAQH;AAAR;AAGnB,eAAQ;fAHW;AAAQ;AAQC;AAAT;AAGnB,qBAAU,CAAC,KAAD;3BACV,eAAQ,UAAK,CAAC,KAAD,CAAO;hCAJD;AAAS;AAsBC;AAG7B,qBAAU,CAAC,KAAD;3BACV;AACA,gBAAK,CAAC,KAAD,CAAO,QAAZ,GAAsB;lCACtB;AAN6B;AAWE;AAG/B,UAAI,WAAW,GAAC,CAAhB,EACG,UAAM,CAAC,iCAAmB,WAApB,CADT;nFAEA,UAAG,WAAW,KAAE,kBAAhB,EACY,UAAD,sBAAC,4BAAM,WAAP,CADX;tHAL+B;AAWG;AAGlC,UAAG,QAAH;lBACE;AAEA;AANgC;AA5HJ;AAE9B,uBAAU,CAAC,MAAO,EAAG,IAAX;pCAFoB;AAMA;AAG9B;AAGA;AACA,UAAG,WAAM,KAAC,kBAAV,EAAwB,WAAxB;zDACA,QAAE,QAAF,GAAY;nBACZ,QAAE,QAAF,GAAY;nBACH,gBAAM,OAAO,CAAC,MAAM,EAAE,EAAT;lCAClB,iBAAJ,IAAG;rBACH;AAZ8B;AAwNE;AAAb;AAEnB,UAAG,mBAAH;7BACE,iBAAQ,uBAAU,CAAC,GAAG,EAAJ;9CAElB,qBAAQ,wBAAW,CAAC,GAAG,EAAJ;nDALF;AAAa;AAvFJ;AAG5B,yBAjuEgD,EAAyB;3BAkuE/D;AAJkB;AASN;AAAH;AAGnB,UAAG,CAAc,CAAT,eAAS,KAAC,8BAAD,CAAjB;/DACE,iBAAQ;jBAER,gBAAG,SAAK,CAAC,EAAE;;;;lBAAH,CAAR;XACO;AACH,YADG,KACH;jBAAY;AACZ,kBAFG,KAEH,qCAAW,UAAK,CAAC,+BAAiB,CAAlB,CAAhB;jGAHJ;PAKD,qBAAW,CAAC,OAAO,CAAR;9BAXO;AAAG;AAcG;AAGzB,UAAG,WAAO,KAAE,CAAZ,EAAmB,MAAnB;nCACA;AACA,yBA1vEgD,EAAyB;3BA2vEzE;AANyB;AASC;AAG1B,qBAAU,CAAC,KAAD;3BACV;AACA,UAAG,iBAAH,EACE,uBAAU,CAAa,CAAP,GAAL,UAAK,CAAC,KAAD,GAAO;;;;lEAAb,CADZ;XAES,gBAAM,OAAO,CAAC,MAAM,CAAP;/BACtB,gBAAK,CAAC,eAAK,GAAC,CAAP,CAAS,QAAd,GAAwB;hDACxB,gBAAK,CAAC,eAAK,GAAC,CAAP,CAAS,QAAd,GAAwB;hDACpB,iBAAJ,IAAG;rBACH;AAX0B;AAsEH;AAAJ;AAGnB;AAAG;AAAG;AACN;AAEA,eAAU;fACV,gBAAO,CAAC,CAAR;lBACA,UAAG,CAAI,gBAAP,EACE,MAAM,eAAU,QAAC,YAAM,CAAC,qCAAD,CAAN,CADnB;9GAGA,UAAK;VACL,UAAK,eAAM,GAAE,CAAF;7BACX,aAAO,CAAC,IAAE,CAAV;nBAEE,YAAK,CAAE,GAAU,WAAL,CAAF,CAAE,GAAE,CAAF,CAAK,GAAI,CAAJ,CAAV;vCACP,qBAAc,kBAAa,CAAC,EAAG,UAAK,CAAC,CAAD,CAAG,QAAZ;/DAC3B,YAAI,UAAU,GAAC,CAAf;1BACE,cAAK,CAAC,GAAC,CAAD;;nBAEN,cAAK,CAAC,GAAC,CAAD;nBACN,cAAI,UAAU,KAAC,CAAf;9BACG,qBAAU;rBACV,gBAAI,gBAAU,KAAE,+BAAhB,EACG,IAAK,CADR;hEAFH;;;XAOJ,gBAAS,CAAT;jBA5BmB;AAAI;AAiCG;AAAP;AAGnB,UAAG,CAAI,gBAAP;3BACE,iBAAyB,gCAAC,CAAD;lDAGzB,gBAAG,CAAI,SAAK,CAAC,EAAE;;;;nBAAH,CAAZ,EACE,SAAQ,CAAC,CADX;xBAPiB;AAAO;AAaA;AAG1B,UAAG,eAAS,KAAC,8BAAb;5DACE,kBAAM,CAAC,+BAAiB,CAAlB;;nDAGN,YAAS,CAAL,KAAK,GAAC,CAAD,CAAI,IAAS,CAAL,KAAK,GAAC,WAAD,CAAtB,EACE,UAAK,CAAC,8BAAgB,KAAjB,CADP;jGAEA,uBAAW,CAAC,MAAM,CAAP;;/BATa;AAgCF;AAGxB,qBAAU,CAAE,2BAAF;jDAHc;AAlBM;AAG9B,UAAe,CAAX,eAAW,IAAI,CAAe,CAAV,eAAU,KAAC,8BAAD,CAAnB,CAA+B,IAAW,CAAN,WAAM,GAAC,CAAD,CAAzD;zGAEE;AACA,sBAAS,CAAC,EAAE,WAAM,GAAC,CAAD,CAAI,SAAb;lDACT;OAJF;PAH8B;AA94EnB;AA4DI;;;AAEb;AACA;AAHa;;AAEb,sBAFa;;;tBA+2EgB;AAAR;AAGvB,UAAG,gBAAW,KAAE,IAAhB;nCACE,iBAAQ,gBAAW,OAAO,QAAQ,CAAC,IAAD;rDAElC,qBAAQ,CAAC;tBANY;AAAQ;AAWM;AAGrC,UAAG,KAAK,KAAE,gBAAV;pCAEE,YAAG,gBAAW,KAAE,IAAhB,EAAyB,gBAAW,WAAW,CAAC,IAAD,CAA/C;xEACA,YAAG,KAAK,KAAE,IAAV,EAAmB,KAAK,WAAW,CAAC,IAAD,CAAnC;3CAHF;PAHqC;AAYN;AAGhC,UAAe,CAAX,gBAAW,KAAE,IAAF,CAAO,IAA4B,CAAvB,gBAAW,aAAY,KAAC,CAAD,CAAlD;9EAEC,YAAG,QAAH;pBACE,0BAAW,OAAO,CAAC,IAAD;tCAElB,cAAA,gBAAW,OAAO,CAAC,IAAD;nCALrB;PAHgC;AAwBA;AAAR;AAGvB,eAAQ;fAHe;AAAQ;AAgBC;AAE9B;AAGF,aAAM;bACN,UAAQ,CAAJ,IAAI,GAAC,CAAC,CAAF,CAAK,IAAS,CAAJ,IAAI,KAAE,KAAF,CAAtB;zCAEE,wBAAW,OAAO,KAAK,CAAC,KAAK,KAAN;/CACvB,oBAAO,CAAC,IAAD;lBAHT;PANgC;AAcM;AAGtC,kBAAO,CAAC,KAAD;xBACP,UAAG,KAAK,KAAC,EAAT;tBAJsC;AASN;AAGtB;AACV,wBAAa,CAAC,WAAD;pCAJmB;AASA;AAGhC,wBAAa,CAAC,IAAD;7BACH;AAJsB;AA98EjB;AAoCQ;AAGZ;;;AAET;AACA;AACA;AACA;AALS;;AAET,qBAFS;rBAGT,iBAHS;;;jBA+8EgB;AAAR;AAGnB,eAAQ,WAAM;1BAHK;AAAQ;AAqDG;AAE9B,UAAG,CAAY,eAAH,eAAL,IAAK,CAAZ,EACE,MADF;tDAEA,iBAAM,IAAI,CAAC,IAAD;1BACV,UAAI,YAAJ,GAAkB;zBAClB,UAAI,IAAJ,GAAU;jBACN,kBAAJ,IAAG;tBACH,sBAAW,CAAC,IAAD;3BACX,iBAAM,CAAC,KAAK,oCAAN;3DACN;AAV8B;AAcA;AAG9B;AAGA,iBAAM,CAAC,KAAK,yCAAN;hEACN,UAAG,WAAM,YAAY,CAAC,KAAK,4BAAN;nEACrB,UAAI,CAAC,KAAE,CAAC,CAAR,EACE,WAAM,OAAO,CAAC,CAAD,CADf;zCAEA,UAAI,YAAJ,GAAkB;zBAClB;AAX8B;AAgJH;AAE3B;AAEA,aAAM,WAAM,OAAM,GAAC,CAAnB;nCAEE,eAAqB,cAAC,WAAM,OAAP;/CACrB,YAAY,IAAD,QAAX,EACE,IAAI,SAAC,WADP;;lDAPyB;AA5FA;AAE3B,UAAG,iBAAY,KAAC,CAAhB,EACE,WAAM,CAAC,IAAD,CADR;pDAF2B;AAOD;AAAP;AAEnB,eAAuB,cAAC,WAAM,IAAM,CAAC,KAAD,CAAb;nDAFJ;AAAO;AAYK;AAE/B,UAAG,IAAI,KAAC,IAAR;vBAF+B;AAKL;AAE1B,UAAG,IAAI,KAAC,IAAR;vBAF0B;AA0HA;AAE1B,UAAG,IAAI,KAAC,IAAR;vBACA,UAAG,MAAM,KAAC,oCAAV;zDAH0B;AApHE;AAElB;AACV,wBAAY;xBACZ,oBAAQ,YAAO,QAAC;xCAJY;AAQA;AAE5B,0BAAc;1BACd;AACE;AADF;AAGE,4BAAc;5BAHhB;AAKA,UAAY,WAAD,QAAX,EACE,WAAM,SAAC,WADT;9DAEU;AAVkB;AAnKJ;AAAL;AAEnB,eAAQ;fAFW;AAAK;AAiLF;AAAH;AAEnB,eAAQ,eAAU,QAAC,YAAM,CAAC,IAAD,CAAN;xDAFA;AAAG;AAMI;AACxB;AAEF,UAAa,gBAAH,eAAP,MAAO,CAAV;hDAEE;AACA,iBAAO,SAA8B,QAAb,MAAO,SAAC,EAAK,GAAC,CAAD,qBAArC;5EAAI;AACH,oBAAG,OAAO,CAAa,MAAO,QAAM,CAAC,CAAD,CAA1B;;7CACX;OAGA,MAAgB,kCAAC,MAAD;rDAXQ;AAeK;AAE3B,uBAAJ,IAAG;3BAF4B;AAMN;AAEzB,UAAG,WAAM,OAAM,KAAC,CAAhB,EACE,MADF;1CAEA;AACA;AACE;AADF;AAGE;AAHF;AALyB;AA0BI;AAE7B,UAAG,iBAAY,GAAC,CAAhB,EACM,iBAAJ,IAAG,CADL;vDAEA,UAAG,iBAAY,KAAC,CAAhB,EACE,cADF;jDAJ6B;AAuBH;AAE1B;AAEA,aAAqB,cAAC,WAAM,KAAC,KAAD,CAAP;jDACrB,iBAAM,CAAC,KAAK,uCAAN;9DACN,UAAY,IAAD,QAAX,EACE,IAAI,SAAC,WADP;hDAN0B;AAtsFf;AAgDK;;;AAEd;AAFc;;AAEd,iBAFc;;;jBA6sFgB;AAAR;AAGxB,eAAQ;fAHgB;AAAQ;AAPC;AAGjC,oBAAU;pBACM,0CAAC,UAAD;pDAJiB;AAtsFjB;AAWN;AAES;AAIA;AAoBT;;;AAER;AACA;AACA;AACA;AACA;AAEA;AASA;AACA;AACA;AAnBQ;;AAER,iBAFQ;jBAKR,sBALQ;tBAMR,wBANQ;xBAQR,0BARQ;1BAiBR,0BAjBQ;;;1BAmrFqB;AAAZ;AAGnB,UAAG,CAAY,CAAC,gBAAD,SAAf;rCACE,iBAAQ;jBAER,qBAAkB,cAAC,gBAAW,IAAM,CAAC,MAAD,CAAlB;/DAND;AAAY;AASK;AAAjB;AAGnB,UAAG,CAAY,CAAC,gBAAD,SAAf;rCACE,iBAAQ;jBAER,qBAAQ,gBAAW;rCANF;AAAiB;AAoBX;AAGzB,UAAG,CAAY,CAAC,gBAAD,SAAf,EACE,mBAAa,YAAO,QAAC,UADvB;xFAEA,sBAAW,IAAI,CAAC,UAAD;rCACf,gBAAU,OAAV,GAAmB;1BANM;AAUA;AAGzB,gBAAU,OAAV,GAAmB;1BACnB,UAAY,gBAAD,QAAX;lCAEE,wBAAW,OAAO,CAAC,UAAD;1CAClB,YAAG,gBAAW,OAAM,KAAC,CAArB;zCAEE,0BAAW,SAAC;nCACZ,6BAAa;pBAHf;FAHF;PAJyB;AAgBY;AAGrC,UAAG,kBAAa,KAAE,IAAlB;rCAEE,0BAAa,OAAO,CAAC,UAAD;5CACpB,YAAG,kBAAa,OAAM,KAAC,CAAvB;3CAEE,4BAAa,SAAC;rCACd,+BAAe;/BACP,8BAAD,kBAAC,qBAAgB,2CAAjB;vGAJT;FAHF;PAHqC;AAwCR;AAG7B,mBAAO;nBAHsB;AAqCF;AAAR;AAGnB,eAAQ;fAHW;AAAQ;AAOF;AAAP;AAElB,eAAU;fAFQ;AAAO;AAKD;AAAN;AAElB,eAAU;fAFQ;AAAM;AAKC;AAGjB,0BAAD,kBAAC,qBAAgB,kCAAjB;nGAHkB;AAMC;AAGlB,0BAAD,kBAAC,qBAAgB,kCAAjB;nGAHmB;AAOK;AAI/B;AAGA,UAAI,SAAS,KAAC,wBAAd,EACE,2BAAsB,CAAC,UAAD,CADxB;zFAEA,UAAG,CAAY,CAAC,gBAAD,SAAf,EACE,MADF;7CAEA,UAAG,gBAAW,OAAM,GAAC,CAAD;rCACpB,aAAO,CAAC,IAAE,CAAV;nBAEY,sBAAC,gBAAW,IAAM,CAAC,CAAD,CAAlB,CAAsB,aAAa,CAAC,WAAW,SAAZ;hFACzC,SAAJ,IAAG;bACH,YAAG,CAAC,IAAE,gBAAW,OAAjB,EACE,IAAG,gBAAW,OAAM,GAAC,CADvB;;zEAhB6B;AA2CA;AAE7B;AAGF,UAAG,KAAH;fACU,4BAAD,kBAAC,qBAAgB,oCAAjB;vGAEP,YAAQ,oBAAD,kBAAC,qBAAgB,oCAAjB;3GACT,UAAW,CAAC,gBAAD,SAAc,IAAI,WAA7B,EACE,SAAY,SAAuB,QAAlB,gBAAW,OAAO,GAAE,CAAF,qBAAnC;/HAAI;AACQ,sBAAC,gBAAW,IAAM,CAAC,MAAD,CAAlB,CAA2B,aAAa,CAAC,MA32FU,IA22FX;pEAFtD;PAT+B;AAiCL;AAG1B,UAAG,UAAK,KAAC,OAAT,EAAsB,MAAtB;xCACA,UAAW,CAAP,OAAO,KAAE,EAAF,CAAM,IAAI,CAAI,yBAAY,CAAC,QDluGwB,MAA6B,KCkuGtD,CAArC,EACE,MAAM,oBAAe,QAAC,aAAS,CAAC,2BAAa,CAAC,OAAD,CAAd,CAAT,CADxB;rKAEA,UAAY,WAAD,QAAX;7BACE,mBAAM,eAAe,CAAC,KAAK,WAAM,OAAZ;1DAErB,YAAA,mBAAc,CAAC,KAAI,WAAM,OAAX;vDAChB,qBAAU,CAAC,OAAD;7BAVgB;AAcM;AAIhC,UAAG,KAAK,KAAC,IAAT;xBACA,UAAG,KAAK,KAAC,CAAT;rBALgC;AASN;AAE1B,mBAAS;nBAFiB;AAKD;AAEzB,kBAAQ;lBAFiB;AA0BQ;AAKjC,UAA2D,CAAtC,CAAP,CAAV,UAAU,KAAE,IAAF,CAAO,IAAiC,CAA5B,wBAAW,CAAC,QAAQ,OAAT,CAAiB,KAAE,CAAF,CAAjC,CAAsC,IAAsB,CAAjB,UAAU,OAAO,KAAE,IAAF,CAAtB,CAA8B,IAC/D,CAAtB,kBAAa,CAAC,OAAD,CAAS,KAAE,IAAF,CAD1B,EAEI,MAAM,oBAAe,QAAC,aAAS,CAAC,6BAAe,CAAC,OAAD,CAAhB,CAAT,CAF1B;5PAGA,UAAgB,CAAZ,oCAAY,IAAG,oBAAH,CAAoB,IAAW,CAAN,WAAM,KAAE,IAAF,CAA/C,EACE,WAAM,eAAe,CAAC,WAAW,QAAQ,OAApB,CADvB;1JARiC;AAaG;AAGpC,gBAAU,eAAe,CAAC,IAAD;pCAHW;AAOH;AAIjC,UAAG,UAAU,KAAC,IAAd;7BAJiC;AAQN;AAG3B,6BAAiB,cAAC,sCAAD;jFACjB,UAAY,MAAD,QAAX,EAAyB,MAAM,gBAAgB,CAAC,IAAD,CAA/C;tDAJ2B;AAQA;AAG3B;AACA;AAGA;AACA,UAAY,kBAAD,QAAX;pCAEE,YAAG,kBAAa,OAAM,GAAC,CAAD;zCACtB,eAAO,CAAC,IAAE,CAAV;rBAEE,cAAa,cAAC,kBAAa,IAAM,CAAC,CAAD,CAApB;rDAEb,4BAAa,OAAO,CAAC,CAAD;rCACpB,WAAC,aAAc,CAAC,KAAK,wBAAN;tDACf,cAAI,kBAAa,KAAC,IAAlB;zCACE,gBAAG;hBACA,oBAAI,CAAC,GAAC,kBAAa,OAAnB,EACH,IAAG,kBAAa,OADb;hFAED,WAAJ,IAAG;;fAEL,+BAAU,CAAC;;;;pBAAD;LAfZ;PAiBA;AACA,UAAG,WAAM,KAAE,IAAX,EAAoB,WAAM,gBAAgB,CAAC,IAAD,CAA1C;jEACU;AA3BiB;AAoCS;AAEpC,UAAG,CAAiB,CAAb,qCAAa,IAAG,oBAAH,CAApB,EACE,iBADF;7FAFoC;AAWA;AAElC;AAGF,aAAe,gBAAD,QAAd;rCAEE,qBAAsB,cAAC,gBAAW,OAAZ;1DACtB,mBAAM,CAAC,UAAD;9BACN,kBAAU,SAAC;;3BATuB;AAcP;AAE3B;AAGF,UAAG,qCAAa,IAAG,oBAAnB,EAAwC,MAAxC;/EACS,0BAAD,kBAAC,qBAAgB,qCAAjB;tGACR,UAAY,gBAAD,QAAX,EACE,SAAY,SAAsB,QAAjB,gBAAW,OAAM,GAAC,CAAD,qBAAlC;9GAAI;AACQ,sBAAC,gBAAW,IAAM,CAAC,MAAD,CAAlB,CAA2B;5CAFzC;PAP6B;AA9BQ;AAErC;AAFqC;AAWC;AAEtC;AAFsC;AAxRR;;AAwTF;;AAKI;AAAb;AAEjB;AAGF,eAAQ;fACR,UAAS,CAAL,KAAK,KAAC,EAAD,CAAK,IAAG,CAAY,CAAC,gBAAD,SAA7B,EAAgD,aAAhD;tEACA,eAAO,SAAsB,QAAjB,gBAAW,OAAM,GAAC,CAAD,qBAA7B;hFAAI;AACF,YAAI,wBAAW,CAAW,cAAC,gBAAW,KAAC,CAAD,CAAZ,CAAgB,OAAM,KAAjC,CAAuC,KAAC,CAAvD;9FAEE,mBAAkB,cAAC,gBAAW,IAAM,CAAC,CAAD,CAAlB;xDAClB;SAHF;;TARiB;AAAa;AAgBG;AAGnC,UAAS,CAAL,WAAK,KAAE,IAAF,CAAO,IAAe,CAAV,UAAU,KAAC,WAAD,CAA/B,EAA4C,MAA5C;xEACA,UAAG,CAAa,CAAC,kBAAD,SAAhB,EACE,qBAAe,YAAO,QAAC,UADzB;5FAEA,UAAG,kBAAa,QAAQ,CAAC,UAAD,CAAY,KAAC,CAAC,CAAtC;vDAEE,0BAAa,IAAI,CAAC,UAAD;zCACjB,kBAAU,iBAAkB,CAAC,IAAD;jCAH9B;PANmC;AAcM;AAEzC,6BAAkB,CAAC,UAAD;xCAClB,gBAAU,mBAAoB,CAAC,IAAD;xCAHW;AAqBP;AAGlC,gBAAU,kBAAkB,CAAC,IAAD;vCAC5B,yBAAc,CAAC,WAAW,GAAG,UAAU,MAAzB;xDACd,iBAAM,CAAC,UAAD;5BACN,UAAG,oCAAY,IAAG,oBAAlB,EACE,UAAU,aAAa,CAAC,KApmGuC,IAomGxC,CADzB;1GAEA,uBAAY,CAAC,WAAW,wBAAZ;3DARsB;AAYA;AAGlC,uBAAY,CAAC,WAAW,wBAAZ;3DACZ,iBAAM,CAAC,UAAD;5BACN,gBAAU,aAAa,CAAC,MA9mGyC,IA8mG1C;xCACvB,yBAAc,CAAC,WAAW,UAAU,OAAO,EAA7B;xDANoB;AAzoGxB;AA6EK,4BA5FD,WA4FC;vCACD,2BL3iBR,cK2iBQ;zCA9EJ;AAuqGW;AAGrB,mBAAgB,CAAN,MAAM,YAAhB,GAA6B;zCAHR;AAevB;AACE,sBAAW,MAAS,OAAO,CAAC,IAAD;xCAD7B;AAlrHA,GAilBc,MAjlBd;;;TAilBc;AA4oEgB;AAArB;AAGP,aAAU,IAAI,cAAc,CAAC,IAAI,MAAM,CAAC,MAAD,CAAQ,SAClB,IAAI,MAAM,CAAC,KAAD,CAAO,QADlB;pFAHrB;AAAqB;AAo8B5B;AAjqHF;ACIA,kBAES,uBAFT;;;zCA6vEgB;;AACZ;;;;AADY;aACZ;bADY;;AA6SH;AAEN,eAAG;fAEE,oBAAG;pBACJ,mBAAG;nBAOL,iBAAG;jBAIH,iBAAG;jBACL,eAAG;fAEG,qBAAG;rBACH,qBAAG;rBACF,sBAAG;tBACN,mBAAG;nBACN,gBAAG;hBACH,gBAAG;hBACC,oBAAG;pBACL,kBAAG;lBACA,qBAAG;rBAKN,kBAAG;lBAGH,kBAAG;lBASH,kBAAG;lBAKJ,iBAAG;jBA6CN,cAAG;dACH,cAAG;dACH,cAAG;dACH,cAAG;dACH,cAAG;dACH,cAAG;dACH,cAAG;dACH,cAAG;dACH,cAAG;dACF,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fAjHG;AA1iFb;ACJA,mBAIS,qBAJT;;;;xCA2QkB;AAAT;AAEP,QAAI,OAAO,KAAC,GAAZ,EACE,UAAS,QAAG,CAAC,QAAG,CAAC,QAAG,CAAC,CAAD,EAAI,QAAG,CAAC,CAAD,CAAX,CAAe,GAAC,KAAD,CAAiB,KAApC,CADd;5FAEA,QAAI,CAAC,GAAC,CAAN;bACE,eAAW,CAAD,CAAC,GAAC,CAAD,CAAG,IAAE,OAAF;jCAEd,mBAAW,CAAD,CAAC,GAAC,CAAD,CAAG,IAAE,OAAF;rCAPT;AAAS;AAoBJ;AAAL;AAIP,aAAQ,gBAAK,CAAC,UAAO,CAAC,CAAD,CAAR;3CAJN;AAAK;AAgKG;AAAR;AAGP,aAAQ,GAAG,GAAI,CAAF,OAAE,GAAC,KAAD,CAAJ;pCAHJ;AAAQ;AAhSJ,qBAAG;rBACD,uBAAM;vBACH,0BAAO;1BAsrBJ;AAAZ;AAEP,aAAQ;bACR,QAAG,QAAG,CAAC,CAAC,GAAC,CAAH,CAAK,IAAE,KAAb;hCACE,eAAQ;fAET,cAAG,CAAC,GAAC,CAAL,EACE,SAAQ,EADV;hCANM;AAAY;AAv1BrB;;;AAwKc;AAgFG,0BAAG;1BAxPpB;ACIA,sBAES,+BAFT;;;rDAqDa;;;AAET;AAFS;AAmmBe;AAG1B;AAGA,UAAG,iBAAH,EACE,IAAI,MAAM,KAAC,uCAAX;nFAEE,YAAU,cAAC,GAAD;7BACV,SAAE,eAAF,CAAE;lBAJN;PAMgB,yCAAC,IAAI,MAAL;nDAZU;AAgBA;AAAP;AAEnB,eAAe,cAAc,gCAAC,KAAD,CAAd;nEAFI;AAAO;AAtBE;AAElB;AACV,0BAAc;1BAHc;AAmCN;AAAH;AAEnB,eAAqB,gCAAQ,cAAC,OAAD,CAAR;rEAFF;AAAG;AAYG;AAAN;AAEnB,eAAwB,mCAAQ,cAAC,OAAD,CAAR;xEAFL;AAAM;AAMC;AAAP;AAEnB,eAAyB,oCAAQ,cAAC,OAAD,CAAR;zEAFN;AAAO;AA4BA;AAEV,yCAAC,MAAa,cAAC,OAAD,CAAd;rEAFU;AA9qBf;AArDb,GAuac,KAvad;RCDA,8BAES,uCAFT;;;;rEAQY,oBAAG;pBAEP,gBAAG,CAAC;jBACH,iBAAG;jBAQF,kBAAG;lBASJ,iBAAG;jBACD,mBAAG;nBACH,mBAAG;nBACA,sBAAG;tBACP,kBAAG;lBAwKI,yBAAG;zBAsBA;AAET;;AAGE;;AAGD;;AAEC,iCAFD,kCAEC;nEAEC;AAEC;;AACX;AACA;;AADA;AACA;;AAFW;aACX,gBACA;7BAFW;;AAKD;;AACV;AAAM;AAAK;AAAO;;AAAlB;AAAM;AAAK;AAAO;;AADR;aACV,sBAAM,IAAK,CAAL,oBAAK,IAAO,CAAP,wBAAO,+BAAP,CAAL;zHADI;;AASR;;;AAEF;AACA;AACA;AAJE;AAkWiB;AAErB,oBAAU;pBAFW;AAPA;AAErB,oBAAU;pBACV,oBAAU;pBACV,oBAAU;pBAJW;AAVF;AAEnB,UAAc,SAAH,eAAP,MAAO,CAAX;zCAEE,sBAAkB,OAAP,OAAU,SAAH,CAAe;9CACjC,sBAAkB,OAAP,OAAU,SAAH,CAAe;9CACjC,sBAAkB,OAAP,OAAU,SAAH,CAAe;vCAJnC;PAFmB;AAjVf;AAUY,6BAxCV,YAwCU;zCACA,6BT9OT,YS8OS;zCACA,6BAtCP,wBAsCO;rDAZZ;AAeE;;;AAEJ;AACA;AAHI;AAwWiB;AAEvB,oBAAU;pBACV,oBAAU;pBAHa;AAdF;AAErB,UAAc,WAAH,eAAP,MAAO,CAAX;3CAEE,sBAAkB,OAAP,OAAU,WAAH,CAAiB;hDACnC,sBAAkB,OAAP,OAAU,WAAH,CAAiB;zCAHrC;PAFqB;AA1Vf;AAQU,6BArDV,YAqDU;zCACA,6BA/CL,0BA+CK;vDATV;AAYD;;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AARG;;AAKH,iBALG;jBAMH,oBANG;;;pBAuZkB;AAEvB;AAEA,qBAAW;rBACX,UAAc,CAAT,CAAC,YAAQ,GAAE,EAAF,CAAI,GAAC,EAAD;nCAClB,mBAAS,UAAK,CAAC,CAAD;/BACd;AAPuB;AA3BF;AAErB,UAAI,UAAM,KAAG,KAAb;9BAEE,qBAAS;rBACT;OAHF;PAFqB;AASA;AAErB,UAAI,UAAM,KAAG,KAAb;9BAEE,qBAAS;rBACT;OAHF;PAFqB;AASC;AAEtB,UAAI,WAAO,KAAG,MAAd;hCAEE,sBAAU;tBACV;OAHF;PAFsB;AAmBA;AAEtB,oBAAU;pBACV;AAHsB;AAeA;AAEtB,UAAY,cAAD,QAAX,EACE,cAAQ,CAAC,IAAD,CADV;tDAFsB;AA5EF;AAEpB,UAAc,UAAH,eAAP,MAAO,CAAX;1CAEE,qBAAiB,OAAP,OAAU,UAAH,CAAe;9CAChC,sBAAkB,OAAP,OAAU,UAAH,CAAgB;/CAClC,qBAAiB,OAAP,OAAU,UAAH,CAAe;9CAChC,sBAAkC,WAAhB,OAAP,OAAU,UAAH,CAAgB;nDALpC;PAFoB;AAmEE;AAEtB;AACA,mBAAS;nBACT,mBAAS;nBACT,oBAAU;pBACV,oBAAU;pBANY;AAxDD;AAAR;AAEb;AAEA,UAAK;VACL,UAAG,sBAAO,IAAG,WAAb,EACE,IAAK,OADP;5DAEA,UAAG,wBAAS,IAAG,WAAf,EACE,IAAK,SADP;hEAGA,eAAiD,CAArC,CAAF,CAAE,GAAE,mBAAc,CAAC,iBAAY,CAAC,UAAD,CAAb,CAAhB,CAAqC,GAAE,GAAF,CAAM,GAAE,UAAF;5FAV1C;AAAQ;AA/WhB;AAqBa,+BAhEN,2BAgEM;1DACH;AACE,8BTrRV,YSqRU;1CACD,6BArEL,0BAqEK;vDACA,6BAlFV,YAkFU;zCACD,4BTxRR,YSwRQ;xCACI,gCJzSP,kCIySO;lEA3Bd;AAoCG;;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAVM;;AAGN,yBAHM;zBAMN,kBANM;lBAON,oBAPM;pBAQN,iBARM;;;jBAk4CkB;AAG5B;AAEE;AACA;AAN0B;AAoBD;AAG3B;AAEE;AACA;AANyB;AAmBA;AAAT;AAEhB,UAAG,CAAY,CAAC,YAAD,SAAf,EACE,qBADF;xDAGA,eAAU;fALM;AAAS;AA3EA;AAEzB;AAEA,oBAAiB,CAAN,eAAM,KAAE,CAAF,CAAK,IAAY,CAAP,gBAAO,KAAE,CAAF,CAAZ;vEACtB,UAAc,CAAX,CAAI,WAAO,IAAW,CAAN,UAAM,KAAG,EAAH,CAAX,CAAkB,IAAI,CAAI,YAAM,OAAO,CAAC,UAAD,CAArD;nFAEE,oBAAM,MAAI,CAAC,mBAAa,QAAC,YAAM,CAAC,YAAQ,UAAT,CAAN,CAAf;3FACV,YAAK,YAAM,QAAQ,CAAC,UAAD;3CACnB,YAAM,CAAF,CAAE,IAAG,CAAH,CAAM,IAAO,CAAF,CAAE,IAAgB,CAAb,YAAM,SAAC,EAAM,GAAE,CAAF,CAAhB,CAAnB,EACE,YAAM,OAAO,CAAC,CAAD,CADf;pFAGI,yBAAJ,IAAG;7BACH,YAAG,iBAAY,KAAE,CAAjB;nCAEE,cAAY,+BAAW,mBAAZ,QAAX,EACE,+BAAW,mBAAkB,CAAC,+BAAD,CAD/B;pJAFF;FARF;PAeA,UAAY,cAAD,QAAX,EACE,cAAS,CAAC,IAAD,CADX;tDApByB;AAmDF;AAEvB,sBAAW,CAAC,GAAD;1BAFY;AAcC;AAAR;AAEhB;AAGF;AAEE,eAAU;fAPM;AAAQ;AAkBC;AAAT;AAEhB;AAGF;AAEE,eAAU;fAPM;AAAS;AAzIM;AAE/B,UAAG,CAAY,CAAC,mBAAD,SAAf,EACE,sBAAuC,QAAQ,cAAc,CAAC,QAAD,CAD/D;hGAGA,UAAY,mBAAD,QAAX;rCAEE,2BAAc,OAAd,GAAyB;rCACzB,2BAAc,MAAd,GAAwB;pCACxB,YAAG,CAAY,CAAC,YAAD,SAAf;nCAEE,yBAAW,YAAO,QAAC,YAAM,CAAC,mBAAD,CAAN;9EACnB,sBAAO,cAAP,GAAwB;vCACxB,sBAAO,YAAP,GAAsB;5BAJxB;FAJF;PAL+B;AAiDF;AAE7B,kBAAO;lBAFsB;AA6BF;AAE3B,yBAAe;zBACf;AACA,yBAAe;zBAJY;AA9NE;AAG/B;AACA;AACA;AACA;AAN+B;AA0LD;AAG9B;AAH8B;AAnIE;AAE9B;AACA;AACA;AACA;AACA;AAEA,mBAAS;nBACT,WAAM;XACN,UAAO,CAAH,EAAG,KAAG,EAAH,CAAO,IAAI,CAAI,YAAM,KAAK,CAAC,GAAI;;;;rCAAL,CAAjC;XAEE,YAAK;ZACL,YAAK;ZAET;AACA;AAGI,YAAK,CAAE,IAAQ,CAAH,EAAG,KAAG,CAAH,CAAR;3BACP,YAAG,CAAH;bAEE;AACA;SAHF;TAMA,YAAU,CAAN,CAAI,CAAE,IAAwB,CAAnB,YAAM,QAAQ,CAAC,EAAD,CAAK,KAAE,CAAC,CAAH,CAAxB,CAA+B,IAAG,CAA5C;1DAGJ;AAGU,2BAAJ,IAAG;/BACH,cAAG,gBAAH,EACE,YAAM,IAAI,CAAC,EAAD,CADZ;3CAPF;;TAaA,sBAAU;tBACV;;AAxC4B;AA8HU;AAAlB;AAEtB,eAAU,yBAAkB,CAAC,UAAW,CAAZ;pDAFN;AAAkB;AAnBA;AAAlB;AAGtB,eAAU,aAAQ,QAAC;pCACnB,YAAM,iBAAiB,CAAC,SAAD;vCAJD;AAAkB;AAOL;AAAb;AAEtB,eAAU,oBAAa,CAAC,KAAM,CAAP;1CAFD;AAAa;AAKA;AAAb;AAGtB,eAAU,aAAQ,QAAC;pCACnB,YAAM,YAAY,CAAC,IAAD;7BAJI;AAAa;AA5Hd;AAAL;AAEhB,eAAU;fAFM;AAAK;AAmLA;AAAL;AAEhB,eAAU;fAFM;AAAK;AAvHS;AAAd;AAEhB,eAAU;fACV,UAAW,CAAC,YAAD,SAAU,IAAY,CAAC,YAAO,eAAR,SAAjC,EACE,SAAU,YAAO,eAAQ,UAAU,EADrC;3HAHgB;AAAc;AA9FL;AAEzB,yBAAe;zBACf,oBAAU;pBACV,mBAAS;nBACT;AACA;AANyB;AANK;AAE9B,UAAW,CAAC,YAAD,SAAU,IAAY,CAAC,YAAO,eAAR,SAAjC,EACE,qBAAgB,CAAC,YAAO,eAAQ,UAAU,EAA1B,CADlB;zIAF8B;AAyFC;AAE/B,UAAW,CAAC,OAAD,SAAU,IAAY,CAAC,OAAO,eAAR,SAAjC,EACE,qBAAgB,CAAC,OAAO,eAAQ,UAAU,EAA1B,CADlB;1HAF+B;AAgJP;AAExB,oBAAS,MAAT;1BACA,qBAAU,OAAV;5BAHwB;AAjND;AAEvB;AAEA,UAAW,CAAC,MAAD,SAAS,IAAY,CAAC,MAAM,QAAP,SAAhC;tDACE,2BAAc,CAAC,MAAM,QAAP;1CACX,gBAAoB,CAAT,CAAC,MAAD,SAAS,IAAY,CAAC,MAAM,OAAP,SAAZ,CAA4B,IAAI,CAAI,MAAM,QAA9D;hFAGP;AAGI,wBAAW,CAAC,CAAD;nBANR;PANkB;AAyGK;AAE5B,wBAAW,CAAC,KAAM,CAAP;/BAFiB;AANA;AAE5B,oBAAU;pBACV,wBAAa,CAAC,IAAD;7BAHe;AA5BC;AAE7B,sBAAW,CAAC,SAAD;hCAFkB;AAkBI;AAEjC,6BAAgB,CAAC,UAAW,CAAZ;zCAFiB;AANA;AAEjC,oBAAU;pBACV,wBAAa,CAAC,SAAD;lCAHoB;AAWF;AAE/B;AAF+B;AAxxCvB;AAmDW,gCJrWP,kCIqWO;lEACL;AApDN;AAuDD;;AAGA;;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AAAQ;AACR;AACA;AACA;AAXK;;AAEL,yBAFK;zBAGL,mBAHK;nBAIL,eAJK;fAKL,iBALK;jBAML,gBANK;hBASL,oBATK;pBAUL,sBAVK;tBAWL,wBAXK;;;xBAw9BoB;AAE3B,uBAAa;vBACb,UAAY,aAAD,QAAX;/BAEE,qBAAQ;rBACR,qBAAQ,KAAK,CAAC,cAAS,MAAO,cAAS,KAAM,cAAS,MAAO,GAAE,cAAS,KAAX,CAAkB,cAAS,OAAQ,GAAE,cAAS,IAA9F;vJACb,qBAAQ;dAJV;PAH2B;AA5mBA;AAE3B,UAAY,aAAD,QAAX;/BAEE,qBAAQ,UAAR,GAAsB,SAAG;3CACzB,qBAAQ,YAAR,GAA+B,gBAAW,CAAC,SAAG,OAAJ;rEAClC,oBAAH,SAAG;7BACN,YADM,KACN;jBAAS,uBAAQ,YAAY,CAAC,EAAD;tCAC7B,kBAFM,KAEN;vBAAO,uBAAQ,YAAY,CAAC,CAAC,EAAE,CAAH,CAAD;zCAC3B,kBAHM,KAGN;vBAAQ,uBAAQ,YAAY,CAAC,CAAC,EAAE,CAAH,CAAD;zCAC5B,kBAJM,KAIN;vBAAW,uBAAQ,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,CAAP,CAAD;7CAC/B,kBALM,KAKN;vBAAc,uBAAQ,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAX,CAAD;jDAClC,kBANM,KAMN,6BAAS,aAAQ,YAAY,CAAC,CAAC,EAAG,MAAJ,CAAD,CAA7B;lFAVJ;PAF2B;AANF;AAEzB,UAAY,aAAD,QAAX,EACE,aAAQ,UAAR,GAAsB,gBAAW,CAAC,WAAK,OAAN,CADnC;/FAFyB;AAiED;AAExB,4BAAkB;5BAClB,sBAAY,QAAQ,WAAsB,CAAC,IAAD;9CAC1C,kBAAQ,SAAI,QAAC;nCACb,oBAAU,WAAM,QAAC;vCACjB,uBAAa;vBACb,mBAAS,UAAK,QAAC;rCAPS;AA8bA;AAExB;AAFwB;AAuII;AAE5B,UAAY,aAAD,QAAX,EACE,aAAQ,aAAa,CAAC,IAAK,IAAK,IAAK,IAAK,GAAI,EAAzB,CADvB;lFAF4B;AAxJH;AAEzB,UAAY,aAAD,QAAX,EACE,aAAQ,UAAU,CAAC,IAAK,IAAK,IAAK,IAAK,GAAI,EAAzB,CADpB;/EAFyB;AA1fD;AAGxB,UAAY,aAAD,QAAX;/BAEE,qBAAQ,UAAU;/BAClB;AACA,qBAAQ,IAAI,CAAC,EAAG,EAAG,OAAQ,WAAY,UAAW,GAAE,UAAxC;vEACZ,qBAAQ,OAAO;rBALjB;PAHwB;AAiQF;AAEtB,UAAY,aAAD,QAAX;/BAEE,yBAAa;zBACb,qBAAQ,UAAU;/BAClB;AACA,qBAAQ,OAAO,CAAC,EAAE,CAAH;zBALjB;PAFsB;AAmWA;AAEtB,UAAY,aAAD,QAAX;/BAEE,YAAG,CAAI,cAAP;3BAEE,uBAAQ,UAAU;jCAClB;AACA,uBAAQ,OAAO,CAAC,YAAQ,WAAT;7CAJjB;TAOA,qBAAQ,OAAO,CAAC,EAAE,CAAH;hCACf,qBAAQ,OAAO;5BACf,sBAAU;tBACV,sBAAU;tBAEV,yBAAa;lBAdf;PAFsB;AAzfG;AAEzB,UAAY,aAAD,QAAX;/BAEE,qBAAQ,UAAU;/BAClB;AACA;AACA,qBAAQ,KAAK,CAAC,GAAI,GAAI,EAAG,GAAE,EAAF,CAAM,EAAG,GAAE,EAAvB;hDACb,YAAG,WAAK,OAAO,KAAG,wBAAlB,EACE,aAAQ,KAAK,EADf;jFAEA,YAAG,SAAG,OAAO,KAAG,sBAAhB,EACE,aAAQ,OAAO,EADjB;xEARF;PAFyB;AA8BA;AAEzB,oBAAS,CAAQ,GAAY,GAAY,GAAY,EAA5C;hCAFgB;AAfA;AAEzB,oBAAS,CAAC,IAAI,MAAO,IAAI,KAAM,IAAI,OAAQ,IAAI,OAAtC;9DAFgB;AAmCA;AAEzB,UAAY,aAAD,QAAX;/BAEE,qBAAQ,UAAU;/BAClB;AACA;AACA,qBAAQ,OAAO,CAAC,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAJ,CAAQ,EAAZ;7CACf,qBAAQ,OAAO,CAAC,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAJ,CAAQ,EAAZ;7CACf,qBAAQ,iBAAiB,CAAC,GAAG,GAAI,GAAI,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAnB;7DACzB,qBAAQ,OAAO,CAAC,GAAI,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAZ;7CACf,qBAAQ,iBAAiB,CAAC,GAAI,GAAI,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAJ,CAAQ,EAApB;7DACzB,qBAAQ,OAAO,CAAC,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAJ,CAAQ,EAAZ;7CACf,qBAAQ,iBAAiB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAApB;7DACzB,qBAAQ,OAAO,CAAC,GAAI,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAZ;7CACf,qBAAQ,iBAAiB,CAAC,GAAI,GAAI,EAAG,GAAI,CAAF,EAAE,GAAC,CAAD,CAAJ,CAAQ,EAApB;7DAEzB,YAAG,WAAK,OAAO,KAAG,wBAAlB,EACE,aAAQ,KAAK,EADf;jFAGA,YAAG,SAAG,OAAO,KAAG,sBAAhB,EACE,aAAQ,OAAO,EADjB;xEAlBF;PAFyB;AAulBA;AAEzB,sBAAS,CAAC,IAAI,MAAO,IAAI,KAAM,IAAI,OAAQ,IAAI,QAAS,GAAI,EAAnD;tEAFgB;AAtmBD;AAExB,sBAAS,CAAC,IAAI,MAAO,IAAI,KAAM,IAAI,OAAQ,IAAI,OAAtC;hEAFe;AAoaD;AAEvB;AAAG;AACH;AACA;AAAI;AAAI;AAAI;AAAI;AAAI;AAEpB,UAAY,aAAD,QAAX;/BAEE,YAAK,EAAG,GAAE,EAAF;nBACR,YAAK,EAAG,GAAE,EAAF;nBAER,gBAAS;hBAET,aAAS,CAAF,CAAE,GAAE,CAAF,CAAK,GAAE,KAAF;5BACd,aAAS,CAAF,CAAE,GAAE,CAAF,CAAK,GAAE,KAAF;5BACd,aAAM,EAAG,GAAE,CAAF;nBACT,aAAM,EAAG,GAAE,CAAF;nBACT,aAAM,EAAG,GAAI,CAAF,CAAE,GAAE,CAAF,CAAJ;zBACT,aAAM,EAAG,GAAI,CAAF,CAAE,GAAE,CAAF,CAAJ;zBAET,qBAAQ,UAAU;/BAClB;AACA;AACA,qBAAQ,OAAO,CAAC,GAAI,EAAL;lCACf,qBAAQ,cAAc,CAAC,GAAI,EAAG,GAAE,EAAF,CAAM,EAAG,GAAE,EAAF,CAAM,GAAI,GAAI,EAA/B;/DACtB,qBAAQ,cAAc,CAAC,EAAG,GAAE,EAAF,CAAM,GAAI,GAAI,EAAG,GAAE,EAAF,CAAM,GAAI,EAA/B;/DACtB,qBAAQ,cAAc,CAAC,GAAI,EAAG,GAAE,EAAF,CAAM,EAAG,GAAE,EAAF,CAAM,GAAI,GAAI,EAA/B;/DACtB,qBAAQ,cAAc,CAAC,EAAG,GAAE,EAAF,CAAM,GAAI,GAAI,EAAG,GAAE,EAAF,CAAM,GAAI,EAA/B;/DACtB,qBAAQ,UAAU;/BAElB,YAAG,WAAK,OAAO,KAAG,wBAAlB,EACE,aAAQ,KAAK,EADf;jFAGA,YAAG,SAAG,OAAO,KAAG,sBAAhB,EACE,aAAQ,OAAO,EADjB;xEA3BF;PANuB;AA4KA;AAEvB,oBAAO,CAAC,IAAI,MAAO,IAAI,KAAM,IAAI,OAAQ,IAAI,OAAtC;9DAFgB;AAxBC;AAExB;AAAG;AAEH,UAAY,aAAD,QAAX;/BAEE,YAAW,WAAC,MAAD;7BAEX,qBAAQ,UAAU;/BAClB;AACA,YAAK;ZACL,qBAAQ,OAAO,CAAC,MAAM,CAAC,CAAD,CAAG,GAAI,MAAM,CAAC,CAAD,CAAG,EAAvB;pDAEf,eAAO,CAAE,GAAI,CAAF,CAAE,GAAE,CAAF,CAAb;1BAEM,WAAJ,IAAG;fACH,uBAAQ,OAAO,CAAC,MAAM,CAAC,CAAD,CAAG,GAAI,MAAM,CAAC,CAAD,CAAG,EAAvB;;tDAGjB,YAAG,SAAG,OAAO,KAAG,sBAAhB,EACE,aAAQ,OAAO,EADjB;xEAfF;PAJwB;AA9BD;AAEvB;AAAG;AAEH,UAAY,aAAD,QAAX;/BAEE,YAAW,WAAC,MAAD;7BAEX,qBAAQ,UAAU;/BAClB;AACA;AACA,YAAK;ZACL,qBAAQ,OAAO,CAAC,MAAM,CAAC,CAAD,CAAG,GAAI,MAAM,CAAC,CAAD,CAAG,EAAvB;pDAEf,eAAO,CAAE,GAAI,CAAF,CAAE,GAAE,CAAF,CAAb;1BAEM,WAAJ,IAAG;fACH,uBAAQ,OAAO,CAAC,MAAM,CAAC,CAAD,CAAG,GAAI,MAAM,CAAC,CAAD,CAAG,EAAvB;;tDAGjB,qBAAQ,UAAU;/BAElB,YAAG,WAAK,OAAO,KAAG,wBAAlB,EACE,aAAQ,KAAK,EADf;jFAGA,YAAG,SAAG,OAAO,KAAG,sBAAhB,EACE,aAAQ,OAAO,EADjB;xEArBF;PAJuB;AA5ZA;AAEvB,UAAY,aAAD,QAAX;/BAEE,qBAAQ,UAAR,GAAsB,gBAAW,CAAC,UAAI,OAAL;pEACjC,qBAAQ,KAAR,GAAiB,UAAI;vCACrB,qBAAQ,aAAR,GAAyB;rCACzB,qBAAQ,SAAS,CAAC,KAAM,EAAG,CAAE,GAAE,GAAd;tCALnB;PAFuB;AA4YI;AAE3B;AAEA,UAAY,aAAD,QAAX;/BAEE,cAAO,OAAO;rBACd,qBAAQ,UAAU,CAAC,IAAK,EAAG,EAAG,OAAO,SAAC,GAAO,OAAO,UAAC,GAAQ,IAAI,MAAO,IAAI,KAAM,IAAI,MAAO,GAAE,IAAI,KAAN,CAAa,IAAI,OAAQ,GAAE,IAAI,IAA1G;xIAHpB;PAJ2B;AArnBD;AAE1B,UAAY,kBAAD,QAAX,EACE,kBAAY,CAAC,IAAD,CADd;9DAF0B;AAgsBF;AAExB,UAAY,gBAAD,QAAX,EACE,gBAAU,CAAC,IAAD,CADZ;1DAFwB;AA3GJ;AAEpB,UAAY,aAAD,QAAX,EACE,aAAQ,KAAK,EADf;rDAFoB;AArfG;AAEvB,UAAY,aAAD,QAAX,EACE,aAAQ,QAAQ,EADlB;xDAFuB;AAJA;;AAtFF;AAErB,UAAW,CAAC,aAAD,SAAW,IAAY,CAAC,mBAAD,SAAlC,EACE,aAAQ,UAAU,CAAC,EAAG,EAAG,mBAAc,OAAQ,mBAAc,OAA3C,CADpB;rJAFqB;AAMA;AAErB;AACA;AAEA;AACA,UAAY,mBAAD,QAAX;rCAEE,YAAK,WAAK;vBACV,YAAK,WAAK;vBACV,mBAAK,OAAL,GAAe;7BACf,mBAAK,OAAL,GAAe;7BACf,qBAAQ,CAAC,cAAI,CAAC,EAAG,EAAG,mBAAc,OAAQ,mBAAc,OAA3C,CAAL;9FACR,mBAAK,OAAL,GAAe;7BACf,mBAAK,OAAL,GAAe;tBARjB;PANqB;AAwOE;;AAAR;AAEf;AACA;AAAG;AAAI;AACP;AACA;AAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAI;AAAK;AAES;AAEhB,YAAG,EAAH;dAEO;AACH,cADG,KACH;nBAAU,0BAAO,CAAC,KAAK,KAAM,GAAsC,CAAV,CAAb,CAAZ,KAAK,MAAO,GAAE,KAAK,KAAP,CAAa,GAAE,MAAF,CAAU,GAAE,CAAF,CAAtC,CAA2C,KAAK,KAAM,KAAlE;nGACjB,oBAFG,KAEH;zBAAe,0BAAO,CAAC,KAAK,MAAO,KAAK,KAAM,KAAxB;rDACtB,oBAHG,KAGH,4CAAgB,cAAO,CAAC,KAAK,MAAO,GAAE,MAAF,CAAU,KAAK,KAAM,KAAlC,CAAvB;;zHAKG;AACH,cADG,KACH;nBAEO;AACH,gBADG,KACH;rBAAY,4BAAO,CAAC,KAAK,KAAM,GAAsC,CAAV,CAAb,CAAZ,KAAK,MAAO,GAAE,KAAK,KAAP,CAAa,GAAE,MAAF,CAAU,GAAE,CAAF,CAAtC,CAA2C,KAAK,KAAM,KAAlE;rGACnB,sBAFG,KAEH;3BAAkB,4BAAO,CAAC,KAAK,KAAM,GAAsC,CAAV,CAAb,CAAZ,KAAK,MAAO,GAAE,KAAK,KAAP,CAAa,GAAE,MAAF,CAAU,GAAE,CAAF,CAAtC,CAA2C,KAAK,IAAK,GAAuC,CAAX,CAAZ,CAAb,KAAK,OAAQ,GAAE,KAAK,IAAP,CAAY,GAAE,OAAF,CAAW,GAAE,CAAF,CAAvC,CAA4C,KAA7G;pJACzB,sBAHG,KAGH,4CAAe,cAAO,CAAC,KAAK,KAAM,GAAsC,CAAV,CAAb,CAAZ,KAAK,MAAO,GAAE,KAAK,KAAP,CAAa,GAAE,MAAF,CAAU,GAAE,CAAF,CAAtC,CAA2C,KAAK,OAAQ,GAAE,OAAF,CAAW,KAA/E,CAAtB;jKAGJ,UATG,KASH;1BAEO;AACH,gBADG,KACH;rBAAY,4BAAO,CAAC,KAAK,MAAO,KAAK,KAAM,KAAxB;vDACnB,sBAFG,KAEH;3BAAkB,4BAAO,CAAC,KAAK,MAAO,KAAK,IAAK,GAAuC,CAAX,CAAZ,CAAb,KAAK,OAAQ,GAAE,KAAK,IAAP,CAAY,GAAE,OAAF,CAAW,GAAE,CAAF,CAAvC,CAA4C,KAAnE;tGACzB,sBAHG,KAGH,4CAAe,cAAO,CAAC,KAAK,MAAO,KAAK,OAAQ,GAAE,OAAF,CAAW,KAArC,CAAtB;nHAGJ,UAjBG,KAiBH;1BAEO;AACH,gBADG,KACH;rBAAY,4BAAO,CAAC,KAAK,MAAO,GAAE,MAAF,CAAU,KAAK,KAAM,KAAlC;jEACnB,sBAFG,KAEH;3BAAkB,4BAAO,CAAC,KAAK,MAAO,GAAE,MAAF,CAAU,KAAK,IAAK,GAAuC,CAAX,CAAZ,CAAb,KAAK,OAAQ,GAAE,KAAK,IAAP,CAAY,GAAE,OAAF,CAAW,GAAE,CAAF,CAAvC,CAA4C,KAA7E;hHACzB,sBAHG,KAGH,4CAAe,cAAO,CAAC,KAAK,MAAO,GAAE,MAAF,CAAU,KAAK,OAAQ,GAAE,OAAF,CAAW,KAA/C,CAAtB;7HALJ;;XA7BY;AAyCG;AAAZ;AAEP;AACA;AAEA,iBAAU;jBAEV,YAAY,IAAD;hBACX,YAAG,UAAK,GAAE,CAAV,EACE,aADF;zCAGA,YAAK;ZACL,eAAM,IAAN;nBAEE,cAA6C,CAAzB,CAAP,CAAR,IAAI,QAAC,KAAD,CAAI,KAAE,IAAF,CAAO,IAAiB,CAAZ,IAAI,QAAG,CAAF,CAAE,GAAE,CAAF,KAAH,CAAQ,KAAE,IAAF,CAAjB,CAAyB,IAAoB,CAAP,CAAR,IAAI,QAAC,KAAD,CAAI,KAAE,IAAF,CAAO,IAAiB,CAAZ,IAAI,QAAG,CAAF,CAAE,GAAE,CAAF,KAAH,CAAQ,KAAE,IAAF,CAAjB,CAApB,CAA6C,IAAY,CAAR,IAAI,QAAC,KAAD,CAAI,KAAE,GAAF,CAAtG;hMAEE,gBAAG,IAAI,QAAC,KAAD,CAAI,KAAE,GAAb;1CACE,uBAAU,eAAI,CAAC,KAAM,WAAM,CAAE,GAAQ,CAAL,UAAK,GAAE,CAAF,CAAvB;3EAEd,2BAAU,eAAI,CAAC,KAAM,WAAM,CAAE,GAAE,UAAjB;zEAEhB;WAEG,UAAmB,CAAP,CAAR,IAAI,QAAC,KAAD,CAAI,KAAE,IAAF,CAAO,IAAY,CAAR,IAAI,QAAC,KAAD,CAAI,KAAE,IAAF,CAAZ,CAAmB,IAAY,CAAR,IAAI,QAAC,KAAD,CAAI,KAAE,GAAF,CAAlD;rHAEH,qBAAU,eAAI,CAAC,KAAM,WAAM,CAAE,GAAQ,CAAL,UAAK,GAAE,CAAF,CAAvB;zEACd;WAEG,UAAG,CAAE,IAAG,CAAR;3BAEH,qBAAU,eAAI,CAAC,KAAM,WAAM,CAAE,GAAQ,CAAL,UAAK,GAAE,CAAF,CAAvB;zEACd;WAGA,MAAI,CAAJ,IAAG;;tBAGP,iBAAQ,CAAE,GAAE,CAAZ;tBArCO;AAAY;AAwCrB,WAAe,CAAT,QAAS,IAAmB,CAAf,cAAG,CAAC,KAAK,IAAN,CAAY,GAAE,CAAF,CAAnB,CAAwB,IAAmB,CAAf,cAAG,CAAC,KAAK,IAAN,CAAY,GAAE,CAAF,CAAnB;3FACvC,YAAO,CAAI,QAAS,IAA0B,CAAL,CAAf,cAAG,CAAC,KAAK,IAAN,CAAY,GAAE,CAAF,CAAK,IAAmB,CAAf,cAAG,CAAC,KAAK,IAAN,CAAY,GAAE,CAAF,CAAnB,CAA1B;7FAEpB,UAAG,CAAI,EAAP;bAEE,YAAK,cAAS,CAAC,IAAD;/BACd,aAAM,eAAU,CAAC,IAAD;jCAChB,YAAG,CAAI,SAAP,EACE,QAAQ,CAAC,KAAM,EAAG,EAAV,CADV;3CAGA,iBAA2B,sBAAjB,sBAAiB,CAAC,KAAK,MAAO,KAAK,KAAM,KAAK,KAAM,GAAE,CAAF,CAAK,KAAK,IAAK,GAAE,EAApD;;hHAI3B,aAAM;bAEN,aAAM;bACN,YAAK;ZACL,cAAO,UAAK,MAAM,GAAE,GAAF;pCAClB,eAAQ;fACR,cAAO;dACP,aAAM;bACN,YAAK,YAAY,CAAC,KAAM;;;;lBAAP;ZACjB,YAAK,cAAS,CAAC,CAAD;5BACd,aAAM,eAAU,CAAC,CAAD,CAAI,GAAE,GAAF;rCAEpB,aAAM,EAAG,GAAE,CAAF;nBACT,YAAc,CAAH,CAAD,OAAI,GAAE,CAAF,CAAK,IAAkB,CAAb,CAAC,QAAQ,CAAD,WAAP,CAAY,KAAE,GAAF,CAArC,EACE,KAAM,EAAG,GAAE,GADb;7EAGA,aAAM;bACN,eAAM,CAAE,IAAU,IAAD,OAAjB;/BAEE,cAAY,CAAD;fACX,cAAM,CAAF,CAAE,IAAG,CAAH,CAAM,IAAyC,CAAtB,CAAP,CAAL,CAAC,QAAC,KAAD,CAAI,KAAE,IAAF,CAAO,IAAc,CAAT,CAAC,QAAG,CAAF,CAAE,GAAE,CAAF,KAAH,CAAQ,KAAE,IAAF,CAAd,CAAsB,IAAiB,CAAP,CAAL,CAAC,QAAC,KAAD,CAAI,KAAE,IAAF,CAAO,IAAc,CAAT,CAAC,QAAG,CAAF,CAAE,GAAE,CAAF,KAAH,CAAQ,KAAE,IAAF,CAAd,CAAjB,CAArD;hKAEE,gBAAK,eAAI,CAAC,EAAG,EAAG,CAAE,GAAE,CAAX;zCACT,gBAAK;LAEF,UAAM,CAAF,CAAE,IAAG,CAAH,CAAM,IAAkB,CAAP,CAAL,CAAC,QAAC,KAAD,CAAI,KAAE,IAAF,CAAO,IAAS,CAAL,CAAC,QAAC,KAAD,CAAI,KAAE,IAAF,CAAT,CAA9B;3FAEH,gBAAK,eAAI,CAAC,EAAG,EAAG,CAAE,GAAE,CAAX;zCACT,gBAAK;LAGL,UAAK;rBAEP,eAAM,YAAY,CAAC,KAAM;;;;nBAAP;dAClB,cAAK,cAAS,CAAC,EAAD;/BACd,eAAM,QAAG,CAAC,GAAI,eAAU,CAAC,EAAD,CAAK,GAAE,GAAtB;pDAET,cAAwB,CAAJ,CAAL,CAAX,KAAK,KAAM,GAAE,EAAF,CAAK,GAAE,CAAF,CAAI,GAAE,KAAK,MAAP,CAAe,IAAG,CAA1C;1DAEE,gBAAM,CAAF,CAAE,KAAG,EAAH,CAAO,IAAI,CAAI,EAArB;jCAEE,kBAAY,CAAD;nBAEX,mBAAM,eAAI,CAAC,EAAG,EAAG,CAAP;xCAEN,kBAAJ,IAAG;tBACH,kBAAG,EAAG,GAAE,EAAR,EACE,KAAM,EADR;lCAGA,kBAAG,CAAI,SAAP,EACE,QAAQ,CAAC,GAAI,GAAI,EAAT,CADV;hDAGA,mBAAM;NAbR;bAgBA,gBAAK;hBAEL,iBAAM;jBACN,gBAAQ,CAAJ,GAAI,IAAI,CAAJ,CAAO,IAAG,CAAI,GAAtB;lCACE,mBAAK,IAAL,GAAa,KAAK,IAAK,GAAE,EAAF;xCACpB,sBAAI,GAAI,IAAI,CAAI,CAAhB,EACH,KAAM,IADH;1CAGL,gBAAqB,CAAjB,gBAAK,CAAC,KAAK,IAAN,CAAY,GAAE,gBAAK,CAAC,KAAK,OAAQ,GAAE,EAAhB,CAAP,CAA4B,IAAI,CAAI,SAAzD,EACE,KADF;7FA1BF;XA8BA,eAAM,EAAG,GAAE,CAAF;rBACT,cAAe,CAAJ,EAAD,OAAK,GAAE,CAAF,CAAK,IAAoB,CAAf,EAAE,QAAQ,EAAD,WAAP,CAAa,KAAE,GAAF,CAAxC,EACE,KAAM,EAAG,GAAE,GADb;lFAEA,cAAK,CAAE,GAAE,EAAF;;pBAGT,YAAG,CAAE,KAAG,EAAR;pBAEE,cAAY,CAAD;fACX,eAAM,eAAI,CAAC,EAAG,EAAG,CAAP;pCACN,cAAJ,IAAG;lBACH,cAAG,EAAG,GAAE,EAAR,EACE,KAAM,EADR;9BAGA,cAAG,CAAI,SAAP,EACE,QAAQ,CAAC,GAAI,GAAI,EAAT,CADV;nCARF;TAYA,iBAA2B,sBAAjB,sBAAiB,CAAC,EAAE,MAAO,EAAE,KAAM,EAAE,KAAM,GAAE,EAAF,CAAM,EAAE,IAAK,GAAO,CAAL,IAAK,GAAE,EAAF,CAA9C;;9GApMd;AAAQ;AAqNC;AAAT;AAEf;AACA;AAEA,UAAY,aAAD,QAAX;/BAEE,YAAK,UAAI;tBACT,qBAAQ,KAAR,GAAiB;7BACjB,aAAc,2BAAR,aAAQ,YAAY,CAAC,IAAD,CAAZ;vEACd,iBAAU,EAAE;ZALd;PALe;AAAS;AAhPC;AAAV;AAEf,eAAU,iBAAY,CAAC,UAAI,MAAL;jDAFP;AAAU;AAtlBlB;AAoKU;AAAV;AAEP,aAAU;bAFH;AAAU;AAKA;AAAV;AAEP;AAGF;AACA;AACA;AACA;AACA;AACA;AAGE,aAAsB,CAAZ,eAAI,CAAC,EAAE,EAAE,CAAL,CAAQ,GAAE,eAAI,CAAC,EAAE,EAAE,CAAL,CAAN,CAAc,GAAE,eAAI,CAAC,EAAE,EAAE,CAAL,CAAN;vFAb7B;AAAU;AAgBC;AAAX;AAEP,aAAU,GAAI,GAAE,eAAU,CAAC,CAAD,CAAZ;rCAFP;AAAW;AAuBG;AAAd;AAEP,aAAU,uBAAU,CAAC,EAAD,CAAI,GAAC,IAAD;/CACxB,aAAU,0BAAa,CAAC,OAAQ,IAAK,IAAK,cAAC,4CAAD,CAAnB;lHAHhB;AAAc;AAlBJ;AAAV;AAEP;AAEA,QAAK,0BAAa,CAAC,EAAG,IAAK,GAAI,EAAb;9CAClB,QAAK,0BAAa,CAAC,EAAG,IAAK,GAAI,EAAb;9CAClB,QAAuB,CAAd,CAAJ,GAAI,GAAE,eAAI,CAAC,EAAE,EAAE,CAAL,CAAN,CAAc,GAAE,eAAI,CAAC,EAAE,EAAE,CAAL,CAAN,CAAc,GAAE,eAAI,CAAC,EAAE,EAAE,CAAL,CAAN;1FACrC,aAAU,uBAAU,CAAC,CAAD;tCAPb;AAAU;AA2DE;AAAZ;AAEP,aAAa,CAAH,EAAG,GAAE,EAAF,CAAK,GAAE,EAAF;3BAFX;AAAY;AApGH;AAAT;AAEP,aAAmB,CAAJ,GAAI,GAAI,IAAJ,CAAL;zBAFP;AAAS;AAKA;AAAT;AAEP,aAA2B,CAAP,CAAJ,GAAI,KAAI,CAAJ,CAAO,GAAI,IAAJ,CAAb;jCAFP;AAAS;AAKA;AAAT;AAEP,aAA4B,CAAR,CAAJ,GAAI,KAAI,EAAJ,CAAQ,GAAI,IAAJ,CAAd;lCAFP;AAAS;AA9BQ;AAAjB;AAEP,UAAM,KAAN,GAAe;lBACf,UAAM,IAAN,GAAc;jBACd,UAAM,MAAN,GAAgB;nBAChB,UAAM,OAAN,GAAiB;pBALV;AAAiB;AAQC;AAAlB;AAEP,UAAM,EAAN,GAAY;fACZ,UAAM,EAAN,GAAY;fAHL;AAAkB;AAbf;AAAH;AAEP,aAAa,CAAF,CAAE,GAAM,CAAF,CAAE,IAAI,CAAJ,CAAN,CAAa,GAAM,CAAF,CAAE,IAAI,EAAJ,CAAN;vCAFnB;AAAG;AAkzCZ;AAEE,mBAAU,uBAAiB,QAAC;lDAC5B,mBAAU,uBAAW,QAAC;lDAHxB;AAjyDA,GAodc,4CApdd;;;/CAodc;AAMC;;;AAEX;AACA;AAHW;;AAEX,iBAFW;;;jBA4xCiB;AAE9B,oBAAU;pBACV,iBAAO;jBAHuB;AA5xCjB;AAUI;AA2yCY;AAAJ;AAEzB;AACA;AAEA,eAAU;fACV,eAAS,SAAW,QAAN,eAAM,GAAE,CAAF,qBAApB;xEAAI;AAEF,aAAe,OAAT,YAAK,CAAC,CAAD,EAAO,mBAAH;vDACf,YAAU,CAAN,EAAE,IAAI,KAAE,GAAF,CAAO,IAAY,CAAC,EAAE,OAAH,SAA7B;nDAEE,qBAAU,EAAE,OAAZ;9BACA,mBAAU;nBACV;SAJF;;TATuB;AAAI;AAjBE;AAAN;AAEzB;AACA;AAEA,eAAU;fACV,eAAS,SAAW,QAAN,eAAM,GAAE,CAAF,qBAApB;xEAAI;AAEF,aAAe,OAAT,YAAK,CAAC,CAAD,EAAO,mBAAH;vDACf,YAAU,CAAN,EAAE,IAAI,KAAE,GAAF,CAAO,IAAY,CAAC,EAAE,OAAH,SAA7B;nDAEE,mBAAU;nBACV;SAHF;;TATuB;AAAM;AA1xCd;AAOjB;AACA;AACA,sBAAuB;tBA7ezB;ACAA,8BAES,iFAFT;;;/GASe;;AA6ED;AAyoCoB;AAAZ;AAEnB,eAAU;fAFS;AAAY;AA3BC;AAAb;AAEpB,eAAU,QAAQ,cAAc,CAAC,OAAD;7CAChC,YAAM,cAAC,OAAW,mBAAZ;pDAHc;AAAa;AAMO;AAExC;AAEA,UAAY,eAAD,QAAX;jCAEE,YAAG,WAAM,KAAG,QAAZ,EACsB,eAAU,MAAM,YAAY,CAAC,mBAAmB,kCAAW,CAAC,WAAD,CAA/B,CADlD;3IAGoB,uBAAU,MAAM,YAAY,CAAC,kBAAmB,YAApB;xEAC5B,uBAAU,MAAM,YAAY,CAAC,qBAAsB,YAAvB;3EAC5B,uBAAU,MAAM,YAAY,CAAC,aAAc,YAAf;5DAPlD;PAJwC;AAeH;AAErC;AACA,wBAAa,IAAb;5BAHqC;AAnoCzB;AAUD;;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAfS;;AAWT,oBAXS;;;pBAmxCqB;AAEhC,wBAAc;xBACd;AAHgC;AAwBI;AAEpC,4BAAkB;5BAClB;AAHoC;AAlBH;AAEjC,yBAAe;zBACf;AAHiC;AAMF;AAE/B,uBAAa;vBACb;AAH+B;AA6BS;AAArB;AAEnB,eAA8B;fAFX;AAAqB;AA3HR;AAEhC,wBAAc;xBACd;AAHgC;AAMD;AAE/B,uBAAa;vBACb;AAH+B;AAMI;AAEnC,2BAAiB;3BACjB;AAHmC;AAoHJ;AAAZ;AAEnB,UAAG,kBAAa,KAAG,EAAnB;nCACE,iBAAU;jBACP,gBAAG,aAAH;7BACH,iBAAU;jBAEV,qBAAU;rBAPO;AAAY;AAUE;AAEjC,kCAAkB,aAAa,CAAC,QAAS,cAAV;tEAFE;AA5JH;AAE9B;AACA,qBAAS,aAAa,CAAC,WAAW,IAAZ;lDAHQ;AAgDJ;AAAP;AAEnB,eAAU;fACV,UAAY,4BAAD,QAAX,EACE,SAAU,4BAAkB,MAD9B;3FAHmB;AAAO;AAwFO;AAAd;AAEnB,eAAU;fAFS;AAAc;AAlIA;AAAd;AAEnB;AACA,eAAU;fAHS;AAAc;AAiDJ;AAAV;AAEnB,eAAU;fAFS;AAAU;AAhGC;AAE9B;AACA,UAAY,4BAAD,QAAX;9CAEE,oCAAkB,QAAlB,GAA8B;xCAFhC;PAH8B;AA2GO;AAErC;AACA,UAAY,4BAAD,QAAX;9CAEO;AACH,YADG,KACH;jBAAc,sCAAkB,MAAM,YAAY,CAAC,iBAAkB,WAAnB;rFAClD,kBAFG,KAEH;vBAAc,sCAAkB,MAAM,YAAY,CAAC,iBAAkB,WAAnB;rFAClD,kBAHG,KAGH;vBAAc,sCAAkB,MAAM,YAAY,CAAC,iBAAkB,YAAnB;tFAClD,kBAJG,KAIH,mCAAW,4BAAkB,MAAM,YAAY,CAAC,iBAAkB,SAAnB,CAA/C;pIAGF,oCAAkB,SAAlB,GAA+B;hDAC/B,oCAAkB,YAAlB,GAAkC;nDAClC,oCAAkB,cAAC,OAAW,mBAAZ;5EAElB,YAAG,eAAU,IAAG,CAAhB;hCACE,sCAAkB,gBAAgB,CAAC,WAAD;lEAElC,cAAA,4BAAkB,UAAlB,GAAgC;vDAElC,oCAAkB,MAAlB,GAA4B;7CAE5B,YAAG,CAAI,aAAP,EACE,4BAAkB,kBAAkB,CAAC,eAAU,cAAS,GAAE,eAAtB,CADtC;pHApBF;PAHqC;AAoDN;AAE/B,uBAAa;vBACb;AAH+B;AAYC;AAEhC,wBAAc;xBACd;AAHgC;AAtHD;AAE/B,uBAAa;vBACb;AAH+B;AA8BJ;AAE3B,mBAAS;nBACT;AAH2B;AAkBI;AAE/B,uBAAa;vBACb;AAH+B;AAtEK;AAEpC;AACA,mBAAS;nBACT,uBAAa;vBACb,wBAAc;xBACd,uBAAa;vBACb,uBAAa;vBAPuB;AAtBV;AAE1B,UAAY,uBAAD,QAAX,EACE,aAAS,4BAAkB,MAD7B;1FAGA,UAAY,cAAD,QAAX,EACE,cAAQ,CAAC,IAAD,CADV;tDAL0B;AA8HG;AAE7B,UAAY,4BAAD,QAAX,EACE,4BAAkB,SADpB;rFAF6B;AA7wClB;AAoEN;;AAEe,iCLjJV,gCKiJU;jEACJ,6BC1DV,uCD0DU;pEACW;AACT,+BCpDV,yCDoDU;xEACC;AACE;AACC,mCC7DV,6CD6DU;hFACH,gCApKN,4BAoKM;5DACH,6BD8CV,YC9CU;zCACW;AACP;AACF;AACH,4BDmGV,sCCnGU;lEACE,8BV5JV,YU4JU;1CACF;AACS;AACT,4BV/JR,YU+JQ;xCACQ;AACL,+BCxCV,yCDwCU;xEACE,iCVlKb,YUkKa;7CACD;AACC;AACD;AACA,gCVtKZ,YUsKY;5CACD;AACH;AACI;AACL,2BV1KP,YU0KO;vCACI;AACF,6BV5KT,YU4KS;zCACG,gCCpEP,6CDoEO;7EACD,+BCrEN,6CDqEM;5EACG,kCCtET,6CDsES;/EACD,iCCnEX,0CDmEW;3EACC,kCCnEP,+CDmEO;jFACH,+BCrET,0CDqES;zEACI,mCCzEX,4CDyEW;/EACF,iCC1ET,4CD0ES;7EACE,mCCzEP,gDDyEO;nFACC,oCC7EX,6CD6EW;jFACA,oCC9EX,6CD8EW;jFACL,+BC/EN,6CD+EM;5EACD,8BChFL,6CDgFK;3EA5CZ;AA0VG;;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AARM;;AAEN,iBAFM;jBAKN,oBALM;pBAQN,oBARM;;;pBA6nDsB;AAE9B,yBAAe;zBAFe;AAmEJ;AAE1B,qBAAW;rBACX,iBAAK;jBAHqB;AA/FY;AAAtB;AAEhB,eAA+B;fAFf;AAAsB;AA/DR;AAAd;AAEhB;AACA,eAAU;fAHM;AAAc;AAuLA;AAE9B;AAF8B;AAKD;AAE7B;AACA;AAEA,UAAG,CAAY,CAAC,eAAD,SAAf,EACE,MADF;5CAGA,UAAG,iBAAH,EACE,MADF;nCAGA,eAAwD,MAA1B,eAAU,QAAQ,OAAQ,GAAE,CAAF,EAAW,eAAnE;xEAAI;AACmB,uBAAU,OAAO,CAAC,CAAD;;hCAExC,eAAS,SAAkB,QAAb,WAAM,SAAC,EAAM,GAAE,CAAF,qBAA3B;/EAAI;AAEF,cAA4B,IAArB,MAAqB,CAAI,WAAM,KAAC,CAAD,CAAV;3CACP,uBAAU,IAAI,CAAC,GAAD;/BACnC,wBAAQ,CAAC,EAAM,KAAP;;hCAlBmB;AAjHC;AAE9B;AAEA,UAAG,CAAY,CAAC,eAAD,SAAf,EACE,MADF;5CAGA,eAAS,SAAoD,QAA1B,eAAU,QAAQ,OAAQ,GAAE,CAAF,qBAA7D;vFAAI;AAEF,YAA6C,eAAU,QAAQ,MAAC,CAAD,CAAI,SAAnE;pDAC4C,yBAAU,QAAQ,MAAC,CAAD,CAAI,aAAa,CAAC,WAAW,UAAZ;5EAE7E,cAA0C,eAAU,QAAQ,MAAC,CAAD,CAAI,gBAAgB,CAAC,UAAD;;xEAZtD;AAlFH;AAE3B;AACA,UAAY,eAAD,QAAX,EACE,eAAS,aAAa,CAAC,WAAW,IAAZ,CADxB;hFAH2B;AA2EC;AAAZ;AAEhB,eAAU;fACV,UAAY,eAAD,QAAX,EACE,SAA+B,eAAU,cAD3C;zEAHgB;AAAY;AAzFC;AAAb;AAEhB,eAAU,QAAQ,cAAc,CAAC,QAAD;9CAChC,YAAM,cAAC,OAAW,GAAZ;pCAHU;AAAa;AAqJF;AAAX;AAEhB,UAAI,MAAO,GAAE,cAAS,SAAC,EAAvB;5CACE,iBAAiB,EAAC,cAAS,IAAM,CAAC,MAAD,CAAhB;7CAEjB,qBAAU;rBAEZ,UAAY,eAAD,QAAX,EACE,SAAoD,eAAU,QAAQ,MAAC,MAAD,CAAS,SADjF;zFAPgB;AAAW;AAmBC;AAE5B,aAAO,MAAO,IAAG,cAAS,SAAC,EAA3B,EACE,cAAS,IAAI,CAAC,KAAD;1EAEf,oBAAS,IAAM,CAAC,OAAW,MAAZ;tCAEf,UAAY,eAAD,QAAX,EAC4C,eAAU,QAAQ,MAAC,MAAD,CAAS,SAArE,GAAkF,MADpF;zFAP4B;AA9FH;AAEzB,iBAAM,OAAO,CAAC,MAAD;/BAFY;AA2CI;AAE7B,UAAG,eAAW,KAAG,MAAjB;pCAEE,0BAAc;1BACd;OAHF;PAF6B;AASE;AAE/B,0BAAgB;1BAChB,UAAY,eAAD,QAAX,EACuB,eAAU,SAA/B,GAA4C,MAD9C;pEAH+B;AAmCR;AAEvB;AACA;AACA;AAJuB;AAwBW;AAElC;AAEA,UAAY,6BAAD,QAAX;/CAEE,qCAAmB,MAAM,YAAY,CAAC,WAAY,MAAb;zEACrC,qCAAmB,cAAnB,GAAqC;/CAHvC;PAJkC;AAWE;AAEpC;AAEA,UAAG,WAAM,KAAG,QAAZ,EACE,uBAAa,MAAM,YAAY,CAAC,mBAAmB,kCAAW,CAAC,WAAD,CAA/B,CADjC;jJAJoC;AApKT;AAE3B;AACA,UAAY,uBAAD,QAAX;zCAEE,+BAAa,SAAb,GAA0B;pCAF5B;PAH2B;AASJ;AAEvB,UAAY,cAAD,QAAX,EACE,cAAQ,CAAC,IAAD,CADV;tDAFuB;AAnDU;AAEjC;AACA,oBAAU,uBAAW,QAAC;nDACtB,iBAAM,UAAN,GAAmB;9BACnB,0BAAgB;1BAChB,uBAAa,iBAAK,QAAC;hDACnB,wBAAa,IAAb;5BAPiC;AAgBR;AAElB,eAAP,KAAO;pBACG,eAAV,KAAU;pBACV;AAJyB;AAnhDjB;AA2CQ,6BC5bV,uCD4bU;pEACW;AACT,+BCtbV,yCDsbU;xEACI,mCC7bV,6CD6bU;hFACN,6BDjVV,YCiVU;zCACD,4BDzRV,sCCyRU;lEACY;AACP;AACF;AACD,8BV3hBV,YU2hBU;1CACF;AACM,kCV7hBd,YU6hBc;9CACD,iCV9hBb,YU8hBa;7CACJ,6BLrPL,iCKqPK;9DACD,4BVhiBR,YUgiBQ;xCACO;AACH;AACC;AACD;AACA,gCVriBZ,YUqiBY;5CACD;AACJ,2BVviBP,YUuiBO;vCACI;AACF,6BVziBT,YUyiBS;zCACG,gCCjcP,6CDicO;7EACD,+BClcN,6CDkcM;5EACG,kCCncT,6CDmcS;/EACD,iCChcX,0CDgcW;3EACC,kCChcP,+CDgcO;jFACH,+BClcT,0CDkcS;zEACI,mCCtcX,4CDscW;/EACF,iCCvcT,4CDucS;7EACE,mCCtcP,gDDscO;nFACC,oCC1cX,6CD0cW;jFACA,oCC3cX,6CD2cW;jFACL,+BC5cN,6CD4cM;5EACD,8BC7cL,6CD6cK;3EA/ET;AAoFM;AAGC;;;AAEb;AACA;AACA;AAEA;AANa;;AAEb,iBAFa;jBAMb,oBANa;;;pBAqvDe;AAAP;AAEvB,UAAG,mBAAU,IAAG,CAAhB;lCACE,iBAAU,WAAK,KAAC,mBAAD;pDAEf,qBAAU;rBALW;AAAO;AA/BC;AAE/B;AAEA,eAAS,SAAiB,QAAZ,WAAK,SAAC,EAAM,GAAE,CAAF,qBAA1B;/EAAI;AAEF,YAAG,KAAM,KAAE,WAAK,KAAC,CAAD,CAAhB,EACE,kBAAa,CAAb,CADF;;9DAN6B;AALC;AAEhC,oBAAU;pBAFsB;AAwBa;AAAtB;AAEvB,eAA+B;fAFR;AAAsB;AA2BR;AAAd;AAEvB;AACA,eAAU;fAHa;AAAc;AAoCA;AAErC;AAFqC;AAKD;AAEpC;AACA;AACA;AAEA,UAAG,CAAY,CAAC,eAAD,SAAf,EACE,MADF;5CAGA,eAAwD,MAA1B,eAAU,QAAQ,OAAQ,GAAE,CAAF,EAAW,eAAnE;xEAAI;AACmB,uBAAU,OAAO,CAAC,CAAD;;hCAExC,eAAS,SAAkB,QAAb,WAAM,SAAC,EAAM,GAAE,CAAF,qBAA3B;/EAAI;AAEF,YAAK,WAAM,KAAC,CAAD;7BACX,cAAO,QAAQ,cAAc,CAAC,QAAD;7CAC7B,WAAG,cAAC,QAAY,CAAb;lCACH,WAAG,UAAH,GAAiB;xBACjB,uBAAS,YAAY,CAAC,GAAD;;vCAGvB;AArBoC;AA/DD;AAAZ;AAEvB,eAAU;fACV,UAAY,eAAD,QAAX,EACE,SAA+B,eAAU,cAD3C;zEAHuB;AAAY;AApDC;AAAb;AAEvB,eAAU,QAAQ,cAAc,CAAC,QAAD;9CAFT;AAAa;AAWF;AAElC;AACA,UAAY,eAAD,QAAX,EACE,eAAS,aAAa,CAAC,WAAW,IAAZ,CADxB;hFAHkC;AAjCA;AAElC;AACA,UAAY,uBAAD,QAAX;zCAEE,+BAAa,SAAb,GAA0B;pCAF5B;PAHkC;AA6DO;AAEzC;AAEA,UAAY,6BAAD,QAAX,EACE,6BAAmB,cAAnB,GAAqC,eADvC;9GAJyC;AArBT;AAEhC,iBAAM,OAAO,CAAC,MAAD;/BAFmB;AAmFI;AAEpC,UAAG,eAAW,KAAG,MAAjB;pCAEE,0BAAc;1BACd;OAHF;PAFoC;AArBN;AAE9B;AACA;AAH8B;AAbA;AAE9B,wBAAc;xBACd,UAAY,cAAD,QAAX,EACE,cAAQ,CAAC,IAAD,CADV;tDAH8B;AAmBO;AAErC;AAEA;AAEA,YAAsB,uBAAa,SAAS,MAAC,mBAAD;rEAC5C,SAAG,aAAa,CAAC,WAAW,UAAZ;5CAPqB;AA9FG;AAExC;AACA,oBAAU,uBAAW,QAAC;nDACtB,iBAAM,UAAN,GAAmB;9BACnB,wBAAa,IAAb;5BALwC;AAaR;AAEzB,eAAP,KAAO;pBACP;AAHgC;AA/rDjB;AAoEN;;AAEO,6BC9iBV,uCD8iBU;pEACW;AACT,+BCxiBV,yCDwiBU;xEACF,6BDlcV,YCkcU;zCACW;AACP;AACF;AACH,4BD7YV,sCC6YU;lEACE,8BV5oBV,YU4oBU;1CACF;AACK,iCV9oBb,YU8oBa;7CACJ,6BLrWL,iCKqWK;9DACD,4BVhpBR,YUgpBQ;xCACK;AACD;AACA,gCVnpBZ,YUmpBY;5CACD;AACH;AACD,2BVtpBP,YUspBO;vCACI;AACF,6BVxpBT,YUwpBS;zCACG,gCChjBP,6CDgjBO;7EACD,+BCjjBN,6CDijBM;5EACG,kCCljBT,6CDkjBS;/EACD,iCC/iBX,0CD+iBW;3EACC,kCC/iBP,+CD+iBO;jFACH,+BCjjBT,0CDijBS;zEACI,mCCrjBX,4CDqjBW;/EACF,iCCtjBT,4CDsjBS;7EACE,mCCrjBP,gDDqjBO;nFACC,oCCzjBX,6CDyjBW;jFACA,oCC1jBX,6CD0jBW;jFACL,+BC3jBN,6CD2jBM;5EACD,8BC5jBL,6CD4jBK;3EAnCR;AAmIE;;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAVS;;AAIT,iBAJS;jBAOT,yBAPS;zBAST,oBATS;;;pBAm4De;AAAP;AAEnB,UAAY,4BAAD,QAAX;9CAEE,4BAAgB;5BAChB,mBAAM,WAAC,CAAQ,4BAAkB,MAA1B;jEACP,4BAAgB;rBAJlB;PAOA,eAAU,WAAM,WAAC;rCATE;AAAO;AA3BC;AAE3B,iBAAM,WAAC,CAAQ,KAAR;lCAFoB;AAlBK;AAEhC,UAAG,eAAW,KAAG,KAAjB;nCAEE,0BAAc;1BACd;OAHF;PAFgC;AASD;AAE/B,UAAG,cAAU,KAAG,KAAhB;lCAEE,yBAAa;zBACb;OAHF;PAF+B;AAhCA;AAE/B,UAAG,cAAU,KAAG,KAAhB;lCAEE,yBAAa;zBACb;OAHF;PAF+B;AA+FS;AAArB;AAEnB,eAA8B;fAFX;AAAqB;AAjFT;AAE/B,UAAI,cAAU,KAAG,KAAjB;lCAEE,yBAAa;zBACb;OAHF;PAF+B;AArCC;AAAb;AAEnB,eAAU,QAAQ,cAAc,CAAC,UAAD;hDAFb;AAAa;AAWA;AAAb;AAEnB;AACA;AACA,eAAU;fAJS;AAAa;AAzCC;AAAd;AAEnB;AACA,eAAU;fAHS;AAAc;AAqIJ;AAAV;AAEnB,eAAU;fAFS;AAAU;AAKI;AAEjC,kCAAkB,UAAlB,GAAgC,WAAK,WAAC;rEAFL;AAKA;AAAd;AAEnB,eAAU,WAAM,WAAC;rCAFE;AAAc;AAzIH;AAE9B;AACA,UAAY,4BAAD,QAAX,EACE,4BAAkB,QAAlB,GAA8B,wCADhC;/HAGA,UAAY,4BAAD,QAAX,EACE,4BAAkB,SAAlB,GAA+B,yCADjC;jIAN8B;AA6FO;AAErC;AACA,UAAW,CAAC,4BAAD,SAAqB,IAAI,CAAI,iBAAxC;tEAEE,oCAAkB,MAAlB,GAA4B;7CAC5B,oCAAkB,kBAAkB,CAAC,eAAU,cAAS,GAAE,eAAtB;tGACpC,oCAAkB,MAAM,YAAY,CAAC,SAAU,MAAX;tEACpC,oCAAkB,SAAlB,GAA+B;zCALjC;PAHqC;AAYE;AAEvC;AACA,UAAW,CAAC,4BAAD,SAAqB,IAAI,CAAI,iBAAxC;tEAEE,oCAAkB,MAAM,YAAY,CAAC,WAAY,EAAb;7DAFtC;PAHuC;AAjDX;AAE5B,iBAAM,OAAO,CAAC,MAAD;/BAFe;AAdK;AAEjC;AAFiC;AAhCP;AAE1B,UAAY,cAAD,QAAX,EACE,cAAQ,CAAC,IAAD,CADV;tDAF0B;AAMU;AAEpC;AACA,oBAAU,uBAAW,QAAC;nDACtB,iBAAM,UAAN,GAAmB;9BACnB,wBAAa,IAAb;5BALoC;AAaR;AAErB,eAAP,KAAO;pBACP;AAH4B;AA7yDjB;AAmDN;;AAEW,6BCpuBV,uCDouBU;pEACW;AACT,+BC9tBV,yCD8tBU;xEACC;AACG,mCCtuBV,6CDsuBU;hFACN,6BD1nBV,YC0nBU;zCACW;AACP;AACF;AACH,4BDrkBV,sCCqkBU;lEACE,8BVp0BV,YUo0BU;1CACF;AACA,4BVt0BR,YUs0BQ;xCACC,6BL7hBL,iCK6hBK;9DACG;AACA,gCVz0BZ,YUy0BY;5CACC,iCV10Bb,YU00Ba;7CACA;AACD;AACA,gCV70BZ,YU60BY;5CACD;AACH;AACD,2BVh1BP,YUg1BO;vCACI;AACF,6BVl1BT,YUk1BS;zCACG,gCC1uBP,6CD0uBO;7EACD,+BC3uBN,6CD2uBM;5EACG,kCC5uBT,6CD4uBS;/EACD,iCCzuBX,0CDyuBW;3EACC,kCCzuBP,+CDyuBO;jFACH,+BC3uBT,0CD2uBS;zEACI,mCC/uBX,4CD+uBW;/EACF,iCChvBT,4CDgvBS;7EACE,mCC/uBP,gDD+uBO;nFACC,oCCnvBX,6CDmvBW;jFACA,oCCpvBX,6CDovBW;jFACL,+BCrvBN,6CDqvBM;5EACD,8BCtvBL,6CDsvBK;3EAvCZ;AA4IY;AA6tEqB;AAAb;AAEzB,eAAU,QAAQ,cAAc,CAAC,MAAD;5CAFP;AAAa;AA7tErB;AAKH;;AAGJ;;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXQ;;AAGR,mBAHQ;nBAWR,oBAXQ;;;pBAgmEgB;AAE1B,UAAG,UAAM,KAAG,KAAZ;9BAEE,qBAAS;rBAGF;AACH,YADG,KACH;jBAEE,wBAAS,CAAC,eAAM,cAAK,iBAAQ,EAApB;hEAEX,UALG,KAKH;xBAEE,wBAAS,CAAC,eAAM,cAAK,GAAI,eAAhB;/DAFX;TAMJ;AACA;OAjBF;PAF0B;AAkDI;AAE9B,UAAG,cAAU,KAAG,KAAhB;lCAEE,yBAAa;zBACb;OAHF;PAF8B;AA3BL;AAEzB,UAAG,SAAK,KAAG,KAAX;7BAEE,oBAAQ;pBACR;OAHF;PAFyB;AASA;AAEzB,UAAG,SAAK,KAAG,KAAX;7BAEE,oBAAQ;pBACR;OAHF;PAFyB;AASK;AAE9B,UAAG,cAAU,KAAG,KAAhB;lCAEE,yBAAa;zBACb;OAHF;PAF8B;AAjED;AAAX;AAElB,eAAU;fACV,UAAY,iBAAD,QAAX;nCAEO;AACH,YADG,KACH;jBAAc,mBAAU,UAAK,CAAC,aAAQ,CAAC,iBAAO,WAAR,CAAT;zEAC7B,kBAFG,KAEH,qCAAY,SAAU,UAAK,CAAC,aAAQ,CAAC,iBAAO,UAAR,CAAT,CAA3B;pHAJJ;PAHkB;AAAW;AAnBA;AAAX;AAElB,eAAU;fACV,UAAG,MAAO,KAAE,CAAZ,EACE,SAAU,EADZ;nCAHkB;AAAW;AAOH;AAAR;AAElB,eAAU;fACV,UAAY,aAAD,QAAX;/BAEO;AACH,YADG,KACH;jBAAc,mBAAiB,CAAN,KAAM,GAAE,aAAQ,SAAC,EAAX,CAAkB,GAAO,CAAJ,SAAI,GAAE,SAAF,CAAP;/EACjD,kBAFG,KAEH,qCAAY,SAAiB,CAAN,KAAM,GAAE,aAAQ,UAAC,EAAX,CAAmB,GAAO,CAAJ,SAAI,GAAE,SAAF,CAAvD;3HAJJ;PAHkB;AAAQ;AA5BK;AAAb;AAElB,eAAU,QAAQ,cAAc,CAAC,MAAD;5CAFd;AAAa;AAWL;AAAR;AAElB,wBAAc;xBACd,UAAY,cAAD,QAAX,EACE,cAAQ,CAAC,IAAD,CADV;tDAGA,wBAAc;xBACd,eAAU;fAPQ;AAAQ;AAlBG;AAE7B;AACA,UAAY,uBAAD,QAAX,EACE,uBAAa,SAAb,GAA2B,mCAD7B;jHAH6B;AAkIS;AAEtC;AAEA,UAAY,uBAAD,QAAX;zCAEE,+BAAa,MAAM,YAAY,CAAC,WAAY,MAAb;nEAC1B;AACH,YADG,KACH;jBAEE,iCAAa,MAAM,YAAY,CAAC,aAAc,QAAf;zEAC/B,iCAAa,MAAM,YAAY,CAAC,aAAc,EAAf;1DAEjC,UANG,KAMH;xBAEE,iCAAa,MAAM,YAAY,CAAC,aAAc,EAAf;nEAC/B,iCAAa,MAAM,YAAY,CAAC,aAAc,QAAf;hEAHjC;FATJ;PAJsC;AAsBN;AAEhC;AAAG;AAAG;AAAG;AACT;AACA;AAEA,UAAyD,CAA/B,CAAvB,CAAY,CAAC,aAAD,SAAW,IAAG,CAAY,CAAC,uBAAD,SAAf,CAA+B,IAAc,CAAV,yCAAU,IAAG,oBAAH,CAAd,CAAiC,IAAG,eAA7F,EACE,MADF;9KAGA,WAAM;XACN,UAAU,CAAJ,SAAI,GAAE,SAAF,CAAO,GAAE,EAAF;tCAEZ;AACH,UADG,KACH;fAEE,YAAK;ZACL,YAAK;ZACL,YAAK,UAAK,CAAC,CAAE,GAAE,eAAL;1CACV,YAAK,UAAK,CAAoB,CAAP,CAAV,cAAU,GAAE,SAAF,CAAO,GAAO,CAAJ,SAAI,GAAE,SAAF,CAAP,CAAe,GAAE,CAArC;5EAEZ,UARG,KAQH;tBAEE,YAAK;ZACL,YAAK;ZACL,YAAK,UAAK,CAAC,CAAE,GAAE,gBAAL;3CACV,YAAK,UAAK,CAAoB,CAAP,CAAV,cAAU,GAAE,SAAF,CAAO,GAAO,CAAJ,SAAI,GAAE,SAAF,CAAP,CAAe,GAAE,CAArC;5EALZ;PASF,mBAAQ,UAAU,CAAC,EAAG,EAAG,EAAG,CAAV;rCAClB,6BAAa,WAAb,GAA4B;3CAC5B,6BAAa,UAAb,GAA2B;1CA/BK;AA7FP;AAEzB;AACA;AAHyB;AAMG;AAE5B;AACA;AAH4B;AAvFO;AAEnC;AACA,sBAAW,IAAX;1BACA,mBAAS;nBACT,uBAAa;vBACb,kBAAQ;lBACR,kBAAQ;lBACR,0BAAgB;1BAChB,0BAAgB;1BAEhB,sBAAY,sBAAiB,QAAC,YAAM,CAAC,IAAD,CAAN;tEAC9B,mBAAQ,UAAC,CAAU,IAAV;lCACT,mBAAQ,SAAC,CAAS,GAAT;hCACT,mBAAQ,UAAC,CAAU,EAAV;hCAET,oBAAS,GAAT;vBACA,qBAAU,EAAV;vBAEA;AAnBmC;AAkCR;AAElB,eAAT,KAAS;pBACT;AAH2B;AAriEjB;AAgCM,6BCt5BV,uCDs5BU;pEACW;AACV,8BV9+BV,YU8+BU;1CACF,4BAtCD,6BAsCC;zDACI,gCVh/BZ,YUg/BY;5CACJ,4BVj/BR,YUi/BQ;xCACO,mCAxCT,YAwCS;/CACA,mCAzCT,YAyCS;/CACR,2BVp/BP,YUo/BO;vCACA,2BVr/BP,YUq/BO;vCACK,gCVt/BZ,YUs/BY;5CACL,2BVv/BP,YUu/BO;vCACI;AACF,6BVz/BT,YUy/BS;zCACG,gCCj5BP,6CDi5BO;7EA9CT;AAn+BZ;ACAA,8BAES,+DAFT;;;;7FASS,iBAAG;jBACJ,gBAAG;hBACA,mBAAG;nBACJ,kBAAG;lBACD,oBAAG;pBACN,iBAAG;jBAGD,mBAAG;nBACJ,kBAAG;lBACH,kBAAG;lBACJ,iBAAG;jBACJ,gBAAG;hBACF,iBAAG;jBACH,iBAAG;jBACL,eAAG;fACA,kBAAG;lBACJ,iBAAG;jBAGD,mBAAG;nBACH,mBAAG;nBAoBP,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACH,eAAG;fACF,gBAAG;hBACH,gBAAG;hBACH,gBAAG;hBAkBA,mBAAO;nBACV,gBAAU;hBACT,iBAAS;jBACT,iBAAS;jBACT,iBAAS;jBACV,gBAAU;hBACN,oBAAM;pBACR,kBAAQ;lBACN,oBAAM;pBACR,kBAAQ;lBACP,mBAAO;nBACL,qBAAK;rBACV,gBAAU;hBACR,kBAAQ;lBACR,kBAAQ;lBACR,kBAAQ;lBACL,qBAAK;rBACP,mBAAO;nBACZ,cAAY;dACN,oBAAM;pBACV,gBAAU;hBACL,qBAAK;rBACP,mBAAO;nBAQV;;AACM;;AACA;;AACI;AACN;;AAGC;;AACH,8BADG,mCACH;jEAQY;;AAAT,iCAAS,qCAAT;tEAGC,mEAAmB,UX7DxB,2BW6DwB,CAAnB;zGACD,kEAAmB,UX9DvB,2BW8DuB,EAAiB,UAnBnC,0BAmBmC,EAAqB,SAJzD,yBAIyD,EAAgB,KX1G7E,WW0G6E,EAAE,KX1G/E,WW0G+E,CAA3E;tNACK,uEAAmB,UX/D5B,2BW+D4B,EAAgB,SALxC,yBAKwC,EAAyB,cX3GrE,WW2GqE,EAAmB,YT7GzF,yBS6GyF,EAAqB,yBAApG;7OACD,sEAAmB,UXhE3B,2BWgE2B,EAAgB,SANvC,yBAMuC,EAAgB,KX5G3D,WW4G2D,EAAE,KX5G7D,WW4G6D,CAArD;pLACN,gEAAmB,UXjErB,2BWiEqB,EAAmB,oBAAa,SAPjD,yBAOiD,CAAnD;9JACK,qEAAmB,UXlE1B,2BWkE0B,EAAoB,oBAAvC;hIACH,kEAAmB,UXnEvB,2BWmEuB,EAAY,KX/GnC,WW+GmC,EAAE,KX/GrC,WW+GqC,CAAjC;5IAOO;AAGV;;;AAEN;AACA;AAAO;AAAM;AAAQ;AAHf;;AAEN,oBAFM;;;pBA+fgB;AAExB,UAAI,KAAM,KAAG,UAAb;9BAEE,qBAAS;rBACT;OAHF;PAFwB;AASD;AAEvB,UAAI,KAAM,KAAG,SAAb;7BAEE,oBAAQ;pBACR;OAHF;PAFuB;AASE;AAEzB,UAAI,KAAM,KAAG,WAAb;/BAEE,sBAAU;tBACV;OAHF;PAFyB;AASC;AAE1B,UAAI,KAAM,KAAG,YAAb;hCAEE,uBAAW;vBACX;OAHF;PAF0B;AASD;AAEzB,UAAY,cAAD,QAAX,EACE,cAAQ,CAAC,IAAD,CADV;tDAFyB;AAmhFA;AAEzB,mBAAS;nBACT,kBAAQ;lBACR,qBAAW;rBACX,oBAAU;pBALe;AAtjGjB;AAcO,4BXvIR,YWuIQ;xCACD,2BXxIP,YWwIO;vCACE,6BXzIT,YWyIS;zCACC,8BX1IV,YW0IU;1CAjBT;AAsBA;;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAS;AACT;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1EM;;AAGN,iBAHM;jBAQN,mBARM;nBAWN,qBAXM;rBAYN,wBAZM;xBAgBN,gBAhBM;hBAiBN,kBAjBM;lBAiBG,sBAjBH;tBAkBN,oBAlBM;pBAwBN,mBAxBM;nBAyBN,sBAzBM;tBA0BN,uBA1BM;vBA2BN,qBA3BM;rBA4BN,uBA5BM;vBA6BN,qBA7BM;rBA8BN,mBA9BM;nBA+BN,sBA/BM;tBAgCN,mBAhCM;nBAiCN,kBAjCM;lBA6CN,mBA7CM;nBAgDN,wBAhDM;xBAiDN,wBAjDM;xBAoDN,wBApDM;xBAqDN,mBArDM;nBAsDN,wBAtDM;xBA0DN,uBA1DM;vBA2DN,wBA3DM;xBA4DN,sBA5DM;tBAkEN,oBAlEM;pBAmEN,0BAnEM;;;1BAixFwB;AAAhB;AAEhB,eAAgB,WAAC,cAAD;xCAFA;AAAgB;AA0BL;AAAX;AAEhB,eAAU,cAAS,CAAC,KAAD;nCAFH;AAAW;AApsDA;AAE3B,UAAI,aAAS,KAAG,MAAhB;lCAEE;AACA,wBAAY;xBACZ;AACA;OALF;PAF2B;AAWF;AAEzB,UAAI,WAAO,KAAG,MAAd;hCAEE,sBAAU;tBACV;OAHF;PAFyB;AAgDC;AAE1B;AAEA,UAAG,YAAQ,KAAG,MAAd;jCAEE,YAAU,CAAN,WAAM,IAAG,cAAC,mBAAQ,oBAAS,oBAAlB,CAAH,CAAgC,IAAY,CAAC,uBAAD,SAAtD;5IAEE,eAAM,uBAAa;tCACnB,cAAU,CAAP,EAAE,IAAK,GAAE,MAAF,CAAS,IAAG,MAAM,YAA5B;rDAEE,qBAAU,UAAK,CAAC,MAAM,YAAa,GAAE,EAAE,IAAxB;3DAEf,gBAAG,sBAAH,EACE,SAAiB,CAAP,MAAO,GAAE,aAAO,QAAT,CAAiB,GAAE,aAAO,KAD7C;3FAJF;FAHF;TAYA,uBAAW;vBAEX;OAhBF;PAJ0B;AAsGF;AAExB,UAAG,UAAM,KAAG,MAAZ;/BAEE,qBAAS;rBACT;OAHF;PAFwB;AATI;AAE5B,UAAG,cAAU,KAAG,MAAhB;nCAEE,yBAAa;zBACb;OAHF;PAF4B;AAyBA;AAE5B,UAAG,cAAU,KAAG,MAAhB;nCAEE,yBAAa;zBACb;OAHF;PAF4B;AASD;AAE3B,UAAG,aAAS,KAAG,MAAf;lCAEE,wBAAY;xBACZ;OAHF;PAF2B;AAkDF;AAEzB,UAAG,WAAO,KAAG,KAAb;/BAEE,sBAAU;tBACV;OAHF;PAFyB;AASW;AAEpC,UAAG,sBAAkB,KAAG,KAAxB;1CAEE,iCAAqB;jCACrB;OAHF;PAFoC;AAoIV;AAE1B,qBAAW;rBACX;AAH0B;AAyyCG;AAAb;AAEhB,YAAM,KAAN,GAAe;pBACf,YAAM,IAAN,GAAc;nBACd,YAAM,MAAN,GAAgB,cAAK,GAAE,eAAF;rDACrB,YAAM,OAAN,GAAiB,aAAI,GAAE,gBAAF;tDALL;AAAa;AAp3CC;AAE9B,oBAAS,CAAC,KAAK,MAAO,KAAK,KAAM,KAAK,MAAO,GAAE,KAAK,KAAP,CAAc,KAAK,OAAQ,GAAE,KAAK,IAAtE;3FAFqB;AApIR;AAEtB,iBAAO;jBACP,UAAY,eAAD,QAAX,EACE,eAAU,cAAC,KAAS,KAAV,CADZ;3EAHsB;AA7CK;AAE3B,mBAAQ,OAAO,CAAC,KAAD;hCAFY;AA8IA;AAE3B,UAAa,UAAT,cAAY,KAAH,CAAb;xCAEE,wBAAY;xBACZ;OAHF;PAF2B;AAzRI;AAAf;AAEhB,eAAU;fAFM;AAAe;AAsfA;AAAf;AAEhB;AAEA,eAAe,qBAAL,eAAK,CAAC,EAAG,CAAJ;vDACf,UAAY,uBAAD,QAAX;zCAEE,YAAK,uBAAa;nCAClB,iBAAe,qBAAL,eAAK,CAAC,UAAK,CAAC,CAAC,KAAF,EAAU,UAAK,CAAC,CAAC,IAAF,CAArB;nFAHjB;PALgB;AAAe;AA5YA;AAE/B,UAAI,iBAAa,KAAG,KAApB;rCAEE,4BAAgB;5BAChB;OAHF;PAF+B;AA/DD;AAE9B,UAAI,gBAAY,KAAG,KAAnB;pCAEE,2BAAe;3BACf;OAHF;PAF8B;AAkHD;AAE7B,UAAI,eAAW,KAAG,KAAlB;nCAEE,0BAAc;1BACd;OAHF;PAF6B;AAqPF;AAAX;AAEhB,eAAU,CAAI;hBAFE;AAAW;AA7YA;AAE3B,UAAI,aAAS,KAAG,KAAhB;jCAEE,wBAAY;xBACZ;OAHF;PAF2B;AAsSD;AAE1B,UAA6B,CAAd,CAAT,CAAF,CAAE,KAAG,cAAH,CAAS,IAAM,CAAF,CAAE,KAAG,aAAH,CAAN,CAAc,IAAW,CAAP,MAAO,KAAG,eAAH,CAAX,CAAqB,IAAY,CAAR,OAAQ,KAAG,gBAAH,CAA9D;/HAEE,mCAAuB;nCACvB,qBAAQ,CAAR;tBACA,oBAAO,CAAP;rBACA,sBAAS,MAAT;5BACA,uBAAU,OAAV;9BACA;AACA,mCAAuB;nCACvB;AACA;AACA;OAXF;PAF0B;AAw3BK;;AAwgBC;;AA1kCR;AAAR;AAEhB,eAAU;fAEV,UAAiB,CAAN,CAAP,MAAO,KAAE,CAAC,CAAH,CAAM,IAAY,CAAC,uBAAD,SAAZ,CAA4B,IAAI,CAAe,CAAV,yCAAU,IAAG,oBAAH,CAAhE;xIAEE,iBAAU,UAAK,CAAC,uBAAa,YAAd;xDAFjB;PAJgB;AAAQ;AAUC;AAAT;AAEhB,eAAU;fAEV,UAAiB,CAAN,CAAP,MAAO,KAAE,CAAC,CAAH,CAAM,IAAY,CAAC,uBAAD,SAAZ,CAA4B,IAAI,CAAe,CAAV,yCAAU,IAAG,oBAAH,CAAhE;xIAEE,iBAAU,UAAK,CAAC,uBAAa,aAAd;zDAFjB;PAJgB;AAAS;AAvKI;AAAb;AAEhB,eAAU,WAAO,GAAE,iBAAF;9CAFD;AAAa;AALC;AAAd;AAEhB,eAAU,YAAQ,GAAE,iBAAF;/CAFF;AAAc;AAkIP;AAAP;AAEhB,eAAU;fACV,UAAiB,CAAN,CAAP,MAAO,KAAE,CAAC,CAAH,CAAM,IAAY,CAAC,uBAAD,SAAZ,CAA4B,IAAI,CAAe,CAAV,yCAAU,IAAG,oBAAH,CAAhE,EACE,SAAU,UAAK,CAAC,uBAAa,WAAd,CADjB;jMAHgB;AAAO;AAOD;AAAN;AAEhB,eAAU;fACV,UAAiB,CAAN,CAAP,MAAO,KAAE,CAAC,CAAH,CAAM,IAAY,CAAC,uBAAD,SAAZ,CAA4B,IAAI,CAAe,CAAV,yCAAU,IAAG,oBAAH,CAAhE,EACE,SAAU,UAAK,CAAC,uBAAa,UAAd,CADjB;hMAHgB;AAAM;AAz2BO;AAAb;AAEhB,eAAU;fAFM;AAAa;AAxCG;AAAhB;AAEhB,eAAU,QAAQ;vBAFF;AAAgB;AAkHJ;;AArEK;;AAjEH;AAEpB,oBAAD,sBAAC,oBAAW,CAAZ;/DAFqB;AA2vBK;AAAnB;AAEhB,eAAU;fACA,kBAAL,KAAK;vBACR,UADQ,KACR;fAAG,iBAAU;jBACb,gBAFQ,KAER;rBAAG,iBAAU;jBACb,gBAHQ,KAGR,QAAG,SAAU,yBAAb;/DANc;AAAmB;AAUI;AAAvB;AAEhB,eAAU;fACV,UAAG,KAAK,SAAR,EACE,SAAiB,aAAP,OAAS,cAAC,0BAAD,CAAF,CADnB;jGAEA,UAAG,KAAK,QAAR,EACE,SAAiB,aAAP,OAAS,cAAC,yBAAD,CAAF,CADnB;/FAEA,UAAG,KAAK,OAAR,EACE,SAAiB,aAAP,OAAS,cAAC,wBAAD,CAAF,CADnB;7FAPgB;AAAuB;AAiCG;AAA1B;AAEhB,eAAU;fACV,UAAG,KAAK,SAAR,EACE,SAAiB,aAAP,OAAS,cAAC,0BAAD,CAAF,CADnB;jGAEA,UAAG,KAAK,QAAR,EACE,SAAiB,aAAP,OAAS,cAAC,yBAAD,CAAF,CADnB;/FAEA,UAAG,KAAK,OAAR,EACE,SAAiB,aAAP,OAAS,cAAC,wBAAD,CAAF,CADnB;7FAPgB;AAA0B;AAtBE;AAA5B;AAGhB,eAAU;fACV,UAAG,KAAK,SAAR,EACE,SAAiB,aAAP,OAAS,cAAC,0BAAD,CAAF,CADnB;jGAEA,UAAG,KAAK,QAAR,EACE,SAAiB,aAAP,OAAS,cAAC,yBAAD,CAAF,CADnB;/FAEA,UAAG,KAAK,OAAR,EACE,SAAiB,aAAP,OAAS,cAAC,wBAAD,CAAF,CADnB;7FARgB;AAA4B;AA4JL;AAAvB;AAEhB,eAAU;fACV,UAAG,KAAK,SAAR,EACE,SAAiB,aAAP,OAAS,cAAC,0BAAD,CAAF,CADnB;jGAEA,UAAG,KAAK,QAAR,EACE,SAAiB,aAAP,OAAS,cAAC,yBAAD,CAAF,CADnB;/FAEA,UAAG,KAAK,OAAR,EACE,SAAiB,aAAP,OAAS,cAAC,wBAAD,CAAF,CADnB;7FAPgB;AAAuB;AAkGV;AAAb;AAEhB,2BAAiB;3BACjB;AACA;AACA,eAAU;fACV,2BAAiB;3BAND;AAAa;AAgFA;AAAb;AAEhB;AACA;AAEA,2BAAiB;3BACjB;AAEA,WAAkC,WAA5B,iCAA4B,CAAC,KAAD;7DAElC,UAAK;VACL,qBAAU,CAAC,eAAI,gBAAK,CAAC,CAAC,KAAK,OAAP,EAAiB;;;;3DAA3B;VACV,UAAY,kBAAD,QAAX,EACE,kBAAY,CAAC,KAAM,eAAI,gBAAK,CAAC,CAAC,KAAK,OAAP,EAAsB,qBAAL,eAAK,CAAC,EAAG,CAAJ,GAAQ;;;;9IAA9C,CADd;XAEA,eAAU;fACV,2BAAiB;3BAfD;AAAa;AAvEG;AAAhB;AAEhB,2BAAiB;3BACjB;AACA;AACA,eAAU;fACV,2BAAiB;3BAND;AAAgB;AASC;AAAjB;AAEhB;AAAG;AACH;AACA;AACA;AAEA,2BAAiB;3BACjB;AAEA,UAA0B,CAAP,CAAd,KAAK,QAAS,GAAE,cAAF,CAAO,GAAE,QAAQ,KAAK,WAAf,CAA2B,GAAE,QAAQ,gBAAgB,WAA1B;7GACrD,UAAyB,CAAN,CAAd,KAAK,QAAS,GAAE,aAAF,CAAM,GAAE,QAAQ,KAAK,UAAf,CAA0B,GAAE,QAAQ,gBAAgB,UAA1B;1GAEnD,UAAK;VACL,aAAe,CAAD,QAAd;tBAEE,YAAK,CAAE,GAAE,CAAC,QAAC,EAAJ;3BACP,YAAK,CAAE,GAAE,CAAC,OAAC,EAAJ;1BACP,YAAK,CAAC;;bAGR,WAA6B,WAAvB,4BAAuB,CAAC,KAAD;xDAC7B,WAAM,wBAAmB,CAAC,KAAD;zCAEzB,oBAAS,CAAC,GAAI,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAAxB;9EACT,UAAY,iBAAD,QAAX,EACE,iBAAW,CAAC,KAAM,GAAI,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAA9B,CADb;tHAEA,eAAU;fACV,2BAAiB;3BA5BD;AAAiB;AA+BF;AAAf;AAEhB;AAAG;AACH;AACA;AACA;AAEA,2BAAiB;3BACjB;AAEA,UAA0B,CAAP,CAAd,KAAK,QAAS,GAAE,cAAF,CAAO,GAAE,QAAQ,KAAK,WAAf,CAA2B,GAAE,QAAQ,gBAAgB,WAA1B;7GACrD,UAAyB,CAAN,CAAd,KAAK,QAAS,GAAE,aAAF,CAAM,GAAE,QAAQ,KAAK,UAAf,CAA0B,GAAE,QAAQ,gBAAgB,UAA1B;1GAEnD,UAAK;VACL,aAAe,CAAD,QAAd;tBAEE,YAAK,CAAE,GAAE,CAAC,QAAC,EAAJ;3BACP,YAAK,CAAE,GAAE,CAAC,OAAC,EAAJ;1BACP,YAAK,CAAC;;bAGR,WAA6B,WAAvB,4BAAuB,CAAC,KAAD;xDAC7B,WAAM,wBAAmB,CAAC,KAAD;zCAEzB,kBAAO,CAAC,GAAI,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAAxB;5EACP,UAAY,eAAD,QAAX,EACE,eAAS,CAAC,KAAM,GAAI,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAA9B,CADX;lHAEA,eAAU;fACV,2BAAiB;3BA5BD;AAAe;AA8SE;AAAjB;AAEhB;AAAG;AACH;AACA;AAEA,2BAAiB;3BACjB;AAEA,UAA0B,CAAP,CAAd,KAAK,QAAS,GAAE,cAAF,CAAO,GAAE,QAAQ,KAAK,WAAf,CAA2B,GAAE,QAAQ,gBAAgB,WAA1B;7GACrD,UAAyB,CAAN,CAAd,KAAK,QAAS,GAAE,aAAF,CAAM,GAAE,QAAQ,KAAK,UAAf,CAA0B,GAAE,QAAQ,gBAAgB,UAA1B;1GAEnD,UAAK;VACL,aAAe,CAAD,QAAd;tBAEE,YAAK,CAAE,GAAE,CAAC,QAAC,EAAJ;3BACP,YAAK,CAAE,GAAE,CAAC,OAAC,EAAJ;1BACP,YAAK,CAAC;;bAGR,WAA6B,WAAvB,4BAAuB,CAAC,KAAD;xDAE7B,oBAAS,CAAC,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAApB;3EACT,UAAY,iBAAD,QAAX,EACE,iBAAW,CAAC,KAAM,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAA1B,CADb;nHAEA,eAAU;fACV,2BAAiB;3BA1BD;AAAiB;AAxBC;AAAlB;AAEhB,UAAG,eAAH,EACE,aADF;xCAGA,WAAK;XACL;AACA,UAAY,kBAAD,QAAX,EACE,kBAAY,CAAC,IAAD,CADd;9DAEA,eAAU;fATM;AAAkB;AApXK;AAAvB;AAEhB,UAAuB,CAAL,CAAd,KAAK,QAAS,KAAE,CAAF,CAAK,IAAI,eAAJ,CAAa,IAAI,CAAI,sBAA5C;/EAEE;AACA,4BAAe,CAAC,KAAD;lCACf,+BAAkB,CAAC,KAAD;9BAJpB;PAMA,+BAAqB;/BACrB,eAAU;fATM;AAAuB;AAYA;AAAvB;AAEhB,+BAAqB;/BACrB,eAAU;fAHM;AAAuB;AAoXL;AAAlB;AAEhB,UAAG,eAAH,EACE,aADF;xCAGA,WAAK;XACL;AACA,UAAY,kBAAD,QAAX,EACE,kBAAY,CAAC,IAAD,CADd;9DAEA,eAAU;fATM;AAAkB;AAyCH;AAAf;AAEhB;AACA;AAEA,2BAAiB;3BACjB;AAEA,UAAK,eAAU,CAAC,KAAK,IAAN;nCAEf,WAAgC,WAA1B,+BAA0B,CAAC,KAAD;3DAEhC,kBAAO,CAAC;;;;RAAG,cAAJ;zBACP,UAAY,eAAD,QAAX,EACE,eAAS,CAAC,KAAM;;;;7CAAG,cAAV,CADX;1BAEA,eAAU;fACV,2BAAiB;3BAhBD;AAAe;AAmBF;AAAb;AAEhB;AACA;AACA;AAEA,2BAAiB;3BACjB;AAEA,UAAK,eAAU,CAAC,KAAK,IAAN;nCAGf,WAAgC,WAA1B,+BAA0B,CAAC,KAAD;3DAGhC,UAAI,CAAE,KAAE,EAAR;lBAEE,YAAK;ZACL,YAAY,gBAAD,QAAX,EACE,gBAAU,CAAC,KAAM;;;;hDAAP,CADZ;NAHF;PAOA,gBAAK,CAAC;;;;NAAG,cAAJ;zBACL,UAAY,aAAD,QAAX,EACE,aAAO,CAAC,KAAM;;;;zCAAG,cAAV,CADT;1BAEA,eAAU;fACV,2BAAiB;3BA1BD;AAAa;AA6BG;AAAhB;AAEhB;AAEA,2BAAiB;3BACjB;AAEA,UAAG,mBAAc,CAAC,KAAK,IAAN,CAAjB;xCAEE,YAAQ,oBAAC,eAAU,CAAC,KAAK,IAAN,CAAX;1DACR,qBAAQ,CAAC;;;;VAAD;ZACR,YAAY,gBAAD,QAAX,EACE,gBAAU,CAAC,KAAM;;;;hDAAP,CADZ;NAJF;PAQA,eAAU;fACV,2BAAiB;3BAhBD;AAAgB;AAgCJ;AAAZ;AAEhB;AACA,UAAY,YAAD,QAAX,EACE,YAAM,CAAC,IAAD,CADR;lDAEA,eAAU;fALM;AAAY;AAbC;AAAb;AAEhB,2BAAiB;3BACjB;AAEA;AACA,UAAY,aAAD,QAAX,EACE,aAAO,CAAC,IAAD,CADT;pDAGA,eAAU;fACV,2BAAiB;3BAVD;AAAa;AAxUK;AAAlB;AAEhB;AAAE;AACF;AACA;AACA;AAEA,2BAAiB;3BAEjB;AACA,UAAG,gBAAH,EACE,qBADF;jDAGA,UAAG,KAAK,QAAQ,OAAQ,GAAE,CAA1B;lCAEE,gBAAS,KAAK,QAAQ,KAAQ,CAAC,CAAD;pCAE9B,YAA0B,CAAP,CAAd,KAAK,QAAS,GAAE,cAAF,CAAO,GAAE,QAAQ,KAAK,WAAf,CAA2B,GAAE,QAAQ,gBAAgB,WAA1B;/GACrD,YAAyB,CAAN,CAAd,KAAK,QAAS,GAAE,aAAF,CAAM,GAAE,QAAQ,KAAK,UAAf,CAA0B,GAAE,QAAQ,gBAAgB,UAA1B;5GAEnD,YAAK;ZACL,eAAe,CAAD,QAAd;xBAEE,cAAK,CAAE,GAAE,CAAC,QAAC,EAAJ;7BACP,cAAK,CAAE,GAAE,CAAC,OAAC,EAAJ;5BACP,cAAK,CAAC;;fAGR,aAA6B,WAAvB,4BAAuB,CAAC,KAAD;1DAE7B,YAAG,qBAAH;jCAEE,wBAAS,CAAC,yBAAQ,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAA5B;xGACT,cAAY,iBAAD,QAAX,EACE,iBAAW,CAAC,KAAM,yBAAQ,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAAlC,CADb;vIAHF;TAOA,uBAAU,CAAC,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAAhB;/DAEV,YAAY,kBAAD,QAAX,EACE,kBAAY,CAAC,KAAK,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAArB,CADd;jGA1BF;PA6BA,eAAU;fACV,2BAAiB;3BA3CD;AAAkB;AA8CD;AAAjB;AAEhB;AAAE;AACF;AACA;AACA;AAEA,2BAAiB;3BAEjB;AACA,UAAG,gBAAH,EACE,qBADF;jDAGA,UAAG,KAAK,QAAQ,OAAQ,GAAE,CAA1B;lCAEE,gBAAS,KAAK,QAAQ,KAAQ,CAAC,CAAD;pCAE9B,YAA0B,CAAP,CAAd,KAAK,QAAS,GAAE,cAAF,CAAO,GAAE,QAAQ,KAAK,WAAf,CAA2B,GAAE,QAAQ,gBAAgB,WAA1B;/GACrD,YAAyB,CAAN,CAAd,KAAK,QAAS,GAAE,aAAF,CAAM,GAAE,QAAQ,KAAK,UAAf,CAA0B,GAAE,QAAQ,gBAAgB,UAA1B;5GAEnD,YAAK;ZACL,eAAe,CAAD,QAAd;xBAEE,cAAK,CAAE,GAAE,CAAC,QAAC,EAAJ;7BACP,cAAK,CAAE,GAAE,CAAC,OAAC,EAAJ;5BACP,cAAK,CAAC;;fAGR,aAA6B,WAAvB,4BAAuB,CAAC,KAAD;1DAE7B,YAAG,qBAAH;jCAEE,wBAAS,CAAC,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAApB;/EACT,cAAY,iBAAD,QAAX,EACE,iBAAW,CAAC,KAAM,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAA1B,CADb;9GAHF;TAOA,sBAAS,CAAC,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAAhB;9DACT,YAAY,iBAAD,QAAX,EACE,iBAAW,CAAC,KAAK,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAArB,CADb;/FAzBF;PA4BA,2BAAiB;3BACjB,eAAU;fA1CM;AAAiB;AA6CD;AAAhB;AAEhB;AAAE;AACF;AACA;AACA;AAEA,2BAAiB;3BAEjB;AACA,UAAG,gBAAH,EACE,qBADF;jDAGA,UAAG,KAAK,QAAQ,OAAQ,GAAE,CAA1B;lCAEE,gBAAS,KAAK,QAAQ,KAAQ,CAAC,CAAD;pCAC9B,YAA0B,CAAP,CAAd,KAAK,QAAS,GAAE,cAAF,CAAO,GAAE,QAAQ,KAAK,WAAf,CAA2B,GAAE,QAAQ,gBAAgB,WAA1B;/GACrD,YAAyB,CAAN,CAAd,KAAK,QAAS,GAAE,aAAF,CAAM,GAAE,QAAQ,KAAK,UAAf,CAA0B,GAAE,QAAQ,gBAAgB,UAA1B;5GAEnD,YAAK;ZACL,eAAe,CAAD,QAAd;xBAEE,cAAK,CAAE,GAAE,CAAC,QAAC,EAAJ;7BACP,cAAK,CAAE,GAAE,CAAC,OAAC,EAAJ;5BACP,cAAK,CAAC;;fAGR,aAA6B,WAAvB,4BAAuB,CAAC,KAAD;1DAE7B,YAAG,qBAAH;jCAEE,sBAAO,CAAC,yBAAQ,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAA5B;tGACP,cAAY,eAAD,QAAX,EACE,eAAS,CAAC,KAAM,yBAAQ,eAAI,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAAlC,CADX;nIAHF;TAOA,qBAAQ,CAAC,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAAhB;7DACR,YAAY,gBAAD,QAAX,EACE,gBAAU,CAAC,KAAK,gBAAK,CAAC,CAAD,EAAK,gBAAK,CAAC,CAAD,CAArB,CADZ;7FAxBF;PA2BA,2BAAiB;3BACjB,eAAU;fAzCM;AAAgB;AAhHE;AAElC;AAEA,UAAI,iBAAa,KAAE,CAAnB;jCAEE,2BAAc;3BAEd,iBAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;lFAAI;AAEA,cAAG,gBAAQ,CAAC,CAAD,CAAG,YAAd;7CAEE,4BAAQ,CAAC,CAAD,CAAG,MAAK,OAAO,CAAC,UAAD;vDACvB,4BAAQ,CAAC,CAAD,CAAG;pBAHb;;JANN;PAcA;AAlBkC;AAy8BX;;AALC;;AA/iEF;AAEtB,UAAY,aAAD,QAAX,EACE,aAAO,CAAC,IAAD,CADT;pDAFsB;AAi0DQ;AAE9B,UAAG,wBAAoB,IAAiB,CAAb,iBAAa,GAAE,CAAF,CAAxC,EACE,MADF;rEAGA,UAA2B,CAAhB,CAAC,uBAAD,SAAgB,IAAmB,CAAd,uBAAc,KAAG,uBAAH,CAAnB,CAAwC,IAAI,CAAI,iBAA3E;5HAEE,YAAG,CAAI,kBAAP,EACE,0BADF;3DAGA;OALF;PAL8B;AA0CI;AAElC;AAEA,UAAG,wBAAoB,IAAiB,CAAb,iBAAa,GAAE,CAAF,CAAxC,EACE,MADF;rEAGA,UAAW,CAAC,uBAAD,SAAgB,IAAmB,CAAd,uBAAc,KAAG,uBAAH,CAA9C;pGAEE,aAAM;bAEN,YAAI,qBAAgB,KAAE,gCAAtB;tEAEE,cAAG,SAAK,KAAG,CAAC,CAAZ;9BACE,cAAE,MAAM,YAAY,CAAC,MAAO,qBAAQ,CAAC,SAAD,CAAO,GAAE,IAAzB;9EAEpB,gBAAA,EAAE,MAAM,YAAY,CAAC,MAAO,EAAR;7CAEtB,cAAG,UAAM,KAAG,CAAC,CAAb;/BACE,cAAE,MAAM,YAAY,CAAC,OAAQ,qBAAQ,CAAC,UAAD,CAAQ,GAAE,IAA3B;hFAEpB,gBAAA,EAAE,MAAM,YAAY,CAAC,OAAQ,EAAT;rCAVxB;TAaA,YAAI,gBAAY,KAAE,0BAAlB;3DAEE,cAAG,WAAO,KAAG,CAAC,CAAd;hCACE,cAAE,MAAM,YAAY,CAAC,QAAS,qBAAQ,CAAC,oBAAD,CAAgB,GAAE,IAApC;3FAEpB,gBAAA,EAAE,MAAM,YAAY,CAAC,QAAS,EAAV;tCALxB;TAQA,YAAI,gBAAY,KAAE,sBAAlB;vDAEE,YAAE,MAAM,YAAY,CAAC,QAAS,EAAV;hCAFtB;TAKA,YAAI,iBAAa,KAAE,0BAAnB;5DAEE,cAAG,YAAQ,KAAG,CAAC,CAAf;jCACE,cAAE,MAAM,YAAY,CAAC,SAAU,qBAAQ,CAAC,qBAAD,CAAiB,GAAE,IAAtC;7FAEpB,gBAAA,EAAE,MAAM,YAAY,CAAC,SAAU,EAAX;vCALxB;TAQA,YAAI,iBAAa,KAAE,sBAAnB;xDAEE,YAAE,MAAM,YAAY,CAAC,SAAU,EAAX;jCAFtB;TAKA,YAAI,gBAAY,KAAE,yBAAlB;1DAEE,cAAG,WAAO,KAAG,CAAC,CAAd;hCACE,cAAE,MAAM,YAAY,CAAC,QAAS,qBAAQ,CAAC,kBAAD,CAAgB,GAAE,GAApC;xFAEpB,gBAAA,EAAE,MAAM,YAAY,CAAC,QAAS,EAAV;tCALxB;TAQA,YAAI,iBAAa,KAAE,yBAAnB;3DAEE,cAAG,YAAQ,KAAG,CAAC,CAAf;jCACE,cAAE,MAAM,YAAY,CAAC,SAAU,qBAAQ,CAAC,mBAAD,CAAiB,GAAE,GAAtC;1FAEpB,gBAAA,EAAE,MAAM,YAAY,CAAC,SAAU,EAAX;vCALxB;TAQA,YAAG,qBAAiB,KAAE,gCAAtB;tEACE,YAAE,MAAM,YAAY,CAAC,WAAY,UAAb;pDACjB,kBAAG,qBAAiB,KAAE,gCAAtB;5EACH,YAAE,MAAM,YAAY,CAAC,WAAY,UAAb;pDAEpB,cAAA,EAAE,MAAM,YAAY,CAAC,WAAY,EAAb;zCAhExB;PAPkC;AA2EE;AAEpC;AAEA,WAAM;XAEN,UAAG,gBAAW,IAAY,CAAC,YAAD,SAA1B,EACE,UAAI,OAAO,CAAC,YAAM,MAAP,CADb;3FAGA,QAAE,MAAM,YAAY,CAAC,WAAY,QAAb;9CAEf;AACH,UADG,KACH;fAAW,UAAE,MAAM,YAAY,CAAC,SAAU,SAAX;/CAC/B,gBAFG,KAEH;rBAAS,UAAE,MAAM,YAAY,CAAC,SAAU,MAAX;5CAC7B,gBAHG,KAGH;rBAAQ,UAAE,MAAM,YAAY,CAAC,SAAU,MAAX;5CAC5B,gBAJG,KAIH;rBAAS,UAAE,MAAM,YAAY,CAAC,SAAU,WAAX;jDAC7B,gBALG,KAKH;rBAAS,UAAE,MAAM,YAAY,CAAC,SAAU,MAAX;5CAC7B,gBANG,KAMH;rBAAY,UAAE,MAAM,YAAY,CAAC,SAAU,aAAX;nDAChC,gBAPG,KAOH;rBAAU,UAAE,MAAM,YAAY,CAAC,SAAU,WAAX;jDAC9B,gBARG,KAQH;rBAAY,UAAE,MAAM,YAAY,CAAC,SAAU,aAAX;nDAChC,gBATG,KASH;rBAAU,UAAE,MAAM,YAAY,CAAC,SAAU,WAAX;jDAC9B,gBAVG,KAUH;rBAAW,UAAE,MAAM,YAAY,CAAC,SAAU,EAAX;xCAC/B,gBAXG,KAWH;rBAAa,UAAE,MAAM,YAAY,CAAC,SAAU,MAAX;5CACjC,gBAZG,KAYH;rBAAQ,UAAE,MAAM,YAAY,CAAC,SAAU,EAAX;xCAC5B,gBAbG,KAaH;rBAAU,UAAE,MAAM,YAAY,CAAC,SAAU,SAAX;/CAC9B,gBAdG,KAcH;rBAAU,UAAE,MAAM,YAAY,CAAC,SAAU,YAAX;lDAC9B,gBAfG,KAeH;rBAAU,UAAE,MAAM,YAAY,CAAC,SAAU,YAAX;lDAC9B,gBAhBG,KAgBH;rBAAa,UAAE,MAAM,YAAY,CAAC,SAAU,EAAX;xCACjC,gBAjBG,KAiBH;rBAAW,UAAE,MAAM,YAAY,CAAC,SAAU,UAAX;hDAC/B,gBAlBG,KAkBH;rBAAM,UAAE,MAAM,YAAY,CAAC,SAAU,aAAX;nDAC1B,gBAnBG,KAmBH;rBAAY,UAAE,MAAM,YAAY,CAAC,SAAU,MAAX;5CAChC,gBApBG,KAoBH;rBAAQ,UAAE,MAAM,YAAY,CAAC,SAAU,MAAX;5CAC5B,gBArBG,KAqBH;rBAAa,UAAE,MAAM,YAAY,CAAC,SAAU,SAAX;/CACjC,gBAtBG,KAsBH,SAAW,EAAE,MAAM,YAAY,CAAC,SAAU,MAAX,CAA/B;nEAGF,UAAG,eAAH,EACiB,WAAO,MAAM,YAAY,CAAC,SAAU,EAAE,MAAM,iBAAiB,CAAC,QAAD,CAApC,CAD1C;tGAGA,UAAqB,CAAjB,sBAAiB,KAAG,EAAH,CAAO,IAAG,mBAA/B;hEACE,UAAE,MAAM,YAAY,CAAC,UAAW,EAAZ;zCAEpB,YAAA,EAAE,MAAM,YAAY,CAAC,UAAW,MAAZ;jDAEtB;AAEA,QAAE,MAAM,YAAY,CAAC,qBAAsB,MAAvB;tDACpB,QAAE,MAAM,YAAY,CAAC,kBAAmB,MAApB;nDACpB,QAAE,MAAM,YAAY,CAAC,oBAAqB,MAAtB;rDACpB,QAAE,MAAM,YAAY,CAAC,iBAAkB,MAAnB;lDACpB,QAAE,MAAM,YAAY,CAAC,cAAe,MAAhB;/CAEpB,UAAG,sBAAiB,KAAE,EAAtB;vCAEE,YAAG,aAAH,EACE,EAAE,MAAM,YAAY,CAAC,QAAS,kCAAW,CAAC,UAAI,OAAL,CAArB,CADtB;9GAGA,2BAAc,CAAC,GAAI,UAAL;;zCAId,UAAE,MAAM,YAAY,CAAC,QAAS,EAAV;vCACpB,UAAE,MAAM,YAAY,CAAC,cAAe,EAAhB;7CACpB,UAAE,MAAM,YAAY,CAAC,aAAc,EAAf;5CACpB,UAAE,MAAM,YAAY,CAAC,YAAa,EAAd;;3CAhEc;AAvGF;AAElC;AAEA,WAAM;XAEN,UAAG,aAAH;vBACE,UAAE,MAAM,YAAY,CAAC,aAAc,EAAf;5CAEpB,YAAA,EAAE,MAAM,YAAY,CAAC,aAAc,QAAf;tDAEtB,UAAG,aAAH;vBACE,uBAAU,cAAC,WAAe,qBAAQ,CAAC,cAAS,GAAE,CAAZ,CAAxB;zFAEA,YAAV,eAAU,cAAC,WAAe,EAAhB;tDAEZ,UAAG,aAAH;vBACE,uBAAU,gBAAgB,CAAC,UAAD;lDAE1B,YAAA,eAAU,aAAa,CAAC,WAAW,UAAZ;9DAGzB,UAAG,cAAS,IAAU,CAAL,UAAK,KAAG,EAAH,CAAtB;/CACG,uBAAU,cAAC,QAAY,UAAb;vDAEA,YAAV,eAAU,cAAC,QAAY,EAAb;nDAzBqB;AA2KL;AAE7B;AACA,UAAiC,CAAnB,CAAV,yCAAU,IAAG,oBAAH,CAAmB,IAAY,CAAC,YAAD,SAAZ,CAAqB,IAAI,CAAe,CAAV,yCAAU,IAAG,YAAM,gBAAT,CAAzE,EACE,aADF;xMAEA,yBAAc,CAAC,gBAAD;1CACd,yBAAc,CAAC,YAAD;tCANe;AAzaQ;AAErC;AAEA,UAAK;VACL,UAAG,SAAH;nBAEE;AAEA,YAAY,eAAD,QAAX;nCAEE,cAAW,CAAC,YAAD,SAAS,IAAI,CAAY,CAAC,YAAM,WAAP,SAApC,EACE,YAAM,gBADR;xGAGA,cAAiB,CAAN,CAAP,YAAO,KAAG,CAAH,CAAM,IAAY,CAAC,CAAD,SAAZ,CAAgB,IAAY,CAAC,CAAC,WAAF,SAA7C,EACE,CAAC,WAAU,YAAY,CAAC,eAAD,CADzB;xHAGA,cAAW,CAAC,YAAD,SAAS,IAAY,CAAC,YAAM,WAAP,SAAhC,EACE,YAAM,WAAU,YAAY,CAAC,eAAD,CAD9B;tHARF;FAJF;PALqC;AA+LN;AAE/B;AACA;AAEA,UAAY,QAAD,QAAX;1BAEE,gBAAQ;hBACR,YAAe,mBAAH,eAAT,QAAS,CAAZ;vDAEY,iBAAT,SAAY,mBAAH,CAAkC;9CAClC,iBAAT,SAAY,mBAAH,CAA8B;rCAH1C;TAMA,iBAAS,SAA2B,QAAtB,QAAQ,iBAAC,EAAa,GAAE,CAAF,qBAApC;tFAAI;AAEF,cAAK,QAAQ,YAAS,CAAC,CAAD;pCACtB,6BAAc,CAAC,CAAD;;xBAZlB;PAL+B;AAsBD;AAE9B;AAEA,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AACF,wBAAQ,CAAC,CAAD,CAAG;;3BALiB;AAQD;AAE7B;AAEA,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AACF,wBAAQ,CAAC,CAAD,CAAG;;3BALgB;AAv/CF;AAE3B;AAEA,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AAEF,wBAAQ,CAAC,CAAD,CAAG;;3BANc;AAkWS;AAEpC,+BAAqB;/BACrB,UAAY,eAAD,QAAX,EACE,eAAU,cAAC,QAAY,MAAb,CADZ;/EAHoC;AAgEX;AAEzB,oBAAU;pBACV;AAHyB;AARD;AAExB,gBAAK,QAAC,CAAQ,MAAM,MAAd;rCACN,gBAAK,QAAC,CAAQ,MAAM,MAAd;rCACN,gBAAK,SAAC,CAAe,WAAN,MAAM,QAAf;nDACN,gBAAK,SAAC,CAAS,MAAM,OAAf;vCALkB;AA4wBE;AAE1B,UAAG,YAAQ,KAAG,MAAd;jCAEE,YAAY,YAAD,QAAX,EACE,YAAO,iBAAiB,CAAC,IAAD,CAD1B;rEAGA,2BAAe;3BACf,uBAAW;vBAEX,YAAY,YAAD,QAAX,EACE,YAAO,eAAe,CAAC,IAAD,CADxB;nEAGA;AACA;AACA;OAbF;PAF0B;AAgDK;AAErB,oBAAD,sBAAC,oBAAiB,WAAC,cAAD,CAAY,GAAE,CAAhC;5FACT,oBAAS,CAAO,WAAC,cAAD,CAAY,GAAE,CAArB,CAAT,GAAoC;vDAHL;AA2KE;AAEjC;AACA;AAEA,YAAO;ZAEP,eAAS,SAAuB,QAAZ,WAAC,cAAD,CAAY,GAAE,CAAF,qBAAhC;nFAAI;AAEF,YAAI,cAAS,CAAC,CAAD,CAAI,KAAE,MAAnB;xCAEE,gBAAO;PAFT;TAKA,YAAI,GAAK,IAAO,CAAF,CAAE,GAAoB,CAAZ,WAAC,cAAD,CAAY,GAAE,CAAF,CAApB,CAAhB,EACE,cAAS,CAAC,CAAD,CAAT,GAAgB,cAAS,CAAC,CAAC,GAAC,CAAH,CAD3B;;pGAIF,UAAG,GAAH,EACY,cAAD,sBAAC,oBAAiB,WAAC,cAAD,CAAY,GAAE,CAAhC,CADX;tGAlBiC;AAluCT;AAExB,UAAG,UAAM,KAAG,MAAZ;/BAEE,qBAAS;rBACT,YAAG,CAAI,mBAAP,EACE,iBAAa,MADf;zDAEA;AACA;AACA;OAPF;PAFwB;AAkBD;AAEvB,UAAG,SAAK,KAAG,MAAX;9BAEE,oBAAQ;pBACR,YAAG,CAAI,mBAAP,EACE,gBAAY,MADd;xDAEA;AACA;AACA;OAPF;PAFuB;AAnsBC;;AAXE;;AAMA;;AA4nBC;;AALD;;AALD;;AA7lBI;;AAJA;;AANF;;AA8eF;AAEzB,UAAY,gBAAD,QAAX,EACE,gBAAU,CAAC,IAAD,CADZ;1DAFyB;AAorBD;;AAKC;;AAKH;;AApRG;AAEzB;AAEA,UAAY,uBAAD,QAAX;zCAEE,YAAK;ZAET;OAJE;PAJyB;AA/FQ;AAEjC;AAFiC;AAKP;AAE1B,UAAW,CAAC,YAAD,SAAS,IAAI,CAAI,YAAM,aAAlC;9DAEE,oBAAM,aAAa,CAAC,YAAD;vCAFrB;PAF0B;AA2qBK;AAE/B;AACA;AAEA;AACA;AAEA,UAAG,gBAAH,EACE,MADF;lCAGA,yBAAe;zBAEf;AAEA;AAEA,UAAK;VAEL,YAAO,iCAAa,CAAC,IAAD;lDACpB,UAAY,GAAD,QAAX;rBAEE,YAAK,GAAG;fACR,YAAK,CAAE,IAA+B,CAAlB,GAAI,aAAc,GAAE,CAAF,CAA/B;hCAHT;PAOA,UAAK,CAAE,IAAiB,CAAb,iBAAa,GAAE,CAAF,CAAjB;tCAEP,UAAK,CAAE,IAAG,gBAAH;/BAEP,UAAG,CAAI,CAAP,EACE,2BADF;zCAGA,yBAAe;zBAlCgB;AAoVN;AAAT;AAEhB,eAAU,eAAW,KAAE,QAAQ,cAAV;zDAFL;AAAS;AAnSF;AAAP;AAEhB,eAAU,eAAW,KAAE,QAAQ,cAAV;zDAFL;AAAO;AAhmBF;AAAL;AAEhB,eAAU;fAFM;AAAK;AAUW;AAAhB;AAEhB,eAAU;fACV,UAAW,CAAC,eAAD,SAAa,IAAI,oBAA5B,EACE,SAAyB,eAD3B;rFAHgB;AAAgB;AA5ZI;AAApB;AAEhB,eAAyB;fAFT;AAAoB;AALV;AAAV;AAEhB,eAAU,QAAQ,eAAe,CAAC,YAAD;nDAFjB;AAAU;AAihBA;AAAV;AAEhB;AAEA,UAAK,CAAC;XAED;AACH,UADG,KACH;fAAM,YAAK;ZACX,gBAFG,KAEH;rBAAQ,YAAK;ZACb,gBAHG,KAGH;rBAAQ,YAAK;ZACb,gBAJG,KAIH;rBAAS,YAAK;ZACd,gBALG,KAKQ,KAAX,mBAAW,UAAX;vDAAuB,YAAK;ZAC5B,gBANG,KAMQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBAPG,KAOQ,KAAX,mBAAW,MAAX;nDAAmB,YAAK;ZACxB,gBARG,KAQQ,KAAX,mBAAW,MAAX;nDAAmB,YAAK;ZACxB,gBATG,KASQ,KAAX,mBAAW,QAAX;rDAAqB,YAAK;ZAC1B,gBAVG,KAUQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBAXG,KAWQ,KAAX,mBAAW,MAAX;nDAAmB,YAAK;ZACxB,gBAZG,KAYQ,KAAX,mBAAW,SAAX;tDAAsB,YAAK;ZAC3B,gBAbG,KAaQ,KAAX,mBAAW,OAAX;pDAAoB,YAAK;ZACzB,gBAdG,KAcQ,KAAX,mBAAW,OAAX;pDAAoB,YAAK;ZACzB,gBAfG,KAeQ,KAAX,mBAAW,SAAX;tDAAsB,YAAK;ZAC3B,gBAhBG,KAgBQ,KAAX,mBAAW,KAAX;lDAAkB,YAAK;ZACvB,gBAjBG,KAiBQ,KAAX,mBAAW,KAAX;lDAAkB,YAAK;ZACvB,gBAlBG,KAkBQ,KAAX,mBAAW,UAAX;vDAAuB,YAAK;ZAC5B,gBAnBG,KAmBQ,KAAX,mBAAW,QAAX;rDAAqB,YAAK;ZAC1B,gBApBG,KAoBQ,KAAX,mBAAW,WAAX;xDAAwB,YAAK;ZAC7B,gBArBG,KAqBQ,KAAX,mBAAW,UAAX;vDAAuB,YAAK;ZAC5B,gBAtBG,KAsBQ,KAAX,mBAAW,OAAX;pDAAoB,YAAK;ZACzB,gBAvBG,KAuBQ,KAAX,mBAAW,OAAX;pDAAoB,YAAK;ZAEzB,gBAzBG,KAyBQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBA1BG,KA0BQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBA3BG,KA2BQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBA5BG,KA4BQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBA7BG,KA6BQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBA9BG,KA8BQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBA/BG,KA+BQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBAhCG,KAgCQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBAjCG,KAiCQ,KAAX,mBAAW,GAAX;hDAAgB,YAAK;ZACrB,gBAlCG,KAkCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBAnCG,KAmCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBApCG,KAoCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBArCG,KAqCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBAtCG,KAsCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBAvCG,KAuCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBAxCG,KAwCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBAzCG,KAyCQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBA1CG,KA0CQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBA3CG,KA2CQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;ZACtB,gBA5CG,KA4CQ,KAAX,mBAAW,IAAX;jDAAiB,YAAK;;ZAEpB,YAAS,MAAD,YAAQ,CAAD,IAAP;;nCAGZ,eAAU;fAvDM;AAAU;AA8wBI;AAAd;AAEX;AACH,gDADG,KACH,cACA,CAFG,KAEH,YADA,KAEA,CAHG,KAGH,YAFA,KAGA,CAJG,KAIH,aAHA,KAIW,CALR,KAKQ,KAAX,mBAAW,OAJX,KAKW,CANR,KAMQ,KAAX,mBAAW,SALX,KAMW,CAPR,KAOQ,KAAX,mBAAW,KANX,KAOW,CARR,KAQQ,KAAX,mBAAW,OAPX,KAQW,CATR,KASQ,KAAX,mBAAW,UARX,KASW,CAVR,KAUQ,KAAX,mBAAW,QATX,KAUW,CAXR,KAWQ,KAAX,mBAAW,UAVX,KAWW,CAZR,KAYQ,KAAX,mBAAW,MAXX,KAYW,CAbR,KAaQ,KAAX,mBAAW,MAZX,KAaW,CAdR,KAcQ,KAAX,mBAAW,WAbX,KAcW,CAfR,KAeQ,KAAX,mBAAW,SAdX,KAeW,CAhBR,KAgBQ,KAAX,mBAAW,YAfX,KAgBW,CAjBR,KAiBQ,KAAX,mBAAW,WAhBX,KAiBW,CAlBR,KAkBQ,KAAX,mBAAW,QAjBX,KAkBW,CAnBR,KAmBQ,KAAX,mBAAW,QAlBX,KAmBW,CApBR,KAoBQ,KAAX,mBAAW,IAnBX,KAoBW,CArBR,KAqBQ,KAAX,mBAAW,IApBX,KAqBW,CAtBR,KAsBQ,KAAX,mBAAW,IArBX,KAsBW,CAvBR,KAuBQ,KAAX,mBAAW,IAtBX,KAuBW,CAxBR,KAwBQ,KAAX,mBAAW,IAvBX,KAwBW,CAzBR,KAyBQ,KAAX,mBAAW,IAxBX,KAyBW,CA1BR,KA0BQ,KAAX,mBAAW,IAzBX,KA0BW,CA3BR,KA2BQ,KAAX,mBAAW,IA1BX,KA2BW,CA5BR,KA4BQ,KAAX,mBAAW,IA3BX,KA4BW,CA7BR,KA6BQ,KAAX,mBAAW,KA5BX,KA6BW,CA9BR,KA8BQ,KAAX,mBAAW,KA7BX,KA8BW,CA/BR,KA+BQ,KAAX,mBAAW,KA9BX,KA+BW,CAhCR,KAgCQ,KAAX,mBAAW,KA/BX,KAgCW,CAjCR,KAiCQ,KAAX,mBAAW,KAhCX,KAiCW,CAlCR,KAkCQ,KAAX,mBAAW,KAjCX,KAkCW,CAnCR,KAmCQ,KAAX,mBAAW,KAlCX,KAmCW,CApCR,KAoCQ,KAAX,mBAAW,KAnCX,KAoCW,CArCR,KAqCQ,KAAX,mBAAW,KApCX,KAqCW,CAtCR,KAsCQ,KAAX,mBAAW,KArCX,KAsCW,CAvCR,KAuCQ,KAAX,mBAAW,KAtCX;viDAsCiB,iBAAU;;jBAEzB,iBAAU;;jBA3CE;AAAc;AAnxBD;AAAb;AAEhB,eAAc,oBAAJ,cAAI,CAAC,EAAG,EAAG,gBAAU,gBAAjB;tFAFE;AAAa;AApzBC;AAE9B,UAAG,CAAY,CAAC,aAAD,SAAf;lCAEE,wBAAY;xBACZ,YAAY,aAAD,QAAX;jCAEE,iCAAmB;jCACnB,4BAAa;5BACb,yBAAS,cAAC,KAAS,YAAV;xDACT,yBAAS,cAAC,SAAa,GAAd;nDACT;AACA;SAPF;FAHF;PAF8B;AAswBH;AAE3B;AAEA,UAAY,2BAAD,QAAX;7CAEE,aAAM;bAEN,UAAE,iBAAiB,CAAC,QAAS,wCAAV;5EACnB,UAAE,iBAAiB,CAAC,QAAS,wCAAV;5EACnB,UAAE,iBAAiB,CAAC,WAAY,2CAAb;lFACnB,UAAE,iBAAiB,CAAC,YAAa,4CAAd;pFACnB,UAAE,iBAAiB,CAAC,UAAW,0CAAZ;hFACnB,UAAE,iBAAiB,CAAC,YAAa,4CAAd;pFACnB,UAAE,iBAAiB,CAAC,aAAc,6CAAf;tFACnB,UAAE,iBAAiB,CAAC,aAAc,6CAAf;tFACnB,UAAE,iBAAiB,CAAC,UAAW,0CAAZ;hFACnB,UAAE,iBAAiB,CAAC,QAAS,wCAAV;5EACnB,UAAE,iBAAiB,CAAC,WAAY,2CAAb;lFACnB,UAAE,iBAAiB,CAAC,QAAS,wCAAV;5EACnB,UAAE,iBAAiB,CAAC,OAAQ,uCAAT;1EAEnB,UAAE,iBAAiB,CAAC,aAAe,6CAAhB;tFACnB,UAAE,iBAAiB,CAAC,YAAc,4CAAf;pFACnB,UAAE,iBAAiB,CAAC,WAAa,2CAAd;3EApBrB;PAJ2B;AAg3BE;AAE7B;AAEA,UAAY,2BAAD,QAAX;7CAEE,aAAM;bAEN,UAAE,oBAAoB,CAAC,QAAS,wCAAV;/EACtB,UAAE,oBAAoB,CAAC,QAAS,wCAAV;/EACtB,UAAE,oBAAoB,CAAC,WAAY,2CAAb;rFACtB,UAAE,oBAAoB,CAAC,YAAa,4CAAd;vFACtB,UAAE,oBAAoB,CAAC,UAAW,0CAAZ;nFACtB,UAAE,oBAAoB,CAAC,YAAa,4CAAd;vFACtB,UAAE,oBAAoB,CAAC,aAAc,6CAAf;zFACtB,UAAE,oBAAoB,CAAC,aAAc,6CAAf;zFACtB,UAAE,oBAAoB,CAAC,UAAW,0CAAZ;nFACtB,UAAE,oBAAoB,CAAC,QAAS,wCAAV;/EACtB,UAAE,oBAAoB,CAAC,WAAY,2CAAb;rFACtB,UAAE,oBAAoB,CAAC,QAAS,wCAAV;/EACtB,UAAE,oBAAoB,CAAC,OAAQ,uCAAT;7EAEtB,UAAE,oBAAoB,CAAC,aAAe,6CAAhB;zFACtB,UAAE,oBAAoB,CAAC,YAAc,4CAAf;vFACtB,UAAE,oBAAoB,CAAC,WAAa,2CAAd;9EApBxB;PAJ6B;AA5/BE;AAE/B;AAEA,QAAE,MAAM,YAAY,CAAC,cAAe,IAAI,MAApB;nDAEpB,QAAE,MAAM,YAAY,CAAC,aAAc,QAAf;hDAEpB,UAAG,wCAAO,IAAG,IAAI,OAAjB;jEACE,UAAE,MAAM,YAAY,CAAC,cAAe,MAAhB;jDAEpB,YAAA,EAAE,MAAM,YAAY,CAAC,cAAe,EAAhB;jDAEtB,UAAG,0CAAS,IAAG,IAAI,OAAnB,EACG,EAAE,MAAM,YAAY,CAAC,aAAc,QAAf,CADvB;hHAGA,UAAK;VAEL,UAAG,6CAAY,IAAG,IAAI,OAAtB,EACE,IAAK,WADP;vFAGA,UAAG,6CAAY,IAAG,IAAI,OAAtB;tEAEE,YAAG,CAAE,KAAG,EAAR,EACG,IAAK,CAAE,GAAE,GADZ;jCAEC,YAAI,CAAE,GAAE,cAAF;vBAJT;PAOA,UAAI,CAAE,KAAG,EAAT,EACE,EAAE,MAAM,YAAY,CAAC,kBAAmB,CAApB,CADtB;7DAGA,QAAE,MAAM,YAAY,CAAC,YAAa,qBAAQ,CAAC,IAAI,MAAL,CAAY,GAAE,IAApC;/EA/BW;AAv2BD;;AAE9B;AAEoB;AAElB;AAAI;AAAI;AAAI;AAEZ,eAAO,eAAP,GAA0B;jCAE1B,YAAG,OAAO,kBAAV;rCAEE,eAAM,OAAO,SAAQ;/BACrB,eAAM,OAAO,SAAQ;/BACrB,eAAM,OAAO,SAAQ;/BACrB,eAAM,OAAO,SAAQ;;/BAIrB,eAAM;fACN,eAAM;fACN,eAAM;fACN,eAAM;;fAGH;AACH,YADG,KACH;jBAEE,iBAAO,SAAC,CAAgC,CAAZ,CAAX,UAAI,MAAO,GAAE,UAAI,KAAN,CAAY,GAAE,EAAF,CAAK,GAAE,EAAvC;3EACR,iBAAO,OAAC,CAAO,UAAI,IAAK,GAAE,EAAlB;5CACR,iBAAO,QAAC,CAAQ,UAAI,KAAM,GAAE,EAApB;9CACR,oBAAI,IAAJ,GAAsC,CAAjB,CAAT,UAAI,IAAK,GAAE,OAAO,UAAC,EAAV,CAAiB,GAAE,EAAF,CAAK,GAAE,EAAF;pEAE7C,UARG,KAQH;xBAEE,iBAAO,SAAC,CAAqC,CAAL,CAAZ,CAAX,UAAI,MAAO,GAAE,UAAI,KAAN,CAAY,GAAE,EAAF,CAAK,GAAE,EAAF,CAAK,GAAE,CAA5C;jFACR,iBAAO,OAAC,CAAoC,CAAjB,CAAZ,UAAI,OAAQ,GAAE,OAAO,UAAC,EAAV,CAAiB,GAAE,EAAF,CAAK,GAAE,CAA3C;7EACR,iBAAO,QAAC,CAAQ,UAAI,KAAM,GAAE,EAApB;9CACR,oBAAI,OAAJ,GAA4C,CAAjB,CAAZ,UAAI,OAAQ,GAAE,OAAO,UAAC,EAAV,CAAiB,GAAE,EAAF,CAAK,GAAE,EAAF;1EAEnD,UAfG,KAeH;xBAEE,iBAAO,UAAC,CAAiC,CAAX,CAAZ,UAAI,OAAQ,GAAE,UAAI,IAAN,CAAW,GAAE,EAAF,CAAK,GAAE,EAAxC;5EACR,iBAAO,QAAC,CAAQ,UAAI,KAAM,GAAE,EAApB;9CACR,iBAAO,OAAC,CAAO,UAAI,IAAK,GAAE,EAAlB;5CACR,oBAAI,KAAJ,GAAuC,CAAhB,CAAV,UAAI,KAAM,GAAE,OAAO,SAAC,EAAV,CAAgB,GAAE,EAAF,CAAK,GAAE,EAAF;rEAE9C,UAtBG,KAsBH;xBAEE,iBAAO,UAAC,CAAsC,CAAL,CAAX,CAAZ,UAAI,OAAQ,GAAE,UAAI,IAAN,CAAW,GAAE,EAAF,CAAK,GAAE,EAAF,CAAK,GAAE,CAA7C;lFACR,iBAAO,QAAC,CAAmC,CAAhB,CAAX,UAAI,MAAO,GAAE,OAAO,SAAC,EAAV,CAAgB,GAAE,EAAF,CAAK,GAAE,CAA1C;5EACR,iBAAO,OAAC,CAAO,UAAI,IAAK,GAAE,EAAlB;5CACR,oBAAI,MAAJ,GAAyC,CAAhB,CAAX,UAAI,MAAO,GAAE,OAAO,SAAC,EAAV,CAAgB,GAAE,EAAF,CAAK,GAAE,EAAF;vEAEhD,UA7BG,KA6BH;xBAEE,iBAAO,OAAC,CAAO,UAAI,IAAK,GAAE,EAAlB;5CACR,iBAAO,QAAC,CAAQ,UAAI,KAAM,GAAE,EAApB;9CACR,iBAAO,SAAC,CAAgC,CAAZ,CAAX,UAAI,MAAO,GAAE,UAAI,KAAN,CAAY,GAAE,EAAF,CAAK,GAAE,EAAvC;3EACR,iBAAO,UAAC,CAAiC,CAAX,CAAZ,UAAI,OAAQ,GAAE,UAAI,IAAN,CAAW,GAAE,EAAF,CAAK,GAAE,EAAxC;5EACR,oBAAI,KAAJ,GAAa;5BACb,oBAAI,IAAJ,GAAY;3BACZ,oBAAI,MAAJ,GAAc;7BACd,oBAAI,OAAJ,GAAe;rBATjB;TAYF,eAAO,eAAP,GAA0B;jCA9DR;AAiEH;AAEf;AAAE;AAAE;AACJ;AAEA,aAAM,iBAAK,QAAC;tCAEZ,iBAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;lFAAI;AAEF,cAAsB,CAAlB,gBAAQ,CAAC,CAAD,CAAG,OAAO,KAAE,MAAF,CAAU,IAAK,gBAAQ,CAAC,CAAD,CAAG,SAAhD;rFAEE,kBAAO,EAAE,SAAC;7BAEV,qBAAkB,MAAT,EAAE,SAAC,EAAM,GAAE,CAAF,EAAW,eAA7B;7DAAI;AAEG;AACL,kBADK,KACL;vBACE,oBAAG,gBAAQ,CAAC,CAAD,CAAG,SAAU,GAAU,cAAC,EAAE,IAAM,CAAC,CAAD,CAAT,CAAa,SAA/C,EACE,MAAO,CADT;7FAEF,wBAJK,KAIL;7BACE,oBAAG,gBAAQ,CAAC,CAAD,CAAG,UAAW,GAAU,cAAC,EAAE,IAAM,CAAC,CAAD,CAAT,CAAa,UAAhD,EACE,MAAO,CADT;/FAEF,wBAPK,KAOL;7BACE,oBAAyB,CAAtB,gBAAQ,CAAC,CAAD,CAAG,UAAW,GAAE,gBAAQ,CAAC,CAAD,CAAG,SAAC,EAAd,CAAoB,GAAkC,CAAxB,cAAC,EAAE,IAAM,CAAC,CAAD,CAAT,CAAa,UAAW,GAAU,cAAC,EAAE,IAAM,CAAC,CAAD,CAAT,CAAa,SAAC,EAAxB,CAA/E,EACE,MAAO,CADT;1KAEF,wBAVK,KAUL,2BACE,IAAwB,CAArB,gBAAQ,CAAC,CAAD,CAAG,SAAU,GAAE,gBAAQ,CAAC,CAAD,CAAG,UAAC,EAAd,CAAqB,GAAiC,CAAvB,cAAC,EAAE,IAAM,CAAC,CAAD,CAAT,CAAa,SAAU,GAAU,cAAC,EAAE,IAAM,CAAC,CAAD,CAAT,CAAa,UAAC,EAAxB,CAA9E,EACE,MAAO,CAFX;;lNAKF,cAAE,OAAO,CAAC,IAAK,gBAAQ,CAAC,CAAD,CAAd;lCArBX;;XAyBF,iBAAS,SAAc,QAAT,EAAE,SAAC,EAAM,GAAE,CAAF,qBAAvB;xEAAI;AAEF,oBAAU,CAAS,cAAC,EAAE,IAAM,CAAC,CAAD,CAAT,EAAe,MAAxB;;pDAGZ,UAAG,eAAH,EAAG;3BAvCY;AA2CjB,aAAO,CAAC,iBAAD;/BACP,aAAO,CAAC,oBAAD;lCACP,aAAO,CAAC,kBAAD;hCACP,aAAO,CAAC,mBAAD;jCACP,aAAO,CAAC,oBAAD;lCACP,aAAO,CAAC,oBAAD;lCAEP,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AAEF,wBAAQ,CAAC,CAAD,CAAG,aAAa,CAAC,gBAAQ,CAAC,CAAD,CAAT;;5DAzHI;AAgaD;AAE7B;AACA;AACA;AAAK;AAAM;AACX;AACA;AACA;AACA;AAEA,UAAG,gBAAH,EACE,MADF;lCAGA,UAAG,iBAAH,EACE,MADF;nCAGA,YAAO,iCAAa,CAAC,IAAD;lDACpB,UAAW,CAAC,GAAD,SAAM,IAAI,GAAG,aAAxB,EACE,MADF;nDAGA,aAAQ;bAER,UAAiB,CAAN,CAAC,GAAD,SAAM,IAAuB,CAAlB,GAAG,eAAe,KAAG,EAAH,CAAvB,CAA8B,IAAiB,+BAAH,eAAT,QAAS,CAA7D;nHAEE,aAAM,QAAQ,eAAe,CAAC,GAAG,eAAJ;vDAC7B,YAAY,EAAD,QAAX;tBAEE,eAAM,EAAE;jBACR,iBAAQ,UAAK,CAAC,EAAE,IAAH;zBAHf;FAHF;PAUA,yBAAe;zBAEf,UAAG,CAAY,CAAC,QAAD,SAAf,EACE,MADF;rCAGA,WAAM,QAAQ,iBAAC;pCAEf,UAAY,EAAD,QAAX;pBAEE,cAAO,EAAE,MAAM,iBAAiB,CAAC,UAAD;lDAChC,eAAQ,EAAE,MAAM,iBAAiB,CAAC,YAAD;rDACjC,eAAQ,EAAE,MAAM,iBAAiB,CAAC,YAAD;rDACjC,UAAE,MAAM,YAAY,CAAC,WAAY,QAAb;zCALtB;PAQA,UAAK;VAEL,UAAY,CAAT,CAAC,OAAQ,GAAE,IAAF,CAAO,GAAE,MAAM,YAA3B,EACE,CAAC,OAAD,GAAY,MAAM,YAAa,GAAE,IADnC;tFAGA,wBAAa,CAAC,SAAU;;;;xBAAX;VAEb,UAAY,EAAD,QAAX;pBAEE,UAAE,MAAM,YAAY,CAAC,WAAY,GAAb;3CACpB,UAAE,MAAM,YAAY,CAAC,aAAc,IAAf;9CACpB,UAAE,MAAM,YAAY,CAAC,aAAc,IAAf;vCAJtB;PAOA,yBAAe;zBA7Dc;AAi1CC;AAE9B;AAEA,uBAAa;vBAEb,UAAY,YAAD,QAAX,EACE,uBAAyB,oBAAN,YAAM,cAAC,EAAD,CAD3B;xGAGA,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AACF,wBAAQ,CAAC,CAAD,CAAG;;3BAViB;AA4QH;;AAhUH;AAExB,uBAAY,CAAC,IAAD;5BAFY;AAxgBD;AAEvB;AAEA;AAEA,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AACF,wBAAQ,CAAC,CAAD,CAAG;;3BAER;AACH,UADG,KACH;fAEE,YAAY,YAAD,QAAX,EACE,cAAS,CAAC,EAAG,EAAG,YAAM,QAAS,YAAM,QAA5B,CADX;vFAFF;PAOF;AAEA;AAnBuB;AA2lBQ;AAE/B,UAAG,yCAAU,IAAG,oBAAhB,EACE,MADF;nFAGA;AAL+B;AA9PH;AAE5B;AAF4B;AAh5CA;AAE5B;AACA;AAEA,WAAM,QAAQ,eAAe,CAAC,QAAD;3CAC7B,wBAAa;xBACb;AACA;AAEA,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AACF,wBAAQ,CAAC,CAAD,CAAG;;3BAXe;AAsIC;AAE7B;AAEA,0BAAgB;1BAEhB,6BAAmB;7BACnB,8BAAoB;9BACpB,yBAAe;zBAEf,UAAoB,CAAR,CAAC,WAAD,SAAQ,IAAe,CAAV,yCAAU,IAAG,WAAK,gBAAR,CAAf,CAAyC,IAAG,CAAY,CAAC,WAAD,SAA5E,EACE,cADF;zJAGA,8BAAoB;9BACpB,yBAAe;zBACf,0BAAgB;1BAEhB,WAAM,QAAQ,eAAe,CAAC,GAAD;tCAE7B,UAAG,CAAY,CAAC,EAAD,SAAf;vBAEE,0BAAa;1BACb,oBAAQ;;pBAIR,0BAAa;1BACb,oBAAQ;pBACR,+BAAmB;/BACnB,gCAAoB;hCACpB;AACA;;AAGF,iBAAO;jBACP,mBAAS,4BAAK,QAAC;vDACf,gBAAK,UAAL,GAAkB;7BAClB,sBAAY;tBACZ,sBAAY;tBACZ,mBAAS;nBACT,kBAAQ;lBACR,sBAAY;tBACZ,oBAAU;pBACV,+BAAqB;/BACrB,yBAAe;zBACf,yBAAc;zBACd,sBAAY,cAAC,wBAAQ,sBAAT;lFACZ,uBAAiB,oBAAJ,cAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAX;rEACjB,wBAAc;xBACd,0BAAgB;1BAChB,gCAAsB;hCAEtB,oBAAU;pBAEV,sBAAY,aAAQ,QAAC;3CACrB,mBAAQ,UAAR,GAAqB;hCAErB,qBAAW;rBACX,yBAAe;zBAEf;AACA;AA7D6B;AA6oDG;AAEhC;AAAI;AACJ;AAAI;AACJ;AAAI;AACJ;AAAG;AAEH,UAAI,yCAAU,IAAG,oBAAjB,EACE,MADF;nFAGA,UAAG,CAAI,oBAAP,EACE,MADF;vCAGA,UAAG,WAAM,KAAG,kBAAZ,EACE,MADF;pDAGA,UAAkB,CAAd,cAAQ,KAAM,KAAE,CAAC,CAAH,CAAM,IAAkB,CAAb,cAAQ,IAAK,KAAE,CAAC,CAAH,CAA1C,EACE,oBADF;3FAGA,UAAW,CAAC,YAAD,SAAS,IAAI,CAAa,yBAAH,eAAL,IAAK,CAAlC;lFAEE,YAAW,oBAAN,YAAM,cAAC,EAAD;5DAEX,cAAgB,CAAR,CAAC,MAAO,GAAE,CAAC,KAAH,CAAU,GAAyB,CAAtB,oBAAe,MAAO,GAAE,oBAAe,KAAjB,CAAzB;3FAC1B,cAAiB,CAAT,CAAC,OAAQ,GAAE,CAAC,IAAH,CAAS,GAA0B,CAAvB,oBAAe,OAAQ,GAAE,oBAAe,IAAjB,CAA1B;3FAE1B,aAAM;bAEN,cAAO;dACP,cAAO;dACP,cAAO;dACP,cAAO;dAEP,YAAI,wBAAQ,IAAG,aAAf;rDAEE,cAAI,uBAAO,IAAG,aAAd;tDACE,kBAAO;lBAEP,sBAAO;bALX;TAQA,YAAI,yBAAS,IAAG,aAAhB;tDAEE,cAAI,sBAAM,IAAG,aAAb;rDACE,kBAAO;lBAEP,sBAAO;bALX;TAQA,YAAa,CAAT,yBAAS,IAAG,aAAH,CAAY,IAAY,CAAR,wBAAQ,IAAG,aAAH,CAArC,EACE,cAAS,CAAC,EAAE,KAAM,GAAE,GAAF,CAAO,EAAE,IAAK,GAAE,GAAF,CAAgB,CAAT,EAAE,MAAO,GAAE,EAAE,KAAJ,CAAU,GAAE,GAAF,CAAiB,CAAV,EAAE,OAAQ,GAAE,EAAE,IAAJ,CAAU,GAAE,GAA9E,CADX;lMA9BF;PAkCA;AArDgC;AAwDK;AAErC;AAEA,eAAS,SAAkB,QAAb,uBAAa,GAAE,CAAF,qBAA3B;hFAAI;AAEF,wBAAQ,CAAC,CAAD,CAAG;;3BANwB;AAzrCX;AAAV;AAEhB,eAAU,iBAAa,GAAE,CAAF;pCAFP;AAAU;AA/nBE;AAAZ;AAEhB,eAAU;fAFM;AAAY;AAxBH;AAEzB,uBAAY,CAAC,EAAD;1BAFa;AA8FA;AAEzB;AAAE;AACF;AAGgB,gDAAC,MAAD;tDAChB,UAAK;VACL,uBAAM,CAAC;;;;bAAG,EAAG,CAAP;dAEN,eAAU;fACV,YAAO,iCAAa,CAAC,IAAD;lDACpB,UAAY,GAAD,QAAX,EACE,SAAU,GAAG,WADf;9CAGA,uBAAY,CAAO,CAAN,MAAM,GAAC,GAAD,CAAI,GAAC,oBAAc,CAAC,CAAD,CAA1B;hEAfa;AA2QA;AAEzB;AACA;AAEA;AAEA,eAAsB,MAAb,uBAAa,GAAE,CAAF,EAAW,eAAjC;jEAAI;AAEF,eAAQ,gBAAQ,CAAC,CAAD;jCAChB,YAAK,eAAL,IAAK;;/BAGP,UAAuB,CAAZ,CAAC,eAAD,SAAY,IAAY,CAAC,YAAD,SAAZ,CAAqB,IAAY,CAAC,YAAM,WAAP,SAAxD;pGAEE,oBAAM,WAAU,YAAY,CAAC,eAAD;3DAC5B,0BAAa;1BACb,+BAAmB;xBAJrB;PAMS,eAAT,KAAS;pBACH,eAAN,KAAM;pBACN;AArByB;AA0CF;;AA6tCA;;AAnlDC;AAExB;AAEA,UAAG,eAAH,EACE,qBADF;hDAGA,+BAAqB;/BAErB,oBAAU,QAAQ,cAAc,CAAC,MAAD;jDAChC,cAAQ,KAAK,YAAY,CAAC,WAAD;3CAEzB,WAAqB;XACrB,QAAE,iBAAiB,CAAC,aAAc,kDAAf;zFACnB,QAAE,iBAAiB,CAAC,aAAc,kDAAf;zFACnB,QAAE,iBAAiB,CAAC,YAAa,4CAAd;lFACnB,QAAE,iBAAiB,CAAC,UAAW,0CAAZ;9EACnB,QAAE,iBAAiB,CAAC,YAAa,4CAAd;lFAEnB,QAAE,MAAM,YAAY,CAAC,MAAO,GAAR;pCACpB,QAAE,MAAM,YAAY,CAAC,OAAQ,GAAT;rCACpB,QAAE,MAAM,YAAY,CAAC,QAAS,GAAV;tCACpB,QAAE,MAAM,YAAY,CAAC,SAAU,GAAX;vCAEpB,QAAE,MAAM,YAAY,CAAC,qBAAsB,MAAvB;tDACpB,QAAE,MAAM,YAAY,CAAC,kBAAmB,MAApB;nDACpB,QAAE,MAAM,YAAY,CAAC,oBAAqB,MAAtB;rDACpB,QAAE,MAAM,YAAY,CAAC,iBAAkB,MAAnB;lDACpB,QAAE,MAAM,YAAY,CAAC,cAAe,MAAhB;/CACpB,QAAE,MAAM,YAAY,CAAC,WAAY,UAAb;hDAEpB,uBAAa;vBACb;AAhCwB;AAgkDO;AAE/B;AAEA,UAAG,cAAU,IAAY,CAAC,WAAD,SAAzB;jDAEE,aAAqB;bACrB,UAAE,oBAAoB,CAAC,aAAc,kDAAf;9FACtB,UAAE,oBAAoB,CAAC,aAAc,kDAAf;9FACtB,UAAE,oBAAoB,CAAC,YAAa,4CAAd;vFACtB,UAAE,oBAAoB,CAAC,UAAW,0CAAZ;nFACtB,UAAE,oBAAoB,CAAC,YAAa,4CAAd;vFACtB,gBAAQ,KAAK,YAAY,CAAC,EAAD;pCACzB,yBAAa;zBACb,sBAAU;tBACV;OAXF;PAJ+B;AAwSA;AAE/B,UAAY,sBAAD,QAAX,EACE,sBAAY,iBADd;jFAF+B;AA/6CC;AAEhC,UAAW,CAAC,sBAAD,SAAe,IAAI,CAAI,uBAAlC,EACE,sBAAY,kBADd;hHAFgC;AA4KJ;AAExB,uBAAJ,IAAG;3BAFyB;AAUF;AAE1B,UAAI,iBAAa,GAAE,CAAnB;/BAEM,yBAAJ,IAAG;7BAEH,YAAG,iBAAa,KAAE,CAAlB,EACE,oBADF;lDAJF;PAF0B;AALC;;AAm7BQ;AAEnC,UAAW,CAAP,YAAO,KAAG,KAAH,CAAU,IAAc,aAAH,eAAN,KAAM,CAAhC,EACC,cAAS,CAAU,KAAV,CADV;/FAFmC;AA1/CX;AAAR;AAEhB,eAAU,cAAU,IAAY,CAAC,WAAD,SAAZ;tDAFJ;AAAQ;AAjOM;AAAd;AAEhB,eAAU;fAFM;AAAc;AAiPA;AAAd;AAEhB;AAEA,eAAU;fACV,YAAM,EAAN,GAAY,KAAK,EAAG,GAAE,MAAM,EAAR;nCACpB,YAAM,EAAN,GAAY,KAAK,EAAG,GAAE,MAAM,EAAR;nCANJ;AAAc;AAmiBA;AAAd;AAEhB;AAEA,eAAU;fACV,YAAM,EAAN,GAAY,KAAK,EAAG,GAAE,MAAM,EAAR;nCACpB,YAAM,EAAN,GAAY,KAAK,EAAG,GAAE,MAAM,EAAR;nCANJ;AAAc;AAhmBN;AAAR;AAEhB,eAAU;fAFM;AAAQ;AA1sBhB;AAmUG;;AAEK,6BA9XV,qBA8XU;lDACW;AACT,+BAxXV,uBAwXU;tDACD,8BAjaV,YAiaU;1CACU;AACT;AACD,8BX1dV,YW0dU;1CACK,mCAjYZ,yBAiYY;5DACP;AACA,4BX7dR,YW6dQ;xCACI;AACA,gCX/dZ,YW+dY;5CACD;AACJ,2BXjeP,YWieO;vCACA,2BXleP,YWkeO;vCACI;AACF,6BXpeT,YWoeS;zCACK,kCA3YX,yBA2YW;3DAEC,mCA7XX,0BA6XW;7DACF,iCA9XT,0BA8XS;3DACE,mCA7XP,8BA6XO;jEACC,oCAjYX,2BAiYW;/DACA,oCAlYX,2BAkYW;/DACL,+BA/XT,wBA+XS;vDACE,iCAhYX,wBAgYW;zDACC,kCAhYP,6BAgYO;/DACH,+BAtYN,2BAsYM;1DACD,8BAvYL,2BAuYK;zDA9BN;AAiCG;;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AARY;;AAIZ,kBAJY;lBAKZ,yBALY;;;zBA+gFiB;AAAT;AAEtB,UAAG,CAAY,CAAC,YAAD,SAAf,EACE,oBADF;vDAEA,eAAU;fAJY;AAAS;AAiBI;AAAb;AAEtB;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEE,eAAU;fAdY;AAAa;AAwDE;AAErC;AACA;AACA;AAAG;AAEH,UAAY,mBAAD,QAAX;rCAEE,YAAG,CAAI,cAAP;3BAEE,eAA2B,QAAQ,eAAe,CAAC,YAAK,GAAC,SAAP;/DAGlD,cAAY,EAAD,QAAX;xBAEE,kCAAkB;lCACV,qBAAR,KAAQ;1BACR,2BAAW;hBAJb;XAOA,eAAM;fACN,cAAK,gBAAO,GAAE,4BAAF;7DACZ,cAAK,eAAM,GAAE,2BAAF;3DAEX,6BAAc,MAAM,YAAY,CAAC,SAAU,qBAAQ,CAAC,CAAD,CAAI,GAAE,IAAzB;xFAChC,6BAAc,MAAM,YAAY,CAAC,QAAS,qBAAQ,CAAC,CAAD,CAAI,GAAE,IAAxB;vFAChC,6BAAc,OAAd,GAAyB,UAAK,CAAC,CAAE,GAAE,EAAL;xDAC9B,6BAAc,MAAd,GAAwB,UAAK,CAAC,CAAE,GAAE,EAAL;vDAE7B,6BAAc,WAAsB,CAAC,IAAD,CAAM,MAAM,CAAC,GAAI,EAAL;jDArBlD;TAwBA,YAAG,CAAY,CAAC,YAAD,SAAf,EACE,eAAW,8BAAO,QAAC,YAAM,CAAC,mBAAD,CAAN,CADrB;rHA1BF;PANqC;AAqDA;AAErC,UAAG,iBAAa,KAAG,MAAnB;tCAEE,4BAAgB;5BAChB;OAHF;PAFqC;AAzJD;AAEpC;AACA;AAHoC;AAoFP;AAE7B;AACA;AAH6B;AA8Ea;AAE1C;AACA,UAAY,uBAAD,QAAX;zCAEE,YAAG,iBAAY,KAAE,0BAAjB;5DAEE,cAAG,kBAAH;hCAEE,mCAAa,MAAM,YAAY,CAAC,eAAgB,OAAjB;5EAC/B,mCAAa,MAAM,YAAY,CAAC,eAAgB,KAAjB;1EAC/B,mCAAa,MAAM,YAAY,CAAC,eAAgB,kCAAW,CAAC,iBAAD,CAA5B;/GAG/B,MAAA,uBAAa,MAAM,YAAY,CAAC,eAAgB,EAAjB;nEAGjC,MAAA,uBAAa,MAAM,YAAY,CAAC,eAAgB,MAAjB;vEAdnC;PAH0C;AA5JP;AAAb;AAEtB,4BAAuC,QAAQ,cAAc,CAAC,QAAD;3DAC7D,UAAG,yCAAkB,IAAG,kBAAxB;zEAEE,iBAAU,QAAQ,cAAc,CAAC,MAAD;9CAChC,cAAM,YAAY,CAAC,mBAAD;9CAClB,2BAAc,cAAC,KAAS,YAAU,GAAE,SAAtB;tEACd,2BAAc,cAAC,SAAa,IAAd;/CAGd,eAAU;tBAXU;AAAa;AA4BQ;AAArB;AAEtB,eAAU;fAFY;AAAqB;AAKD;AAApB;AAEtB,eAAU;fAFY;AAAoB;AAtDT;AAEjC;AAFiC;AA+GL;;AA5HW;AAEvC;AACA,0BAAgB;1BAChB,0BAAgB;1BAChB,uBAAa;vBACb,oBAAU;pBACV,qBAAW;rBACX,2BAAiB;3BACjB,4BAAkB;5BAClB,2BAAiB;3BAVsB;AAgDR;AAE/B,UAAY,YAAD,QAAX,EACU,SAAR,KAAQ,UADV;xDAEA;AAJ+B;AAsEK;AAAd;AAEtB,eAAU,8BAAO,QAAC;rDAClB,YAAM,eAAe,CAAC,gBAAD;5CAHC;AAAc;AA+CP;AAE7B;AACA;AAH6B;AA5EI;AAEjC;AAEA;AACA,UAAG,YAAO,KAAE,IAAZ,EACE,MADF;vCAGA,WAAM;XACN,UAAI,EAAG,KAAG,gBAAV,EACE,qBADF;xDAGA,yBAAe;zBAEf,uBAAa;vBAEb,UAAY,YAAD,QAAX,EACE,YAAO,QADT;pDAGA;AACA,uBAAa;vBApBoB;AAjjFnB;AAiEC;;;AAEb;AAFa;AAqoFiB;AAEhC;AACA,4BAAkB;5BAHc;AAMQ;AAAjB;AAEnB,yBAAJ,IAAG;7BACH,eAAU;fAHa;AAAiB;AA3oFzB;AASC;;;AAEd;AACA;AAHc;;AAGd,eAHc;;;fA2pFe;AAE/B,eAAI,OAAO,CAAC,KAAD;5BAFoB;AAZE;AAEjC;AACA,kBAAQ,uBAAW,QAAC;jDAHa;AAMA;AAE5B,eAAL,KAAK;pBACL;AAHiC;AArpFjB;AASW;AACb,2BN7RH,iCM6RG;5DAVE;AAaC;AA0pFiB;AAElB,sDAAC,OAAQ,qBAAT;lFAFkB;AA1pFjB;AAWF;;;AAEb;AAFa;;AAEb,wBAFa;;;xBA0sFwB;AAEvC,wBAAa,OAAO,CAAC,KAAD;rCAFmB;AApCP;AAEhC;AACA,2BAAiB,sBAAiB,QAAC,YAAM,CAAC,IAAD,CAAN;3EAHH;AAMA;AAElB,eAAd,KAAc;pBACd;AAHgC;AA5qFjB;AAUQ,oCArBN,gCAqBM;pEAVR;AAuBW;AAAnB;AAEP,aAAU;bAFH;AAAmB;AAuuF5B;AACE,2BAAkB,oBAAe,QAAC,YAAM,CAAC,IAAD,CAAN;zEADpC;AA12GA,GA2nBc,kCA3nBd;;;rCA2nBc;AAMZ;AAOqB;AAAd;AAEP,aAAU,IAAK,GAAE,qBAAQ,CAAC,oBAAc,oBAAf,CAAV;nFAFR;AAAc;AAxoBvB;ACfA,0BAES,UAFT;;;pCAMa;AA0LmB;AAAvB;AAEF;AACH,QADG,KACH;bAAO,eAAU;fACjB,cAFG,KAEH;nBAAO,eAAU;fACjB,cAHG,KAGH;nBAAY,eAAU;fACtB,cAJG,KAIH;nBAAU,eAAU;fACpB,cALG,KAKH;nBAAY,eAAU;fACtB,cANG,KAMH;nBAAO,eAAU;fACjB,cAPG,KAOH;nBAAU,eAAU;fACpB,cARG,KAQH;nBAAY,eAAU;fACtB,cATG,KASH;nBAAS,eAAU;fACnB,cAVG,KAUH;nBAAW,eAAU;fACrB,cAXG,KAWH;nBAAS,eAAU;fACnB,cAZG,KAYH;nBAAS,eAAU;fACnB,cAbG,KAaH;nBAAc,eAAU;fACxB,cAdG,KAcH;nBAAU,eAAU;fACpB,cAfG,KAeH;nBAAa,eAAU;fACvB,cAhBG,KAgBH;nBAAY,eAAU;fACtB,cAjBG,KAiBH;nBAAS,eAAU;fACnB,cAlBG,KAkBH;nBAAU,eAAU;fACpB,cAnBG,KAmBH;nBAAU,eAAU;fACpB,cApBG,KAoBH;nBAAU,eAAU;fACpB,cArBG,KAqBH;nBAAU,eAAU;fACpB,cAtBG,KAsBH;nBAAS,eAAU;fACnB,cAvBG,KAuBH;nBAAU,eAAU;fACpB,cAxBG,KAwBH;nBAAU,eAAU;fACpB,cAzBG,KAyBH;nBAAU,eAAU;fACpB,cA1BG,KA0BH;nBAAW,eAAU;fACrB,cA3BG,KA2BH;nBAAW,eAAU;fACrB,cA5BG,KA4BH;nBAAO,eAAU;fACjB,cA7BG,KA6BH;nBAAQ,eAAU;fAClB,cA9BG,KA8BH;nBAAY,eAAU;fACtB,cA/BG,KA+BH;nBAAU,eAAU;fACpB,cAhCG,KAgCH;nBAAQ,eAAU;fAClB,cAjCG,KAiCH;nBAAS,eAAU;fACnB,cAlCG,KAkCH;nBAAS,eAAU;fACnB,cAnCG,KAmCH;nBAAS,eAAU;fACnB,cApCG,KAoCH;nBAAW,eAAU;fACrB,cArCG,KAqCH;nBAAM,eAAU;fAChB,cAtCG,KAsCH;nBAAU,eAAU;fACpB,cAvCG,KAuCH;nBAAY,eAAU;fACtB,cAxCG,KAwCH;nBAAU,eAAU;fACpB,cAzCG,KAyCH;nBAAW,eAAU;fACrB,cA1CG,KA0CH;nBAAS,eAAU;fACnB,cA3CG,KA2CH;nBAAU,eAAU;fACpB,cA5CG,KA4CH;nBAAQ,eAAU;fAClB,cA7CG,KA6CH;nBAAU,eAAU;fACpB,cA9CG,KA8CH;nBAAS,eAAU;fACnB,cA/CG,KA+CH;nBAAU,eAAU;fACpB,cAhDG,KAgDH;nBAAS,eAAU;fACnB,cAjDG,KAiDH;nBAAiB,eAAU;fAC3B,cAlDG,KAkDH;nBAAQ,eAAU;fAClB,cAnDG,KAmDH;nBAAS,eAAU;fACnB,cApDG,KAoDH;nBAAW,eAAU;fACrB,cArDG,KAqDH;nBAAU,eAAU;fACpB,cAtDG,KAsDH;nBAAW,eAAU;fACrB,cAvDG,KAuDH;nBAAO,eAAU;fACjB,cAxDG,KAwDH;nBAAQ,eAAU;fAClB,cAzDG,KAyDH;nBAAS,eAAU;fACnB,cA1DG,KA0DH;nBAAQ,eAAU;fAClB,cA3DG,KA2DH;nBAAW,eAAU;fACrB,cA5DG,KA4DH;nBAAW,eAAU;fACrB,cA7DG,KA6DH;nBAAU,eAAU;fACpB,cA9DG,KA8DH;nBAAY,eAAU;fACtB,cA/DG,KA+DH;nBAAW,eAAU;fACrB,cAhEG,KAgEH;nBAAS,eAAU;fACnB,cAjEG,KAiEH;nBAAc,eAAU;fACxB,cAlEG,KAkEH;nBAAa,eAAU;fACvB,cAnEG,KAmEH;nBAAc,eAAU;fACxB,cApEG,KAoEH;nBAAO,eAAU;fACjB,cArEG,KAqEH;nBAAY,eAAU;fACtB,cAtEG,KAsEH;nBAAU,eAAU;fACpB,cAvEG,KAuEH;nBAAM,eAAU;fAChB,cAxEG,KAwEH;nBAAY,eAAU;fACtB,cAzEG,KAyEH;nBAAU,eAAU;fACpB,cA1EG,KA0EH;nBAAY,eAAU;fACtB,cA3EG,KA2EH;nBAAW,eAAU;fACrB,cA5EG,KA4EH;nBAAW,eAAU;fACrB,cA7EG,KA6EH;nBAAW,eAAU;fACrB,cA9EG,KA8EH;nBAAQ,eAAU;fAClB,cA/EG,KA+EH;nBAAS,eAAU;fACnB,cAhFG,KAgFH;nBAAW,eAAU;fACrB,cAjFG,KAiFH;nBAAS,eAAU;fACnB,cAlFG,KAkFH;nBAAc,eAAU;fACxB,cAnFG,KAmFH;nBAAe,eAAU;fACzB,cApFG,KAoFH;nBAAU,eAAU;fACpB,cArFG,KAqFH;nBAAS,eAAU;fACnB,cAtFG,KAsFH;nBAAS,eAAU;fACnB,cAvFG,KAuFH;nBAAW,eAAU;fACrB,cAxFG,KAwFH;nBAAU,eAAU;fACpB,cAzFG,KAyFH;nBAAO,eAAU;fACjB,cA1FG,KA0FH;nBAAU,eAAU;fACpB,cA3FG,KA2FH;nBAAU,eAAU;fACpB,cA5FG,KA4FH;nBAAQ,eAAU;fAClB,cA7FG,KA6FH;nBAAgB,eAAU;fAC1B,cA9FG,KA8FH;nBAAQ,eAAU;fAClB,cA/FG,KA+FH;nBAAY,eAAU;fACtB,cAhGG,KAgGH;nBAAU,eAAU;fACpB,cAjGG,KAiGH;nBAAM,eAAU;fAChB,cAlGG,KAkGH;nBAAa,eAAU;fACvB,cAnGG,KAmGH;nBAAc,eAAU;fACxB,cApGG,KAoGH;nBAAU,eAAU;fACpB,cArGG,KAqGH;nBAAW,eAAU;fACrB,cAtGG,KAsGH;nBAAc,eAAU;fACxB,cAvGG,KAuGH;nBAAQ,eAAU;fAClB,cAxGG,KAwGH;nBAAa,eAAU;fACvB,cAzGG,KAyGH;nBAAY,eAAU;fACtB,cA1GG,KA0GH;nBAAY,eAAU;fACtB,cA3GG,KA2GH;nBAAU,eAAU;fACpB,cA5GG,KA4GH;nBAAQ,eAAU;fAClB,cA7GG,KA6GH;nBAAU,eAAU;fACpB,cA9GG,KA8GH;nBAAU,eAAU;fACpB,cA/GG,KA+GH;nBAAQ,eAAU;fAClB,cAhHG,KAgHH;nBAAU,eAAU;fACpB,cAjHG,KAiHH;nBAAS,eAAU;fACnB,cAlHG,KAkHH;nBAAS,eAAU;fACnB,cAnHG,KAmHH;nBAAQ,eAAU;fAClB,cApHG,KAoHH;nBAAY,eAAU;fACtB,cArHG,KAqHH;nBAAS,eAAU;fACnB,cAtHG,KAsHH;nBAAW,eAAU;fACrB,cAvHG,KAuHH;nBAAU,eAAU;fACpB,cAxHG,KAwHH;nBAAS,eAAU;fACnB,cAzHG,KAyHH;nBAAQ,eAAU;fAClB,cA1HG,KA0HH;nBAAQ,eAAU;fAClB,cA3HG,KA2HH;nBAAW,eAAU;fACrB,cA5HG,KA4HH;nBAAU,eAAU;fACpB,cA7HG,KA6HH;nBAAO,eAAU;fACjB,cA9HG,KA8HH;nBAAS,eAAU;fACnB,cA/HG,KA+HH;nBAAS,eAAU;fACnB,cAhIG,KAgIH;nBAAa,eAAU;fACvB,cAjIG,KAiIH;nBAAU,eAAU;fACpB,cAlIG,KAkIH;nBAAU,eAAU;fACpB,cAnIG,KAmIH;nBAAQ,eAAU;fAClB,cApIG,KAoIH;nBAAW,eAAU;fACrB,cArIG,KAqIH;nBAAU,eAAU;fACpB,cAtIG,KAsIH;nBAAc,eAAU;fACxB,cAvIG,KAuIH;nBAAW,eAAU;fACrB,cAxIG,KAwIH;nBAAY,eAAU;fACtB,cAzIG,KAyIH;nBAAS,eAAU;fACnB,cA1IG,KA0IH;nBAAe,eAAU;fACzB,cA3IG,KA2IH;nBAAQ,eAAU;fAClB,cA5IG,KA4IH;nBAAU,eAAU;fACpB,cA7IG,KA6IH;nBAAS,eAAU;fACnB,cA9IG,KA8IH;nBAAY,eAAU;fACtB,cA/IG,KA+IH;nBAAS,eAAU;fACnB,cAhJG,KAgJH;nBAAQ,eAAU;fAClB,cAjJG,KAiJH;nBAAS,eAAU;fACnB,cAlJG,KAkJH;nBAAW,eAAU;fACrB,cAnJG,KAmJH;nBAAU,eAAU;fACpB,cApJG,KAoJH;nBAAQ,eAAU;fAClB,cArJG,KAqJH;nBAAQ,eAAU;fAClB,cAtJG,KAsJH;nBAAY,eAAU;fACtB,cAvJG,KAuJH;nBAAU,eAAU;fACpB,cAxJG,KAwJH;nBAAU,eAAU;fACpB,cAzJG,KAyJH;nBAAQ,eAAU;fAClB,cA1JG,KA0JH;nBAAS,eAAU;fACnB,cA3JG,KA2JH;nBAAQ,eAAU;fAClB,cA5JG,KA4JH;nBAAO,eAAU;fACjB,cA7JG,KA6JH;nBAAW,eAAU;fACrB,cA9JG,KA8JH;nBAAU,eAAU;fACpB,cA/JG,KA+JH;nBAAU,eAAU;fACpB,cAhKG,KAgKH;nBAAS,eAAU;fACnB,cAjKG,KAiKH;nBAAQ,eAAU;fAClB,cAlKG,KAkKH;nBAAU,eAAU;fACpB,cAnKG,KAmKH;nBAAS,eAAU;fACnB,cApKG,KAoKH;nBAAQ,eAAU;fAClB,cArKG,KAqKH;nBAAM,eAAU;fAChB,cAtKG,KAsKH;nBAAW,eAAU;fACrB,cAvKG,KAuKH;nBAAS,eAAU;fACnB,cAxKG,KAwKH;nBAAY,eAAU;fACtB,cAzKG,KAyKH;nBAAO,eAAU;fACjB,cA1KG,KA0KH;nBAAQ,eAAU;fAClB,cA3KG,KA2KH;nBAAQ,eAAU;fAClB,cA5KG,KA4KH;nBAAa,eAAU;fACvB,cA7KG,KA6KH;nBAAU,eAAU;fACpB,cA9KG,KA8KH;nBAAQ,eAAU;fAClB,cA/KG,KA+KH;nBAAQ,eAAU;fAClB,cAhLG,KAgLH;nBAAU,eAAU;fACpB,cAjLG,KAiLH;nBAAS,eAAU;fACnB,cAlLG,KAkLH;nBAAS,eAAU;fACnB,cAnLG,KAmLH;nBAAU,eAAU;fACpB,cApLG,KAoLH,6BAAO,SAAU,IAAjB;7DAtLK;AAAuB;AAhMhC;ACeA,8BAIS,mGAJT;;;jIAwHQ;;;AAEJ;AACA;AACA;AAJI;;AAIJ,mBAJI;;;nBA4vBqB;AAAb;AAEd,eAAU;fACV;AAHc;AAAa;AAMF;AAEL,2DAAC,KAAD;hEACpB;AAHyB;AAMC;AAE1B,uBAAa;vBACb;AAH0B;AAMJ;AAEtB,UAAY,aAAD,QAAX,EACE,aAAQ,CAAC,IAAD,CADV;pDAFsB;AAWM;AAE5B;AAEA,UAAG,aAAH,EACE,gBAAY,MAAM,YAAY,CAAE,mCAAS,cAAX,CADhC;9GAJ4B;AALD;AAE3B,YAAM,cAAc,CAAC,aAAD;xCAFO;AAhCI;AAE/B;AACA,uBAAa;vBACb,sBAAY,CAAC;vBACb,sBAAW,IAAX;1BAL+B;AApvBzB;AAgBY;AACC,gCblHZ,YakHY;5CACD,+BFVN,6CEUM;5EAlBZ;AAxHR;ACAA,8BAES,UAFT;;;xCAoFiC;AAAxB;AAEP;AAIF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGE,aAAU;bAjOH;AAAwB;AAoOJ;AAApB;AAEP;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEE,aAAU;bAdH;AAAoB;AAiBC;AAArB;AAEP;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEE,aAAU;bAdH;AAAqB;AAiBC;AAAtB;AAEP;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGE,aAAU;bAfH;AAAsB;AAkBC;AAAvB;AAEP;AAGF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGE,aAAU;bAfH;AAAuB;AAkBE;AAAzB;AAEP;AAGF;AACA;AACA;AAEE,aAAU;bATH;AAAyB;AAaT;AAAhB;AAEP;AAGF;AAEE,aAAU;bAPH;AAAgB;AA3YzB,GAmBc,WAnBd;dCAA,6BAES,2FAFT;;;;xHAQa;AAQA;;;AAET;AAGA;AACA;AACA;AACA;AARS;;AAOT,yBAPS;zBAQT,mBARS;;;nBAwImB;;AARM;AAEpC;AACA,sBAAY;tBACZ,sBAAY;tBACZ,yBAAe;zBALqB;AAhIzB;AA0BO;AAEM,qCJoFZ,6CIpFY;lFACN,+BJmFN,6CInFM;5EA7BP;AAudb;AACE,sBAAa;tBADf;AAveA,GAwEc,gBAxEd;;;nBAwEc;AAMZ;AA9EF;ACAA,2BAES,uFAFT;;;;lHAcU,kBAAK;lBAIR,eAAQ;fAMP,gBAAO;hBAEL,kBAAK;lBAIR,eAAQ;fAYD;;AAEF;;AAIC,kEAAmB,UhBmBvB,2BgBn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/C,2BoC8X+C,EAAkB,WpC1ajE,WoC0aiE,EAAsB,0BAA3D;nLACW,qGAAmB,UpC/X1D,2BoC+X0D,EAAoB,aZ9UtE,qDY8UsE,EAAwB,SlBzOvG,yCkByOuG,EAAgB,UArE9F,6CAqE8F,EAA6C,yBAA2B,8BAAvJ;pXACD,oGAAmB,UpChYzD,2BoCgYyD,EAAoB,aZ/UrE,qDY+UqE,EAAwB,SlB1OtG,yCkB0OsG,EAAgB,UAtE7F,6CAsE6F,CAA/E;3TACA,oGAAmB,UpCjYzD,2BoCiYyD,EAAoB,aZhVrE,qDYgVqE,EAAwB,SlB3OtG,yCkB2OsG,EAAgB,UAtE9F,4CAsE8F,EAA4C,yBAA2B,8BAAtJ;lXACD,mGAAmB,UpClYxD,2BoCkYwD,EAAoB,aZjVpE,qDYiVoE,EAAwB,SlB5OrG,yCkB4OqG,EAAgB,UAvE7F,4CAuE6F,CAA/E;zTAEF,iGAAmB,UpCpYtD,2BoCoYsD,EAAkB,WpChbxE,WoCgbwE,EAAkB,W/B5PzF,6B+B4PyF,CAAvD;zMACN,2FAAmB,UpCrYhD,2BoCqYgD,EAAoB,aZpV5D,qDYoV4D,EAAwB,SlB/O7F,yCkB+O6F,EAAiB,WpCjb7G,WoCib6G,EAAqB,yBAA2B,8BAAhI;zUACD,0FAAmB,UpCtY/C,2BoCsY+C,EAAoB,aZrV3D,qDYqV2D,EAAwB,SlBhP5F,yCkBgP4F,EAAiB,WpClb5G,WoCkb4G,CAAhF;hRACO,iGAAmB,UpCvYtD,2BoCuYsD,EAAoB,aZtVlE,qDYsVkE,EAAwB,SlBjPnG,yCkBiPmG,EAAiB,WpCnbnH,WoCmbmH,EAAgB,SH9T9G,sEG8T8G,EAA0C,yBAA2B,8BAArK;haACD,gGAAmB,UpCxYrD,2BoCwYqD,EAAoB,aZvVjE,qDYuViE,EAAwB,SlBlPlG,yCkBkPkG,EAAiB,WpCpblH,WoCobkH,EAAgB,SH/T7G,sEG+T6G,CAAhG;vWACN,0FAAmB,UpCzY/C,2BoCyY+C,EAAoB,aZxV3D,qDYwV2D,EAAwB,SlBnP5F,yCkBmP4F,EAAgB,UpCrb3G,WoCqb2G,EAAc,gBpCrbzH,WoCqbyH,EAAY,cpCrbrI,WoCqbqI,EAAgB,SHhUhI,sEGgUgI,EAA0C,yBAA2B,8BAA9L;hdACD,yFAAmB,UpC1Y9C,2BoC0Y8C,EAAoB,aZzV1D,qDYyV0D,EAAwB,SlBpP3F,yCkBoP2F,EAAgB,UpCtb1G,WoCsb0G,EAAc,gBpCtbxH,WoCsbwH,EAAY,cpCtbpI,WoCsboI,EAAgB,SHjU/H,sEGiU+H,CAAzH;vZAEA,yFAAmB,UpC5Y9C,2BoC4Y8C,EAAoB,aZ3V1D,qDY2V0D,EAAwB,SlBtP3F,yCkBsP2F,EAAe,SH9YtF,oEG8YsF,EAAwC,yBAA2B,8BAAjJ;9XACD,wFAAmB,UpC7Y7C,2BoC6Y6C,EAAoB,aZ5VzD,qDY4VyD,EAAwB,SlBvP1F,yCkBuP0F,EAAe,SH/YrF,oEG+YqF,CAA9E;rUAEG,2FAAmB,UpC/YhD,2BoC+YgD,EAAgB,SHjZ7C,oEGiZ6C,EAAgD,kBpC3bhH,YoC2bgH,EAAnF;jPAEH,wFAAmB,UpCjZ7C,2BoCiZ6C,EAAkB,WpC7b/D,WoC6b+D,EAAgB,SHxU1D,sEGwU0D,EAAyC,sBAA9F;9PACO,+FAAmB,UpClZpD,2BoCkZoD,EAAoB,aZjWhE,qDYiWgE,EAAwB,SlB5PjG,yCkB4PiG,EAAiB,WpC9bjH,WoC8biH,EAAgB,SHzU5G,sEGyU4G,EAAqC,qBAAoB,wBAAzJ;pZACD,8FAAmB,UpCnZnD,2BoCmZmD,EAAoB,aZlW/D,qDYkW+D,EAAwB,SlB7PhG,yCkB6PgG,EAAiB,WpC/bhH,WoC+bgH,EAAgB,SH1U3G,sEG0U2G,EAAqC,oBAArI;1XACP,uFAAmB,UpCpZ5C,2BoCoZ4C,EAAiB,UpChc7D,WoCgc6D,EAAgB,SH3UxD,sEG2UwD,EAAyC,sBAA7F;5PACO,8FAAmB,UpCrZnD,2BoCqZmD,EAAoB,aZpW/D,qDYoW+D,EAAwB,SlB/PhG,yCkB+PgG,EAAgB,UpCjc/G,WoCic+G,EAAc,gBpCjc7H,WoCic6H,EAAY,cpCjczI,WoCicyI,EAAgB,SH5UpI,sEG4UoI,EAAqC,qBAAoB,wBAAlL;1cACD,6FAAmB,UpCtZlD,2BoCsZkD,EAAoB,aZrW9D,qDYqW8D,EAAwB,SlBhQ/F,yCkBgQ+F,EAAgB,UpClc9G,WoCkc8G,EAAc,gBpClc5H,WoCkc4H,EAAY,cpClcxI,WoCkcwI,EAAgB,SH7UnI,sEG6UmI,EAAqC,oBAA9J;hbACH,0FAAmB,UpCvZ/C,2BoCuZ+C,EAAgB,SHzZ5C,oEGyZ4C,EAAqC,WpCncpG,WoCmcoG,EAAkB,sBAA1F;9PAEJ,sFAAmB,UpCzZ3C,2BoCyZ2C,EAAgB,SH3ZxC,oEG2ZwC,CAAnC;3MACA,sFAAmB,UpC1Z3C,2BoC0Z2C,EAAgB,SH5ZxC,oEG4ZwC,EAAqC,WpCtchG,WoCscgG,EAAgB,SHuR5F,qEGvR4F,EAAwC,sBAAhI;1UAGC,uFAAmB,UpC7Z5C,2BoC6Z4C,EAAgB,SH/ZzC,oEG+ZyC,EAAwC,Uf+DvF,gEe/DuF,EAA3E;zRACG,0FAAmB,UpC9Z/C,2BoC8Z+C,EAAgB,SHha5C,oEGga4C,EAAqC,WpC1cpG,WoC0coG,EAAwB,af4DxG,uEe5DwG,EAAhG;9TACW,qGAAmB,UpC/Z1D,2BoC+Z0D,EAAgB,SHjavD,oEGiauD,EAAqC,WpC3c/G,WoC2c+G,EAAmC,wBf0DjI,oEe1DiI,EAA3G;jVACF,mGAAmB,UpChaxD,2BoCgawD,EAAgB,SHlarD,oEGkaqD,EAAqC,WpC5c7G,WoC4c6G,EAAiC,sBfyD7H,oEezD6H,EAAzG;7UACL,8FAAmB,UpCjanD,2BoCiamD,EAAgB,SHnahD,oEGmagD,EAAqC,WpC7cxG,WoC6cwG,EAA4B,+BAApG;3QAGF,4FAAmB,UpCpajD,2BoCoaiD,EAAkB,WpChdnE,WoCgdmE,EAAgB,SH3V9D,sEG2V8D,EAA6C,afsD5G,uEetD4G,EAAlG;lUACW,uGAAmB,UpCra5D,2BoCqa4D,EAAkB,WpCjd9E,WoCid8E,EAAgB,SH5VzE,sEG4VyE,EAAwD,wBfoDrI,oEepDqI,EAA7G;rVACF,qGAAmB,UpCta1D,2BoCsa0D,EAAkB,WpCld5E,WoCkd4E,EAAgB,SH7VvE,sEG6VuE,EAAsD,sBfmDjI,oEenDiI,EAA3G;jVACL,gGAAmB,UpCvarD,2BoCuaqD,EAAkB,WpCndvE,WoCmduE,EAAgB,SH9VlE,sEG8VkE,EAAiD,+BAAtG;/QACV,sFAAmB,UpCxa3C,2BoCwa2C,EAAgB,SH1axC,oEG0awC,EAAqC,WpCpdhG,WoCodgG,EAAiB,uBAAoB,SlBxO/H,iDkBwO+H,EAA7G;vTACE,wFAAmB,UpCza7C,2BoCya6C,EAAgB,SH3a1C,oEG2a0C,EAAqC,WpCrdlG,WoCqdkG,EAAsB,wBAA9F;9PACK,6FAAmB,UpC1alD,2BoC0akD,EAAoB,aZzX9D,qDYyX8D,EAAwB,SlBpR/F,yCkBoR+F,EAAiB,WpCtd/G,WoCsd+G,EAAgB,SH5a5G,oEG4a4G,EAAmC,qBAAoB,wBAAvJ;hZACD,4FAAmB,UpC3ajD,2BoC2aiD,EAAoB,aZ1X7D,qDY0X6D,EAAwB,SlBrR9F,yCkBqR8F,EAAiB,WpCvd9G,WoCud8G,EAAgB,SH7a3G,oEG6a2G,EAAmC,oBAAnI;tXAGG,+FAAmB,UpC9apD,2BoC8aoD,EAAoB,aZ7XhE,qDY6XgE,EAAwB,SlBxRjG,yCkBwRiG,EAAiB,WpC1djH,WoC0diH,EAAgB,SHhb9G,oEGgb8G,EAAqC,WlB9OhK,gDkB8OgK,EAA0B,wBAA/J;1bACD,8FAAmB,UpC/anD,2BoC+amD,EAAoB,aZ9X/D,qDY8X+D,EAAwB,SlBzRhG,yCkByRgG,EAAiB,WpC3dhH,WoC2dgH,EAAgB,SHjb7G,oEGib6G,EAAqC,WlB/O/J,gDkB+O+J,CAArI;haACD,6FAAmB,UpChblD,2BoCgbkD,EAAoB,aZ/X9D,qDY+X8D,EAAwB,SlB1R/F,yCkB0R+F,EAAiB,WpC5d/G,WoC4d+G,EAAgB,SHlb5G,oEGkb4G,EAAmC,SlBhP5J,gDkBgP4J,EAA0B,wBAA7J;tbACD,4FAAmB,UpCjbjD,2BoCibiD,EAAoB,aZhY7D,qDYgY6D,EAAwB,SlB3R9F,yCkB2R8F,EAAiB,WpC7d9G,WoC6d8G,EAAgB,SHnb3G,oEGmb2G,EAAmC,SlBjP3J,gDkBiP2J,CAAnI;5ZAOE,8FAAmB,UpCxbnD,2BoCwbmD,EAAoB,aZvY/D,qDYuY+D,EAAwB,SlBlShG,yCkBkSgG,EAAiB,WpCpehH,WoCoegH,EAAgB,SH1b7G,oEG0b6G,EAAoC,UlBxP9J,gDkBwP8J,EAA2B,wBAA/J;xbACD,6FAAmB,UpCzblD,2BoCybkD,EAAoB,aZxY9D,qDYwY8D,EAAwB,SlBnS/F,yCkBmS+F,EAAiB,WpCre/G,WoCqe+G,EAAgB,SH3b5G,oEG2b4G,EAAoC,UlBzP7J,gDkByP6J,CAApI;9ZACN,uFAAmB,UpC1b5C,2BoC0b4C,EAAgB,SH5bzC,oEG4byC,EAAwC,Uf9IvF,Ye8IuF,EAA3E;rOACI,2FAAmB,UpC3bhD,2BoC2bgD,EAAgB,SH7b7C,oEG6b6C,EAAqC,WpCverG,WoCueqG,EAAyB,cH1EzG,uEG0EyG,EAAjG;hUACA,2FAAmB,UpC5bhD,2BoC4bgD,EAAgB,SH9b7C,oEG8b6C,EAAqC,WpCxerG,WoCweqG,EAAyB,cfhJjH,YegJiH,EAAjG;rQAEF,yFAAmB,UpC9b9C,2BoC8b8C,EAAgB,SHhc3C,oEGgc2C,EAA2C,2BAA9E;1OAGD,wFAAmB,UpCjc7C,2BoCic6C,EAAgB,SHnc1C,oEGmc0C,EAA0C,0BAA7E;xOACC,yFAAmB,UpClc9C,2BoCkc8C,EAAgB,SHpc3C,oEGoc2C,EAA2C,2BAA9E;1OAED,wFAAmB,UpCpc7C,2BoCoc6C,EAAgB,SHtc1C,oEGsc0C,EAA0C,0BAA7E;xOAEG,2FAAmB,UpCtchD,2BoCscgD,EAAgB,SHxc7C,oEGwc6C,EAAqC,WpClfrG,WoCkfqG,EAAoB,uBAAwB,4BAApH;5RACD,0FAAmB,UpCvc/C,2BoCuc+C,EAAgB,SHzc5C,oEGyc4C,EAAqC,WpCnfpG,WoCmfoG,CAAxE;vOACG,6FAAmB,UpCxclD,2BoCwckD,EAAgB,SH1c/C,oEG0c+C,EAA8C,8BAAjF;jPACD,4FAAmB,UpCzcjD,2BoCyciD,EAAgB,SH3c9C,oEG2c8C,CAAnC;jNACD,2FAAmB,UpC1chD,2BoC0cgD,EAAgB,SH5c7C,oEG4c6C,EAA4C,4BAA/E;7OACD,0FAAmB,UpC3c/C,2BoC2c+C,EAAgB,SH7c5C,oEG6c4C,CAAnC;/MACA,0FAAmB,UpC5c/C,2BoC4c+C,EAAgB,SH9c5C,oEG8c4C,EAAqC,WpCxfpG,WoCwfoG,EAAwB,2BAAhG;nQACD,yFAAmB,UpC7c9C,2BoC6c8C,EAAgB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ACA,UAAc,CAAV,SAAU,KAAE,+BAAF,CAAY,IAAgB,CAAX,UAAW,KAAE,cAAF,CAA1C,EACE,iBAAa,IADf;nHAJ2C;AA2CA;;AA0BF;;AA7DI;;AAIJ;;AAoCC;;AAMQ;AAApB;AAE9B,eAAU;fAFoB;AAAoB;AAzEX;AAEvC;AAEA;AACA,qBAAW;rBACX,UAAW,CAAC,MAAD,SAAS,IAAe,+BAAH,eAAP,MAAO,CAAhC;nFAEE,iBAAS,SAA2B,QAAtB,MAAM,kBAAC,EAAe,GAAE,CAAF,qBAApC;rFAAI;AAEF,cAA4B,0BAAH,eAArB,MAAM,aAAW,CAAC,CAAD,CAAI,CAAzB;9EAEE,6BAAiC,OAArB,MAAM,aAAW,CAAC,CAAD,EAAO,0BAAH,CAAjC;tFACA;WAHF;;JAJJ;PANuC;AA/uQjB;AAqBL;AACE,gCApnBE,oCAonBF;pEAtBG;AAyBD;;;AAEnB;AACA;AACA;AAAiB;AACjB;AACA;AACA;AAAI;AAAQ;AACZ;AACA;AACA;AAAc;AAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAa;AAAa;AAAmB;AAC7C;AACA;AACA;AAKA;AACA;AACA;AACA;AAAW;AAAc;AACzB;AACA;AAAe;AACf;AACA;AACA;AACA;AACA;AACA;AAAU;AAAqB;AAAuB;AACtD;AACA;AAAM;AACN;AAAU;AAAU;AAAQ;AAAQ;AAAS;AAAS;AACtD;AAAY;AACZ;AAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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"}