XFormsTreeView.js 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671
  1. XFormsTreeView.prototype = new XFormsGroup();
  2. function XFormsTreeView (strParentId, strAlert, strHelp, strHint, strAccesskey, strBind, strButtonColor, strCellSpacing, bCheckChildren,
  3. strCheckImage, strClass, bDisabled, bDragmode, bDropmode, bEditmenu, nExpandDepth, strExpandedImage, bFullRowSelect, bHasButtons,
  4. bHasCheck, bHasImages, bHasLines, strId, strImage, strIndent, strItemHeight, strItemSetType, strLineColor, nNavindex, bOneClickExpand,
  5. strOverflow, bPopup, strRef, strScroll, strSelectedImage, strShowEffect, bSingleExpand, strStyle, strTag, strUncheckImage, strVisibility,
  6. bIsItemSet, nItemLength, strNodeSet, strLabelRef, strValueRef, strDepthRef, strNodeSetName, strImageRef, strExpandedImageRef, strSelectedImageRef, strUserDefineAttrib, strUserStaticValue)
  7. {
  8. if (!strId)
  9. {
  10. return;
  11. }
  12. XFormsGroup.call(this, strParentId, strAlert, strHelp, strHint, strAccesskey, strBind, strClass, bDisabled, strId, nNavindex,
  13. strOverflow, bPopup, strRef, strScroll, strShowEffect, strStyle, strTag, strVisibility, strUserDefineAttrib);
  14. /**
  15. * Atrribute
  16. */
  17. this.attribute["buttoncolor"] = strButtonColor; // 보류
  18. this.attribute["cellspacing"] = strCellSpacing;
  19. this.attribute["checkchildren"] = String(bCheckChildren);
  20. this.attribute["checkimage"] = strCheckImage;
  21. this.attribute["dragmode"] = String(bDragmode);
  22. this.attribute["dropmode"] = String(bDropmode);
  23. this.attribute["editmenu"] = String(bEditmenu);
  24. this.attribute["expanddepth"] = String(nExpandDepth);
  25. this.attribute["expandedimage"] = String(strExpandedImage);
  26. this.attribute["fullrowselect"] = String(bFullRowSelect);
  27. this.attribute["hasbuttons"] = String(bHasButtons);
  28. this.attribute["hascheck"] = String(bHasCheck);
  29. this.attribute["hasimages"] = String(bHasImages);
  30. this.attribute["haslines"] = String(bHasLines);
  31. this.attribute["image"] = strImage;
  32. this.attribute["indent"] = strIndent;
  33. this.attribute["itemheight"] = strItemHeight;
  34. this.attribute["itemsettype"] = strItemSetType;
  35. this.attribute["linecolor"] = strLineColor;
  36. this.attribute["oneclickexpand"] = String(bOneClickExpand);
  37. this.attribute["selectedimage"] = strSelectedImage;
  38. this.attribute["singleexpand"] = String(bSingleExpand);
  39. this.attribute["uncheckimage"] = strUncheckImage;
  40. /**
  41. * Property
  42. */
  43. this.alwaysDrawButton; // 뷰어에 구현되어있지 않음. 보류.
  44. this.checkImage;
  45. this.currentStyle;
  46. this.expandDepth = nExpandDepth;
  47. this.label = "";
  48. this.length; // treeview item 갯수
  49. this.mouseCol = 0;
  50. this.mouseRow = 0;
  51. this.selected;
  52. this.nodeset = strNodeSet;
  53. this.focusIndex = -1;
  54. this.value = "";
  55. this.m_nSelectedRow = -1;
  56. this.m_strPath = new Array();
  57. this.m_strCellSpacing = "";
  58. this.m_strItemHeight = "";
  59. this.m_strLabelRef = strLabelRef;
  60. this.m_strValueRef = strValueRef;
  61. this.m_strDepthRef = strDepthRef;
  62. this.m_strNodeSetName = strNodeSetName;
  63. this.m_strImageRef = strImageRef;
  64. this.m_strExpandedImageRef = strExpandedImageRef;
  65. this.m_strSelectedImageRef = strSelectedImageRef;
  66. this.m_strUserStaticValue = strUserStaticValue;
  67. this.htStaticValue;
  68. this.m_bIsItemSet = bIsItemSet;
  69. this.itemset;
  70. this.m_objOriginControl = null;
  71. this.m_arItemSetAttribute = new Array();
  72. this.m_alLineDIV = new Array();
  73. this.m_xlOriginItemSet;
  74. };
  75. XFormsTreeView.prototype.init = function ()
  76. {
  77. XFormsGroup.prototype.init.call(this);
  78. var strAttribute = "id:" + this.id + ".item; background-color:transparent; vertical-align:middle; border-style:none; word-wrap:none; text-rect:visible; ";
  79. this.itemset = this.createChild("xforms:treeitem", strAttribute);
  80. var strLabelAttribute = "id:" + this.id + ".label";
  81. var objLabel = this.itemset.createChild("xforms:label", strLabelAttribute);
  82. var strValueAttribute = "id:" + this.id + ".value";
  83. var objValue = this.itemset.createChild("xforms:value", strValueAttribute);
  84. this.itemset.setLabel(objLabel);
  85. this.itemset.setValue(objValue);
  86. if (this.m_bIsItemSet)
  87. {
  88. this.initItemSetData();
  89. }
  90. else
  91. {
  92. this.initItemData();
  93. if("" != this.m_strUserStaticValue)
  94. {
  95. this.htStaticValue = new Hashtable();
  96. var arCellList = this.m_strUserStaticValue.split("|");
  97. for (var i=0; i<arCellList.length; i++)
  98. {
  99. if (-1 != arCellList[i].indexOf("^"))
  100. {
  101. var arCellLabelAndValue = arCellList[i].split("^");
  102. var strCellName = arCellLabelAndValue[0];
  103. arCellLabelAndValue.shift();
  104. this.htStaticValue[strCellName] = arCellLabelAndValue;
  105. }
  106. }
  107. }
  108. }
  109. this.makeCell();
  110. var arKeyset = this.children.keys();
  111. // item들 init
  112. for (var i=0; i<arKeyset.length; i++)
  113. {
  114. var strChild = arKeyset[i];
  115. var objChild = this.children.item(strChild);
  116. if (null != objChild)
  117. {
  118. objChild.init();
  119. if (!this.m_bIsItemSet && "xforms:cell" == objChild.getAttribute("tag"))
  120. {
  121. objChild.m_heControl.setAttribute("name", this.id + "_item");
  122. objChild.m_heControl.setAttribute("label", this.htStaticValue[objChild.id][0]);
  123. objChild.m_heControl.setAttribute("value", this.htStaticValue[objChild.id][1]);
  124. objChild.m_heControl.noWrap = true;
  125. // noWrap Attribute와 select 효과 때문에 ie만 content TD에 width를 1px을 넣는다.
  126. if (is_ie)
  127. {
  128. var heContentTD = document.getElementById("HE_" + objChild.id + "_content");
  129. // heContentTD.style.width = "1px";
  130. }
  131. }
  132. }
  133. }
  134. this.initItem();
  135. };
  136. XFormsTreeView.prototype.applySelection = function (strValue)
  137. {
  138. this.clearSelect();
  139. this.value = strValue;
  140. if (null != strValue && !strValue.isEmpty())
  141. {
  142. for (var i=0; i<this.length; i++)
  143. {
  144. var strSelectedImage = "";
  145. var objCell = this.getCell(i, 0);
  146. if (null != objCell && !objCell.getDisabled())
  147. {
  148. var strCellValue = objCell.getValue();
  149. if (strValue == strCellValue)
  150. {
  151. objCell.setSelect(true);
  152. this.focusIndex = objCell.index;
  153. // this.mouseRow = objCell.index;
  154. strSelectedImage = objCell.selectedImage;
  155. }
  156. else
  157. {
  158. objCell.setSelect(false);
  159. if (1 == objCell.expanded)
  160. {
  161. strSelectedImage = objCell.expandedimage;
  162. }
  163. else
  164. {
  165. strSelectedImage = objCell.image;
  166. }
  167. }
  168. }
  169. if ("" == strSelectedImage)
  170. {
  171. strSelectedImage = __getAppName() + "/kr/comsquare/image/treeview/blank.gif";
  172. }
  173. this.setImage(objCell.m_heControl, strSelectedImage);
  174. }
  175. }
  176. };
  177. XFormsTreeView.prototype.setAttribute = function (strAttribute, strValue)
  178. {
  179. XFormsGroup.prototype.setAttribute.call(this, strAttribute, strValue);
  180. switch (strAttribute)
  181. {
  182. case "row" :
  183. {
  184. this.attribute["row"] = strValue;
  185. this.m_nSelectedRow = strValue;
  186. this.mouseRow = strValue;
  187. break;
  188. }
  189. }
  190. };
  191. XFormsTreeView.prototype.initItem = function ()
  192. {
  193. // TreeView의 Image, ExpandedImage, SelectedImage
  194. var strImage = this.getAttribute("image");
  195. var strExpandedImage = this.getAttribute("expandedimage");
  196. var strSelectedImage = this.getAttribute("selectedimage");
  197. var nIndex = 0;
  198. for (var i=0; i<this.length; i++)
  199. {
  200. var objTreeItem = this.getCell(i, 0);
  201. // 미리 저장해둔 itemset의 attribute를 가져온다
  202. var clAttribute = this.m_arItemSetAttribute[nIndex];
  203. // index값 증가
  204. var strItemImage = clAttribute.item("image");
  205. var strItemExpandedImage = clAttribute.item("expandedimage");
  206. var strItemSelectedImage = clAttribute.item("selectedimage");
  207. var heItem = document.getElementById("HE_" + this.id + "_" + nIndex + "_0");
  208. var ImageSrc = heItem.getAttribute("image");
  209. // check는 맨처음에 무조건 안되있음.
  210. objTreeItem.setChecked(0);
  211. var nDepth = clAttribute.item("depth");
  212. objTreeItem.depth = nDepth;
  213. // Label과 Value를 세팅한다
  214. objTreeItem.label = objTreeItem.getLabel();
  215. objTreeItem.value = objTreeItem.getValue();
  216. if (null == clAttribute.item("haschilditem") || 0 == clAttribute.item("haschilditem"))
  217. {
  218. clAttribute.add("haschilditem", -1);
  219. }
  220. objTreeItem.m_nChildNumber = clAttribute.item("haschilditem");
  221. objTreeItem.expanded = clAttribute.item("expand");
  222. // index는 child의 순서와 같다.
  223. objTreeItem.index = nIndex;
  224. // parentIndex의 기본값 설정
  225. objTreeItem.parentIndex = -1;
  226. // parentIndex
  227. for (var j=i-1; j>=0; j--)
  228. {
  229. var objParentItem = this.getCell(j, 0);
  230. var nParentDepth = objParentItem.depth;
  231. if (nParentDepth < nDepth)
  232. {
  233. var strParentIndex = objParentItem.index;
  234. objTreeItem.parentIndex = strParentIndex;
  235. break;
  236. }
  237. }
  238. // image와 selectedImage, expandedImage, checkImage, uncheckImage 설정
  239. objTreeItem.image = ("" == strItemImage) ? strImage : strItemImage;
  240. objTreeItem.expandedimage = ("" == strItemExpandedImage) ? strExpandedImage : strItemExpandedImage;
  241. objTreeItem.selectedimage = ("" == strItemSelectedImage) ? strSelectedImage : strItemSelectedImage;
  242. var heContentTD = document.getElementById("HE_" + objTreeItem.id + "_content");
  243. heContentTD.noWrap = "nowrap";
  244. nIndex++;
  245. }
  246. if (!this.m_bIsItemSet)
  247. {
  248. for (var i=0; i<this.length; i++)
  249. {
  250. var nHasChildItem = 0;
  251. var objTreeItem = this.getCell(i, 0);
  252. var nParentDepth = objTreeItem.depth;
  253. for (var j=i+1; j<this.length; j++)
  254. {
  255. var objChildItem = this.getCell(j, 0);
  256. var nDepth = objChildItem.depth;
  257. if (nParentDepth + 1 == nDepth)
  258. {
  259. nHasChildItem++;
  260. }
  261. else if (nParentDepth + 1 > nDepth)
  262. {
  263. break;
  264. }
  265. }
  266. if (0 == nHasChildItem)
  267. {
  268. nHasChildItem = -1;
  269. }
  270. objTreeItem.m_nChildNumber = nHasChildItem;
  271. }
  272. }
  273. if ("false" != this.getAttribute("haslines"))
  274. {
  275. // if (!this.m_bIsItemSet)
  276. // {
  277. // this.setLineType();
  278. // }
  279. // this.makeLine();
  280. }
  281. // overflow = visible
  282. this.overflow();
  283. if (is_smartphone)
  284. {
  285. var strOverflow = this.getAttribute("overflow");
  286. // Treeview 원래 크기 저장해두기.
  287. this.m_nOriginWidth = this.m_heControl.offsetWidth;
  288. this.m_nOriginHeight = this.m_heControl.offsetHeight;
  289. this.makeTreeViewExpansion();
  290. }
  291. this.m_objOriginControl = this;
  292. };
  293. // TODO Group으로 올려야 할듯.
  294. XFormsTreeView.prototype.overflow = function ()
  295. {
  296. if ("visible" == this.getAttribute("overflow"))
  297. {
  298. // height setting
  299. var nTreeHeight = 0;
  300. var nTreeWidth = 0;
  301. var strIndent = ("" == this.getAttribute("indent")) ? "17px" : this.getAttribute("indent");
  302. var nIndent = parseInt(strIndent.replaceAll("px", ""));
  303. for (var i=0; i<this.length; i++)
  304. {
  305. var objCell = this.getCell(i, 0);
  306. if ("block" == objCell.m_heControl.style.display)
  307. {
  308. var strHeight = objCell.m_heControl.style.height;
  309. if (null != parseInt(strHeight.replaceAll("px", "")))
  310. {
  311. nTreeHeight += parseInt(strHeight.replaceAll("px", ""));
  312. }
  313. }
  314. var heContentTD = document.getElementById("HE_" + objCell.id + "_content");
  315. var nContentTDApsoluteRight = heContentTD.offsetLeft + heContentTD.offsetWidth;
  316. if (nTreeWidth < nContentTDApsoluteRight)
  317. {
  318. nTreeWidth = nContentTDApsoluteRight;
  319. }
  320. }
  321. HtmlLib.setStyle(this.m_heControl, "height", nTreeHeight + "px");
  322. HtmlLib.setStyle(this.m_heControl, "width", nTreeWidth + "px");
  323. }
  324. };
  325. XFormsTreeView.prototype.setLineType = function ()
  326. {
  327. for (var i=0; i<this.length; i++)
  328. {
  329. var objCell = this.getCell(i, 0);
  330. var nDepth = objCell.depth;
  331. var strItemLineType = this.htStaticValue[objCell.id][2];
  332. for (var j=0; j<nDepth; j++)
  333. {
  334. var heIndentDIV = document.getElementById("HE_" + this.id + "_" + i + "_0_indent" + j);
  335. heIndentDIV.setAttribute("linetype", strItemLineType.charAt(0));
  336. strItemLineType = strItemLineType.substr(1);
  337. }
  338. var nDIVCount = 0;
  339. var heCellDIV = document.getElementById("HE_" + this.id + "_" + i + "_0_div" + nDIVCount);
  340. while (null != heCellDIV)
  341. {
  342. heCellDIV.setAttribute("linetype", strItemLineType.charAt(0));
  343. strItemLineType = strItemLineType.substr(1);
  344. nDIVCount++;
  345. heCellDIV = document.getElementById("HE_" + this.id + "_" + i + "_0_div" + nDIVCount);
  346. }
  347. }
  348. };
  349. XFormsTreeView.prototype.makeLine = function ()
  350. {
  351. for (var i=0; i<this.length; i++)
  352. {
  353. var objCell = this.getCell(i, 0);
  354. var nDepth = objCell.depth;
  355. for (var j=0; j<nDepth; j++)
  356. {
  357. var heIndentDIV = document.getElementById("HE_" + this.id + "_" + i + "_0_indent" + j);
  358. var strLineType = heIndentDIV.getAttribute("linetype");
  359. var objLine = new jsGraphics(heIndentDIV);
  360. this.drawLine(objLine, strLineType);
  361. }
  362. var nDIVCount = 0;
  363. var heCellDIV = document.getElementById("HE_" + this.id + "_" + i + "_0_div" + nDIVCount);
  364. while (null != heCellDIV)
  365. {
  366. var strLineType = heCellDIV.getAttribute("linetype");
  367. var objLine = new jsGraphics(heCellDIV);
  368. this.m_alLineDIV.push(objLine);
  369. this.drawLine(objLine, strLineType);
  370. nDIVCount++;
  371. heCellDIV = document.getElementById("HE_" + this.id + "_" + i + "_0_div" + nDIVCount);
  372. }
  373. }
  374. };
  375. XFormsTreeView.prototype.drawLine = function (objLine, strLineType)
  376. {
  377. objLine.clear();
  378. objLine.setStroke(Stroke.DOTTED);
  379. var nWidth = ("" == this.getAttribute("indent")) ? 17 : parseInt(this.getAttribute("indent").replaceAll("px", ""));
  380. var nHeight = parseInt(this.m_strItemHeight.replaceAll("px", ""));
  381. switch (strLineType)
  382. {
  383. // indent 부분
  384. case "0" : // blank 일때
  385. {
  386. break;
  387. }
  388. case "1" : // 형제가 있을때 : │
  389. {
  390. objLine.drawLine(nWidth/2, 0, nWidth/2, nHeight);
  391. break;
  392. }
  393. case "2" : // 형제가 없고 맨처음일 때 : -
  394. {
  395. objLine.drawLine(nWidth/2, nHeight/2, nWidth, nHeight/2);
  396. break;
  397. }
  398. case "3" : // 처음 형제가 있을 때 : ┌
  399. {
  400. objLine.drawLine(nWidth/2, nHeight/2, nWidth/2, nHeight);
  401. objLine.drawLine(nWidth/2, nHeight/2, nWidth, nHeight/2);
  402. break;
  403. }
  404. case "4" : // 형제가 있을 때 : ├
  405. {
  406. objLine.drawLine(nWidth/2, 0, nWidth/2, nHeight);
  407. objLine.drawLine(nWidth/2, nHeight/2, nWidth, nHeight/2);
  408. break;
  409. }
  410. case "5" : // 형제가 있고 마지막일때 : └
  411. {
  412. objLine.drawLine(nWidth/2, nHeight/2, nWidth, nHeight/2);
  413. objLine.drawLine(nWidth/2, 0, nWidth/2, nHeight/2);
  414. break;
  415. }
  416. case "6" : // 형제가 있고 자식이 있고 처음일 때 : ─┬─
  417. {
  418. objLine.drawLine(0, nHeight/2, nWidth, nHeight/2);
  419. objLine.drawLine(nWidth/2, nHeight/2, nWidth/2, nHeight);
  420. break;
  421. }
  422. case "7" : // 형제가 없고 자식이 있을 때 : ──
  423. {
  424. objLine.drawLine(0, nHeight/2, nWidht, nHeight/2);
  425. break;
  426. }
  427. default :
  428. {
  429. break;
  430. }
  431. }
  432. objLine.paint();
  433. };
  434. XFormsTreeView.prototype.makeCell = function ()
  435. {
  436. for (var i=0; i<this.length; i++)
  437. {
  438. var strCellId = this.id + "_" + i + "_0";
  439. var objCell = new XFormsCell(this.id, 0, strCellId, i, "xforms:cell");
  440. var heItem = document.getElementById("HE_" + strCellId);
  441. objCell.setElement(this.itemset);
  442. objCell.setIndex(i);
  443. }
  444. };
  445. XFormsTreeView.prototype.initItemData = function ()
  446. {
  447. var heTreeControl = this.m_heControl;
  448. this.length = heTreeControl.childNodes.length;
  449. // expanded
  450. var strExpandDepth = this.getAttribute("expanddepth");
  451. var nExpandDepth = ("" == strExpandDepth)? 0 : parseInt(strExpandDepth);
  452. // height
  453. var strItemHeight = this.getAttribute("itemheight");
  454. this.m_strItemHeight = ("" == strItemHeight) ? "17px" : strItemHeight + "px";
  455. for (var i=0; i<this.length; i++)
  456. {
  457. var clAttributes = new Collection();
  458. var heTreeItem = document.getElementById("HE_" + this.id + "_" + i + "_0");
  459. var nExpanded = 0;
  460. if (null == heTreeItem)
  461. {
  462. return;
  463. }
  464. // depth 구하기
  465. var nDepth = 0;
  466. var heIndent = document.getElementById(heTreeItem.id + "_indent" + nDepth);
  467. while (null != heIndent)
  468. {
  469. nDepth++;
  470. heIndent = document.getElementById(heTreeItem.id + "_indent" + nDepth);
  471. }
  472. clAttributes.add("depth", nDepth);
  473. if ((nDepth < nExpandDepth) || (-1 == nExpandDepth))
  474. {
  475. nExpanded = 1;
  476. }
  477. clAttributes.add("expand", nExpanded);
  478. // image
  479. clAttributes.add("image", this.getAttribute("image"));
  480. // expandedimage
  481. clAttributes.add("expandedimage", this.getAttribute("expandedimage"));
  482. // selectedimage
  483. clAttributes.add("selectedimage", this.getAttribute("selectedimage"));
  484. this.m_arItemSetAttribute[i] = clAttributes;
  485. if (is_smartphone)
  486. {
  487. for (var j=0; j<nDepth; j++)
  488. {
  489. var heIndentTD = document.getElementById(heTreeItem.id + "_indent" + j);
  490. if (null != heIndentTD)
  491. {
  492. this.makeSmartphoneAttribute(heIndentTD);
  493. }
  494. }
  495. var heButtonTD = document.getElementById(heTreeItem.id + "_button");
  496. if (null != heButtonTD)
  497. {
  498. this.makeSmartphoneAttribute(heButtonTD);
  499. }
  500. var heCheckTD = document.getElementById(heTreeItem.id + "_check");
  501. if (null != heCheckTD)
  502. {
  503. this.makeSmartphoneAttribute(heCheckTD);
  504. }
  505. var heImageTD = document.getElementById(heTreeItem.id + "_image");
  506. if (null != heImageTD)
  507. {
  508. this.makeSmartphoneAttribute(heImageTD);
  509. }
  510. this.makeSmartphoneAttribute(document.getElementById(heTreeItem.id + "_blank"));
  511. }
  512. }
  513. };
  514. XFormsTreeView.prototype.makeSmartphoneAttribute = function (heElementTD)
  515. {
  516. heElementTD.setAttribute("onmousedown", "onmousedown=\" ");
  517. heElementTD.setAttribute("onmousemove", "onmousemove=\" ");
  518. heElementTD.setAttribute("onmouseup", "onmouseup=\" ");
  519. heElementTD.setAttribute("ondblclick", "ondblclick=\" ");
  520. heElementTD.setAttribute("onkeydown", "onkeydown=\" ");
  521. heElementTD.setAttribute("onkeypress", "onkeypress=\" ");
  522. heElementTD.setAttribute("onkeyup", "onkeyup=\" ");
  523. };
  524. XFormsTreeView.prototype.initItemSetDepthData = function (xlRefNode)
  525. {
  526. var nItemCount = xlRefNode.length;
  527. var xnItemSetData = XmlLib.createXML("DepthData").firstChild;
  528. var arDepthNode = new Array();
  529. var xnPrevItem;
  530. for (var i=0; i<nItemCount; i++)
  531. {
  532. var xnTreeItem = xlRefNode.item(i);
  533. var xnDepth = XmlLib.selectSingleNode(xnTreeItem, this.m_strDepthRef);
  534. var nDepth = parseInt(XmlLib.getTextValue(xnDepth));
  535. var xnCloneItem = xnTreeItem.cloneNode(true);
  536. if (null != xnPrevItem)
  537. {
  538. var xnPrevDepth = XmlLib.selectSingleNode(xnPrevItem, this.m_strDepthRef);
  539. var nPrevDepth = parseInt(XmlLib.getTextValue(xnPrevDepth));
  540. if (nPrevDepth < nDepth)
  541. {
  542. xnPrevItem.appendChild(xnCloneItem);
  543. }
  544. else
  545. {
  546. var xnParent;
  547. for (var j=nDepth-1; j >= 0; j--)
  548. {
  549. if (arDepthNode[j])
  550. {
  551. xnParent = arDepthNode[j];
  552. break;
  553. }
  554. }
  555. if (null != xnParent)
  556. {
  557. xnParent.appendChild(xnCloneItem);
  558. xnParent = null;
  559. }
  560. else
  561. {
  562. xnItemSetData.appendChild(xnCloneItem);
  563. }
  564. }
  565. }
  566. else
  567. {
  568. xnItemSetData.appendChild(xnCloneItem);
  569. }
  570. arDepthNode[nDepth] = xnCloneItem;
  571. xnPrevItem = xnCloneItem;
  572. }
  573. return xnItemSetData.childNodes;
  574. };
  575. XFormsTreeView.prototype.initItemSetData = function ()
  576. {
  577. this.m_nIndex = 0;
  578. var xlRefNode = model.getInstancePart(null, this.nodeset);
  579. if (null == xlRefNode)
  580. {
  581. return;
  582. }
  583. var xlItemSet = null;
  584. var strItemSetType = this.getAttribute("itemsettype");
  585. if ("depth" == strItemSetType)
  586. {
  587. xlItemSet = this.initItemSetDepthData(xlRefNode);
  588. }
  589. else
  590. {
  591. xlItemSet = xlRefNode;
  592. }
  593. this.m_xlOriginItemSet = xlItemSet;
  594. // 최상위 item의 갯수
  595. var nRootItemCount = xlItemSet.length;
  596. var strItemHeight = this.getAttribute("itemheight").replaceAll("px", "");
  597. var strCellSpacing = this.getAttribute("cellspacing").replaceAll("px", "");
  598. this.m_strItemHeight = ("" == strItemHeight) ? "17px" : strItemHeight + "px";
  599. this.m_strCellSpacing = ("" == strCellSpacing) ? "0px" : strCellSpacing + "px";
  600. var nDepth = 0;
  601. var strBlankRecursion = "";
  602. for (var i=0; i<nRootItemCount; i++)
  603. {
  604. var xnChild = xlItemSet.item(i);
  605. var bFirst = false;
  606. var bLast = false;
  607. var bSibling = false;
  608. if ("depth" == strItemSetType)
  609. {
  610. var xnDepth = XmlLib.selectSingleNode(xnChild, this.m_strDepthRef);
  611. var strDepth = XmlLib.getTextValue(xnDepth);
  612. if ("" != strDepth)
  613. {
  614. nDepth = parseInt(strDepth) - 1;
  615. for (var j=0; j<nDepth; j++)
  616. {
  617. strBlankRecursion += "0";
  618. }
  619. }
  620. }
  621. //첫번째 index일 때
  622. if (0 == i)
  623. {
  624. bFirst = true;
  625. }
  626. if (nRootItemCount - 1 == i)
  627. {
  628. bLast = true;
  629. }
  630. if (1 < nRootItemCount)
  631. {
  632. bSibling = true;
  633. }
  634. var strRecursion = strBlankRecursion + ((i == nRootItemCount-1) ? "0" : "1");
  635. this.makeSubItemSet(xnChild, nDepth, bFirst, bLast, bSibling, strRecursion);
  636. this.m_nIndex++;
  637. }
  638. // length property 세팅
  639. this.length = this.m_nIndex;
  640. };
  641. // 동적일때 html Tag 만들기.
  642. XFormsTreeView.prototype.makeSubItemSet = function (xnTreeNode, nDepth, bFirst, bLast, bSibling, strRecursion)
  643. {
  644. this.m_clItemSetAttributes = new Collection();
  645. // image, expandedimage, selectedimage hashtable에 넣어두는 method
  646. this.setItemSetImages(xnTreeNode);
  647. // depth도 설정
  648. this.m_clItemSetAttributes.add("depth", nDepth);
  649. // itemset node
  650. var xlChildItems = XmlLib.selectNodes(xnTreeNode, this.m_strNodeSetName);
  651. // child 갯수
  652. var nChildNumber = (null != xlChildItems) ? xlChildItems.length : -1;
  653. this.m_clItemSetAttributes.add("haschilditem", nChildNumber);
  654. var strItemId = this.id + "_" + this.m_nIndex + "_0";
  655. // TABLE 만들기
  656. var heItemTable = document.createElement("table");
  657. this.m_heControl.appendChild(heItemTable);
  658. // Item의 전체적인 Attribute 적용
  659. heItemTable.setAttribute("id", "HE_" + strItemId);
  660. HtmlLib.setStyle(heItemTable, "width", "100%");
  661. // ItemHeight와 CellSpacing 설정
  662. if ("" != this.m_strItemHeight)
  663. {
  664. HtmlLib.setStyle(heItemTable, "height", this.m_strItemHeight);
  665. heItemTable.cellSpacing = "0px";
  666. }
  667. else
  668. {
  669. heItemTable.cellSpacing = this.m_strCellSpacing;
  670. }
  671. var nExpandDepth = parseInt(this.expandDepth);
  672. if ("" == this.expandDepth)
  673. {
  674. if (null != this.m_arItemSetAttribute[0])
  675. {
  676. nExpandDepth = this.m_arItemSetAttribute[0].item("depth");
  677. }
  678. else
  679. {
  680. nExpandDepth = nDepth;
  681. }
  682. }
  683. if (-1 == nExpandDepth)
  684. {
  685. heItemTable.style.display = "block";
  686. // expand property 설정
  687. if (0 < nChildNumber)
  688. {
  689. this.m_clItemSetAttributes.add("expand", 1);
  690. }
  691. else
  692. {
  693. this.m_clItemSetAttributes.add("expand", 0);
  694. }
  695. }
  696. else
  697. {
  698. if (nExpandDepth < nDepth)
  699. {
  700. heItemTable.style.display = "none";
  701. this.m_clItemSetAttributes.add("expand", 0);
  702. }
  703. else
  704. {
  705. heItemTable.style.display = "block";
  706. // expand property 설정
  707. if (0 < nChildNumber && nExpandDepth != nDepth)
  708. {
  709. this.m_clItemSetAttributes.add("expand", 1);
  710. }
  711. else
  712. {
  713. this.m_clItemSetAttributes.add("expand", 0);
  714. }
  715. }
  716. }
  717. // TBODY 만들기
  718. var heItemTBody = document.createElement("tbody");
  719. heItemTable.appendChild(heItemTBody);
  720. var heItemTR = document.createElement("tr");
  721. // 들여쓰기 TD
  722. heItemTR = this.makeIndentationTD(strItemId, heItemTR, nDepth, strRecursion);
  723. heItemTBody.appendChild(heItemTR);
  724. // button 그리기
  725. var strHasButtons = this.getAttribute("hasbuttons");
  726. if ("false" != strHasButtons)
  727. {
  728. var heButtonTD = this.makeButtonTD(strItemId, nChildNumber);
  729. heItemTR.appendChild(heButtonTD);
  730. if ("false" != this.getAttribute("haslines"))
  731. {
  732. // 0 : DIV , 1 : IMG
  733. var heLineDIV = heButtonTD.children.item(0);
  734. if (bFirst)
  735. {
  736. heLineDIV.setAttribute("linetype", "6");
  737. }
  738. else if (bLast)
  739. {
  740. heLineDIV.setAttribute("linetype", "5");
  741. }
  742. else
  743. {
  744. heLineDIV.setAttribute("linetype", "4");
  745. }
  746. if (0 == this.m_nIndex)
  747. {
  748. if (bSibling)
  749. {
  750. heLineDIV.setAttribute("linetype", "3");
  751. }
  752. else
  753. {
  754. heLineDIV.setAttribute("linetype", "2");
  755. }
  756. }
  757. }
  758. }
  759. // checkbox 설정
  760. var strHasCheck = this.getAttribute("hascheck");
  761. if ("true" == strHasCheck)
  762. {
  763. var heCheckTD = this.makeCheckTD(strItemId);
  764. heItemTR.appendChild(heCheckTD);
  765. }
  766. // image 설정
  767. var strHasImages = this.getAttribute("hasimages");
  768. if ("false" != strHasImages)
  769. {
  770. heItemTR.appendChild(this.makeImageTD(strItemId));
  771. }
  772. // 내용 TD
  773. var heContentTD = this.makeContentTD(strItemId, xnTreeNode, heItemTable);
  774. heItemTR.appendChild(heContentTD);
  775. // content TD가 맨 끝가지 나오는것 방지하기 위한 blank TD
  776. var heBlankTD = document.createElement("td");
  777. heItemTR.appendChild(heBlankTD);
  778. // TODO if IS_IE?
  779. // HtmlLib.setStyle(heBlankTD, "width", "100%");
  780. heBlankTD.setAttribute("id", "HE_" + strItemId + "_blank");
  781. heBlankTD.style.width = "100%";
  782. if (is_smartphone)
  783. {
  784. this.makeSmartphoneAttribute(heBlankTD);
  785. }
  786. // attribute 넣기
  787. this.m_arItemSetAttribute[this.m_nIndex] = this.m_clItemSetAttributes;
  788. for (var i=0; i<nChildNumber ;i++)
  789. {
  790. // item의 index
  791. this.m_nIndex++;
  792. var bChildLast = false;
  793. if (i == nChildNumber - 1)
  794. {
  795. bChildLast = true;
  796. }
  797. var xnItem = xlChildItems.item(i);
  798. var strChildRecursion = (i == nChildNumber - 1) ? (strRecursion + "0") : (strRecursion + "1");
  799. var strItemSetType = this.getAttribute("itemsettype");
  800. if ("depth" == strItemSetType)
  801. {
  802. var xnDepth = XmlLib.selectSingleNode(xnItem, this.m_strDepthRef);
  803. var strDepth = XmlLib.getTextValue(xnDepth);
  804. if ("" != strDepth)
  805. {
  806. nDepth = parseInt(strDepth) - 1;
  807. this.makeSubItemSet(xnItem, nDepth, false, bChildLast, bSibling, strChildRecursion);
  808. }
  809. }
  810. else
  811. {
  812. this.makeSubItemSet(xnItem, nDepth+1, false, bChildLast, bSibling, strChildRecursion);
  813. }
  814. }
  815. };
  816. XFormsTreeView.prototype.setItemSetImages = function (xnNode)
  817. {
  818. // Image Node
  819. var xnImage = XmlLib.selectSingleNode(xnNode, this.m_strImageRef);
  820. // ExpandedImage Node
  821. var xnExpandedImage = XmlLib.selectSingleNode(xnNode, this.m_strExpandedImageRef);
  822. // SelectedImage Node
  823. var xnSelectedImage = XmlLib.selectSingleNode(xnNode, this.m_strSelectedImageRef);
  824. // 각 이미지의 src 가져오기
  825. var strImage = "";
  826. var strExpandedImage = "";
  827. var strSelectedImage = "";
  828. if (null != xnImage)
  829. {
  830. strImage = XmlLib.getTextValue(xnImage);
  831. }
  832. if (null != xnExpandedImage)
  833. {
  834. strExpandedImage = XmlLib.getTextValue(xnExpandedImage);
  835. }
  836. if (null != xnSelectedImage)
  837. {
  838. strSelectedImage = XmlLib.getTextValue(xnSelectedImage);
  839. }
  840. this.m_clItemSetAttributes.add("image", strImage);
  841. this.m_clItemSetAttributes.add("expandedimage", strExpandedImage);
  842. this.m_clItemSetAttributes.add("selectedimage", strSelectedImage);
  843. };
  844. /**
  845. * Tree Line을 그리기 위한 DIV 생성 Method
  846. * @param strId
  847. * @param heParent
  848. * @param nWidth
  849. * @return
  850. */
  851. XFormsTreeView.prototype.makeLineDIVHasLine = function (strId, heParent, nWidth)
  852. {
  853. var heLineDIV = document.createElement("div");
  854. heLineDIV.setAttribute("id", strId);
  855. HtmlLib.setStyle(heLineDIV, "width", nWidth + "px");
  856. HtmlLib.setStyle(heLineDIV, "height", this.m_strItemHeight);
  857. heLineDIV.style.position = "absolute";
  858. heParent.appendChild(heLineDIV);
  859. };
  860. XFormsTreeView.prototype.makeIndentationTD = function (strItemId, heItemTR, nDepth, strRecursion)
  861. {
  862. // TR 만들기
  863. var strIndent = this.getAttribute("indent");
  864. // strIndent가 없을경우와 18px일 경우가 같음
  865. if ("" == strIndent)
  866. {
  867. strIndent = "17px";
  868. }
  869. for (var i=0; i< nDepth; i++)
  870. {
  871. // 들여쓰기
  872. var heIndentTD = document.createElement("td");
  873. if (is_smartphone)
  874. {
  875. this.makeSmartphoneAttribute(heIndentTD);
  876. }
  877. heItemTR.appendChild(heIndentTD);
  878. // 들여쓰기 TD Attribute 설정
  879. var nIndent = parseInt(strIndent.replace("px", ""));
  880. HtmlLib.setStyle(heIndentTD, "width", nIndent + "px");
  881. heIndentTD.vAlign = "top";
  882. // 선을 그리기 위한 DIV 생성 Method
  883. this.makeLineDIVHasLine("HE_" + strItemId + "_indent" + i, heIndentTD, nIndent);
  884. heIndentTD.firstChild.style.position = "relative";
  885. if ("false" != this.getAttribute("hasbuttons"))
  886. {
  887. var heLineDIV = heIndentTD.children.item(0);
  888. if (null != heLineDIV)
  889. {
  890. if ('1' == strRecursion.charAt(i))
  891. {
  892. heLineDIV.setAttribute("linetype", "1");
  893. }
  894. else
  895. {
  896. heLineDIV.setAttribute("linetype", "0");
  897. }
  898. }
  899. }
  900. }
  901. return heItemTR;
  902. };
  903. XFormsTreeView.prototype.makeButtonTD = function (strItemId, nChildNumber)
  904. {
  905. var heButtonTD = document.createElement("td");
  906. // buttonTD의 setAttribute
  907. HtmlLib.setStyle(heButtonTD, "width", "17px");
  908. if (0 < nChildNumber)
  909. {
  910. heButtonTD.setAttribute("id", "HE_" + strItemId + "_button");
  911. }
  912. heButtonTD.vAlign = "top";
  913. // 선을 그리기 위한 buttonContainedDIV 생성 Method
  914. this.makeLineDIVHasLine("HE_" + strItemId + "_div0", heButtonTD, 17);
  915. // draw mark
  916. var heButtonIMG = document.createElement("img");
  917. heButtonTD.appendChild(heButtonIMG);
  918. heButtonIMG.setAttribute("alt", "");
  919. heButtonIMG.style.position = "relative";
  920. // child가 있을때 plus 이미지 넣기
  921. if (1 <= nChildNumber)
  922. {
  923. var nExpand = this.m_clItemSetAttributes.item("expand");
  924. // 펼쳐졌을 때
  925. if (1 == nExpand)
  926. {
  927. heButtonIMG.setAttribute("src", __getAppName() + "/kr/comsquare/image/treeview/minus.gif");
  928. }
  929. // 접혀있을 때
  930. else if (0 == nExpand) // TODO
  931. {
  932. heButtonIMG.setAttribute("src", __getAppName() + "/kr/comsquare/image/treeview/plus.gif");
  933. }
  934. }
  935. else
  936. {
  937. heButtonIMG.setAttribute("src", __getAppName() + "/kr/comsquare/image/treeview/blank.gif");
  938. heButtonIMG.style.width = "17px";
  939. heButtonIMG.style.height = "17px";
  940. }
  941. if (is_smartphone)
  942. {
  943. this.makeSmartphoneAttribute(heButtonTD);
  944. }
  945. return heButtonTD;
  946. };
  947. XFormsTreeView.prototype.makeCheckTD = function (strItemId)
  948. {
  949. var heCheckTD = document.createElement("td");
  950. // check 공통 attribute 세팅
  951. heCheckTD.setAttribute("id", "HE_" + strItemId + "_check");
  952. HtmlLib.setStyle(heCheckTD, "width", "17px");
  953. heCheckTD.vAlign = "top";
  954. var nHeight = parseInt(this.m_strItemHeight.replaceAll("px", ""));
  955. // 선을 그리기 위한 DIV 생성 Method
  956. if ("false" == this.getAttribute("hasbuttons"))
  957. {
  958. this.makeLineDIVHasLine("HE_" + strItemId + "_div0", heCheckTD, 17);
  959. }
  960. else
  961. {
  962. this.makeLineDIVHasLine("HE_" + strItemId + "_div1", heCheckTD, 17);
  963. }
  964. var heCheckIMG = document.createElement("img");
  965. heCheckTD.appendChild(heCheckIMG);
  966. heCheckIMG.setAttribute("alt", "");
  967. var strUncheckImage = this.getAttribute("uncheckimage");
  968. if ("" == this.getAttribute("uncheckimage"))
  969. {
  970. strUncheckImage = __getAppName() + "/kr/comsquare/image/treeview/uncheck.gif";
  971. }
  972. // Img Element setAttribute
  973. var nImageWidth = 13;
  974. var nImageHeight = 13;
  975. var nImageLeft = 2;
  976. var nImageTop = (nHeight - 13)/2;
  977. heCheckIMG.setAttribute("src", strUncheckImage);
  978. heCheckIMG.style.left = nImageLeft + "px";
  979. heCheckIMG.style.top = nImageTop + "px";
  980. HtmlLib.setStyle(heCheckIMG, "width", nImageWidth + "px");
  981. HtmlLib.setStyle(heCheckIMG, "height", nImageHeight + "px");
  982. heCheckIMG.style.position = "relative";
  983. if (is_smartphone)
  984. {
  985. this.makeSmartphoneAttribute(heCheckTD);
  986. }
  987. return heCheckTD;
  988. };
  989. XFormsTreeView.prototype.makeImageTD = function (strItemId)
  990. {
  991. var heImageTD = document.createElement("td");
  992. HtmlLib.setStyle(heImageTD, "width", "17px");
  993. heImageTD.setAttribute("id", "HE_" + strItemId + "_image");
  994. var strImage = this.getAttribute("image");
  995. var strItemImage = this.m_clItemSetAttributes.item("image");
  996. if ("" != strItemImage)
  997. {
  998. strImage = strItemImage;
  999. }
  1000. // 펼쳐졌을때!
  1001. if (1 == this.m_clItemSetAttributes.item("expand"))
  1002. {
  1003. var strExpandedImage = this.getAttribute("expandedimage");
  1004. var strItemExpandedImage = this.m_clItemSetAttributes.item("expandedimage");
  1005. if ("" == strItemExpandedImage)
  1006. {
  1007. if ("" != strExpandedImage)
  1008. {
  1009. strImage = strExpandedImage;
  1010. }
  1011. }
  1012. else if (0 == this.m_clItemSetAttributes.item("expand"))
  1013. {
  1014. strImage = strItemExpandedImage;
  1015. }
  1016. }
  1017. if ("true" != this.getAttribute("hascheck"))
  1018. {
  1019. if ("false" == this.getAttribute("hasbuttons"))
  1020. {
  1021. this.makeLineDIVHasLine("HE_" + strItemId + "_div0", heImageTD, "17px");
  1022. }
  1023. else
  1024. {
  1025. this.makeLineDIVHasLine("HE_" + strItemId + "_div1", heImageTD, "17px");
  1026. }
  1027. }
  1028. var heImageIMG = document.createElement("img");
  1029. heImageTD.appendChild(heImageIMG);
  1030. heImageIMG.setAttribute("alt", "");
  1031. if ("" == strImage)
  1032. {
  1033. strImage = __getAppName() + "/kr/comsquare/image/treeview/blank.gif";
  1034. }
  1035. heImageIMG.setAttribute("src", strImage);
  1036. heImageIMG.style.position = "relative";
  1037. heImageIMG.style.left = "0px";
  1038. heImageIMG.style.top = "0px";
  1039. heImageIMG.style.width = "17px";
  1040. heImageIMG.style.height = "17px";
  1041. if (is_smartphone)
  1042. {
  1043. this.makeSmartphoneAttribute(heImageTD);
  1044. }
  1045. return heImageTD;
  1046. };
  1047. XFormsTreeView.prototype.makeContentTD = function (strItemId, xnTreeNode, heItemTable)
  1048. {
  1049. var heContentTD = document.createElement("td");
  1050. // 내용 TD Attribute설정
  1051. heContentTD.setAttribute("noWrap", "true");
  1052. heContentTD.setAttribute("id", "HE_" + strItemId + "_content");
  1053. var xnLabel = XmlLib.selectSingleNode(xnTreeNode, this.m_strLabelRef);
  1054. var strLabel = XmlLib.getTextValue(xnLabel);
  1055. if (null != heContentTD.innerText)
  1056. {
  1057. heContentTD.innerText = strLabel;
  1058. }
  1059. else
  1060. {
  1061. heContentTD.textContent = strLabel;
  1062. }
  1063. // value setting
  1064. var xnValue = XmlLib.selectSingleNode(xnTreeNode, this.m_strValueRef);
  1065. var strValue = XmlLib.getTextValue(xnValue);
  1066. // table에 attribute로 label value에 값을 넣는다
  1067. heItemTable.setAttribute("label", strLabel);
  1068. heItemTable.setAttribute("value", strValue);
  1069. if (is_smartphone)
  1070. {
  1071. this.makeSmartphoneAttribute(heContentTD);
  1072. }
  1073. return heContentTD;
  1074. };
  1075. XFormsTreeView.prototype.applyDefaultStyle = function ()
  1076. {
  1077. XFormsGroup.prototype.applyDefaultStyle.call(this);
  1078. if (!this.attribute["border-style"] && !this.attribute["border-width"])
  1079. {
  1080. HtmlLib.setStyle(this.m_heControl, "border-width", "2px");
  1081. HtmlLib.setStyle(this.m_heControl, "border-style", "inset");
  1082. }
  1083. if ("" == HtmlLib.getStyle(this.m_heControl, "cursor"))
  1084. {
  1085. HtmlLib.setStyle(this.m_heControl, "cursor", "default");
  1086. }
  1087. };
  1088. XFormsTreeView.prototype.select = function (nIndex)
  1089. {
  1090. var xlRefNode = this.getRefNode();
  1091. if (null == xlRefNode)
  1092. {
  1093. return;
  1094. }
  1095. var objCell = this.getCell(nIndex, 0);
  1096. if (null == objCell)
  1097. {
  1098. return;
  1099. }
  1100. var bChange = false;
  1101. var xnRefNode = xlRefNode.item(0);
  1102. if (null != xnRefNode)
  1103. {
  1104. var strOldValue = XmlLib.getTextValue(xnRefNode);
  1105. var strValue = objCell.getValue();
  1106. if (strOldValue != strValue)
  1107. {
  1108. bChange = true;
  1109. this.clearSelect();
  1110. }
  1111. }
  1112. this.refreshCurrentModel(this.attribute["ref"]);
  1113. objCell.setSelect(true);
  1114. this.dispatch("xforms-select");
  1115. if (bChange)
  1116. {
  1117. this.dispatch("xforms-value-changed");
  1118. }
  1119. };
  1120. XFormsTreeView.prototype.refresh = function ()
  1121. {
  1122. var strId = this.id;
  1123. if (null != this.m_heControl)
  1124. {
  1125. if (this.isRebuild())
  1126. {
  1127. this.rebuild();
  1128. // var strValue = this.getValue(strRef);
  1129. // this.applySelection(strValue);
  1130. }
  1131. else if (this.isChangedLabel())
  1132. {
  1133. var strRef = this.attribute["ref"];
  1134. if (null != strRef && "" != strRef)
  1135. {
  1136. var bContain = false;
  1137. var heTarget = event.srcElement;
  1138. while (null != heTarget)
  1139. {
  1140. var strTargetId = heTarget.id;
  1141. if (this.id == strTargetId)
  1142. {
  1143. bContain = true;
  1144. break;
  1145. }
  1146. heTarget = heTarget.parentNode;
  1147. }
  1148. if (bContain)
  1149. {
  1150. var strValue = this.getValue(strRef);
  1151. this.applySelection(strValue);
  1152. }
  1153. }
  1154. }
  1155. }
  1156. };
  1157. XFormsTreeView.prototype.isChangedLabel = function ()
  1158. {
  1159. if (this.m_bIsItemSet)
  1160. {
  1161. var objCell = this.getCell(this.m_nSelectedRow, 0);
  1162. var xlRefNode = this.getRefNode();
  1163. if (null == objCell || null == xlRefNode)
  1164. {
  1165. return false;
  1166. }
  1167. var xnRefNode = xlRefNode.item(0);
  1168. if (null != xnRefNode)
  1169. {
  1170. var strOldValue = XmlLib.getTextValue(xnRefNode);
  1171. var strValue = objCell.getValue();
  1172. if (strOldValue != strValue)
  1173. {
  1174. XmlLib.setTextValue(xnRefNode, strValue);
  1175. this.value = strValue;
  1176. return true;
  1177. }
  1178. }
  1179. return false;
  1180. }
  1181. };
  1182. XFormsTreeView.prototype.clearSelect = function ()
  1183. {
  1184. for (var i=0; i<this.length; i++)
  1185. {
  1186. var objCell = this.getCell(i, 0);
  1187. if (null != objCell)
  1188. {
  1189. objCell.setSelect(false);
  1190. if (1 == objCell.expanded)
  1191. {
  1192. strSelectedImage = objCell.expandedimage;
  1193. }
  1194. else
  1195. {
  1196. strSelectedImage = objCell.image;
  1197. }
  1198. }
  1199. }
  1200. this.value = "";
  1201. };
  1202. /**
  1203. * rebuild : item을 노드셋과 맞게 다시그린다.
  1204. */
  1205. XFormsTreeView.prototype.rebuild = function ()
  1206. {
  1207. if (this.m_bIsItemSet)
  1208. {
  1209. // 초기화
  1210. this.initialization();
  1211. this.initItemSetData();
  1212. this.makeCell();
  1213. var arKeyset = this.children.keys();
  1214. for (var i=0; i<arKeyset.length; i++)
  1215. {
  1216. var strChild = arKeyset[i];
  1217. var objChild = this.children.item(strChild);
  1218. if (null != objChild)
  1219. {
  1220. objChild.init();
  1221. }
  1222. }
  1223. this.initItem();
  1224. }
  1225. };
  1226. XFormsTreeView.prototype.isRebuild = function ()
  1227. {
  1228. var bRebuild = false;
  1229. if (this.m_bIsItemSet)
  1230. {
  1231. var xlNode = model.getInstancePart(null, this.nodeset);
  1232. if (null != xlNode)
  1233. {
  1234. bChangeNode = this.compareNodes(this.m_xlOriginItemSet, xlNode);
  1235. // if ("depth" == this.getAttribute("itemsettype"))
  1236. // {
  1237. // var nChangedLength = xlNode.length;
  1238. // if (this.length != nChangedLength)
  1239. // {
  1240. // bRebuild = true;
  1241. // }
  1242. // }
  1243. // else
  1244. // {
  1245. if (bChangeNode)
  1246. {
  1247. bRebuild = true;
  1248. }
  1249. // }
  1250. }
  1251. }
  1252. return bRebuild;
  1253. };
  1254. // 노드 비교
  1255. XFormsTreeView.prototype.compareNodes = function (xlOriginNode, xlNode)
  1256. {
  1257. var bChangeNode = false;
  1258. if (null != xlOriginNode)
  1259. {
  1260. var nLength = xlNode.length;
  1261. var nOrgLength = xlOriginNode.length;
  1262. if (nOrgLength != nLength)
  1263. {
  1264. bChangeNode = true;
  1265. }
  1266. else
  1267. {
  1268. for (var i=0; i<nLength; i++)
  1269. {
  1270. var xnChildNode = xlNode.item(i);
  1271. var xnOriginChildNode = xlOriginNode.item(i);
  1272. var xlChildNodeList = xnChildNode.childNodes;
  1273. var xlOriginChildNodeList = xnOriginChildNode.childNodes;
  1274. // var xlOriginChildNodeList = XmlLib.selectNodes(xnOriginChildNode, this.m_strNodeSetName);
  1275. // var xlChildNodeList = XmlLib.selectNodes(xnChildNode, this.m_strNodeSetName);
  1276. bChangeNode = this.compareNodes(xlOriginChildNodeList, xlChildNodeList);
  1277. if (bChangeNode)
  1278. {
  1279. break;
  1280. }
  1281. else
  1282. {
  1283. var xnFirstChild = xnChildNode.firstChild;
  1284. var xnOriginFirstChild = xnOriginChildNode.firstChild;
  1285. if (null != xnFirstChild && null != xnOriginFirstChild)
  1286. {
  1287. var strFirstChild = xnFirstChild.nodeValue;
  1288. var strOriginFirstChild = xnOriginFirstChild.nodeValue;
  1289. if (null != strFirstChild && (strFirstChild != strOriginFirstChild))
  1290. {
  1291. bChangeNode = true;
  1292. break;
  1293. }
  1294. }
  1295. }
  1296. }
  1297. }
  1298. }
  1299. else
  1300. {
  1301. bChangeNode = true;
  1302. }
  1303. return bChangeNode;
  1304. };
  1305. XFormsTreeView.prototype.initialization = function ()
  1306. {
  1307. var nIndex = 0;
  1308. while (null != this.children.item(nIndex))
  1309. {
  1310. if ("xforms:cell" != this.children.item(nIndex).elementName)
  1311. {
  1312. nIndex++;
  1313. continue;
  1314. }
  1315. var strChildrenId = this.children.item(nIndex).id;
  1316. this.children.remove(strChildrenId);
  1317. var heChildren = document.getElementById("HE_" + strChildrenId);
  1318. heChildren.parentNode.removeChild(heChildren);
  1319. }
  1320. this.m_arItemSetAttribute.removeAll();
  1321. };
  1322. XFormsTreeView.prototype.deselect = function ()
  1323. {
  1324. this.clearSelect();
  1325. this.dispatch("xforms-deselect");
  1326. this.dispatch("xforms-value-changed");
  1327. };
  1328. XFormsTreeView.prototype.getCheckValue = function (strSeparator)
  1329. {
  1330. if (null == strSeparator)
  1331. {
  1332. return;
  1333. }
  1334. var strCheckResult = "";
  1335. for (var i=0; i<this.length; i++)
  1336. {
  1337. var objCell = this.getCell(i, 0);
  1338. if (1 == objCell.getChecked())
  1339. {
  1340. var strValue = objCell.getValue();
  1341. strCheckResult += strValue + strSeparator;
  1342. }
  1343. }
  1344. // 모두 합치고 마지막 구분자를 제거한다
  1345. var nIndexNumber = strCheckResult.lastIndexOf(strSeparator);
  1346. strCheckResult = strCheckResult.substring(0, nIndexNumber);
  1347. return strCheckResult;
  1348. };
  1349. XFormsTreeView.prototype.getItemPath = function (nIndex, strSeparator)
  1350. {
  1351. if (null == nIndex)
  1352. {
  1353. return;
  1354. }
  1355. // defalut 구분자
  1356. if (null == strSeparator)
  1357. {
  1358. strSeparator = ",";
  1359. }
  1360. var objCell = this.getCell(nIndex, 0);
  1361. if (null == objCell)
  1362. {
  1363. return;
  1364. }
  1365. var strPathResult = "";
  1366. var strPathResult = strSeparator + objCell.getLabel();
  1367. var nParentIndex = objCell.parentIndex;
  1368. while (-1 != nParentIndex)
  1369. {
  1370. var objParentCell = this.getCell(nParentIndex, 0);
  1371. var strParentLabel = objParentCell.getLabel();
  1372. if ("" != strParentLabel)
  1373. {
  1374. strPathResult = strSeparator + strParentLabel + strPathResult;
  1375. }
  1376. nParentIndex = objParentCell.parentIndex;
  1377. }
  1378. // 구분자의 문자열 길이
  1379. var nSeparatorLength = strSeparator.length;
  1380. strPathResult = strPathResult.substring(nSeparatorLength, strPathResult.length);
  1381. return strPathResult;
  1382. };
  1383. // createChild 부분
  1384. XFormsTreeView.create = function (strParentId, clAttribute, strStyle)
  1385. {
  1386. // 메인노드 생성
  1387. var xnTreeView = XFormsTreeView.createMainNode(clAttribute);
  1388. var xnParent = document.getElementById("HE_"+strParentId);
  1389. xnParent.appendChild(xnTreeView);
  1390. // 하위노드 생성
  1391. xnTreeView = XFormsTreeView.createSubNodes(xnTreeView, clAttribute);
  1392. // object 생성
  1393. return XFormsTreeView.createObject(strParentId, xnTreeView, clAttribute, strStyle);
  1394. };
  1395. XFormsTreeView.createMainNode = function (clAttribute)
  1396. {
  1397. var xnTreeView = document.createElement("div");
  1398. if (!clAttribute.exists("border-width"))
  1399. {
  1400. clAttribute.add("border-width", "2px");
  1401. }
  1402. if (!clAttribute.exists("border-style"))
  1403. {
  1404. clAttribute.add("border-style", "inset");
  1405. }
  1406. xnTreeView = XFormsTreeView.createAttribute(xnTreeView, clAttribute);
  1407. return xnTreeView;
  1408. };
  1409. XFormsTreeView.createSubNodes = function (xnTreeView, clAttribute)
  1410. {
  1411. return xnTreeView;
  1412. };
  1413. XFormsTreeView.createObject = function (strParentId, xnTreeView, clAttribute, strStyle)
  1414. {
  1415. var strAlert = "";
  1416. var strHelp = "";
  1417. var strHint = "";
  1418. var strAccesskey = "";
  1419. var strBind = "";
  1420. var strButtonColor = "";
  1421. var strCellSpacing = "";
  1422. var bCheckChildren = false;
  1423. var strCheckImage = "";
  1424. var strClass = "";
  1425. var bDisabled = false;
  1426. var bDragMode = false;
  1427. var bDropMode = false;
  1428. var bEditMenu = true;
  1429. var nExpandDepth = 0;
  1430. var strExpandedImage = "";
  1431. var bFullRowSelect = false;
  1432. var bHasButtons = true;
  1433. var bHasCheck = false;
  1434. var bHasImages = true;
  1435. var bHasLines = true;
  1436. var strId = "";
  1437. var strImage = "";
  1438. var strIndent = "";
  1439. var strItemHeight = "";
  1440. var strItemSetType = "";
  1441. var strLineColor = "";
  1442. var nNavindex = 9007199254740992;
  1443. var bOneClickExpand = false;
  1444. var strOverflow = "hidden";
  1445. var bPopup = false;
  1446. var strRef = "";
  1447. var strScroll = "";
  1448. var strSelectedImage = "";
  1449. var strShowEffect = "";
  1450. var bSingleExpand = false;
  1451. var strUncheckImage = "";
  1452. var strVisibility = "visible";
  1453. var bIsItemSet = true;
  1454. var nItemLength = 0;
  1455. var strNodeSet = "";
  1456. var strLabelRef = "";
  1457. var strValueRef = "";
  1458. var strDepthRef = "";
  1459. var strNodeSetName = "";
  1460. var strImageRef = "";
  1461. var strExpandedImageRef = "";
  1462. var strSelectedImageRef = "";
  1463. var strUserDefineAttrib = "";
  1464. for (var i=0; i<clAttribute.count(); i++)
  1465. {
  1466. var strAttributeName = clAttribute.keys()[i];
  1467. switch (strAttributeName)
  1468. {
  1469. case "alert" :
  1470. {
  1471. strAlert = clAttribute.item(strAttributeName);
  1472. break;
  1473. }
  1474. case "help" :
  1475. {
  1476. strHelp = clAttribute.item(strAttributeName);
  1477. break;
  1478. }
  1479. case "hint" :
  1480. {
  1481. strHint = clAttribute.item(strAttributeName);
  1482. break;
  1483. }
  1484. case "accesskey" :
  1485. {
  1486. strAccesskey = clAttribute.item(strAttributeName);
  1487. break;
  1488. }
  1489. case "bind" :
  1490. {
  1491. strBind = clAttribute.item(strAttributeName);
  1492. break;
  1493. }
  1494. case "buttoncolor" :
  1495. {
  1496. strButtonColor = clAttribute.item(strAttributeName);
  1497. break;
  1498. }
  1499. case "cellspacing" :
  1500. {
  1501. strCellSpacing = clAttribute.item(strAttributeName);
  1502. break;
  1503. }
  1504. case "checkchildren" :
  1505. {
  1506. if ("true" == clAttribute.item(strAttributeName))
  1507. {
  1508. bCheckChildren = true;
  1509. }
  1510. break;
  1511. }
  1512. case "checkimage" :
  1513. {
  1514. strCheckImage = clAttribute.item(strAttributeName);
  1515. break;
  1516. }
  1517. case "class" :
  1518. {
  1519. strClass = clAttribute.item(strAttributeName);
  1520. break;
  1521. }
  1522. case "disabled" :
  1523. {
  1524. if ("true" == clAttribute.item(strAttributeName))
  1525. {
  1526. bDisabled = true;
  1527. }
  1528. break;
  1529. }
  1530. case "dragmode" :
  1531. {
  1532. if ("true" == clAttribute.item(strAttributeName))
  1533. {
  1534. bDragMode = true;
  1535. }
  1536. break;
  1537. }
  1538. case "dropmode" :
  1539. {
  1540. if ("true" == clAttribute.item(strAttributeName))
  1541. {
  1542. bDropMode = true;
  1543. }
  1544. break;
  1545. }
  1546. case "editmenu" :
  1547. {
  1548. if ("false" == clAttribute.item(strAttributeName))
  1549. {
  1550. bEditMenu = false;
  1551. }
  1552. break;
  1553. }
  1554. case "expanddepth" :
  1555. {
  1556. nExpandDepth = parseInt(clAttribute.item(strAttributeName));
  1557. break;
  1558. }
  1559. case "expandedimage" :
  1560. {
  1561. strExpandedImage = clAttribute.item(strAttributeName);
  1562. break;
  1563. }
  1564. case "fullrowselect" :
  1565. {
  1566. if ("true" == clAttribute.item(strAttributeName))
  1567. {
  1568. bFullRowSelect = true;
  1569. }
  1570. break;
  1571. }
  1572. case "hasbuttons" :
  1573. {
  1574. if ("false" == clAttribute.item(strAttributeName))
  1575. {
  1576. bHasButtons = false;
  1577. }
  1578. break;
  1579. }
  1580. case "hascheck" :
  1581. {
  1582. if ("true" == clAttribute.item(strAttributeName))
  1583. {
  1584. bHasCheck = true;
  1585. }
  1586. break;
  1587. }
  1588. case "hasimages" :
  1589. {
  1590. if ("false" == clAttribute.item(strAttributeName))
  1591. {
  1592. bHasImages = false;
  1593. }
  1594. break;
  1595. }
  1596. case "haslines" :
  1597. {
  1598. if ("false" == clAttribute.item(strAttributeName))
  1599. {
  1600. bHasLines = false;
  1601. }
  1602. break;
  1603. }
  1604. case "id" :
  1605. {
  1606. strId = clAttribute.item(strAttributeName);
  1607. break;
  1608. }
  1609. case "image" :
  1610. {
  1611. strImage = clAttribute.item(strAttributeName);
  1612. break;
  1613. }
  1614. case "indent" :
  1615. {
  1616. strIndent = clAttribute.item(strAttributeName);
  1617. break;
  1618. }
  1619. case "itemheight" :
  1620. {
  1621. strItemHeight = clAttribute.item(strAttributeName);
  1622. break;
  1623. }
  1624. case "itemsettype" :
  1625. {
  1626. strItemSetType = clAttribute.item(strAttributeName);
  1627. break;
  1628. }
  1629. case "linecolor" :
  1630. {
  1631. strLineColor = clAttribute.item(strAttributeName);
  1632. break;
  1633. }
  1634. case "navindex" :
  1635. {
  1636. nNavindex = parseInt(clAttribute.item(strAttributeName));
  1637. break;
  1638. }
  1639. case "oneclickexpand" :
  1640. {
  1641. if ("true" == clAttribute.item(strAttributeName))
  1642. {
  1643. bOneClickExpand = true;
  1644. }
  1645. break;
  1646. }
  1647. case "overflow" :
  1648. {
  1649. strOverflow = clAttribute.item(strAttributeName);
  1650. break;
  1651. }
  1652. case "ref" :
  1653. {
  1654. strRef = clAttribute.item(strAttributeName);
  1655. break;
  1656. }
  1657. case "scroll" :
  1658. {
  1659. strScroll = clAttribute.item(strAttributeName);
  1660. break;
  1661. }
  1662. case "selectedimage" :
  1663. {
  1664. strSelectedImage = clAttribute.item(strAttributeName);
  1665. break;
  1666. }
  1667. case "singleexpand" :
  1668. {
  1669. if ("true" == clAttribute.item(strAttributeName))
  1670. {
  1671. bSingleExpand = true;
  1672. }
  1673. break;
  1674. }
  1675. case "uncheckimage" :
  1676. {
  1677. strUncheckImage = clAttribute.item(strAttributeName);
  1678. break;
  1679. }
  1680. case "visibility" :
  1681. {
  1682. strVisibility = clAttribute.item(strAttributeName);
  1683. break;
  1684. }
  1685. // 트리를 그리기 위한 attribute
  1686. case "nodeset" :
  1687. {
  1688. break;
  1689. }
  1690. default :
  1691. {
  1692. if (!STYLE_LIST[strAttributeName])
  1693. {
  1694. strUserDefineAttrib += strAttributeName + ":" + clAttribute.item(strAttributeName) + "; ";
  1695. }
  1696. break;
  1697. }
  1698. }
  1699. }
  1700. var objTreeView = new XFormsTreeView (strParentId, strAlert, strHelp, strHint, strAccesskey, strBind, strButtonColor, strCellSpacing, bCheckChildren,
  1701. strCheckImage, strClass, bDisabled, bDragMode, bDropMode, bEditMenu, nExpandDepth, strExpandedImage, bFullRowSelect, bHasButtons,
  1702. bHasCheck, bHasImages, bHasLines, strId, strImage, strIndent, strItemHeight, strItemSetType, strLineColor, nNavindex, bOneClickExpand,
  1703. strOverflow, bPopup, strRef, strScroll, strSelectedImage, strShowEffect, bSingleExpand, strStyle, "xforms:treeview", strUncheckImage, strVisibility,
  1704. bIsItemSet, nItemLength, strNodeSet, strLabelRef, strValueRef, strDepthRef, strNodeSetName, strImageRef, strExpandedImageRef, strSelectedImageRef, strUserDefineAttrib);
  1705. return objTreeView;
  1706. };
  1707. XFormsTreeView.createAttribute = function (xnHtmlNode, clAttribute)
  1708. {
  1709. xnHtmlNode =XFormsGroup.createAttribute(xnHtmlNode, clAttribute);
  1710. return xnHtmlNode;
  1711. };
  1712. /*****************
  1713. * Function
  1714. */
  1715. XFormsTreeView.prototype.item = function (nIndex)
  1716. {
  1717. if (null == nIndex)
  1718. {
  1719. return;
  1720. }
  1721. return this.getCell(nIndex, 0);
  1722. };
  1723. //Check값 변경 True/False;
  1724. XFormsTreeView.prototype.changeCheck = function (nIndex)
  1725. {
  1726. var objItem = this.getCell(nIndex, 0);
  1727. var nChecked = objItem.getChecked();
  1728. if (1 == nChecked)
  1729. {
  1730. nChecked = 0;
  1731. }
  1732. else
  1733. {
  1734. nChecked = 1;
  1735. }
  1736. objItem.setChecked(nChecked);
  1737. if (1 == nChecked)
  1738. {
  1739. this.dispatch("onunchecked");
  1740. }
  1741. else
  1742. {
  1743. this.dispatch("onchecked");
  1744. }
  1745. if ("true" == this.getAttribute("checkchildren"))
  1746. {
  1747. this.checkChildren(nIndex, nChecked);
  1748. }
  1749. };
  1750. //child들도 같이 check상태 변화 변경
  1751. XFormsTreeView.prototype.checkChildren = function (nIndex, nChecked)
  1752. {
  1753. for (var i=0; i<this.length; i++)
  1754. {
  1755. var objChildItem = this.getCell(i, 0);
  1756. if (nIndex == objChildItem.getParentIndex())
  1757. {
  1758. objChildItem.setChecked(nChecked);
  1759. if (0 == nChecked)
  1760. {
  1761. this.dispatch("onunchecked");
  1762. }
  1763. else
  1764. {
  1765. this.dispatch("onchecked");
  1766. }
  1767. var nChildIndex = objChildItem.getIndex();
  1768. this.checkChildren(nChildIndex, nChecked);
  1769. }
  1770. }
  1771. };
  1772. XFormsTreeView.prototype.isContained = function (objCell, nX)
  1773. {
  1774. if (null == objCell)
  1775. {
  1776. return;
  1777. }
  1778. var objElement = objCell.m_objElement;
  1779. var strCellId = objCell.id;
  1780. var strDepth = objCell.depth;
  1781. var nRow = objCell.index;
  1782. var heButton = document.getElementById("HE_" + strCellId + "_button");
  1783. var heCheck = document.getElementById("HE_" + strCellId + "_check");
  1784. var heImage = document.getElementById("HE_" + strCellId + "_image");
  1785. var nExpand = objCell.getExpand();
  1786. if (1 == nExpand)
  1787. {
  1788. nExpand = 0;
  1789. }
  1790. else if (0 == nExpand)
  1791. {
  1792. nExpand = 1;
  1793. }
  1794. if (objElement.hasContained(heButton, nX) && -1 != objCell.haschilditem())
  1795. {
  1796. this.dispatch("onmarkclick");
  1797. if (1 == nExpand)
  1798. {
  1799. // onExpanded Event
  1800. this.dispatch("onexpanded");
  1801. this.setExpand(nRow);
  1802. }
  1803. else if (0 == nExpand)
  1804. {
  1805. // onCollapse Event
  1806. this.dispatch("oncollapse");
  1807. this.setCollapse(nRow);
  1808. }
  1809. }
  1810. else if (objElement.hasContained(heCheck, nX))
  1811. {
  1812. if ("false" == this.getAttribute("hasbuttons"))
  1813. {
  1814. if (1 == nExpand)
  1815. {
  1816. // onExpanded Event
  1817. this.dispatch("onexpanded");
  1818. this.setExpand(nRow);
  1819. }
  1820. else if (0 == nExpand)
  1821. {
  1822. // onCollapse Event
  1823. this.dispatch("oncollapse");
  1824. this.setCollapse(nRow);
  1825. }
  1826. }
  1827. this.toggleCheck(nRow);
  1828. }
  1829. else
  1830. {
  1831. if ("false" == this.getAttribute("hasbuttons") &&
  1832. "true" != this.getAttribute("hascheck"))
  1833. {
  1834. if (objElement.hasContained(heImage, nX))
  1835. {
  1836. if (1 == nExpand)
  1837. {
  1838. // onExpanded Event
  1839. this.dispatch("onexpanded");
  1840. this.setExpand(nRow);
  1841. }
  1842. else if (0 == nExpand)
  1843. {
  1844. // onCollapse Event
  1845. this.dispatch("oncollapse");
  1846. this.setCollapse(nRow);
  1847. }
  1848. }
  1849. }
  1850. for (var i=0; i<this.length; i++)
  1851. {
  1852. var objChild = this.getCell(i, 0);
  1853. var strChildId = objChild.id;
  1854. if (strChildId == strCellId)
  1855. {
  1856. objChild.setSelect(true);
  1857. this.focusIndex = objChild.index;
  1858. var selectedImage = objChild.selectedimage;
  1859. strSelectedImage = ("" == selectedImage || null == selectedImage) ? objChild.image : selectedImage;
  1860. this.label = objChild.getLabel();
  1861. this.value = objChild.getValue();
  1862. }
  1863. else
  1864. {
  1865. objChild.setSelect(false);
  1866. if (1 == objChild.expanded)
  1867. {
  1868. strSelectedImage = objChild.expandedimage;
  1869. }
  1870. else if (0 == objChild.expanded)
  1871. {
  1872. strSelectedImage = objChild.image;
  1873. }
  1874. }
  1875. if ("" == strSelectedImage)
  1876. {
  1877. strSelectedImage = __getAppName() + "/kr/comsquare/image/treeview/blank.gif";
  1878. }
  1879. var heItem = document.getElementById("HE_" + this.id + "_" + i + "_0_image");
  1880. this.setImage(heItem, strSelectedImage);
  1881. }
  1882. this.dispatch("xforms-select");
  1883. var strEventType = "";
  1884. if (is_firefox)
  1885. {
  1886. strEventType = m_event.m_browserEvent.type;
  1887. }
  1888. else
  1889. {
  1890. strEventType = event.type;
  1891. }
  1892. // oneclickexpand 설정
  1893. if (("mousedown" == strEventType && "true" == this.getAttribute("oneclickexpand")) ||
  1894. ("dblclick" == strEventType && "true" != this.getAttribute("oneclickexpand")))
  1895. {
  1896. var heContentItem = document.getElementById("HE_" + strCellId + "_content");
  1897. if (objElement.hasContained(heContentItem, nX) && -1 != objCell.haschilditem())
  1898. {
  1899. if (1 == nExpand)
  1900. {
  1901. this.setExpand(nRow);
  1902. }
  1903. else if (0 == nExpand)
  1904. {
  1905. this.setCollapse(nRow);
  1906. }
  1907. }
  1908. }
  1909. }
  1910. this.overflow();
  1911. };
  1912. XFormsTreeView.prototype.toggleCheck = function (nIndex)
  1913. {
  1914. var objSelectItem = this.getCell(nIndex, 0);
  1915. if (null == objSelectItem)
  1916. {
  1917. return;
  1918. }
  1919. var strCheckChildren = this.getAttribute("checkchildren");
  1920. var strHasButtons = this.getAttribute("hasbuttons");
  1921. var heItem = document.getElementById("HE_" + this.id + "_" + nIndex + "_0_check");
  1922. var nChecked = objSelectItem.getChecked();
  1923. var nSelectDepth = objSelectItem.depth;
  1924. if (null != heItem)
  1925. {
  1926. var strCheckImage = this.getAttribute("checkimage");
  1927. if ("" == strCheckImage)
  1928. {
  1929. strCheckImage = __getAppName() + "/kr/comsquare/image/treeview/check.gif";
  1930. }
  1931. var strUncheckImage = this.getAttribute("uncheckimage");
  1932. if ("" == strUncheckImage)
  1933. {
  1934. strUncheckImage = __getAppName() + "/kr/comsquare/image/treeview/uncheck.gif";
  1935. }
  1936. if (0 == nChecked)
  1937. {
  1938. this.setImage(heItem, strCheckImage);
  1939. objSelectItem.setChecked(1);
  1940. // onChecked Event
  1941. this.dispatch("onchecked");
  1942. }
  1943. else
  1944. {
  1945. this.setImage(heItem, strUncheckImage);
  1946. objSelectItem.setChecked(0);
  1947. // onUnchecked Event
  1948. this.dispatch("onunchecked");
  1949. }
  1950. }
  1951. if ("true" == strCheckChildren && -1 != objSelectItem.haschilditem())
  1952. {
  1953. for (var i=nIndex+1; i<this.length; i++)
  1954. {
  1955. var objItem = this.getCell(i, 0);
  1956. var nItemDepth = objItem.depth;
  1957. if (nItemDepth > nSelectDepth)
  1958. {
  1959. objItem.setChecked(nChecked);
  1960. this.toggleCheck(objItem.index);
  1961. }
  1962. else
  1963. {
  1964. break;
  1965. }
  1966. }
  1967. }
  1968. };
  1969. XFormsTreeView.prototype.expand = function (nIndex, bExpand)
  1970. {
  1971. var nExpand = 0;
  1972. if (bExpand)
  1973. {
  1974. nExpand = 1;
  1975. }
  1976. var objCell = this.getCell(nIndex, 0);
  1977. objCell.setExpand(nExpand);
  1978. // singleexpand 속성이 true일때 나머지 row를 접어준다.
  1979. if ("true" == this.getAttribute("singleexpand"))
  1980. {
  1981. this.singleexpand(nIndex);
  1982. }
  1983. var nCellDepth = objCell.depth;
  1984. var strDisplay = objCell.m_heControl.style.display;
  1985. if ("none" != strDisplay)
  1986. {
  1987. if (bExpand)
  1988. {
  1989. this.setExpand(nIndex);
  1990. }
  1991. else
  1992. {
  1993. this.setCollapse(nIndex);
  1994. }
  1995. }
  1996. this.overflow();
  1997. };
  1998. XFormsTreeView.prototype.setExpand = function (nRow)
  1999. {
  2000. var objSelectItem = this.getCell(nRow, 0);
  2001. if (-1 != objSelectItem.haschilditem())
  2002. {
  2003. var nSelectDepth = objSelectItem.depth;
  2004. var heSelectItem = document.getElementById("HE_" + this.id + "_" + nRow + "_0_button");
  2005. var strImage = __getAppName() + "/kr/comsquare/image/treeview/minus.gif";
  2006. objSelectItem.setExpand(1);
  2007. for (var i=nRow+1; i<this.length; i++)
  2008. {
  2009. var objItem = this.getCell(i, 0);
  2010. var nItemDepth = objItem.depth;
  2011. if (nItemDepth <= nSelectDepth)
  2012. {
  2013. break;
  2014. }
  2015. else if (nItemDepth > nSelectDepth)
  2016. {
  2017. if (nRow == objItem.parentIndex)
  2018. {
  2019. if (1 == objItem.getExpand())
  2020. {
  2021. this.setExpand(objItem.index);
  2022. }
  2023. objItem.m_heControl.style.display = "block";
  2024. }
  2025. }
  2026. }
  2027. // 이미지 바꾸기
  2028. this.setImage(heSelectItem, strImage);
  2029. if ("" != objSelectItem.expandedimage && !objSelectItem.selected)
  2030. {
  2031. var heImage = document.getElementById("HE_" + this.id + "_" + nRow + "_0_image");
  2032. this.setImage(heImage, objSelectItem.expandedimage);
  2033. }
  2034. if ("true" == this.getAttribute("singleexpand"))
  2035. {
  2036. this.singleexpand(nRow);
  2037. }
  2038. }
  2039. };
  2040. XFormsTreeView.prototype.getLineDIV = function (strId)
  2041. {
  2042. return objLine;
  2043. };
  2044. XFormsTreeView.prototype.singleexpand = function (nSelectIndex)
  2045. {
  2046. var objSelectItem = this.getCell(nSelectIndex, 0);
  2047. if (-1 != objSelectItem.haschilditem())
  2048. {
  2049. var nSelectCellDepth = objSelectItem.depth;
  2050. var arSameDepthCell = new Array();
  2051. for (var i=0; i<this.length; i++)
  2052. {
  2053. var objItem = this.getCell(i, 0);
  2054. var nItemIndex = objItem.index;
  2055. var nItemDepth = objItem.depth;
  2056. if (nItemDepth == nSelectCellDepth)
  2057. {
  2058. if (nItemIndex != nSelectIndex)
  2059. {
  2060. this.setCollapse(nItemIndex);
  2061. }
  2062. }
  2063. }
  2064. }
  2065. };
  2066. XFormsTreeView.prototype.setCollapse = function (nRow)
  2067. {
  2068. var objSelectItem = this.getCell(nRow, 0);
  2069. objSelectItem.setExpand(0);
  2070. var heSelectItem = document.getElementById("HE_" + this.id + "_" + nRow + "_0_button");
  2071. if (null != heSelectItem)
  2072. {
  2073. var strImage = __getAppName() + "/kr/comsquare/image/treeview/plus.gif";
  2074. this.setImage(heSelectItem, strImage);
  2075. }
  2076. var nSelectCellDepth = objSelectItem.depth;
  2077. for (var i=nRow+1; i<this.length; i++)
  2078. {
  2079. var objChildItem = this.getCell(i, 0);
  2080. var nChildDepth = objChildItem.depth;
  2081. if (nChildDepth <= nSelectCellDepth)
  2082. {
  2083. break;
  2084. }
  2085. objChildItem.m_heControl.style.display = "none";
  2086. }
  2087. // image를 다시 세팅
  2088. if (!objSelectItem.selected)
  2089. {
  2090. var strImage = ("" != objSelectItem.image) ? objSelectItem.image : __getAppName() + "/kr/comsquare/image/treeview/blank.gif";
  2091. var heImage = document.getElementById("HE_" + this.id + "_" + nRow + "_0_image");
  2092. this.setImage(heImage, strImage);
  2093. }
  2094. };
  2095. XFormsTreeView.prototype.setImage = function (heItem, strImage)
  2096. {
  2097. if (null != heItem)
  2098. {
  2099. for (var i=0; i<heItem.childNodes.length; i++)
  2100. {
  2101. var heImageTag = heItem.childNodes.item(i);
  2102. if ("IMG" == heImageTag.nodeName)
  2103. {
  2104. heImageTag.src = strImage;
  2105. break;
  2106. }
  2107. }
  2108. }
  2109. };
  2110. /**
  2111. * Method
  2112. */
  2113. XFormsTreeView.prototype.getBindingType = function ()
  2114. {
  2115. return BT_SINGLE;
  2116. };
  2117. /**************************
  2118. * Event
  2119. */
  2120. XFormsTreeView.prototype.onMouseUp = function (event)
  2121. {
  2122. XFormsGroup.prototype.onMouseUp.call(this, event);
  2123. this.m_bLButtonDown = false;
  2124. };
  2125. XFormsTreeView.prototype.onMouseMove = function (event)
  2126. {
  2127. if (this.m_bLButtonDown && "false" != this.getAttribute("dragmode") && !this.m_bDragStart)
  2128. {
  2129. window.bDragDrop = true;
  2130. this.m_bDragStart = true;
  2131. event.capture = "";
  2132. event.drag = this.id;
  2133. this.dispatch("ondragstart");
  2134. }
  2135. else
  2136. {
  2137. XFormsGroup.prototype.onMouseMove.call(this, event);
  2138. }
  2139. };
  2140. /**
  2141. * OnMouseDown
  2142. */
  2143. XFormsTreeView.prototype.onMouseDown = function (event)
  2144. {
  2145. XFormsGroup.prototype.onMouseDown.call(this, event);
  2146. if (!this.isCell(event.target))
  2147. {
  2148. return;
  2149. }
  2150. if (TFEvent.BUTTON_LEFT != event.button)
  2151. {
  2152. return;
  2153. }
  2154. this.m_bLButtonDown = false;
  2155. this.m_bDragStart = false;
  2156. var objCell = this.getCell(this.m_nSelectedRow, 0);
  2157. if (null != objCell)
  2158. {
  2159. if (objCell.getDisabled())
  2160. {
  2161. return;
  2162. }
  2163. var nOffsetX = 0;
  2164. var heOffsetParent = this.m_heControl;
  2165. while (null != heOffsetParent)
  2166. {
  2167. nOffsetX += heOffsetParent.offsetLeft - heOffsetParent.scrollLeft;
  2168. heOffsetParent = heOffsetParent.offsetParent;
  2169. }
  2170. var nX = event.clientX - nOffsetX;
  2171. // var nX = event.clientX - (is_android ? this.getClientLeftForAndroid() : this.getClientLeft());
  2172. this.isContained(objCell, nX);
  2173. // TODO Tree Label쪽 클릭 시 this.m_nSelectRow가 안들어온다.
  2174. window.setFocus(objCell.getId());
  2175. this.m_bLButtonDown = true;
  2176. }
  2177. };
  2178. XFormsTreeView.prototype.getClientLeftForAndroid = function ()
  2179. {
  2180. var nOffsetX = 0;
  2181. var heOffsetParent = this.m_heControl;
  2182. while (null != heOffsetParent)
  2183. {
  2184. nOffsetX += heOffsetParent.offsetLeft - heOffsetParent.scrollLeft;
  2185. heOffsetParent = heOffsetParent.offsetParent;
  2186. }
  2187. return nOffsetX;
  2188. };
  2189. /**
  2190. * onDblCilck Event
  2191. */
  2192. XFormsTreeView.prototype.onDblClick = function (event)
  2193. {
  2194. if ("true" != this.getAttribute("disabled") && "true" != this.getAttribute("oneclickexpand"))
  2195. {
  2196. this.onMouseDown(event);
  2197. }
  2198. };
  2199. /**
  2200. * 스마트폰 브라우저 상에서 트리 확장/되돌림 버튼 위치를 조정한다.
  2201. *
  2202. * @return
  2203. */
  2204. XFormsTreeView.prototype.moveTreeViewExpansion = function ()
  2205. {
  2206. if (is_smartphone)
  2207. {
  2208. if (this.bIsExpansion)
  2209. {
  2210. var heElementExpansion = document.getElementById("__TREEVIEW_EXPANSION_" + this.id);
  2211. if (null != heElementExpansion)
  2212. {
  2213. var nTreeViewEndXPosition = this.getOffsetLeft() + this.m_heControl.offsetWidth;
  2214. var nTreeViewEndYPosition = this.getOffsetTop() + this.m_heControl.offsetHeight;
  2215. var nScreenEndXPosition = window.scrollX + window.innerWidth;
  2216. var nScreenEndYPosition = window.scrollY + window.innerHeight;
  2217. var nTreeViewXPosition = this.m_heControl.offsetLeft;
  2218. var nTreeViewYPosition = this.m_heControl.offsetTop;
  2219. var nXPos = (nTreeViewEndXPosition > nScreenEndXPosition) ? nScreenEndXPosition : nTreeViewEndXPosition;
  2220. var nYPos = (nTreeViewEndYPosition > nScreenEndYPosition) ? nScreenEndYPosition : nTreeViewEndYPosition;
  2221. nXPos = (nTreeViewXPosition < nXPos) ? nXPos : nTreeViewXPosition;
  2222. nYPos = (nTreeViewYPosition < nYPos) ? nYPos : nTreeViewYPosition;
  2223. heElementExpansion.style.top = nYPos - 20 + "px";
  2224. heElementExpansion.style.left = nXPos - 20 + "px";
  2225. }
  2226. }
  2227. }
  2228. };
  2229. XFormsTreeView.prototype.makeTreeViewExpansion = function ()
  2230. {
  2231. var heExpansionButton = document.getElementById("__TREEVIEW_EXPANSION_" + this.id);
  2232. if (null == heExpansionButton)
  2233. {
  2234. if (is_ie)
  2235. {
  2236. heExpansionButton = document.createElement("<image onclick=\"XFormsTreeView.onClickExpansion(event, '" + this.id + "');\">");
  2237. }
  2238. else
  2239. {
  2240. heExpansionButton = document.createElement("image");
  2241. heExpansionButton.setAttribute("onclick", "XFormsTreeView.onClickExpansion(event, \""+this.id+"\")");
  2242. }
  2243. heExpansionButton.setAttribute("id", "__TREEVIEW_EXPANSION_" + this.id);
  2244. heExpansionButton.setAttribute("src", __getAppName() + "/kr/comsquare/image/treeview/treeviewExpansion.png");
  2245. heExpansionButton.style.position = "absolute";
  2246. heExpansionButton.style.left = (this.getOffsetLeft() + this.m_heControl.offsetWidth - 20) + "px";
  2247. heExpansionButton.style.top = (this.getOffsetTop() + this.m_heControl.offsetHeight - 20) + "px";
  2248. document.body.appendChild(heExpansionButton);
  2249. }
  2250. if ("visible" == this.getAttribute("overflow") || "hidden" == this.getAttribute("overflow"))
  2251. {
  2252. heExpansionButton.style.display = "none";
  2253. }
  2254. };
  2255. // TreeView 전체 크기 다시 그리기(DIV)
  2256. XFormsTreeView.prototype.wholeTreeView = function ()
  2257. {
  2258. var strOriginOverflow = this.getAttribute("overflow");
  2259. var scrollWidth = (this.m_nOriginWidth > this.m_heControl.scrollWidth) ? this.m_nOriginWidth : this.m_heControl.scrollWidth ;
  2260. var scrollHeight = (this.m_nOriginHeight > this.m_heControl.scrollHeight) ? this.m_nOriginHeight : this.m_heControl.scrollHeight ;
  2261. this.m_heControl.style.width = scrollWidth + "px";
  2262. this.m_heControl.style.height = scrollHeight + "px";
  2263. this.moveTreeViewExpansion();
  2264. };
  2265. /**
  2266. * 전역함수
  2267. */
  2268. XFormsTreeView.onClickExpansion = function (event, strId)
  2269. {
  2270. var objTreeView = document.allElement.item(strId);
  2271. var heElementTreeView = document.getElementById("HE_" + strId);
  2272. var heElementExpansion = document.getElementById("__TREEVIEW_EXPANSION_" + strId);
  2273. if (null != heElementTreeView)
  2274. {
  2275. var strOverflow = objTreeView.getAttribute("overflow");
  2276. // if ("hidden" == strOverflow)
  2277. if (!objTreeView.bIsExpansion)
  2278. {
  2279. var scrollWidth = (objTreeView.m_nOriginWidth > heElementTreeView.scrollWidth) ? objTreeView.m_nOriginWidth : heElementTreeView.scrollWidth;
  2280. var scrollHeight = (objTreeView.m_nOriginHeight > heElementTreeView.scrollHeight) ? objTreeView.m_nOriginHeight : heElementTreeView.scrollHeight;
  2281. heElementTreeView.style.width = scrollWidth + "px";
  2282. heElementTreeView.style.height = scrollHeight + "px";
  2283. objTreeView.setAttribute("overflow", "visible");
  2284. objTreeView.setOverflow("visible");
  2285. objTreeView.bIsExpansion = true;
  2286. heElementExpansion.src = __getAppName() + "/kr/comsquare/image/treeview/treeviewReturn.png";
  2287. var nScreenEndXPosition = window.scrollX + window.innerWidth;
  2288. var nScreenEndYPosition = window.scrollY + window.innerHeight;
  2289. var nTreeViewEndXPosition = objTreeView.getOffsetLeft() + heElementTreeView.offsetWidth;
  2290. var nTreeViewEndYPosition = objTreeView.getOffsetTop() + heElementTreeView.offsetHeight;
  2291. var nXPos = ((nTreeViewEndXPosition > nScreenEndXPosition) ? nScreenEndXPosition : nTreeViewEndXPosition);
  2292. var nYPos = ((nTreeViewEndYPosition > nScreenEndYPosition) ? nScreenEndYPosition : nTreeViewEndYPosition);
  2293. heElementExpansion.style.left = ((nXPos - 20) < 0) ? "0px" : (nXPos - 20) + "px";
  2294. heElementExpansion.style.top = ((nYPos - 20) < 0) ? "0px" : (nYPos - 20) + "px";
  2295. }
  2296. else
  2297. {
  2298. heElementTreeView.style.width = objTreeView.m_nOriginWidth + "px";
  2299. heElementTreeView.style.height = objTreeView.m_nOriginHeight + "px";
  2300. objTreeView.setAttribute("overflow", "hidden");
  2301. objTreeView.setOverflow("hidden");
  2302. objTreeView.bIsExpansion = false;
  2303. heElementExpansion.src = __getAppName() + "/kr/comsquare/image/treeview/treeviewExpansion.png";
  2304. heElementExpansion.style.left = (objTreeView.getOffsetLeft() + heElementTreeView.offsetWidth - 20) + "px";
  2305. heElementExpansion.style.top = (objTreeView.getOffsetTop() + heElementTreeView.offsetHeight - 20) + "px";
  2306. }
  2307. }
  2308. };