kul_editor_pane.js 121 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383
  1. //System Pre-define functions Start
  2. //var fs = parent.require('fs');
  3. function COMX_DEBUG(msg)
  4. {
  5. //console.log('' + msg);
  6. }
  7. function COMX_ERROR(msg)
  8. {
  9. console.error('' + msg);
  10. }
  11. function OnViewPictures()
  12. {
  13. model.viewIcons(ui.units.value);
  14. //unit.form.picture_mgr.Show();
  15. }
  16. //var old_id = false;
  17. function OnHighLight(id, rclick)
  18. {
  19. //if(old_id == id && rclick == false)return;
  20. //old_id = id;
  21. ui.tree.content_menu = false;
  22. if(ui.cb_pickup_in_preview.valid)
  23. {
  24. ui.tree.position = id;
  25. OnClickTreeItem();
  26. if(rclick)
  27. {
  28. OnRClickTreeItem();
  29. }
  30. }
  31. }
  32. function OnTest(){OnDistribute();}
  33. function OnDistribute()
  34. {
  35. }
  36. function initEslint()
  37. {
  38. ui.listEslintModel.table = ui.listEslintCallback.table =
  39. [['Row', 'Column', 'Static Syntax Error List ( Number : 0 )']];
  40. ui.listEslintModel.head_size = ui.listEslintCallback.head_size = [-1,-1,0];
  41. ui.listEslintModel.visible = ui.listEslintCallback.visible = false;
  42. }
  43. var g_geo_x = 0;
  44. var g_geo_y = 0;
  45. var g_geo_width = 0;
  46. var g_geo_height = 0;
  47. function _initAttachmentGeometry()
  48. {
  49. //deal with attachment geometry begin.
  50. var glo = ui.geometry;
  51. var sub = ui.GetWidgetGeometry(ui.callback.handle);
  52. g_geo_width = glo.width - sub.width;
  53. g_geo_height = glo.height - sub.height;
  54. g_geo_x = sub.x - glo.x;
  55. g_geo_y = sub.y - glo.y;
  56. g_geo_init = true;
  57. //deal with attachment geometry end.
  58. }
  59. function _initializeData()
  60. {
  61. _initAttachmentGeometry();
  62. model.distributeAddon();
  63. ui.compile_type.index = 1;
  64. ui.list.tabel = [
  65. ['Property','Value']
  66. ];
  67. ui.tree.enable = false;
  68. ui.list.enable = false;
  69. ui.pbaf.enable = false;
  70. ui.pbau.enable = false;
  71. ui.pbn_execute.enable = false;
  72. ui.callback_fn_list.list = [];
  73. ui.model_fn_list.list = [];
  74. model.createDataFolder();
  75. COMX_DEBUG('OnInitializeData()');
  76. ui.pb_preview.valid = true;
  77. ui.tree.node = {name : 'form', icon : 'form', id : 0};
  78. //Initialize Copyright Info.
  79. initCopyrightInfo();
  80. //Initialize Callback Editor.
  81. initCallbackEditor();
  82. //Initialize Model Editor.
  83. //ui.model.lexer="javascript";
  84. initModelEditor();
  85. ui.gyp.lexer="javascript";
  86. ui.plugin_src.lexer="cpp";
  87. ui.append_plugin_btn.enable = false;
  88. ui.plugin_sample_codes_flag.enable = false;
  89. ui.cueline_stack.index = 1;
  90. //Initialize Kul Editor
  91. //InitKulEditor();
  92. //Initialize Plugin Editor
  93. //Initialize Lesson Menu Pane.
  94. InitLessaonPane();
  95. //Initialize Plugin Pane
  96. initPluginPane();
  97. //Initialize Unit List
  98. updateUnitList(true);
  99. /*
  100. if(ui.units.value != '')
  101. {
  102. OnUnitChanged();
  103. //Initialize Form List
  104. updateFormList();
  105. }
  106. */
  107. //Disable Save Button
  108. ui.pb_save.enable = false;
  109. ui.hot_key = [
  110. {
  111. key : "Ctrl+S",
  112. id : 1
  113. },
  114. {
  115. key : "Ctrl+E",
  116. id : 2
  117. },
  118. {
  119. key : "Ctrl+M",
  120. id : 3
  121. },
  122. {
  123. key : "Ctrl+P",
  124. id : 4
  125. },
  126. {
  127. key : "Ctrl+R",
  128. id : 5
  129. },
  130. {
  131. key : "Ctrl+Q",
  132. id : 6
  133. },
  134. {
  135. key : "Ctrl+F",
  136. id : 7
  137. },
  138. {
  139. key : "Ctrl+I",
  140. id : 8
  141. },
  142. {
  143. key : "Ctrl+H",
  144. id : 9
  145. }
  146. ];
  147. ui.cb_pickup_in_preview.valid = true;
  148. }
  149. function OnInitializeData()
  150. {
  151. ui.pb_plugin_vs.visible = model.isWin32();
  152. initEslint();
  153. initJavascriptEditorReadonlyProp();
  154. model.createShortcut();
  155. }
  156. function OnOpenPluginInVS()
  157. {
  158. outputInfo('<span style="color:red">警告: 使用Visual Studio打开Plugin解决方案后, 如果再次使用DCiP环境配置/编译Plugin, VS中的自定义配置将被自动清空; VS编译好的.node文件需手动部署(拷贝)到相应的addon文件夹中。</span>');
  159. var top_ns = (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value;
  160. var ns = ui.plugin_ns.value;
  161. model.openPluginSolutionInVisualStudio(top_ns, ns);
  162. }
  163. function OnHideSolutionPane()
  164. {
  165. g_side_docker.hide();
  166. }
  167. function OnChildDockerMessage(type, para){
  168. if(type == 'exit')
  169. {
  170. pane.Close();
  171. }
  172. if(type == 'develop')
  173. {
  174. ui.toolbar_index.index = 0;
  175. }
  176. if(type == 'lesson')
  177. {
  178. ui.toolbar_index.index = 1;
  179. }
  180. if(type == 'copyright')
  181. {
  182. ui.toolbar_index.index = 2;
  183. }
  184. if(type == 'expend')
  185. {
  186. g_tool_bar.show();
  187. }
  188. if(type == 'fold')
  189. {
  190. g_tool_bar.hide();
  191. }
  192. }
  193. var g_side_docker = false;
  194. var g_status_bar = false;
  195. var g_toolbar = false;
  196. var g_topmenu = false;
  197. var g_code_snip = false;
  198. var g_log_sidepane = false;
  199. var g_logplugin_sidepane = false;
  200. function _initDockPane()
  201. {
  202. g_topmenu = ui.docker.load('cw_topmenu', 4, '');
  203. g_topmenu.setSizePolicy(2);
  204. g_tool_bar = ui.docker.load('toolbarpane_new', 4, '');
  205. g_tool_bar.setSizePolicy(2);
  206. g_topmenu.split(g_tool_bar, 2);
  207. g_status_bar = ui.docker.load('statuspane', 8, '');
  208. g_status_bar.setSizePolicy(2);
  209. g_side_docker = ui.docker.load('sidepane', 1, "Unit Manager Panel");
  210. parent.setTimeout(()=>{
  211. g_log_sidepane = ui.docker.load('log_sidepane', 8, 'Log Information Panel');
  212. //g_log_sidepane.setSizePolicy(2);
  213. g_logplugin_sidepane = ui.docker.load('logplugin_sidepane', 8, 'Plugin Inform Panel');
  214. //g_logplugin_sidepane.setSizePolicy(2);
  215. g_log_sidepane.split(g_status_bar, 2);
  216. g_log_sidepane.split(g_logplugin_sidepane, 1);
  217. g_log_sidepane.hide();
  218. g_logplugin_sidepane.hide();
  219. ui.global_log_info.value = model.loadGlobalLogInfo();
  220. ui.global_log_info.index = 10000000000000;
  221. ui.global_log_info.lexer = 'javasciprt';
  222. ui.plugin_log.keywords = ['gyp', 'info'];
  223. ui.plugin_log.lexer = 'cpp';
  224. },1000);
  225. ui.pb_unit.visible = false;
  226. }
  227. function OnLogFlagChange()
  228. {
  229. if(ui.log_flag.valid)
  230. {
  231. g_logplugin_sidepane.hide();
  232. g_log_sidepane.show();
  233. }
  234. else
  235. {
  236. g_log_sidepane.hide();
  237. }
  238. //OnGeometryChange();
  239. }
  240. var g_cueline_init = false;
  241. function OnReady()
  242. {
  243. _initDockPane();
  244. ui.preview_visible.valid = true;
  245. setCuelineInfo('Initializing ...');
  246. _initializeData();
  247. parent.setTimeout(()=>{
  248. if(!g_cueline_init)
  249. {
  250. g_cueline_init = true;
  251. resetCueline();
  252. }
  253. if(ui.geometry.width > ui.GetScreenGeometry().width ||
  254. ui.geometry.height > ui.GetScreenGeometry().height)
  255. {
  256. ui.show(0);
  257. ui.show(1);
  258. }
  259. }, 1500);
  260. }
  261. function OnCallbackEslintView()
  262. {
  263. var list = ui.listEslintCallback.list;
  264. var row = parseInt(list[0]);
  265. var column = parseInt(list[1]);
  266. ui.callback.row = row - 1;
  267. ui.callback.column = column - 1;
  268. }
  269. function OnModelEslintView()
  270. {
  271. var list = ui.listEslintModel.list;
  272. var row = parseInt(list[0]);
  273. var column = parseInt(list[1]);
  274. ui.model.row = row - 1;
  275. ui.model.column = column - 1;
  276. }
  277. function beautifyPluginEntry(cb)
  278. {
  279. var row = ui.plugin.row;
  280. //ui.plugin.range.low = -1;
  281. //ui.plugin.range.high = -1;
  282. var firstVisibleLine = ui.plugin.firstVisibleLine;
  283. var content = ui.plugin.document;
  284. model.beautifyCpp(content, result=>{
  285. if(result)
  286. {
  287. ui.block_event = true;
  288. ui.plugin.document = result;
  289. ui.plugin.row = row;
  290. ui.plugin.firstVisibleLine = firstVisibleLine;
  291. ui.block_event = false;
  292. }
  293. cb();
  294. });
  295. }
  296. function beautifyPluginCurrentSourceCodes(cb)
  297. {
  298. var row = ui.plugin_src.row;
  299. //ui.plugin_src.range.low = -1;
  300. //ui.plugin_src.range.high = -1;
  301. var firstVisibleLine = ui.plugin_src.firstVisibleLine;
  302. var content = ui.plugin_src.document;
  303. model.beautifyCpp(content, result=>{
  304. if(result)
  305. {
  306. ui.block_event = true;
  307. ui.plugin_src.document = result;
  308. ui.plugin_src.row = row;
  309. ui.plugin_src.firstVisibleLine = firstVisibleLine;
  310. ui.block_event = false;
  311. }
  312. cb();
  313. });
  314. }
  315. function OnBeautifyPlugin()
  316. {
  317. if(ui.plugin_ns.value == "") return;
  318. enableKulEditor(false);
  319. setCuelineInfo('Saving with automatic code beautification ...');
  320. beautifyPluginEntry(()=>{
  321. beautifyPluginCurrentSourceCodes(()=>{
  322. savePluginSourceCodesSync();
  323. resetCueline();
  324. enableKulEditor(true);
  325. });
  326. });
  327. }
  328. function OnPluginLogInfo()
  329. {
  330. if(ui.plugin_info_btn.valid)
  331. {
  332. g_log_sidepane.hide();
  333. g_logplugin_sidepane.show();
  334. }
  335. else
  336. g_logplugin_sidepane.hide();
  337. }
  338. function isCallbackTab(){ return ui.main_tabctrl.value == 'Callback'; } //index-0
  339. function isModelTab() { return ui.main_tabctrl.value == 'Model'; } //index-1
  340. function isLibraryTab() { return ui.main_tabctrl.value == 'Library'; } //index-2
  341. function isPluginTab() { return ui.main_tabctrl.value == 'Plugin'; } //index-3
  342. function isLogTab() { return ui.main_tabctrl.value == 'Log'; } //index-4
  343. function OnCloseForm()
  344. {
  345. OnSaveEx();
  346. var is_preview = ui.pb_preview.valid;
  347. ui.pb_preview.valid = false;
  348. OnPreview();
  349. var timeID = parent.setTimeout(()=>{
  350. parent.clearTimeout(timeID);
  351. if(ui.MessageBox('DCiP | Message Prompt', 'This application will be closed! Are you sure?',
  352. MessageBox.Icon.Information,
  353. MessageBox.Button.Yes | MessageBox.Button.No) == MessageBox.Button.Yes)
  354. {
  355. model.saveGlobalLogInfo(ui.global_log_info.value);
  356. process.exit();
  357. }
  358. else
  359. {
  360. ui.pb_preview.valid = is_preview;
  361. OnPreview();
  362. }
  363. }, 300);
  364. return false;
  365. }
  366. //System Pre-define functions End
  367. //////////////////////////////////////////////////////////////////////////////////
  368. // Widget Callback
  369. function OnModelFind()
  370. {
  371. ui.model.regex = ui.model_find.value;
  372. }
  373. function OnCallbackFind()
  374. {
  375. ui.callback.regex = ui.callback_find.value;
  376. }
  377. function OnSaveEx()
  378. {
  379. if(g_save_lock) return;
  380. if(!ui.pb_save.enable) return;
  381. ui.pb_save.enable = false;
  382. if(isJavaScriptCodeDirty())
  383. {
  384. OnSave();
  385. }
  386. if(isPluginDirty())
  387. {
  388. OnBeautifyPlugin();
  389. }
  390. if(isJavaScriptCodeDirty() && isPluginDirty())
  391. {
  392. setTimedCueline('When you see this message means that there is a bug in the IDE, please contact zhangxk@dlut.edu.cn.', 5000);
  393. }
  394. }
  395. function OnHotKey()
  396. {
  397. if(ui.hot_key == 1)
  398. {
  399. OnSaveEx();
  400. }
  401. if(ui.hot_key == 2)
  402. {
  403. OnExecute();
  404. }
  405. if(ui.hot_key == 3)
  406. {
  407. OnFrame();
  408. }
  409. if(ui.hot_key == 4)
  410. {
  411. ui.pb_preview.valid = !ui.pb_preview.valid;
  412. OnPreview();
  413. }
  414. if(ui.hot_key == 5)
  415. {
  416. OnRegister();
  417. }
  418. if(ui.hot_key == 6)
  419. {
  420. pane.Close();
  421. }
  422. if(ui.hot_key == 7)
  423. {
  424. if(isCallbackTab() && ui.callback.range.low != 0)
  425. {
  426. ui.callback_find.value = ui.callback.value;
  427. OnCallbackFind();
  428. }
  429. if(isModelTab() && ui.model.range.low != 0)
  430. {
  431. ui.model_find.value = ui.model.value;
  432. OnModelFind();
  433. }
  434. if(isPluginTab() && ui.plugin.range.low != 0 &&
  435. ui.plugin_tab.index == 0)
  436. {
  437. OnPluginEntryFind();
  438. }
  439. if(isPluginTab() && ui.plugin_src.range.low != 0 &&
  440. ui.plugin_tab.index == 2)
  441. {
  442. OnPluginSrcFind();
  443. }
  444. }
  445. if(ui.hot_key == 8 && g_snip_buffer)
  446. {
  447. ui.callback.inserter = g_snip_buffer;//ui.clipboard;
  448. OnSave(true, ()=>{
  449. ui.SetFocus(ui.callback.handle);
  450. g_callback_dirty = true;
  451. ui.pb_save.enable = true;
  452. });
  453. }
  454. if(ui.hot_key == 9 && ui.preview_visible.enable)
  455. {
  456. ui.preview_visible.valid = !ui.preview_visible.valid;
  457. OnPreviewVisible();
  458. }
  459. }
  460. var g_callback_dirty = false;
  461. function checkStaticJavascriptCodes(sci, list)
  462. {
  463. var row = sci.row;
  464. var firstVisibleLine = sci.firstVisibleLine;
  465. var content = sci.document;
  466. if(sci.document == '') return true;
  467. var ret = false;
  468. var keysReserve = [];
  469. var keysReserveModel = acCallbackOfModel(ui.model)(['']);
  470. if(keysReserveModel) keysReserve = keysReserve.concat(keysReserveModel);
  471. var keysReserveCallback = acCallbackOfCallback(['']);
  472. if(keysReserveCallback) keysReserve = keysReserve.concat(keysReserveCallback);
  473. keysReserve = keysReserve.map(item=>{
  474. var idx = item.indexOf('?');
  475. return idx == -1 ? item : item.substring(0, idx);
  476. });
  477. //console.log(keysReserve);
  478. if(content)
  479. {
  480. //var res = model.beautifyJS(content, ui.units.value);
  481. var res = model.syntaxStaticCheckJavascript(content, ui.units.value, keysReserve, !ui.pb_preview.valid);
  482. if(res.fixed)
  483. {
  484. content = res.output;
  485. sci.document = content;
  486. sci.row = row;
  487. sci.firstVisibleLine = firstVisibleLine;
  488. }
  489. list.visible = false;
  490. ret = true;
  491. if(res.messages && res.messages.length > 0)
  492. {
  493. list.table = [['Row', 'Column', 'Static Syntax Error List ( Number : ' + res.messages.length + ' )']]
  494. .concat(res.messages);
  495. list.visible = true;
  496. list.head_size = [-1,-1,0];
  497. //list.color = [0,0,'#EEEEEE'];
  498. //list.color = [0,1,'#EEEEEE'];
  499. //list.color = [0,2,'#EEEEEE'];
  500. list.head_color = '#FFB4B4';
  501. ret = false;
  502. if(ui.ignore_syntax.valid)
  503. {
  504. ret = true;
  505. }
  506. }
  507. else
  508. {
  509. list.table = [['Row', 'Column', 'Static Syntax Error List ( Number : ' + res.messages.length + ' )']];
  510. }
  511. }
  512. return ret;
  513. }
  514. function OnPluginEntryFind()
  515. {
  516. if(ui.plugin.range.low != 0 && ui.plugin_tab.index == 0 && isPluginTab())
  517. {
  518. ui.plugin_entry_find.value = ui.plugin.value;
  519. ui.plugin.regex = ui.plugin_entry_find.value;
  520. }
  521. if(ui.plugin_entry_find.value && ui.plugin_tab.index == 0 && isPluginTab())
  522. {
  523. ui.plugin.regex = ui.plugin_entry_find.value;
  524. }
  525. }
  526. function OnPluginSrcFind()
  527. {
  528. if(ui.plugin_src.range.low != 0 && ui.plugin_tab.index == 2 && isPluginTab())
  529. {
  530. ui.plugin_src_find.value = ui.plugin_src.value;
  531. ui.plugin_src.regex = ui.plugin_src_find.value;
  532. }
  533. if(ui.plugin_src_find.value && ui.plugin_tab.index == 2 && isPluginTab())
  534. {
  535. ui.plugin_src.regex = ui.plugin_src_find.value;
  536. }
  537. }
  538. function OnRegister()
  539. {
  540. unit.form.register_form.Show();
  541. }
  542. function OnGoCallbackLine()
  543. {
  544. ui.callback.row = ui.callback_line_no.value - 1;
  545. }
  546. function OnCallbackLineChange()
  547. {
  548. ui.callback_line_no.value = ui.callback.row + 1;
  549. }
  550. function OnGoModelLine()
  551. {
  552. ui.model.row = ui.model_line_no.value - 1;
  553. }
  554. function OnModelLineChange()
  555. {
  556. var require_list = model.getModelPackage(ui.units.value);
  557. modelRequireAutoComplete(ui.model, require_list);
  558. ui.model_line_no.value = ui.model.row + 1;
  559. }
  560. function getCurrentLineOfScintilla(sci)
  561. {
  562. return sci.line.replace(/\r|\n/g, '');
  563. }
  564. function isJavascriptRequireMode(sci)
  565. {
  566. var bIsGlobalMode = /require\('/.test(sci.line);
  567. var start = sci.line.indexOf('require(\'');
  568. if(start != -1) start += 8;
  569. var end = sci.line.indexOf('\')');
  570. if(end == -1) end = getCurrentLineOfScintilla(sci).length;
  571. return bIsGlobalMode && (sci.column > start && sci.column <= end);
  572. }
  573. function modelRequireAutoComplete(sci, require_list)
  574. {
  575. if(isJavascriptRequireMode(sci))
  576. {
  577. var offset = sci.column - sci.line.indexOf('require(\'') - 9;
  578. var word = sci.line.substring(sci.line.indexOf('require(\'') + 9, sci.column);
  579. //var require_list = model.getModelPackage(ui.units.value);
  580. sci.activateAutoComplete(require_list.filter(item=>{
  581. return word == '' ? true : item.indexOf(word) == 0;
  582. }).map(item=>{
  583. return item + '?13';
  584. }), offset);
  585. }
  586. }
  587. function initJavascriptEditorReadonlyProp()
  588. {
  589. ui.callback.readonly = true;
  590. ui.model.readonly = true;
  591. }
  592. function updateJavascriptEditorReadonlyProp()
  593. {
  594. ui.callback.readonly = (ui.units.value == 'comx_sdk');
  595. ui.model.readonly = (ui.units.value == 'comx_sdk');
  596. }
  597. function updateJavascriptEslint()
  598. {
  599. if(ui.units.value == 'comx_sdk'){
  600. ui.listEslintModel.visible = false;
  601. ui.listEslintCallback.visible = false;
  602. return;
  603. }
  604. var bPassCallback = checkStaticJavascriptCodes(ui.callback, ui.listEslintCallback);
  605. var bPassModel = checkStaticJavascriptCodes(ui.model, ui.listEslintModel);
  606. if(ui.listEslintCallback.table.length >= 2)
  607. {
  608. ui.main_tabctrl.index = 0;
  609. }
  610. else if(ui.listEslintModel.table.length >= 2)
  611. {
  612. ui.main_tabctrl.index = 1;
  613. }
  614. return bPassCallback && bPassModel;
  615. }
  616. function OnDocumentChanged()
  617. {
  618. refreshDocumentModifiedStatus();
  619. updateApiCallTip();
  620. updateJavascriptEditorReadonlyProp();
  621. }
  622. async function CheckJavascriptSyntaxBeforeSaveASync()
  623. {
  624. return new Promise(resolve=>{
  625. if(!updateJavascriptEslint())
  626. {
  627. resolve(false);
  628. return;
  629. }
  630. model.CheckJavascriptSyntax(
  631. ui.units.value,
  632. ui.forms.value,
  633. ui.callback.document,
  634. ui.model.document,
  635. (err, msg)=>{
  636. if(err)
  637. {
  638. outputError(msg);
  639. resolve(false);
  640. }
  641. else
  642. {
  643. resolve(true);
  644. }
  645. }
  646. );
  647. }).catch(error=>{
  648. console.log(error);
  649. });
  650. }
  651. function OnSave(is_silent, silent_cb)
  652. {
  653. outputInfo('');
  654. CheckJavascriptSyntaxBeforeSaveASync().then(success=>{
  655. if(success)
  656. {
  657. ui.cueline_stack.index = 1;
  658. OnSave_(is_silent);
  659. outputInfo('');
  660. updateFunctionList();
  661. if(is_silent && silent_cb) silent_cb(true);
  662. }
  663. else
  664. {
  665. g_save_lock = false;
  666. ui.pb_save.enable = true;
  667. }
  668. });
  669. }
  670. function OnSave_(is_slient)
  671. {
  672. model.saveJavascript(
  673. ui.units.value, ui.forms.value,
  674. ui.callback.document, ui.model.document);
  675. ui.callback.dirty = false;
  676. ui.model.firty = false;
  677. ui.pb_save.enable = false;
  678. if(is_slient)
  679. {
  680. return;
  681. }
  682. ui.callback.dirty = false;
  683. ui.model.dirty = false;
  684. var is_preview = ui.pb_preview.valid;
  685. model.closePreviewForm(ui.forms.value, function(err, result){
  686. if(err){outputError(result); return;}
  687. if(ui.units.value == 'comx_sdk' && ui.forms.value == 'kul_editor')
  688. {
  689. return;
  690. }
  691. ui.pb_preview.valid = is_preview;
  692. if(ui.pb_preview.valid)
  693. {
  694. enableKulEditor(false);
  695. setCuelineInfo('Save successfully, reloading the form context ...');
  696. model.previewForm(ui.units.value, ui.forms.value, function(err, result){
  697. if(err) {outputError(result); return;}
  698. model.updateGeometryToPreviewForm(ui.forms.value, getUiGeometry(),()=>{
  699. resetCueline();
  700. enableKulEditor(true);
  701. }, !ui.preview_visible.valid);
  702. }, ui.preview_visible.valid);
  703. }
  704. });
  705. }
  706. function OnException(err)
  707. {
  708. outputError(err);
  709. }
  710. function OnPreviewVisible()
  711. {
  712. if(!ui.pb_preview.valid) return;
  713. //OnPreview();
  714. model.closePreviewForm(ui.forms.value, function(err, result){
  715. if(err){outputError(result); return}
  716. ui.pb_preview.valid = true;
  717. if(ui.pb_preview.valid)
  718. {
  719. enableKulEditor(false);
  720. if(ui.preview_visible.valid){
  721. setCuelineInfo('Loading Preview Form ...');
  722. }
  723. else
  724. {
  725. setCuelineInfo('Hiding Preview Form ...');
  726. }
  727. model.previewForm(ui.units.value, ui.forms.value, function(err, result){
  728. if(err) {outputError(result); return;}
  729. model.updateGeometryToPreviewForm(
  730. ui.forms.value,
  731. getUiGeometry(),
  732. ()=>{
  733. // post-process
  734. // nothing
  735. //parent.setTimeout(()=>{
  736. OnClickTreeItem();
  737. enableKulEditor(true);
  738. resetCueline();
  739. //});
  740. },
  741. !ui.preview_visible.valid
  742. );
  743. }, ui.preview_visible.valid);
  744. }
  745. });
  746. }
  747. function OnPreview(force_close)
  748. {
  749. ui.preview_visible.enable = ui.pb_preview.valid;
  750. var closePreviewForm = model.closePreviewForm;
  751. if(force_close) closePreviewForm = model.killPreviewForm;
  752. closePreviewForm(ui.forms.value, function(err, result){
  753. if(err){outputError(result); return}
  754. if(ui.pb_preview.valid)
  755. {
  756. enableKulEditor(false);
  757. if(ui.preview_visible.valid)
  758. {
  759. setCuelineInfo('Loading Preview Form ...');
  760. }
  761. else
  762. {
  763. setCuelineInfo('Loading Preview Form Context...');
  764. }
  765. model.previewForm(ui.units.value, ui.forms.value, function(err, result){
  766. if(err) {outputError(result); return;}
  767. model.updateGeometryToPreviewForm(
  768. ui.forms.value,
  769. getUiGeometry(),
  770. ()=>{
  771. // post-process
  772. // nothing
  773. resetCueline();
  774. enableKulEditor(true);
  775. },
  776. !ui.preview_visible.valid
  777. );
  778. }, ui.preview_visible.valid);
  779. }
  780. });
  781. }
  782. function OnGeometryChange()
  783. {
  784. if(g_side_docker){
  785. if(ui.preview_visible.valid)model.updateGeometryToPreviewForm(ui.forms.value, getUiGeometry());
  786. }
  787. }
  788. var g_bUnitChangedLock = false;
  789. function OnAppendUnit()
  790. {
  791. var new_unit = ui.units.value;
  792. model.createUnit(new_unit, function(err, ret){
  793. if(err){ outputError(err); return;}
  794. outputInfo(ret);
  795. g_bUnitChangedLock = true;
  796. updateUnitList(false);
  797. for(var idx in ui.units.list)
  798. {
  799. if(ui.units.list[idx] == new_unit)
  800. {
  801. ui.units.index = idx;
  802. }
  803. }
  804. g_bUnitChangedLock = false;
  805. ui.forms.value = 'mainfrm';
  806. OnAppendForm();
  807. //Refresh Plugin Information.
  808. updatePlugin();
  809. });
  810. }
  811. function OnFormAccepted()
  812. {
  813. model.formExists(ui.units.value, ui.forms.value, function(err, result){
  814. //ui.pbaf.enable = err;
  815. if(err)
  816. {
  817. OnAppendForm();
  818. }
  819. else
  820. {
  821. OnFormChanged();
  822. }
  823. });
  824. }
  825. function OnAppendForm()
  826. {
  827. ui.tree.enable = true;
  828. ui.list.enable = true;
  829. ui.pbn_execute.enable = true;
  830. COMX_DEBUG('OnAppendForm caller is ' + OnAppendForm.caller);
  831. model.createForm(ui.units.value, ui.forms.value, function(err, info){
  832. if(err) {outputError(info); return;}
  833. outputInfo(info);
  834. updateFormList(true);
  835. //g_current_form_name = false;
  836. //ui.forms.index = ui.forms.list.length - 1;
  837. ui.pbaf.enable = false;
  838. });
  839. }
  840. function OnUnitChangedLight()
  841. {
  842. model.unitExists(ui.units.value, function(err, result){
  843. ui.pbau.enable = err;
  844. });
  845. }
  846. function OnUnitChanged()
  847. {
  848. if(g_bUnitChangedLock) return;
  849. COMX_DEBUG('OnUnitChanged caller is ' + OnUnitChanged.caller);
  850. model.unitExists(ui.units.value, function(err, result){
  851. //ui.pbau.enable = err;
  852. if(err)
  853. {
  854. OnAppendUnit();
  855. }
  856. else
  857. {
  858. updateFormList(false);
  859. updatePlugin();
  860. }
  861. });
  862. }
  863. function OnUnitIndexChanged()
  864. {
  865. COMX_DEBUG('OnUnitIndexChanged caller is ' + OnUnitIndexChanged.caller);
  866. OnUnitChanged();
  867. }
  868. function OnUnitAccepted()
  869. {
  870. COMX_DEBUG('OnUnitAccepted caller is ' + OnUnitAccepted.caller);
  871. OnUnitChanged();
  872. }
  873. var g_current_unit_name = false;
  874. var g_current_form_name = false;
  875. function OnFormChangedLight()
  876. {
  877. model.formExists(ui.units.value, ui.forms.value, function(err, result){
  878. ui.pbaf.enable = err;
  879. });
  880. }
  881. var g_bOnFormChangedLock = false;
  882. var g_save_lock = false;
  883. function enableKulEditor(flag)
  884. {
  885. ui.pb_preview.enable = flag;
  886. ui.execute_type.enable = flag;
  887. ui.pb_package.enable = flag;
  888. ui.pb_distribute.enable = flag;
  889. ui.preview_visible.enable = flag;
  890. g_save_lock = !flag;
  891. //ui.callback.readonly = !flag;
  892. //ui.model.readonly = !flag;
  893. //ui.plugin.readonly = !flag;
  894. //ui.gyp.readonly = !flag;
  895. //ui.plugin_src.readonly = !flag;
  896. }
  897. function OnFormChanged()
  898. {
  899. g_cueline_init = true;
  900. if(g_bOnFormChangedLock) return;
  901. if(g_current_unit_name == ui.units.value &&
  902. g_current_form_name == ui.forms.value)
  903. {
  904. return;
  905. }
  906. ui.pb_preview.enable = true;
  907. ui.execute_type.enable = true;
  908. ui.pb_package.enable = true;
  909. ui.pb_distribute.enable = true;
  910. ui.preview_visible.enable = true;
  911. g_current_unit_name = ui.units.value;
  912. g_current_form_name = ui.forms.value;
  913. if(ui.forms.value == '<empty>')
  914. {
  915. ui.pbaf.enable = false;
  916. ui.forms.value = '';
  917. return;
  918. }
  919. COMX_DEBUG('OnFormChanged caller is ' + OnFormChanged.caller);
  920. //ui.codes.value = ""; // clear possible range states
  921. ui.callback.document = ""; // clear possible range states
  922. ui.model.document = ""; // clear possible range states
  923. initJavascriptEditorReadonlyProp();
  924. model.formExists(ui.units.value, ui.forms.value, function(err, result){
  925. //ui.pbaf.enable = err;
  926. if(err) return;
  927. model.isDefaultForm(ui.units.value, ui.forms.value, function(err, result){
  928. if(err){ outputError(result); return;}
  929. ui.cbDF.valid = result;
  930. ui.cbDF.enable = !result;
  931. });
  932. model.loadFormFiles(ui.units.value, ui.forms.value, function(err, result){
  933. if(err){ outputError(result); return;}
  934. //ui.codes.value = result.ui_codes;
  935. ui.callback.document = result.callback;
  936. ui.model.document = result.model;
  937. //ui.codes.dirty = false;
  938. ui.callback.dirty = false;
  939. ui.model.dirty = false;
  940. OnDocumentChanged();
  941. updateJavascriptEslint();
  942. });
  943. model.switchCurrentFormDB(ui.units.value, ui.forms.value, function(err, result){
  944. if(err){ /*COMX_ERROR(result);*/ return; }
  945. //COMX_DEBUG(result.tree);
  946. ui.tree.tree = result.tree;
  947. OnClickTreeItem();
  948. });
  949. var is_preview = ui.pb_preview.valid;
  950. ui.cueline_stack.index = 1;
  951. ui.pb_save.enable = false;
  952. model.closePreviewForm(ui.forms.value, function(err, result){
  953. if(err){outputError(result); return}
  954. if(ui.units.value == 'comx_sdk' && ui.forms.value == 'kul_editor')
  955. {
  956. return;
  957. }
  958. ui.pb_preview.valid = is_preview;
  959. if(ui.pb_preview.valid)
  960. {
  961. enableKulEditor(false);
  962. setCuelineInfo('Loading Preview Form ...');
  963. model.previewForm(ui.units.value, ui.forms.value, function(err, result){
  964. if(err) {outputError(result); return;}
  965. model.updateGeometryToPreviewForm(
  966. ui.forms.value,
  967. getUiGeometry(),
  968. ()=>{
  969. // post-process
  970. // nothing
  971. resetCueline();
  972. enableKulEditor(true);
  973. },
  974. !ui.preview_visible.valid
  975. );
  976. }, ui.preview_visible.valid);
  977. }
  978. });
  979. updateFunctionList();
  980. updateCompositeFormList();
  981. });
  982. }
  983. function OnFormIndexChanged()
  984. {
  985. COMX_DEBUG('ui.forms.index is ' + ui.forms.index);
  986. COMX_DEBUG('OnFormIndexChanged caller is ' + OnFormIndexChanged.caller);
  987. //OnFormChanged();
  988. OnFormAccepted();
  989. }
  990. function OnSetDefaultForm()
  991. {
  992. model.setFormAsDefault(ui.units.value, ui.forms.value, function(err, result){
  993. if(err){ outputError(result); return;}
  994. outputInfo(JSON.stringify(result));
  995. ui.cbDF.enable = false;
  996. });
  997. }
  998. function OnExecute()
  999. {
  1000. if(ui.execute_type.index == 0)
  1001. model.executeUnit(ui.units.value, ui.forms.value);
  1002. else
  1003. model.executeUnit(ui.units.value, 'mainfrm');
  1004. }
  1005. function OnDebug()
  1006. {
  1007. let geo = ui.GetWidgetGeometry(ui.callback.handle);
  1008. ui.pb_preview.valid = false;
  1009. OnPreview(false);
  1010. setCuelineInfo('<span style="color:darkblue">Starting debugger, please wait a moment ...</span>');
  1011. parent.setTimeout(()=>{
  1012. setCuelineInfo('Ready.');
  1013. }, 15000);
  1014. ui.debug_btn.visible = false;
  1015. ui.stop_debug_btn.visible = true;
  1016. model.debugUnit(ui.units.value, geo, ()=>{
  1017. ui.debug_btn.visible = true;
  1018. ui.stop_debug_btn.visible = false;
  1019. setCuelineInfo('Ready.');
  1020. },()=>{
  1021. setCuelineInfo('Ready.');
  1022. });
  1023. }
  1024. function OnStopDebug()
  1025. {
  1026. model.stopDebugUnit(ui.units.value);
  1027. }
  1028. function OnFrame()
  1029. {
  1030. model.executeUnit('comx_sdk', 'kul_editor');
  1031. }
  1032. function getParentTabIndex()
  1033. {
  1034. var ret = [];
  1035. var init_pos = ui.tree.position;
  1036. while(true)
  1037. {
  1038. var cur_pos = ui.tree.position;
  1039. var parent_pos = ui.tree.parent;
  1040. if(parent_pos == 1)
  1041. {
  1042. break;
  1043. }
  1044. ui.tree.position = parent_pos;
  1045. if(isTabctrlTreeNode())
  1046. {
  1047. var children = ui.tree.children;
  1048. for(var idx = 0; idx < children.length; ++idx)
  1049. {
  1050. if(children[idx] == cur_pos)
  1051. {
  1052. ret.push({id : ui.tree.position, index : idx});
  1053. break;
  1054. }
  1055. }
  1056. }
  1057. }
  1058. ui.tree.position = init_pos;
  1059. return ret;
  1060. }
  1061. function isCompositeWidgetPropList(table)
  1062. {
  1063. var ret = false;
  1064. if(!Array.isArray(table))
  1065. {
  1066. return ret;
  1067. }
  1068. table.forEach((item)=>{
  1069. if(item[0] == 'style' &&
  1070. item[1] == 'composite')
  1071. {
  1072. ret = true;
  1073. }
  1074. });
  1075. return ret;
  1076. }
  1077. function clickTreeItem()
  1078. {
  1079. var id = ui.tree.position;
  1080. var type = ui.tree.node.name;
  1081. model.getListViewByID(id, type, function(err, result){
  1082. if(err){ outputError(result); return;}
  1083. if(type == 'hbox' || type == 'vbox')
  1084. {
  1085. var scroll_ignore = (result.table[3][1] == 'false');
  1086. if(scroll_ignore)
  1087. {
  1088. result.table = result.table.slice(0,4);
  1089. result.filters = result.filters.slice(0, 2);
  1090. }
  1091. }
  1092. ui.block_event = true;
  1093. if(id == 1 &&
  1094. isCompositeWidgetPropList(result.table))
  1095. {
  1096. ui.list.table = [[ 'Property', 'Value' ],
  1097. [ 'style', 'composite']];
  1098. ui.list.head_size = [0, 0];
  1099. ui.list.filter = [0, 1, ['popup', 'composite']];
  1100. }
  1101. else
  1102. {
  1103. ui.list.table = result.table;
  1104. ui.list.head_size = [0, 0];
  1105. for(var prop in result.filters)
  1106. {
  1107. ui.list.filter = result.filters[prop];
  1108. //COMX_DEBUG((result.filters[prop]));
  1109. }
  1110. for(var prop in result.list_buttons)
  1111. {
  1112. ui.list.button = result.list_buttons[prop];
  1113. }
  1114. }
  1115. var rows = ui.list.table.length - 1;
  1116. for(var row = 0; row < rows; ++ row)
  1117. {
  1118. ui.list.readOnly = [row, 0, true];
  1119. }
  1120. ui.block_event = false;
  1121. });
  1122. model.highlightWidget(id);
  1123. }
  1124. function OnClickTreeItem(bModify)
  1125. {
  1126. COMX_DEBUG('OnClickTreeItem caller is ' + OnClickTreeItem.caller);
  1127. clickTreeItem();
  1128. if(ui.tree.position == 1) return;
  1129. model.saveFormDBToKul(
  1130. ui.units.value, ui.forms.value,
  1131. function(err, result){
  1132. if(err){outputError(result); return;}
  1133. if(ui.units.value == 'comx_sdk' && ui.forms.value == 'kul_editor')
  1134. {
  1135. return;
  1136. }
  1137. if(ui.preview_visible.valid)
  1138. {
  1139. model.reloadPreviewForm(
  1140. ui.forms.value,
  1141. getParentTabIndex(),
  1142. function(err, result){
  1143. if(err) {if(result != false)outputError(result); return;}
  1144. if(ui.preview_visible.valid)
  1145. {
  1146. model.updateGeometryToPreviewForm(ui.forms.value, getUiGeometry());
  1147. }
  1148. });
  1149. }
  1150. });
  1151. }
  1152. var g_old_list = false;
  1153. function OnPropertyDClick()
  1154. {
  1155. outputInfo('');
  1156. g_old_list = ui.list.list;
  1157. }
  1158. function isInArray(arr, val)
  1159. {
  1160. for(var loop = 0; loop < arr.length; ++loop)
  1161. {
  1162. if(arr[loop] == val)
  1163. {
  1164. return true;
  1165. }
  1166. }
  1167. return false;
  1168. }
  1169. function isEventProp(prop)
  1170. {
  1171. var event_list = model.getEventList();
  1172. if(!event_list)
  1173. {
  1174. return false;
  1175. }
  1176. return isInArray(event_list, prop);
  1177. }
  1178. function createCallbackTemplate(prop, value, cb)
  1179. {
  1180. if(!value)
  1181. {
  1182. if(cb)cb(false);
  1183. return;
  1184. }
  1185. if(isEventProp(prop))
  1186. {
  1187. var fn = pickupCallbackFunctionName(value);
  1188. var callback = "\n\nfunction " + fn + "(){\n\n}\n";
  1189. var cur_cb_list = ui.callback_fn_list.list;
  1190. if(!isInArray(cur_cb_list, fn) && fn)
  1191. {
  1192. ui.callback.regex = '641a254c-ef3e-11ea-bc8a-379bb908bdd7';
  1193. ui.callback.column = ui.callback.line.length - 1;
  1194. ui.callback.inserter = callback;
  1195. OnSave(true, cb);
  1196. }
  1197. else
  1198. {
  1199. cb(false);
  1200. }
  1201. }
  1202. else
  1203. {
  1204. cb(false);
  1205. }
  1206. }
  1207. function isInteger(value)
  1208. {
  1209. return /^[0-9]\d*$/.test( '' + value);
  1210. }
  1211. function isDataProp(value)
  1212. {
  1213. return /^\d*[ \t]*,[ \t]*\d*[ \t]*,[ \t]*\d*$/.test('' + value);
  1214. }
  1215. function checkPropValue(prop, value)
  1216. {
  1217. if(prop == 'width' || prop == 'height')
  1218. {
  1219. if(ui.tree.position == 1 && value == 'auto')
  1220. {
  1221. return true;
  1222. }
  1223. return isInteger(value);
  1224. }
  1225. if(prop == 'size')
  1226. {
  1227. return value == 'auto' || isInteger(value);
  1228. }
  1229. if(prop == 'data' &&
  1230. (ui.tree.node.name == 'hprogbar' ||
  1231. ui.tree.node.name == 'vprogbar' ||
  1232. ui.tree.node.name == 'hslider' ||
  1233. ui.tree.node.name == 'vslider' ||
  1234. ui.tree.node.name == 'spin'
  1235. ))
  1236. {
  1237. return isDataProp(value);
  1238. }
  1239. if(prop == 'margin' ||
  1240. prop == 'group_id' ||
  1241. prop == 'icon_size' ||
  1242. prop == 'icon_hint')
  1243. {
  1244. return isInteger(value);
  1245. }
  1246. return true;
  1247. }
  1248. var g_OnPropertyChange_lock = false;
  1249. function OnPropertyClick()
  1250. {
  1251. var row = arguments[0];
  1252. var column = arguments[1];
  1253. ui.list.row = row;
  1254. var prop = ui.list.list[0];
  1255. var value = ui.list.list[1];
  1256. if(prop == 'bitmap' ||
  1257. prop == 'picture' ||
  1258. prop == 'icon')
  1259. {
  1260. unit.form.picture_mgr.Show();
  1261. }
  1262. }
  1263. function OnPropertyChange()
  1264. {
  1265. if(g_OnPropertyChange_lock) return;
  1266. var row = arguments[0];
  1267. var column = arguments[1];
  1268. if(column == 0)
  1269. {
  1270. if(g_old_list)
  1271. {
  1272. ui.list.list = g_old_list;
  1273. g_old_list = false;
  1274. }
  1275. return;
  1276. }
  1277. ui.list.row = row;
  1278. //if(ui.list.column == 1)
  1279. {
  1280. var prop = ui.list.list[0];
  1281. var value = ui.list.list[1];
  1282. value = value.replace(/(^[\s\t]*)|([\s\t]*$)/g, "");
  1283. if(isEventProp(prop))
  1284. {
  1285. if(value)
  1286. {
  1287. var fn = pickupCallbackFunctionName(value);
  1288. if(fn == '')
  1289. {
  1290. g_OnPropertyChange_lock = true;
  1291. ui.list.list = g_old_list;
  1292. g_old_list = false;
  1293. g_OnPropertyChange_lock = false;
  1294. outputError('The input value[\'' + value + '\'] of property[\'' + prop + '\'] is invalid!');
  1295. return;
  1296. }
  1297. }
  1298. }
  1299. if(!checkPropValue(prop, value))
  1300. {
  1301. g_OnPropertyChange_lock = true;
  1302. ui.list.list = g_old_list;
  1303. g_old_list = false;
  1304. g_OnPropertyChange_lock = false;
  1305. outputError('The input value[\'' + value + '\'] of property[\'' + prop + '\'] is invalid!');
  1306. return;
  1307. }
  1308. createCallbackTemplate(prop, value, (flag)=>{
  1309. //var value = ui.list.value;
  1310. //var prop = ui.list.value;
  1311. //COMX_DEBUG('the ID of current DB is ' + ui.tree.position);
  1312. //COMX_DEBUG('prop[' + prop + ']\'s value is ' + value);
  1313. //console.log('value is ' + value);
  1314. //console.log('prop is ' + prop);
  1315. model.updateWidgetPropertyToDB(ui.tree.position, prop, value, function(err, result){
  1316. if(err){outputError(result); return;}
  1317. var type = ui.tree.node.name;
  1318. if(prop == 'scroll' && (type == 'hbox' || type == 'vbox'))
  1319. {
  1320. clickTreeItem();
  1321. }
  1322. model.saveFormDBToKul(
  1323. ui.units.value, ui.forms.value,
  1324. function(err, result){
  1325. if(err){outputError(result); return;}
  1326. outputInfo('');
  1327. if(ui.tree.position == 1 &&
  1328. (prop == 'resize' ||
  1329. prop == 'maximum_box' ||
  1330. prop == 'minimum_box'
  1331. ))
  1332. {
  1333. clickTreeItem();
  1334. }
  1335. if(ui.tree.position == 1 &&
  1336. prop == 'style')
  1337. {
  1338. parent.setTimeout(clickTreeItem, 0);
  1339. }
  1340. if(!ui.pb_preview.valid)
  1341. {
  1342. return;
  1343. }
  1344. if(ui.tree.position == 1 || flag)
  1345. {
  1346. var is_preview = ui.pb_preview.valid;
  1347. model.closePreviewForm(ui.forms.value, function(err, result){
  1348. if(err){console.log(err);outputError(result); return}
  1349. if(ui.units.value == 'comx_sdk' && ui.forms.value == 'kul_editor')
  1350. {
  1351. return;
  1352. }
  1353. ui.pb_preview.valid = is_preview;
  1354. enableKulEditor(false);
  1355. setCuelineInfo('Property has been saved,reloading the form context ...');
  1356. model.previewForm(
  1357. ui.units.value,
  1358. ui.forms.value,
  1359. function(err, result){
  1360. if(err) {outputError(result); return;}
  1361. model.updateGeometryToPreviewForm(
  1362. ui.forms.value, getUiGeometry(),()=>{
  1363. resetCueline();
  1364. enableKulEditor(true);
  1365. },
  1366. !ui.preview_visible.valid
  1367. );
  1368. }, ui.preview_visible.valid);
  1369. });
  1370. }
  1371. else
  1372. {
  1373. if(ui.units.value == 'comx_sdk' && ui.forms.value == 'kul_editor')
  1374. {
  1375. return;
  1376. }
  1377. enableKulEditor(false);
  1378. setCuelineInfo('Property has been saved,reloading the form context ...');
  1379. model.reloadPreviewForm(ui.forms.value, 0, function(err, result){
  1380. if(err) {outputError(result); return;}
  1381. model.updateGeometryToPreviewForm(
  1382. ui.forms.value,
  1383. getUiGeometry(),
  1384. ()=>{
  1385. resetCueline();
  1386. enableKulEditor(true);
  1387. },
  1388. !ui.preview_visible.valid
  1389. );
  1390. }, !ui.preview_visible.valid);
  1391. }
  1392. });
  1393. });
  1394. });
  1395. // restore column
  1396. // ui.list.column = 1;
  1397. }
  1398. }
  1399. function getParentTreeNodeType()
  1400. {
  1401. var old_position = ui.tree.position;
  1402. ui.tree.position = ui.tree.parent;
  1403. var type = ui.tree.node.name;
  1404. ui.tree.position = old_position;
  1405. return type;
  1406. }
  1407. function getParentTreeNodeID()
  1408. {
  1409. var old_position = ui.tree.position;
  1410. ui.tree.position = ui.tree.parent;
  1411. var id = ui.tree.node.id;
  1412. ui.tree.position = old_position;
  1413. return id;
  1414. }
  1415. function isContrainTreeNode()
  1416. {
  1417. var type = ui.tree.node.name;
  1418. return type == 'hbox' || type == 'vbox' || type == 'stack' || type == "tabctrl";
  1419. }
  1420. function isTabctrlTreeNode()
  1421. {
  1422. var type = ui.tree.node.name;
  1423. return type == "tabctrl";
  1424. }
  1425. function isFormTreeNode()
  1426. {
  1427. var type = ui.tree.node.name;
  1428. return type == 'form';
  1429. }
  1430. function isHBoxConstrainTreeNode()
  1431. {
  1432. var type = ui.tree.node.name;
  1433. return type == 'hbox';
  1434. }
  1435. function isVBoxConstrainTreeNode()
  1436. {
  1437. var type = ui.tree.node.name;
  1438. return type == 'vbox';
  1439. }
  1440. function isPlainConstrainTreeNode()
  1441. {
  1442. var type = ui.tree.node.name;
  1443. return type == 'hbox' || type == 'vbox';
  1444. }
  1445. function isPlainConstrainParentTreeNode()
  1446. {
  1447. var type = getParentTreeNodeType();
  1448. return type == 'hbox' || type == 'vbox';
  1449. }
  1450. function isHBoxConstrainParentTreeNode()
  1451. {
  1452. var type = getParentTreeNodeType();
  1453. return type == 'hbox';
  1454. }
  1455. function isVBoxConstrainParentTreeNode()
  1456. {
  1457. var type = getParentTreeNodeType();
  1458. return type == 'vbox';
  1459. }
  1460. function isStackConstrainTreeNode()
  1461. {
  1462. var type = ui.tree.node.name;
  1463. return type == 'stack';
  1464. }
  1465. function isPlainConstrainParentTreeNode()
  1466. {
  1467. var type = getParentTreeNodeType();
  1468. return type == 'hbox' || type == 'vbox';
  1469. }
  1470. function isLeafTreeNode()
  1471. {
  1472. return (!isContrainTreeNode()) && (!(isFormTreeNode()));
  1473. }
  1474. function hasChildTreeNode()
  1475. {
  1476. return ui.tree.children != undefined;
  1477. }
  1478. function popupFormContentMenu()
  1479. {
  1480. if(!isFormTreeNode()) return;
  1481. if(!hasChildTreeNode())
  1482. {
  1483. var menu = [
  1484. {
  1485. name : 'Append a Top Constrain',
  1486. icon : '',
  1487. id : '1',
  1488. children : [
  1489. {
  1490. name : 'Horizontal Box',
  1491. icon : 'hbox',
  1492. id : '11'
  1493. },
  1494. {
  1495. name : 'Vertical Box',
  1496. icon : 'vbox',
  1497. id : '12'
  1498. },
  1499. {
  1500. name : 'Tabctrl',
  1501. icon : 'tabctrl',
  1502. id : '14'
  1503. }
  1504. ]
  1505. },
  1506. {
  1507. name : '-'
  1508. }];
  1509. if(parseWidgetFromClipboard())
  1510. {
  1511. menu.push({
  1512. name : 'Append from Clipboard',
  1513. icon : 'paste1',
  1514. id : '5'
  1515. });
  1516. }
  1517. ui.tree.content_menu = menu;
  1518. }
  1519. else
  1520. {
  1521. ui.tree.content_menu = [
  1522. {
  1523. name : 'Clear all Sub Widget',
  1524. icon : 'clear',
  1525. id : '2'
  1526. }
  1527. ];
  1528. }
  1529. }
  1530. function parseWidgetFromClipboard()
  1531. {
  1532. var clipcontent = ui.clipboard;
  1533. try
  1534. {
  1535. var obj = JSON.parse(clipcontent);
  1536. if(obj.node && obj.db)
  1537. {
  1538. var travelArray = [];
  1539. travelArray.push(obj.db);
  1540. for(var loop = 0; loop < travelArray.length; ++loop)
  1541. {
  1542. var node = travelArray[loop];
  1543. var props = node.property;
  1544. for(var idx = 0; idx < props.length; ++idx)
  1545. {
  1546. var prop_item = props[idx];
  1547. var value = "";
  1548. if(prop_item._)
  1549. value = prop_item._;
  1550. var name = prop_item.$.name;
  1551. if(name == 'name' && value != '')
  1552. {
  1553. prop_item._ = '';
  1554. }
  1555. if(isEventProp(name) && value != '')
  1556. {
  1557. prop_item._ = '';
  1558. }
  1559. }
  1560. if(node.widget)
  1561. {
  1562. for(var sub_loop = 0; sub_loop < node.widget.length; ++sub_loop)
  1563. {
  1564. travelArray.push(node.widget[sub_loop]);
  1565. }
  1566. }
  1567. }
  1568. return obj;
  1569. }
  1570. }
  1571. catch(e)
  1572. {
  1573. return false;
  1574. }
  1575. }
  1576. function popupConstrainContentMenu()
  1577. {
  1578. if(!isContrainTreeNode()) return;
  1579. var content_menu = [
  1580. {
  1581. name : 'Append a Constrain',
  1582. icon : '',
  1583. id : '1',
  1584. children : [
  1585. {
  1586. name : 'Horizontal Box',
  1587. icon : 'hbox',
  1588. id : '11'
  1589. },
  1590. {
  1591. name : 'Vertical Box',
  1592. icon : 'vbox',
  1593. id : '12'
  1594. },
  1595. {
  1596. name : 'Stack',
  1597. icon : 'stack',
  1598. id : '13'
  1599. },
  1600. {
  1601. name : 'Tabctrl',
  1602. icon : 'tabctrl',
  1603. id : '14'
  1604. }
  1605. ]
  1606. },
  1607. {
  1608. name : 'Append a Widget',
  1609. icon : '',
  1610. id : '1',
  1611. children : [
  1612. {
  1613. name : 'Bitmap',
  1614. icon : 'bitmap',
  1615. id : '17'
  1616. },
  1617. {
  1618. name : 'Checkbutton',
  1619. icon : 'checkbutton',
  1620. id : '18'
  1621. },
  1622. {
  1623. name : 'Combobox',
  1624. icon : 'combobox',
  1625. id : '19'
  1626. },
  1627. {
  1628. name : 'Edit',
  1629. icon : 'edit',
  1630. id : '20'
  1631. },
  1632. {
  1633. name : 'Glcanvas',
  1634. icon : 'glcanvas',
  1635. id : '33'
  1636. },
  1637. {
  1638. name : 'Label',
  1639. icon : 'label',
  1640. id : '21'
  1641. },
  1642. {
  1643. name : 'Listbox',
  1644. icon : 'listbox',
  1645. id : '22'
  1646. },
  1647. {
  1648. name : 'List',
  1649. icon : 'list',
  1650. id : '23'
  1651. },
  1652. {
  1653. name : 'Horizontal Progressbar',
  1654. icon : 'hprogbar',
  1655. id : '24'
  1656. },
  1657. {
  1658. name : 'Vertical Progressbar',
  1659. icon : 'vprogbar',
  1660. id : '25'
  1661. },
  1662. {
  1663. name : 'Pushbutton',
  1664. icon : 'pushbutton',
  1665. id : '26'
  1666. },
  1667. {
  1668. name : 'Radiobutton',
  1669. icon : 'radiobutton',
  1670. id : '27'
  1671. },
  1672. {
  1673. name : 'Scintilla',
  1674. icon : 'edit',
  1675. id : '28'
  1676. },
  1677. {
  1678. name : 'Horizontal Slider',
  1679. icon : 'hslider',
  1680. id : '29'
  1681. },
  1682. {
  1683. name : 'Vertical Slider',
  1684. icon : 'vslider',
  1685. id : '30'
  1686. },
  1687. {
  1688. name : 'Spin',
  1689. icon : 'spin',
  1690. id : '31'
  1691. },
  1692. {
  1693. name : 'Tree',
  1694. icon : 'tree',
  1695. id : '32'
  1696. },
  1697. {
  1698. name : 'Constrain',
  1699. icon : 'constrain',
  1700. id : '35'
  1701. },
  1702. {
  1703. name : 'Webview',
  1704. icon : 'webview',
  1705. id : '36'
  1706. }
  1707. ]
  1708. }
  1709. ];
  1710. if(isStackConstrainTreeNode())
  1711. {
  1712. content_menu = [
  1713. {
  1714. name : 'Append a Constrain',
  1715. icon : '',
  1716. id : '1',
  1717. children : [
  1718. {
  1719. name : 'Horizontal Box',
  1720. icon : 'hbox',
  1721. id : '11'
  1722. },
  1723. {
  1724. name : 'Vertical Box',
  1725. icon : 'vbox',
  1726. id : '12'
  1727. },
  1728. {
  1729. name : 'Stack',
  1730. icon : 'stack',
  1731. id : '13'
  1732. }
  1733. ]
  1734. },
  1735. {
  1736. name : 'Append a Widget',
  1737. icon : '',
  1738. id : '1',
  1739. children : [
  1740. {
  1741. name : 'Bitmap',
  1742. icon : 'bitmap',
  1743. id : '17'
  1744. },
  1745. {
  1746. name : 'Checkbutton',
  1747. icon : 'checkbutton',
  1748. id : '18'
  1749. },
  1750. {
  1751. name : 'Combobox',
  1752. icon : 'combobox',
  1753. id : '19'
  1754. },
  1755. {
  1756. name : 'Edit',
  1757. icon : 'edit',
  1758. id : '20'
  1759. },
  1760. {
  1761. name : 'Glcanvas',
  1762. icon : 'glcanvas',
  1763. id : '33'
  1764. },
  1765. {
  1766. name : 'Label',
  1767. icon : 'label',
  1768. id : '21'
  1769. },
  1770. {
  1771. name : 'Listbox',
  1772. icon : 'listbox',
  1773. id : '22'
  1774. },
  1775. {
  1776. name : 'List',
  1777. icon : 'list',
  1778. id : '23'
  1779. },
  1780. {
  1781. name : 'Horizontal Progressbar',
  1782. icon : 'hprogbar',
  1783. id : '24'
  1784. },
  1785. {
  1786. name : 'Vertical Progressbar',
  1787. icon : 'vprogbar',
  1788. id : '25'
  1789. },
  1790. {
  1791. name : 'Pushbutton',
  1792. icon : 'pushbutton',
  1793. id : '26'
  1794. },
  1795. {
  1796. name : 'Radiobutton',
  1797. icon : 'radiobutton',
  1798. id : '27'
  1799. },
  1800. {
  1801. name : 'Scintilla',
  1802. icon : 'edit',
  1803. id : '28'
  1804. },
  1805. {
  1806. name : 'Horizontal Slider',
  1807. icon : 'hslider',
  1808. id : '29'
  1809. },
  1810. {
  1811. name : 'Vertical Slider',
  1812. icon : 'vslider',
  1813. id : '30'
  1814. },
  1815. {
  1816. name : 'Spin',
  1817. icon : 'spin',
  1818. id : '31'
  1819. },
  1820. {
  1821. name : 'Tree',
  1822. icon : 'tree',
  1823. id : '32'
  1824. },
  1825. {
  1826. name : 'Constrain',
  1827. icon : 'constrain',
  1828. id : '35'
  1829. },
  1830. {
  1831. name : 'Webview',
  1832. icon : 'webview',
  1833. id : '36'
  1834. }
  1835. ]
  1836. }
  1837. ];
  1838. }
  1839. if(isPlainConstrainTreeNode())
  1840. {
  1841. if(isHBoxConstrainTreeNode())
  1842. {
  1843. content_menu.push(
  1844. {
  1845. name : 'Append a Stretch',
  1846. icon : '',
  1847. id : '1',
  1848. children : [
  1849. {
  1850. name : 'Space',
  1851. icon : 'hspace',
  1852. id : '15'
  1853. },
  1854. {
  1855. name : 'Separator',
  1856. icon : 'vseparator',
  1857. id : '16'
  1858. }
  1859. ]
  1860. });
  1861. }
  1862. if(isVBoxConstrainTreeNode())
  1863. {
  1864. content_menu.push(
  1865. {
  1866. name : 'Append a Stretch',
  1867. icon : '',
  1868. id : '1',
  1869. children : [
  1870. {
  1871. name : 'Space',
  1872. icon : 'vspace',
  1873. id : '15'
  1874. },
  1875. {
  1876. name : 'Separator',
  1877. icon : 'hseparator',
  1878. id : '16'
  1879. }
  1880. ]
  1881. });
  1882. }
  1883. }
  1884. content_menu.push(
  1885. {
  1886. name : '-'
  1887. });
  1888. if(getParentTreeNodeType() != 'form')
  1889. {
  1890. content_menu.push(
  1891. {
  1892. name : 'Insert a Constrain',
  1893. icon : '',
  1894. id : '6',
  1895. children : [
  1896. {
  1897. name : 'Horizontal Box',
  1898. icon : 'hbox',
  1899. id : '111'
  1900. },
  1901. {
  1902. name : 'Vertical Box',
  1903. icon : 'vbox',
  1904. id : '112'
  1905. },
  1906. {
  1907. name : 'Stack',
  1908. icon : 'stack',
  1909. id : '113'
  1910. },
  1911. {
  1912. name : 'Tabctrl',
  1913. icon : 'tabctrl',
  1914. id : '114'
  1915. }
  1916. ]
  1917. });
  1918. content_menu.push(
  1919. {
  1920. name : 'Insert a Widget',
  1921. icon : '',
  1922. id : '6',
  1923. children : [
  1924. {
  1925. name : 'Bitmap',
  1926. icon : 'bitmap',
  1927. id : '117'
  1928. },
  1929. {
  1930. name : 'Checkbutton',
  1931. icon : 'checkbutton',
  1932. id : '118'
  1933. },
  1934. {
  1935. name : 'Combobox',
  1936. icon : 'combobox',
  1937. id : '119'
  1938. },
  1939. {
  1940. name : 'Edit',
  1941. icon : 'edit',
  1942. id : '120'
  1943. },
  1944. {
  1945. name : 'Glcanvas',
  1946. icon : 'glcanvas',
  1947. id : '133'
  1948. },
  1949. {
  1950. name : 'Label',
  1951. icon : 'label',
  1952. id : '121'
  1953. },
  1954. {
  1955. name : 'Listbox',
  1956. icon : 'listbox',
  1957. id : '122'
  1958. },
  1959. {
  1960. name : 'List',
  1961. icon : 'list',
  1962. id : '123'
  1963. },
  1964. {
  1965. name : 'Horizontal Progressbar',
  1966. icon : 'hprogbar',
  1967. id : '124'
  1968. },
  1969. {
  1970. name : 'Vertical Progressbar',
  1971. icon : 'vprogbar',
  1972. id : '125'
  1973. },
  1974. {
  1975. name : 'Pushbutton',
  1976. icon : 'pushbutton',
  1977. id : '126'
  1978. },
  1979. {
  1980. name : 'Radiobutton',
  1981. icon : 'radiobutton',
  1982. id : '127'
  1983. },
  1984. {
  1985. name : 'Scintilla',
  1986. icon : 'edit',
  1987. id : '128'
  1988. },
  1989. {
  1990. name : 'Horizontal Slider',
  1991. icon : 'hslider',
  1992. id : '129'
  1993. },
  1994. {
  1995. name : 'Vertical Slider',
  1996. icon : 'vslider',
  1997. id : '130'
  1998. },
  1999. {
  2000. name : 'Spin',
  2001. icon : 'spin',
  2002. id : '131'
  2003. },
  2004. {
  2005. name : 'Tree',
  2006. icon : 'tree',
  2007. id : '132'
  2008. },
  2009. {
  2010. name : 'Constrain',
  2011. icon : 'constrain',
  2012. id : '135'
  2013. },
  2014. {
  2015. name : 'Webview',
  2016. icon : 'webview',
  2017. id : '135'
  2018. }
  2019. ]
  2020. });
  2021. if(isPlainConstrainParentTreeNode())
  2022. {
  2023. if(isHBoxConstrainParentTreeNode())
  2024. {
  2025. content_menu.push(
  2026. {
  2027. name : 'Insert a Stretch',
  2028. icon : '',
  2029. id : '6',
  2030. children : [
  2031. {
  2032. name : 'Space',
  2033. icon : 'hspace',
  2034. id : '115'
  2035. },
  2036. {
  2037. name : 'Separator',
  2038. icon : 'vseparator',
  2039. id : '116'
  2040. }
  2041. ]
  2042. });
  2043. }
  2044. if(isVBoxConstrainParentTreeNode())
  2045. {
  2046. content_menu.push(
  2047. {
  2048. name : 'Insert a Stretch',
  2049. icon : '',
  2050. id : '6',
  2051. children : [
  2052. {
  2053. name : 'Space',
  2054. icon : 'vspace',
  2055. id : '115'
  2056. },
  2057. {
  2058. name : 'Separator',
  2059. icon : 'hseparator',
  2060. id : '116'
  2061. }
  2062. ]
  2063. });
  2064. }
  2065. }
  2066. content_menu.push(
  2067. {
  2068. name : '-'
  2069. });
  2070. }
  2071. content_menu.push(
  2072. {
  2073. name : 'Clear all Sub Widget',
  2074. icon : 'clear',
  2075. id : '2'
  2076. });
  2077. content_menu.push(
  2078. {
  2079. name : 'Delete this Constrain',
  2080. icon : 'delete1',
  2081. id : '3'
  2082. });
  2083. content_menu.push(
  2084. {
  2085. name : '-'
  2086. });
  2087. if(parseWidgetFromClipboard())
  2088. {
  2089. content_menu.push(
  2090. {
  2091. name : 'Append from Clipboard',
  2092. icon : 'paste1',
  2093. id : '5'
  2094. });
  2095. var parent_type = getParentTreeNodeType();
  2096. if(parent_type == 'hbox' ||
  2097. parent_type == 'vbox' ||
  2098. parent_type == 'stack' ||
  2099. parent_type == 'tabctrl')
  2100. {
  2101. content_menu.push(
  2102. {
  2103. name : 'Insert from Clipboard',
  2104. icon : 'paste1',
  2105. id : '51'
  2106. });
  2107. }
  2108. }
  2109. content_menu.push(
  2110. {
  2111. name : 'Copy to Clipboard',
  2112. icon : 'copy',
  2113. id : '4'
  2114. });
  2115. if(g_composite_widget_list.length != 0)
  2116. {
  2117. var cw_list = g_composite_widget_list;
  2118. var appendWidgetMenu = content_menu[1].children;
  2119. var insertWidgetMenu = false;
  2120. for(var loop = 0; loop < content_menu.length; ++loop)
  2121. {
  2122. if(content_menu[loop].name == 'Insert a Widget')
  2123. {
  2124. insertWidgetMenu = content_menu[loop].children;
  2125. break;
  2126. }
  2127. }
  2128. var current_form_name = ui.forms.value;
  2129. var isCurrentComposite = false;
  2130. for(var loop = 0; loop < cw_list.length; ++loop)
  2131. {
  2132. if(cw_list[loop] == current_form_name)
  2133. {
  2134. isCurrentComposite = true;
  2135. break;
  2136. }
  2137. }
  2138. if(cw_list.length != 0 && !isCurrentComposite)
  2139. {
  2140. var cw_children_append = [];
  2141. var cw_children_insert = [];
  2142. for(var loop = 0; loop < cw_list.length; ++loop)
  2143. {
  2144. cw_children_append.push({
  2145. name : cw_list[loop],
  2146. icon : 'cw',
  2147. id : 1024 + loop
  2148. });
  2149. cw_children_insert.push({
  2150. name : cw_list[loop],
  2151. icon : 'cw',
  2152. id : 2024 + loop
  2153. });
  2154. }
  2155. appendWidgetMenu.push({
  2156. name : '-'
  2157. });
  2158. appendWidgetMenu.push({
  2159. name : 'Composite Widget',
  2160. icon : 'composite',
  2161. id : '34',
  2162. children : cw_children_append
  2163. });
  2164. if(insertWidgetMenu)
  2165. {
  2166. insertWidgetMenu.push({
  2167. name : '-'
  2168. });
  2169. insertWidgetMenu.push({
  2170. name : 'Composite Widget',
  2171. icon : 'composite',
  2172. id : '34',
  2173. children : cw_children_insert
  2174. });
  2175. }
  2176. }
  2177. }
  2178. ui.tree.content_menu = content_menu;
  2179. }
  2180. function getTypeFromID(id)
  2181. {
  2182. if(id > 200) id -= 100;
  2183. if(id > 100) id -= 100;
  2184. if(id == 11) return 'hbox';
  2185. if(id == 12) return 'vbox';
  2186. if(id == 13) return 'stack';
  2187. if(id == 14) return 'tabctrl';
  2188. if(id == 17) return 'bitmap';
  2189. if(id == 18) return 'checkbutton';
  2190. if(id == 19) return 'combobox';
  2191. if(id == 20) return 'edit';
  2192. if(id == 21) return 'label';
  2193. if(id == 22) return 'listbox';
  2194. if(id == 23) return 'list';
  2195. if(id == 24) return 'hprogbar';
  2196. if(id == 25) return 'vprogbar';
  2197. if(id == 26) return 'pushbutton';
  2198. if(id == 27) return 'radiobutton';
  2199. if(id == 28) return 'scintilla';
  2200. if(id == 29) return 'hslider';
  2201. if(id == 30) return 'vslider';
  2202. if(id == 31) return 'spin';
  2203. if(id == 32) return 'tree';
  2204. if(id == 33) return 'glcanvas';
  2205. if(id == 34) return 'composite';
  2206. if(id == 35) return 'constrain';
  2207. if(id == 36) return 'webview';
  2208. if(id == 15) return 'space';
  2209. if(id == 16) return 'separator';
  2210. }
  2211. function getIconFromID(id)
  2212. {
  2213. if(id > 200) id -= 100;
  2214. if(id > 100) id -= 100;
  2215. if(id > 1000) id = 34;
  2216. if(id == 11) return 'hbox';
  2217. if(id == 12) return 'vbox';
  2218. if(id == 13) return 'stack';
  2219. if(id == 14) return 'tabctrl';
  2220. if(id == 17) return 'bitmap';
  2221. if(id == 18) return 'checkbutton';
  2222. if(id == 19) return 'combobox';
  2223. if(id == 20) return 'edit';
  2224. if(id == 21) return 'label';
  2225. if(id == 22) return 'listbox';
  2226. if(id == 23) return 'list';
  2227. if(id == 24) return 'hprogbar';
  2228. if(id == 25) return 'vprogbar';
  2229. if(id == 26) return 'pushbutton';
  2230. if(id == 27) return 'radiobutton';
  2231. if(id == 28) return 'scintilla';
  2232. if(id == 29) return 'hslider';
  2233. if(id == 30) return 'vslider';
  2234. if(id == 31) return 'spin';
  2235. if(id == 32) return 'tree';
  2236. if(id == 33) return 'glcanvas';
  2237. if(id == 34) return 'composite';
  2238. if(id == 35) return 'constrain';
  2239. if(id == 36) return 'webview';
  2240. if(getParentTreeNodeType() == 'hbox')
  2241. {
  2242. if(id == 15) return 'hspace';
  2243. if(id == 16) return 'vseparator';
  2244. }
  2245. else
  2246. {
  2247. if(id == 15) return 'vspace';
  2248. if(id == 16) return 'hseparator';
  2249. }
  2250. }
  2251. function popupLeafWidgetContentMenu()
  2252. {
  2253. if(!isLeafTreeNode()) return;
  2254. if(isContrainTreeNode() || isFormTreeNode()) return ;
  2255. ///////////////////////////////////////////////////////////
  2256. var content_menu = [
  2257. {
  2258. name : 'Append a Constrain',
  2259. icon : '',
  2260. id : '1',
  2261. children : [
  2262. {
  2263. name : 'Horizontal Box',
  2264. icon : 'hbox',
  2265. id : '11'
  2266. },
  2267. {
  2268. name : 'Vertical Box',
  2269. icon : 'vbox',
  2270. id : '12'
  2271. },
  2272. {
  2273. name : 'Stack',
  2274. icon : 'stack',
  2275. id : '13'
  2276. },
  2277. {
  2278. name : 'Tabctrl',
  2279. icon : 'tabctrl',
  2280. id : '14'
  2281. }
  2282. ]
  2283. },
  2284. {
  2285. name : 'Append a Widget',
  2286. icon : '',
  2287. id : '1',
  2288. children : [
  2289. {
  2290. name : 'Bitmap',
  2291. icon : 'bitmap',
  2292. id : '17'
  2293. },
  2294. {
  2295. name : 'Checkbutton',
  2296. icon : 'checkbutton',
  2297. id : '18'
  2298. },
  2299. {
  2300. name : 'Combobox',
  2301. icon : 'combobox',
  2302. id : '19'
  2303. },
  2304. {
  2305. name : 'Edit',
  2306. icon : 'edit',
  2307. id : '20'
  2308. },
  2309. {
  2310. name : 'Glcanvas',
  2311. icon : 'glcanvas',
  2312. id : '33'
  2313. },
  2314. {
  2315. name : 'Label',
  2316. icon : 'label',
  2317. id : '21'
  2318. },
  2319. {
  2320. name : 'Listbox',
  2321. icon : 'listbox',
  2322. id : '22'
  2323. },
  2324. {
  2325. name : 'List',
  2326. icon : 'list',
  2327. id : '23'
  2328. },
  2329. {
  2330. name : 'Horizontal Progressbar',
  2331. icon : 'hprogbar',
  2332. id : '24'
  2333. },
  2334. {
  2335. name : 'Vertical Progressbar',
  2336. icon : 'vprogbar',
  2337. id : '25'
  2338. },
  2339. {
  2340. name : 'Pushbutton',
  2341. icon : 'pushbutton',
  2342. id : '26'
  2343. },
  2344. {
  2345. name : 'Radiobutton',
  2346. icon : 'radiobutton',
  2347. id : '27'
  2348. },
  2349. {
  2350. name : 'Scintilla',
  2351. icon : 'edit',
  2352. id : '28'
  2353. },
  2354. {
  2355. name : 'Horizontal Slider',
  2356. icon : 'hslider',
  2357. id : '29'
  2358. },
  2359. {
  2360. name : 'Vertical Slider',
  2361. icon : 'vslider',
  2362. id : '30'
  2363. },
  2364. {
  2365. name : 'Spin',
  2366. icon : 'spin',
  2367. id : '31'
  2368. },
  2369. {
  2370. name : 'Tree',
  2371. icon : 'tree',
  2372. id : '32'
  2373. },
  2374. {
  2375. name : 'Constrain',
  2376. icon : 'constrain',
  2377. id : '35'
  2378. },
  2379. {
  2380. name : 'Webview',
  2381. icon : 'webview',
  2382. id : '36'
  2383. }
  2384. ]
  2385. }
  2386. ];
  2387. if(getParentTreeNodeType() == 'stack')
  2388. {
  2389. content_menu = [
  2390. {
  2391. name : 'Append a Constrain',
  2392. icon : '',
  2393. id : '1',
  2394. children : [
  2395. {
  2396. name : 'Horizontal Box',
  2397. icon : 'hbox',
  2398. id : '11'
  2399. },
  2400. {
  2401. name : 'Vertical Box',
  2402. icon : 'vbox',
  2403. id : '12'
  2404. },
  2405. {
  2406. name : 'Stack',
  2407. icon : 'stack',
  2408. id : '13'
  2409. }
  2410. ]
  2411. },
  2412. {
  2413. name : 'Append a Widget',
  2414. icon : '',
  2415. id : '1',
  2416. children : [
  2417. {
  2418. name : 'Bitmap',
  2419. icon : 'bitmap',
  2420. id : '17'
  2421. },
  2422. {
  2423. name : 'Checkbutton',
  2424. icon : 'checkbutton',
  2425. id : '18'
  2426. },
  2427. {
  2428. name : 'Combobox',
  2429. icon : 'combobox',
  2430. id : '19'
  2431. },
  2432. {
  2433. name : 'Edit',
  2434. icon : 'edit',
  2435. id : '20'
  2436. },
  2437. {
  2438. name : 'Glcanvas',
  2439. icon : 'glcanvas',
  2440. id : '33'
  2441. },
  2442. {
  2443. name : 'Label',
  2444. icon : 'label',
  2445. id : '21'
  2446. },
  2447. {
  2448. name : 'Listbox',
  2449. icon : 'listbox',
  2450. id : '22'
  2451. },
  2452. {
  2453. name : 'List',
  2454. icon : 'list',
  2455. id : '23'
  2456. },
  2457. {
  2458. name : 'Horizontal Progressbar',
  2459. icon : 'hprogbar',
  2460. id : '24'
  2461. },
  2462. {
  2463. name : 'Vertical Progressbar',
  2464. icon : 'vprogbar',
  2465. id : '25'
  2466. },
  2467. {
  2468. name : 'Pushbutton',
  2469. icon : 'pushbutton',
  2470. id : '26'
  2471. },
  2472. {
  2473. name : 'Radiobutton',
  2474. icon : 'radiobutton',
  2475. id : '27'
  2476. },
  2477. {
  2478. name : 'Scintilla',
  2479. icon : 'edit',
  2480. id : '28'
  2481. },
  2482. {
  2483. name : 'Horizontal Slider',
  2484. icon : 'hslider',
  2485. id : '29'
  2486. },
  2487. {
  2488. name : 'Vertical Slider',
  2489. icon : 'vslider',
  2490. id : '30'
  2491. },
  2492. {
  2493. name : 'Spin',
  2494. icon : 'spin',
  2495. id : '31'
  2496. },
  2497. {
  2498. name : 'Tree',
  2499. icon : 'tree',
  2500. id : '32'
  2501. },
  2502. {
  2503. name : 'Constrain',
  2504. icon : 'constrain',
  2505. id : '35'
  2506. },
  2507. {
  2508. name : 'Webview',
  2509. icon : 'webview',
  2510. id : '36'
  2511. }
  2512. ]
  2513. }
  2514. ];
  2515. }
  2516. if(getParentTreeNodeType() == 'hbox' || getParentTreeNodeType() == 'vbox')
  2517. {
  2518. if(getParentTreeNodeType() == 'hbox')
  2519. {
  2520. content_menu.push(
  2521. {
  2522. name : 'Append a Stretch',
  2523. icon : '',
  2524. id : '1',
  2525. children : [
  2526. {
  2527. name : 'Space',
  2528. icon : 'hspace',
  2529. id : '15'
  2530. },
  2531. {
  2532. name : 'Separator',
  2533. icon : 'vseparator',
  2534. id : '16'
  2535. }
  2536. ]
  2537. });
  2538. }
  2539. if(getParentTreeNodeType() == 'vbox')
  2540. {
  2541. content_menu.push(
  2542. {
  2543. name : 'Append a Stretch',
  2544. icon : '',
  2545. id : '1',
  2546. children : [
  2547. {
  2548. name : 'Space',
  2549. icon : 'vspace',
  2550. id : '15'
  2551. },
  2552. {
  2553. name : 'Separator',
  2554. icon : 'hseparator',
  2555. id : '16'
  2556. }
  2557. ]
  2558. });
  2559. }
  2560. }
  2561. content_menu.push(
  2562. {
  2563. name : '-'
  2564. });
  2565. if(getParentTreeNodeType() != 'form')
  2566. {
  2567. if(getParentTreeNodeType() == 'stack')
  2568. {
  2569. content_menu.push(
  2570. {
  2571. name : 'Insert a Constrain',
  2572. icon : '',
  2573. id : '6',
  2574. children : [
  2575. {
  2576. name : 'Horizontal Box',
  2577. icon : 'hbox',
  2578. id : '111'
  2579. },
  2580. {
  2581. name : 'Vertical Box',
  2582. icon : 'vbox',
  2583. id : '112'
  2584. },
  2585. {
  2586. name : 'Stack',
  2587. icon : 'stack',
  2588. id : '113'
  2589. }
  2590. ]
  2591. });
  2592. }
  2593. else
  2594. {
  2595. content_menu.push(
  2596. {
  2597. name : 'Insert a Constrain',
  2598. icon : '',
  2599. id : '6',
  2600. children : [
  2601. {
  2602. name : 'Horizontal Box',
  2603. icon : 'hbox',
  2604. id : '111'
  2605. },
  2606. {
  2607. name : 'Vertical Box',
  2608. icon : 'vbox',
  2609. id : '112'
  2610. },
  2611. {
  2612. name : 'Stack',
  2613. icon : 'stack',
  2614. id : '113'
  2615. }
  2616. ]
  2617. });
  2618. }
  2619. content_menu.push(
  2620. {
  2621. name : 'Insert a Widget',
  2622. icon : '',
  2623. id : '6',
  2624. children : [
  2625. {
  2626. name : 'Bitmap',
  2627. icon : 'bitmap',
  2628. id : '117'
  2629. },
  2630. {
  2631. name : 'Checkbutton',
  2632. icon : 'checkbutton',
  2633. id : '118'
  2634. },
  2635. {
  2636. name : 'Combobox',
  2637. icon : 'combobox',
  2638. id : '119'
  2639. },
  2640. {
  2641. name : 'Edit',
  2642. icon : 'edit',
  2643. id : '120'
  2644. },
  2645. {
  2646. name : 'Glcanvas',
  2647. icon : 'glcanvas',
  2648. id : '133'
  2649. },
  2650. {
  2651. name : 'Label',
  2652. icon : 'label',
  2653. id : '121'
  2654. },
  2655. {
  2656. name : 'Listbox',
  2657. icon : 'listbox',
  2658. id : '122'
  2659. },
  2660. {
  2661. name : 'List',
  2662. icon : 'list',
  2663. id : '123'
  2664. },
  2665. {
  2666. name : 'Horizontal Progressbar',
  2667. icon : 'hprogbar',
  2668. id : '124'
  2669. },
  2670. {
  2671. name : 'Vertical Progressbar',
  2672. icon : 'vprogbar',
  2673. id : '125'
  2674. },
  2675. {
  2676. name : 'Pushbutton',
  2677. icon : 'pushbutton',
  2678. id : '126'
  2679. },
  2680. {
  2681. name : 'Radiobutton',
  2682. icon : 'radiobutton',
  2683. id : '127'
  2684. },
  2685. {
  2686. name : 'Scintilla',
  2687. icon : 'edit',
  2688. id : '128'
  2689. },
  2690. {
  2691. name : 'Horizontal Slider',
  2692. icon : 'hslider',
  2693. id : '129'
  2694. },
  2695. {
  2696. name : 'Vertical Slider',
  2697. icon : 'vslider',
  2698. id : '130'
  2699. },
  2700. {
  2701. name : 'Spin',
  2702. icon : 'spin',
  2703. id : '131'
  2704. },
  2705. {
  2706. name : 'Tree',
  2707. icon : 'tree',
  2708. id : '132'
  2709. },
  2710. {
  2711. name : 'Constrain',
  2712. icon : 'constrain',
  2713. id : '135'
  2714. },
  2715. {
  2716. name : 'Webview',
  2717. icon : 'webview',
  2718. id : '136'
  2719. }
  2720. ]
  2721. });
  2722. if(isPlainConstrainParentTreeNode())
  2723. {
  2724. if(isHBoxConstrainParentTreeNode())
  2725. {
  2726. content_menu.push(
  2727. {
  2728. name : 'Insert a Stretch',
  2729. icon : '',
  2730. id : '6',
  2731. children : [
  2732. {
  2733. name : 'Space',
  2734. icon : 'hspace',
  2735. id : '115'
  2736. },
  2737. {
  2738. name : 'Separator',
  2739. icon : 'vseparator',
  2740. id : '116'
  2741. }
  2742. ]
  2743. });
  2744. }
  2745. if(isVBoxConstrainParentTreeNode())
  2746. {
  2747. content_menu.push(
  2748. {
  2749. name : 'Insert a Stretch',
  2750. icon : '',
  2751. id : '6',
  2752. children : [
  2753. {
  2754. name : 'Space',
  2755. icon : 'vspace',
  2756. id : '115'
  2757. },
  2758. {
  2759. name : 'Separator',
  2760. icon : 'hseparator',
  2761. id : '116'
  2762. }
  2763. ]
  2764. });
  2765. }
  2766. }
  2767. content_menu.push(
  2768. {
  2769. name : '-'
  2770. });
  2771. }
  2772. content_menu.push(
  2773. {
  2774. name : '-'
  2775. });
  2776. content_menu.push(
  2777. {
  2778. name : 'Delete This Widget',
  2779. icon : 'delete1',
  2780. id : '2'
  2781. });
  2782. content_menu.push(
  2783. {
  2784. name : '-'
  2785. });
  2786. if(parseWidgetFromClipboard())
  2787. {
  2788. content_menu.push(
  2789. {
  2790. name : 'Append from Clipboard',
  2791. icon : 'paste1',
  2792. id : '5'
  2793. });
  2794. content_menu.push(
  2795. {
  2796. name : 'Insert from Clipboard',
  2797. icon : 'paste1',
  2798. id : '51'
  2799. });
  2800. }
  2801. content_menu.push(
  2802. {
  2803. name : 'Copy to Clipboard',
  2804. icon : 'copy',
  2805. id : '4'
  2806. });
  2807. if(g_composite_widget_list.length != 0)
  2808. {
  2809. var cw_list = g_composite_widget_list;
  2810. var appendWidgetMenu = content_menu[1].children;
  2811. //var insertWidgetMenu = content_menu[5].children;
  2812. var insertWidgetMenu = false;
  2813. for(var loop = 0; loop < content_menu.length; ++loop)
  2814. {
  2815. if(content_menu[loop].name == 'Insert a Widget')
  2816. {
  2817. insertWidgetMenu = content_menu[loop].children;
  2818. break;
  2819. }
  2820. }
  2821. var current_form_name = ui.forms.value;
  2822. var isCurrentComposite = false;
  2823. for(var loop = 0; loop < cw_list.length; ++loop)
  2824. {
  2825. if(cw_list[loop] == current_form_name)
  2826. {
  2827. isCurrentComposite = true;
  2828. break;
  2829. }
  2830. }
  2831. if(cw_list.length != 0 && !isCurrentComposite)
  2832. {
  2833. var cw_children_append = [];
  2834. var cw_children_insert = [];
  2835. for(var loop = 0; loop < cw_list.length; ++loop)
  2836. {
  2837. cw_children_append.push({
  2838. name : cw_list[loop],
  2839. icon : 'cw',
  2840. id : 1024 + loop
  2841. });
  2842. cw_children_insert.push({
  2843. name : cw_list[loop],
  2844. icon : 'cw',
  2845. id : 2024 + loop
  2846. });
  2847. }
  2848. appendWidgetMenu.push({
  2849. name : '-'
  2850. });
  2851. appendWidgetMenu.push({
  2852. name : 'Composite Widget',
  2853. icon : 'composite',
  2854. id : '34',
  2855. children : cw_children_append
  2856. });
  2857. if(insertWidgetMenu)
  2858. {
  2859. insertWidgetMenu.push({
  2860. name : '-'
  2861. });
  2862. insertWidgetMenu.push({
  2863. name : 'Composite Widget',
  2864. icon : 'composite',
  2865. id : '34',
  2866. children : cw_children_insert
  2867. });
  2868. }
  2869. }
  2870. }
  2871. ui.tree.content_menu = content_menu;
  2872. }
  2873. function OnRClickTreeItem()
  2874. {
  2875. //clickTreeItem();
  2876. popupFormContentMenu();
  2877. popupConstrainContentMenu();
  2878. popupLeafWidgetContentMenu();
  2879. parent.setTimeout(OnClickTreeItem);
  2880. }
  2881. function OnContentMenu()
  2882. {
  2883. OnContentMenuAsync(function(err, result, cb){
  2884. if(err){ outputError(result); return;}
  2885. OnClickTreeItem(true);
  2886. });
  2887. }
  2888. function insertFromClipboard(cb)
  2889. {
  2890. var obj = parseWidgetFromClipboard();
  2891. model.insertWidgetsToDB(ui.tree.parent, ui.tree.position, obj.db, function(err, result){
  2892. function getChildWidget(node)
  2893. {
  2894. return node.widget;
  2895. }
  2896. if(err) COMX_ERROR(result);
  2897. if(!err)
  2898. {
  2899. var nid = model.generateNewWidgetID();
  2900. var travelDBArray = [];
  2901. var travelTreeArray = [];
  2902. travelDBArray.push(obj.db);
  2903. travelTreeArray.push(ui.tree.position);
  2904. for(var idx = 0; idx < travelDBArray.length; ++idx)
  2905. {
  2906. ui.tree.position = travelTreeArray[idx];
  2907. nid = model.generateNewWidgetID();
  2908. var node = travelDBArray[idx];
  2909. var name = node.$.type;
  2910. var icon = node.$.type;
  2911. if(name == 'space')
  2912. {
  2913. icon = 'hspace';
  2914. //COMX_DEBUG(parent.name);
  2915. if(getParentTreeNodeType() == 'vbox')
  2916. {
  2917. icon = 'vspace';
  2918. }
  2919. }
  2920. if(name == 'separator')
  2921. {
  2922. if(getParentTreeNodeType() == 'vbox')
  2923. {
  2924. icon = 'hseparator';
  2925. }
  2926. /*if(tree_node.name == 'hbox')
  2927. {
  2928. icon = 'vseparator';
  2929. }*/
  2930. }
  2931. if(idx == 0)
  2932. {
  2933. ui.tree.inserter = {
  2934. name : name,
  2935. icon : icon,
  2936. id : nid
  2937. };
  2938. }
  2939. else if(ui.tree.children && ui.tree.children.length)
  2940. {
  2941. ui.tree.position = ui.tree.children[0];
  2942. ui.tree.tail = {
  2943. name : name,
  2944. icon : icon,
  2945. id : nid
  2946. };
  2947. }
  2948. else
  2949. {
  2950. ui.tree.node = [
  2951. {
  2952. name : name,
  2953. icon : icon,
  2954. id : nid
  2955. }
  2956. ];
  2957. }
  2958. result.list[nid] = node;
  2959. var children = getChildWidget(node);
  2960. if(!children)
  2961. {
  2962. continue;
  2963. }
  2964. for(var sub_idx = 0; sub_idx < children.length; ++sub_idx)
  2965. {
  2966. var child = children[sub_idx];
  2967. travelDBArray.push(child);
  2968. travelTreeArray.push(nid);
  2969. }
  2970. }
  2971. cb();
  2972. }
  2973. });
  2974. }
  2975. function appendFromClipboard(cb)
  2976. {
  2977. var obj = parseWidgetFromClipboard();
  2978. model.appendWidgetsToDB(ui.tree.position, obj.db, function(err, result){
  2979. function getChildWidget(node)
  2980. {
  2981. return node.widget;
  2982. }
  2983. if(err) COMX_ERROR(result);
  2984. if(!err)
  2985. {
  2986. //ui.tree.position = nid;
  2987. var nid = model.generateNewWidgetID();
  2988. var travelDBArray = [];
  2989. var travelTreeArray = [];
  2990. travelDBArray.push(obj.db);
  2991. travelTreeArray.push(ui.tree.position);
  2992. for(var idx = 0; idx < travelDBArray.length; ++idx)
  2993. {
  2994. ui.tree.position = travelTreeArray[idx];
  2995. nid = model.generateNewWidgetID();
  2996. var node = travelDBArray[idx];
  2997. var name = node.$.type;
  2998. var icon = node.$.type;
  2999. if(name == 'space')
  3000. {
  3001. icon = 'hspace';
  3002. //COMX_DEBUG(parent.name);
  3003. if(getParentTreeNodeType() == 'vbox')
  3004. {
  3005. icon = 'vspace';
  3006. }
  3007. }
  3008. if(name == 'separator')
  3009. {
  3010. if(getParentTreeNodeType() == 'vbox')
  3011. {
  3012. icon = 'hseparator';
  3013. }
  3014. /*if(tree_node.name == 'hbox')
  3015. {
  3016. icon = 'vseparator';
  3017. }*/
  3018. }
  3019. if(ui.tree.children && ui.tree.children.length)
  3020. {
  3021. ui.tree.position = ui.tree.children[0];
  3022. ui.tree.tail = {
  3023. name : name,
  3024. icon : icon,
  3025. id : nid
  3026. };
  3027. }
  3028. else
  3029. {
  3030. ui.tree.node = [
  3031. {
  3032. name : name,
  3033. icon : icon,
  3034. id : nid
  3035. }
  3036. ];
  3037. }
  3038. result.list[nid] = node;
  3039. var children = getChildWidget(node);
  3040. if(!children)
  3041. {
  3042. continue;
  3043. }
  3044. for(var sub_idx = 0; sub_idx < children.length; ++sub_idx)
  3045. {
  3046. var child = children[sub_idx];
  3047. travelDBArray.push(child);
  3048. travelTreeArray.push(nid);
  3049. }
  3050. }
  3051. cb();
  3052. }
  3053. });
  3054. }
  3055. function clearAllSubWidgets(cb)
  3056. {
  3057. outputInfo('action: clear all sub widgets');
  3058. var cur_node = ui.tree.node;
  3059. var cur_pos = ui.tree.position;
  3060. cur_node.children = undefined;
  3061. ui.tree.node = cur_node;
  3062. ui.tree.position = cur_pos;
  3063. model.clearChildWidgetFromDB(ui.tree.position, function(err, result){
  3064. cb(err, result);
  3065. });
  3066. }
  3067. function deleteWidget(cb)
  3068. {
  3069. var pid = ui.tree.parent;
  3070. var id = ui.tree.position;
  3071. ui.tree.node = undefined;
  3072. model.deleteWidgetFromDB(pid, id, function(err, result){
  3073. cb(err, result);
  3074. });
  3075. }
  3076. function copyCurrentUINodeToClipboard()
  3077. {
  3078. var clipcontent = {node : ui.tree.node, db : model.getDatabaseById(ui.tree.position)};
  3079. ui.clipboard = JSON.stringify(clipcontent);
  3080. }
  3081. function appendCompositeToConstrain(menu_id, cb)
  3082. {
  3083. var nid = model.generateNewWidgetID();
  3084. //Update Widget Tree.
  3085. if(!ui.tree.children) //There isn't any child widget in current constrain.
  3086. {
  3087. var cur_node = ui.tree.node;
  3088. cur_node.children = [];
  3089. cur_node.children.push({
  3090. name : 'composite',
  3091. icon : 'composite',
  3092. id : nid
  3093. });
  3094. ui.tree.node = cur_node;
  3095. }
  3096. else // There are child widget(s) in current constrain.
  3097. {
  3098. var cur_pos = ui.tree.position;
  3099. ui.tree.position = ui.tree.children[0];
  3100. ui.tree.tail = {
  3101. name : 'composite',
  3102. icon : 'composite',
  3103. id : nid
  3104. };
  3105. ui.tree.position = cur_pos;
  3106. }
  3107. //model.getCompositeFormList(ui.units.value, (err, cw_list)=>{
  3108. var cw_list = g_composite_widget_list;
  3109. var cw_idx = parseInt(menu_id) - 1024;
  3110. var ref = cw_list[cw_idx];
  3111. //Update KUL database.
  3112. model.appendCompositeWidgetToDB(
  3113. ui.tree.position,
  3114. ref,
  3115. nid,
  3116. function(err, result){
  3117. if(!err)
  3118. {
  3119. ui.tree.position = nid;
  3120. }
  3121. cb(err, result);
  3122. }
  3123. );
  3124. //});
  3125. }
  3126. function appendWidgetToConstrain(menu_id, cb)
  3127. {
  3128. var nid = model.generateNewWidgetID();
  3129. //Update Widget Tree.
  3130. if(!ui.tree.children) //There isn't any child widget in current constrain.
  3131. {
  3132. var cur_node = ui.tree.node;
  3133. cur_node.children = [];
  3134. cur_node.children.push({
  3135. name : getTypeFromID(menu_id),
  3136. icon : getIconFromID(menu_id),
  3137. id : nid
  3138. });
  3139. ui.tree.node = cur_node;
  3140. }
  3141. else // There are child widget(s) in current constrain.
  3142. {
  3143. var cur_pos = ui.tree.position;
  3144. ui.tree.position = ui.tree.children[0];
  3145. ui.tree.tail = {
  3146. name : getTypeFromID(menu_id),
  3147. icon : getIconFromID(menu_id),
  3148. id : nid
  3149. };
  3150. ui.tree.position = cur_pos;
  3151. }
  3152. //Update KUL database.
  3153. model.appendWidgetToDB(
  3154. ui.tree.position,
  3155. getTypeFromID(menu_id),
  3156. nid,
  3157. function(err, result){
  3158. if(!err)
  3159. {
  3160. ui.tree.position = nid;
  3161. }
  3162. cb(err, result);
  3163. });
  3164. }
  3165. function appendWidgetToForm(menu_id, cb)
  3166. {
  3167. var cur_node = ui.tree.node;
  3168. cur_node.children = [];
  3169. var nid = model.generateNewWidgetID();
  3170. cur_node.children.push({
  3171. name : getTypeFromID(menu_id),
  3172. icon : getIconFromID(menu_id),
  3173. id : nid
  3174. });
  3175. ui.tree.node = cur_node;
  3176. model.appendWidgetToDB(
  3177. ui.tree.position,
  3178. getTypeFromID(menu_id),
  3179. nid,
  3180. function(err, result){
  3181. if(!err)
  3182. {
  3183. ui.tree.position = nid;
  3184. }
  3185. cb(err, result);
  3186. });
  3187. }
  3188. function insertCompositeBeforeCurrentNode(menu_id, cb)
  3189. {
  3190. var nid = model.generateNewWidgetID();
  3191. var pid = ui.tree.parent;
  3192. var id = ui.tree.position;
  3193. ui.tree.inserter = {
  3194. name : 'composite',
  3195. icon : 'composite',
  3196. id : nid
  3197. };
  3198. var cw_list = g_composite_widget_list;
  3199. //model.getCompositeFormList(ui.units.value, (err, cw_list)=>{
  3200. var cw_idx = parseInt(menu_id) - 2024;
  3201. var ref = cw_list[cw_idx];
  3202. //Update KUL database.
  3203. model.insertCompositeToDB(
  3204. pid, id,
  3205. ref,
  3206. nid,
  3207. function(err, result){
  3208. if(!err)
  3209. {
  3210. ui.tree.position = nid;
  3211. }
  3212. cb(err, result);
  3213. }
  3214. );
  3215. //});
  3216. }
  3217. function insertWidgetBeforeCurrentNode(menu_id, cb)
  3218. {
  3219. var nid = model.generateNewWidgetID();
  3220. var pid = ui.tree.parent;
  3221. var id = ui.tree.position;
  3222. ui.tree.inserter = {
  3223. name : getTypeFromID(menu_id),
  3224. icon : getIconFromID(menu_id),
  3225. id : nid
  3226. };
  3227. model.insertWidgetToDB(
  3228. pid, id,
  3229. getTypeFromID(menu_id),
  3230. nid,
  3231. function(err, result){
  3232. if(!err)
  3233. {
  3234. ui.tree.position = nid;
  3235. }
  3236. cb(err, result);
  3237. });
  3238. }
  3239. function isGroupMenuID (menu_id) { return menu_id == 1; }
  3240. function isConstrainInsertMenuID (menu_id) { return menu_id > 100 && menu_id < 200; }
  3241. function isInsertCompositeMenuID (menu_id) { return menu_id >= 2024;}
  3242. function isAppendCompositeMenuID (menu_id) { return menu_id >= 1024 && menu_id < 2024;}
  3243. function isAddParentConstrainMenuID (menu_id) { return menu_id > 200 && menu_id < 1024;}
  3244. function isCopyToClipboardMenuID (menu_id) { return menu_id == 4; }
  3245. function isAppendFromClipboardMenuID(menu_id) { return menu_id == 5; }
  3246. function isInsertFromClipboardMenuID(menu_id) { return menu_id == 51;}
  3247. function isClearAllSubWidgetsMenuID (menu_id) {
  3248. return menu_id == 2 && (isContrainTreeNode() || isFormTreeNode());
  3249. }
  3250. function isDeleteWidgetMenuID (menu_id){
  3251. return (isLeafTreeNode() && menu_id == 2) ||
  3252. (isContrainTreeNode() && menu_id == 3);
  3253. }
  3254. function OnContentMenuAsync(cb)
  3255. {
  3256. var menu_id = ui.tree.content_menu;
  3257. if(isGroupMenuID(menu_id)) return;
  3258. if(isCopyToClipboardMenuID(menu_id))
  3259. {
  3260. copyCurrentUINodeToClipboard();
  3261. return;
  3262. }
  3263. if(isAppendFromClipboardMenuID(menu_id))
  3264. {
  3265. if(isLeafTreeNode())
  3266. {
  3267. ui.tree.position = ui.tree.parent;
  3268. }
  3269. appendFromClipboard(cb);
  3270. return;
  3271. }
  3272. if(isInsertFromClipboardMenuID(menu_id))
  3273. {
  3274. insertFromClipboard(cb);
  3275. return;
  3276. }
  3277. if(isClearAllSubWidgetsMenuID(menu_id))
  3278. {
  3279. clearAllSubWidgets(cb);
  3280. return;
  3281. }
  3282. if(isDeleteWidgetMenuID(menu_id)/*menu_id == 2 || menu_id == 3*/)
  3283. {
  3284. deleteWidget(cb);
  3285. return;
  3286. }
  3287. if(isAddParentConstrainMenuID(menu_id))
  3288. {
  3289. return;
  3290. }
  3291. if(isContrainTreeNode())
  3292. {
  3293. if(isAppendCompositeMenuID(menu_id))
  3294. {
  3295. appendCompositeToConstrain(menu_id, cb);
  3296. }
  3297. else if(isInsertCompositeMenuID(menu_id))
  3298. {
  3299. insertCompositeBeforeCurrentNode(menu_id, cb);
  3300. }
  3301. else if(isConstrainInsertMenuID(menu_id))
  3302. {
  3303. insertWidgetBeforeCurrentNode(menu_id, cb);
  3304. }
  3305. else
  3306. {
  3307. appendWidgetToConstrain(menu_id, cb);
  3308. }
  3309. return;
  3310. }
  3311. if(isFormTreeNode())
  3312. {
  3313. appendWidgetToForm(menu_id, cb);
  3314. return;
  3315. }
  3316. if(isLeafTreeNode())
  3317. {
  3318. //insertWidgetBeforeCurrentNode(menu_id, cb);
  3319. if(isAppendCompositeMenuID(menu_id))
  3320. {
  3321. ui.tree.position = ui.tree.parent;
  3322. appendCompositeToConstrain(menu_id, cb);
  3323. }
  3324. else if(isInsertCompositeMenuID(menu_id))
  3325. {
  3326. insertCompositeBeforeCurrentNode(menu_id, cb);
  3327. }
  3328. else if(isConstrainInsertMenuID(menu_id))
  3329. {
  3330. insertWidgetBeforeCurrentNode(menu_id, cb);
  3331. }
  3332. else
  3333. {
  3334. ui.tree.position = ui.tree.parent;
  3335. appendWidgetToConstrain(menu_id, cb);
  3336. }
  3337. }
  3338. }
  3339. function OnModelFunctionListChange()
  3340. {
  3341. model.getFunctionList(ui.model.document, function(err, result){
  3342. if(err){outputError(result); return;}
  3343. var patt = "function[ \t]+" + ui.model_fn_list.value;
  3344. ui.model.regex = patt;
  3345. //var row = ui.model.row;
  3346. //ui.model.row = row;
  3347. });
  3348. }
  3349. function OnCallbackFunctionListChange()
  3350. {
  3351. model.getFunctionList(ui.callback.document, function(err, result){
  3352. if(err){outputError(result); return;}
  3353. var patt = "function[ \t]+" + ui.callback_fn_list.value;
  3354. ui.callback.regex = patt;
  3355. //var row = ui.callback.row;
  3356. //ui.callback.row = row;
  3357. });
  3358. }
  3359. ///////////////////////////////////////////////////////////////////////////
  3360. // utils funcitons.
  3361. function getIndexByFunctionName(result, name)
  3362. {
  3363. for(var prop in result)
  3364. {
  3365. if(result[prop].name == name)
  3366. {
  3367. return result[prop].index;
  3368. }
  3369. }
  3370. return -1;
  3371. }
  3372. function updateFunctionList()
  3373. {
  3374. function getComboboxListFromResult(result)
  3375. {
  3376. var ret = [];
  3377. for(var prop in result)
  3378. {
  3379. ret.push(result[prop].name);
  3380. }
  3381. return ret;
  3382. }
  3383. model.getFunctionList(ui.callback.document, function(err, result){
  3384. if(err){outputError(result); return;}
  3385. ui.block_event = true;
  3386. ui.callback_fn_list.list = getComboboxListFromResult(result);
  3387. ui.block_event = false;
  3388. });
  3389. model.getFunctionList(ui.model.document, function(err, result){
  3390. if(err){outputError(result); return;}
  3391. ui.block_event = true;
  3392. ui.model_fn_list.list = getComboboxListFromResult(result);
  3393. ui.block_event = false;
  3394. });
  3395. }
  3396. var g_composite_widget_list = [];
  3397. function updateCompositeFormList()
  3398. {
  3399. var unit_name = ui.units.value;
  3400. var form_list = ui.forms.list;
  3401. g_composite_widget_list = [];
  3402. //var cnt = 0;
  3403. for(var loop = 0; loop < form_list.length; ++loop)
  3404. {
  3405. var form_name = form_list[loop];
  3406. model.isCompositeForm(unit_name, form_name, function(err1, result1){
  3407. //cnt++;
  3408. if(!err1 && result1)
  3409. {
  3410. g_composite_widget_list.push(form_name);
  3411. }
  3412. /*
  3413. if(cnt == form_list.length)
  3414. {
  3415. console.log(g_composite_widget_list);
  3416. }*/
  3417. });
  3418. }
  3419. }
  3420. function updateFormList(bShowLastForm)
  3421. {
  3422. if(ui.units.value == '')
  3423. return;
  3424. COMX_DEBUG('updateFormList caller is ', updateFormList.caller);
  3425. model.getFormList(ui.units.value, function(err, result){
  3426. if(err){ /*outputError(result);*/ return;}
  3427. if(result.length == 0)
  3428. result.push('<empty>');
  3429. bShowLastForm = (bShowLastForm && result.length > 1);
  3430. g_bOnFormChangedLock = bShowLastForm;
  3431. ui.forms.list = result;
  3432. g_bOnFormChangedLock = false;
  3433. if(bShowLastForm)
  3434. {
  3435. ui.forms.index = ui.forms.list.length - 1;
  3436. }
  3437. updateCompositeFormList();
  3438. //OnFormChanged();
  3439. });
  3440. }
  3441. function outputGlobalLogInfo(msg)
  3442. {
  3443. if(!ui.global_log_info) return;
  3444. ui.global_log_info.index = 10000000000000;
  3445. ui.global_log_info.value += msg;
  3446. ui.global_log_info.value += "\n";
  3447. ui.global_log_info.index = 10000000000000;
  3448. }
  3449. function updateUnitList(bUpdateFormList)
  3450. {
  3451. COMX_DEBUG('updateUnitList caller is ' + updateUnitList.caller);
  3452. model.getList(function(err, result){
  3453. if(err){ outputInfo(/*err*/"There isn't any unit, create one firstly please!"); return;}
  3454. ui.units.list = result;
  3455. if(ui.units.value != '')
  3456. {
  3457. if(bUpdateFormList)
  3458. {
  3459. ui.tree.enable = true;
  3460. ui.list.enable = true;
  3461. ui.pbn_execute.enable = true;
  3462. OnFormChanged();
  3463. }
  3464. }
  3465. else
  3466. {
  3467. outputInfo(/*err*/"There isn't any unit, create one firstly please!");
  3468. }
  3469. });
  3470. }
  3471. ////////////////////////////////////////////////////////////////////////////////////
  3472. // output notify info.
  3473. function isArray(o) {
  3474. return Object.prototype.toString.call(o) == '[object Array]';
  3475. }
  3476. function outputInfo(info)
  3477. {
  3478. var g_focus_handle = false;
  3479. if(isCallbackTab()) g_focus_handle = ui.callback.handle;
  3480. if(isModelTab()) g_focus_handle = ui.model.handle;
  3481. if(isArray(info))
  3482. {
  3483. var info_msg = '';
  3484. for(var loop = 0; loop < info.length; ++loop)
  3485. {
  3486. var i = info[info.length - loop - 1];
  3487. info_msg += '<span style="color:green">' + i + '</span><br/>';
  3488. }
  3489. ui.info.value = info_msg;
  3490. }
  3491. else
  3492. {
  3493. ui.info.value = '<span style="color:green">' + info + '</span><br/>';
  3494. }
  3495. if(g_focus_handle && info != '')
  3496. {
  3497. parent.setTimeout(()=>{
  3498. ui.Activate();
  3499. ui.SetFocus(g_focus_handle);
  3500. });
  3501. }
  3502. }
  3503. function outputError(err)
  3504. {
  3505. var g_focus_handle = false;
  3506. if(isCallbackTab()) g_focus_handle = ui.callback.handle;
  3507. if(isModelTab()) g_focus_handle = ui.model.handle;
  3508. var caller = (new Error()).stack.split("\n")[2].trim().split(" ")[1];
  3509. if(isArray(err))
  3510. {
  3511. var err_msg = '';
  3512. for(var loop = 0; loop < err.length; ++loop)
  3513. {
  3514. var e = err[err.length - loop - 1];
  3515. err_msg += '<b><u><span style="color:blue">Caller: ' +
  3516. caller + '</span></u></b><span style="color:red"> Error Info : ' + e + '</span><br/>';
  3517. }
  3518. ui.info.value = err_msg;
  3519. }
  3520. else
  3521. {
  3522. ui.info.value = '<b><u><span style="color:blue">Caller: ' +
  3523. caller + '</span></u></b><span style="color:red"> Error Info : ' + err + '</span><br/>';
  3524. }
  3525. //ui.info.value = JSON.stringify(err);
  3526. if(g_focus_handle && err != '')
  3527. {
  3528. parent.setTimeout(()=>{
  3529. ui.Activate();
  3530. ui.SetFocus(g_focus_handle);
  3531. });
  3532. }
  3533. }
  3534. function formatError(err)
  3535. {
  3536. var caller = (new Error()).stack.split("\n")[2].trim().split(" ")[1];
  3537. return '<b><u><span style="color:blue">Caller: ' +
  3538. caller + '</span></u></b><span style="color:red"> Error Info : ' + err + '</span><br/>';
  3539. }
  3540. function formatInfo(info)
  3541. {
  3542. return '<span style="color:green">' + info + '</span><br/>';
  3543. }
  3544. function outputHtml(html)
  3545. {
  3546. ui.info.value = html;
  3547. }
  3548. ////////////////////////////////////////////////////////////////////////////////////
  3549. // initialize some widget data
  3550. function initCopyrightInfo()
  3551. {
  3552. ui.copyright.value = "<span style='color:red'><u>Warning: This computer program is protected by copyright law and international treaties.Unauthorized reproduction or distribution of this program, or any portion of it, may result in severe civil and criminal penalties,and will be prosecuted under the law.</u></span>";
  3553. ui.copyright2.value = "<span style='color:blue'><u>This is where the INTELLECTUAL property claims for LGPL/ISC/MIT third-party libraries (e.g. QT, QScintilla, NPM dependencies) will be placed!</u></span>";
  3554. }
  3555. function initPluginPane()
  3556. {
  3557. ui.plugin.autoComplete = [
  3558. '#include?4',
  3559. '#define?4',
  3560. '#if?4',
  3561. '#else?4',
  3562. '#endif?4',
  3563. '#end?4'
  3564. ];
  3565. ui.plugin.lexer = 'cpp';
  3566. ui.plugin_category.index = 1;
  3567. model.callTip.registerImage(ui.plugin);
  3568. ui.plugin.callTip = [
  3569. 'JS_EXT_PARA(TComxCallback, [index]); // Parse JavaScript Callback Function Parameter',
  3570. 'JS_EXT_PARA([value_type], [index]); // Parse JavaScript Common Parameter',
  3571. 'JS_EXT_PARA(TComxBuffer, [index]); // Parse JavaScript Buffer Parameter',
  3572. 'JS_EXT_FUNC_ASSIGN_RET_EX(buf, num); // Return a Buffer',
  3573. 'JS_EXT_FUNC_ASSIGN_RET([value]); // Return a Value'
  3574. ];
  3575. //ui.plugin_language.index = 0;
  3576. ui.plugin.autoCompleteCallback = (ns_list)=>{
  3577. };
  3578. }
  3579. var bNSRefreshFlag = false;
  3580. function pickupPluginNS(unit_name, ns_folder)
  3581. {
  3582. if(unit_name == 'comx_sdk')
  3583. {
  3584. unit_name = 'comx';
  3585. }
  3586. var regex = new RegExp("^js_ext_" + unit_name + "_" + "([a-zA-Z0-9_]+)$");
  3587. var res = ns_folder.match(regex);
  3588. try{
  3589. return res[1];
  3590. }
  3591. catch(err)
  3592. {
  3593. console.log('pickupPluginNS(in kul_editor.js - Line:4146) - ', err.message, [ns_folder]);
  3594. return false;
  3595. }
  3596. }
  3597. function updatePlugin(namespace)
  3598. {
  3599. bNSRefreshFlag = true;
  3600. var unit_name = ui.units.value;
  3601. var plugin_info = model.getUnitPluginInfo(ui.units.value);
  3602. if(ui.plugin_category.index == 0)
  3603. {
  3604. plugin_info = model.getSystemPluginInfo();
  3605. unit_name = 'comx_sdk';
  3606. }
  3607. var plugin_list = plugin_info.list;
  3608. var name_list = [];
  3609. for(var loop = 0; loop < plugin_list.length; ++loop)
  3610. {
  3611. var name = plugin_list[loop];
  3612. //name = name.split('_');
  3613. //name = name[name.length - 1];
  3614. name = pickupPluginNS(unit_name, name);
  3615. if(name)name_list.push(name);
  3616. }
  3617. if(!name_list.length)name_list.push('<empty>');
  3618. ui.plugin_ns.list = name_list;
  3619. if(ui.plugin_ns.value == '<empty>')
  3620. ui.plugin_ns.value = '';
  3621. if(namespace == undefined)
  3622. {
  3623. namespace = ui.plugin_ns.value;
  3624. }
  3625. if(namespace)
  3626. {
  3627. var idx = false;
  3628. for(var loop = 0; loop < name_list.length; ++loop)
  3629. {
  3630. if(namespace == name_list[loop])
  3631. {
  3632. idx = loop;
  3633. }
  3634. }
  3635. ui.plugin_ns.index = idx;
  3636. enablePluginOperator();
  3637. }
  3638. else
  3639. {
  3640. disablePluginOperator();
  3641. }
  3642. if(hasNewPluginNS())
  3643. {
  3644. ui.append_plugin_btn.enable = true;
  3645. ui.plugin_sample_codes_flag.enable = true;
  3646. }
  3647. else
  3648. {
  3649. ui.append_plugin_btn.enable = false;
  3650. ui.plugin_sample_codes_flag.enable = false;
  3651. }
  3652. bNSRefreshFlag = false;
  3653. loadPluginFiles();
  3654. refreshDocumentModifiedStatus();
  3655. }
  3656. function appendCxxFileToGyp(filename)
  3657. {
  3658. filename = ',\n "src/' + filename + '.cc"'
  3659. var gyp_content = ui.gyp.document;
  3660. ui.gyp.index = /"include_dirs":[ \t]*\[/.exec(gyp_content).index;
  3661. ui.gyp.row -=2;
  3662. ui.gyp.column = ui.gyp.line.length - 1;
  3663. ui.gyp.inserter = filename;
  3664. savePluginSourceCodesSync();
  3665. }
  3666. var cur_plugin_func_pn_list = [];
  3667. var cur_plugin_func_pos_list = [];
  3668. function updateCurPluginFuncList()
  3669. {
  3670. var content = ui.plugin.document;
  3671. //COMX_DEBUG(content);
  3672. var regExp = /JS_EXT_FUNC_BEGIN[ \t]*\([ \t]*([a-zA-Z]{1}[a-zA-Z0-9]*)[ \t]*\,[ \t]*([0-9]*)\,/g;
  3673. var rec = regExp.exec(content);
  3674. var cur_plugin_func_list = [];
  3675. cur_plugin_func_pn_list = [];
  3676. cur_plugin_func_pos_list = [];
  3677. while(rec)
  3678. {
  3679. cur_plugin_func_list.push(rec[1]);
  3680. cur_plugin_func_pn_list.push(rec[2]);
  3681. cur_plugin_func_pos_list.push(rec.index);
  3682. rec = regExp.exec(content);
  3683. }
  3684. var hasFunc = true;
  3685. if(cur_plugin_func_list.length == 0)
  3686. {
  3687. hasFunc = false;
  3688. cur_plugin_func_list.push('<empty>');
  3689. }
  3690. ui.plugin_namespace_function_list.list = cur_plugin_func_list;
  3691. if(hasFunc)
  3692. {
  3693. ui.plugin_function_parameter_num.value =
  3694. parseInt(cur_plugin_func_pn_list[ui.plugin_namespace_function_list.index]);
  3695. }
  3696. else
  3697. {
  3698. ui.plugin_function_parameter_num.value = 0;
  3699. }
  3700. //COMX_DEBUG(cur_plugin_func_pos_list);
  3701. }
  3702. function OnPluginCurFuncChanged()
  3703. {
  3704. ui.plugin_function_parameter_num.enable = false;
  3705. ui.append_plugin_namespace_function_btn.enable = false;
  3706. //COMX_DEBUG(ui.plugin_namespace_function_list.value);
  3707. if(ui.plugin_namespace_function_list.value == '<empty>')
  3708. {
  3709. ui.plugin_namespace_function_list.value = '';
  3710. }
  3711. if(ui.plugin_namespace_function_list.value == '')
  3712. {
  3713. return;
  3714. }
  3715. var list = ui.plugin_namespace_function_list.list;
  3716. var bNewFuncName = true;
  3717. for(var loop = 0; loop < list.length; ++loop)
  3718. {
  3719. if(list[loop] == ui.plugin_namespace_function_list.value)
  3720. {
  3721. bNewFuncName = false;
  3722. break;
  3723. }
  3724. }
  3725. if(bNewFuncName)
  3726. {
  3727. ui.plugin_function_parameter_num.enable = true;
  3728. ui.append_plugin_namespace_function_btn.enable = true;
  3729. ui.plugin_function_parameter_num.value = 0;
  3730. }
  3731. else
  3732. {
  3733. ui.plugin_function_parameter_num.value =
  3734. parseInt(cur_plugin_func_pn_list[ui.plugin_namespace_function_list.index]);
  3735. ui.plugin.index = cur_plugin_func_pos_list[ui.plugin_namespace_function_list.index];
  3736. }
  3737. ui.SetFocus(ui.plugin_namespace_function_list.handle);
  3738. }
  3739. function OnAppendNewFuncForCurPlugin()
  3740. {
  3741. var func_name = ui.plugin_namespace_function_list.value;
  3742. var parameters_num = ui.plugin_function_parameter_num.value;
  3743. var ns = (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value + '.' +
  3744. ui.plugin_ns.value;
  3745. var func_content = model.createNewFuncForPlugin(ns, func_name,parameters_num);
  3746. ui.plugin.regex = '0x4cc0c89c-0x0090-0x47e3-0xb7-0x63-0xc1-0xaf-0xf1-0xe7-0x99-0x4e';
  3747. ui.plugin.row += 1;
  3748. ui.plugin.column = ui.plugin.line.length - 1;
  3749. var last_index = ui.plugin.index;
  3750. ui.plugin.inserter = func_content;
  3751. ui.plugin.regex = 'JS_EXT_ENTRY_BEGIN()';
  3752. ui.plugin.column = ui.plugin.line.length - 1;
  3753. var js_ext_entry = 'JS_EXT_ENTRY(' + func_name + ')\n';
  3754. ui.plugin.inserter = js_ext_entry;
  3755. ui.plugin.regex = 'JS_EXT_MAIN_BEGIN(JS_EXT_NS';
  3756. ui.plugin.column = 0;
  3757. var head = ui.plugin.line;
  3758. var regExp = /JS_EXT_MAIN_BEGIN\(JS_EXT_NS[ \t]*\,[ \t]*([0-9]*)/g;
  3759. var func_num = parseInt(regExp.exec(head)[1]) + 1;
  3760. var low = ui.plugin.index;
  3761. var high = low + ui.plugin.line.length;
  3762. ui.plugin.range.low = low;
  3763. ui.plugin.range.high = high;
  3764. ui.plugin.value = 'JS_EXT_MAIN_BEGIN(JS_EXT_NS, ' + func_num + ')\n';
  3765. ui.plugin.column = 0;
  3766. var js_ext_entry = 'JS_EXT_FUNC_REG(' + func_name + ')\n';
  3767. ui.plugin.inserter = js_ext_entry;
  3768. ui.plugin.index = last_index;
  3769. ui.plugin.row += 2;
  3770. ui.plugin.column = 0;
  3771. savePluginSourceCodesSync();
  3772. updateCurPluginFuncList();
  3773. }
  3774. function loadPluginFiles()
  3775. {
  3776. if(isPluginDirty() && isModifiedNamespaceValid())
  3777. {
  3778. PromptSavePluginFilesSync(()=>{
  3779. savePluginSourceCodesSync();
  3780. });
  3781. }
  3782. if(ui.plugin_ns.value)
  3783. {
  3784. var files = model.loadPluginFiles(
  3785. (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value,
  3786. ui.plugin_ns.value);
  3787. //COMX_DEBUG('' + files.cc);
  3788. ui.plugin.document = ''; //Clears possible range states
  3789. ui.plugin.document = '' + files.cc;
  3790. ui.plugin.dirty = false;
  3791. ui.plugin.enable = true;
  3792. updateCurPluginFuncList();
  3793. //COMX_DEBUG('' + files.gyp);
  3794. ui.gyp.document = ''; //Clears possible range states
  3795. ui.gyp.document = '' + files.gyp;
  3796. ui.gyp.enable = true;
  3797. ui.gyp.dirty = false;
  3798. //ui.plugin_tab.index = 0;
  3799. ui.plugin_src_file_list.list = files.src_list;
  3800. loadPluginSourceFile();
  3801. }
  3802. refreshDocumentModifiedStatus();
  3803. }
  3804. function loadPluginSourceFile()
  3805. {
  3806. //outputInfo(ui.plugin_src_file_list.value);
  3807. if(!ui.plugin_src_file_list.value)
  3808. {
  3809. ui.plugin_src.document = '';
  3810. ui.plugin_src.enable = false;
  3811. }
  3812. else
  3813. {
  3814. ui.plugin_src.document = ''; // Clear possible range states
  3815. ui.plugin_src.document = model.loadPluginSourceFile(
  3816. (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value,
  3817. ui.plugin_ns.value,
  3818. ui.plugin_src_file_list.value);
  3819. ui.plugin_src.enable = true;
  3820. }
  3821. ui.plugin_src.dirty = false;
  3822. }
  3823. function explorePluginSourceFolder()
  3824. {
  3825. if(!ui.plugin_ns.value) return;
  3826. model.explorePluginSourceFolder(
  3827. (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value,
  3828. ui.plugin_ns.value);
  3829. }
  3830. function OnPluginCategoryChanged()
  3831. {
  3832. updatePlugin();
  3833. }
  3834. function hasNewPluginNS()
  3835. {
  3836. var list = ui.plugin_ns.list;
  3837. var val = ui.plugin_ns.value;
  3838. //COMX_DEBUG(list);
  3839. //COMX_DEBUG(val);
  3840. var ret = true;
  3841. for(var loop = 0; loop < list.length; ++loop)
  3842. {
  3843. if(list[loop] == val)
  3844. ret = false;
  3845. }
  3846. return ret && (val != '');
  3847. }
  3848. function disablePluginOperator()
  3849. {
  3850. ui.plugin.document = '';
  3851. ui.gyp.document = '';
  3852. ui.plugin_src.document = '';
  3853. ui.plugin.dirty = false;
  3854. ui.plugin_src.dirty = false;
  3855. ui.gyp.dirty = false;
  3856. ui.plugin.enable = false;
  3857. ui.gyp.enable = false;
  3858. ui.plugin_src.enable = false;
  3859. ui.plugin_src_file_list.list = [];
  3860. ui.plugin_namespace_function_list.list = [];
  3861. ui.append_plugin_src_file_btn.enable = false;
  3862. ui.append_plugin_namespace_function_btn.enable = false;
  3863. ui.plugin_function_parameter_num.enable = false;
  3864. ui.plugin_config_btn.enable = false;
  3865. ui.plugin_build_btn.enable = false;
  3866. ui.plugin_open_folder_btn.enable = false;
  3867. ui.pb_plugin_vs.enable = false;
  3868. }
  3869. function enablePluginOperator()
  3870. {
  3871. ui.plugin.enable = true;
  3872. ui.gyp.enable = true;
  3873. ui.plugin_src.enable = true;
  3874. ui.append_plugin_src_file_btn.enable = true;
  3875. ui.append_plugin_namespace_function_btn.enable = false;
  3876. ui.plugin_function_parameter_num.enable = false;
  3877. ui.plugin_config_btn.enable = true;
  3878. ui.plugin_build_btn.enable = true;
  3879. ui.plugin_open_folder_btn.enable = true;
  3880. ui.pb_plugin_vs.enable = true;
  3881. }
  3882. var g_OnPluginNSChanged_lock = false;
  3883. function OnPluginNSChanged()
  3884. {
  3885. if(g_OnPluginNSChanged_lock)return;
  3886. g_OnPluginNSChanged_lock = true;
  3887. if(isPluginDirty() && isModifiedNamespaceValid())
  3888. {
  3889. PromptSavePluginFilesSync(()=>{
  3890. savePluginSourceCodesSync();
  3891. });
  3892. }
  3893. if(ui.plugin_ns.value == '<empty>')
  3894. {
  3895. ui.plugin_ns.value = '';
  3896. }
  3897. if(bNSRefreshFlag)
  3898. {
  3899. g_OnPluginNSChanged_lock = false;
  3900. return;
  3901. }
  3902. //outputInfo('OnPluginNSChanged');
  3903. ui.append_plugin_btn.enable = false;
  3904. ui.plugin_sample_codes_flag.enable = false;
  3905. //ui.plugin_sample_codes_flag.valid = false;
  3906. ui.plugin.enable = true;
  3907. ui.gyp.enable = true;
  3908. ui.plugin_src.enable = true;
  3909. ui.append_plugin_src_file_btn.enable = true;
  3910. ui.append_plugin_namespace_function_btn.enable = true;
  3911. if(hasNewPluginNS() || ui.plugin_ns.value == '')
  3912. {
  3913. if(ui.plugin_ns.value != '')
  3914. {
  3915. ui.append_plugin_btn.enable = true;
  3916. ui.plugin_sample_codes_flag.enable = true;
  3917. }
  3918. disablePluginOperator();
  3919. //outputInfo('new ns name is ' + ui.plugin_ns.value);
  3920. }
  3921. else
  3922. {
  3923. loadPluginFiles();
  3924. enablePluginOperator();
  3925. }
  3926. refreshDocumentModifiedStatus();
  3927. ui.SetFocus(ui.plugin_ns.handle);
  3928. g_OnPluginNSChanged_lock = false;
  3929. }
  3930. function OnAppendPluginSrcFile()
  3931. {
  3932. unit.form.AddSrcFileDlg.Show();
  3933. }
  3934. function OnAppendPlugin()
  3935. {
  3936. var unit_name = (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value;
  3937. var namespace = ui.plugin_ns.value;
  3938. var have_sample_codes = ui.plugin_sample_codes_flag.valid;
  3939. g_log_sidepane.hide();
  3940. g_logplugin_sidepane.show();
  3941. ui.plugin_log.value = "";
  3942. model.appendPlugin(
  3943. unit_name, namespace, have_sample_codes,
  3944. (msg)=>{
  3945. ui.plugin_log.value += msg;
  3946. ui.plugin_log.index = 100000000000000000;
  3947. },
  3948. ()=>{
  3949. ui.plugin_log.index = 100000000000000000;
  3950. updatePlugin(namespace);
  3951. ui.append_plugin_btn.enable = false;
  3952. ui.plugin_sample_codes_flag.enable = false;
  3953. //ui.plugin_tab.index = 0;
  3954. });
  3955. }
  3956. var g_is_compiling = false;
  3957. function OnCompilePlugin()
  3958. {
  3959. //ui.plugin_tab.index = 3;
  3960. g_is_compiling = true;
  3961. g_log_sidepane.hide();
  3962. g_logplugin_sidepane.show();
  3963. savePluginSourceCodesSync();
  3964. ui.pb_preview.valid = false;
  3965. OnPreview(false);
  3966. ui.plugin_log.value = "";
  3967. model.compilePlugin(
  3968. (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value,
  3969. ui.plugin_ns.value,
  3970. (msg)=>{
  3971. ui.plugin_log.value += msg;
  3972. ui.plugin_log.index = 100000000000000000;
  3973. },
  3974. ()=>{
  3975. ui.plugin_log.index = 100000000000000000;
  3976. ui.pb_preview.valid = true;
  3977. OnPreview();
  3978. updateApiCallTip();
  3979. g_is_compiling = false;
  3980. },
  3981. (err_msg)=>{
  3982. ui.plugin_log.value += err_msg;
  3983. ui.plugin_log.index = 100000000000000000;
  3984. },
  3985. (ui.compile_type.index == 0)//debug mode flag
  3986. );
  3987. }
  3988. var modified_unit_name = false;
  3989. var modified_namespace = false;
  3990. var timeIDOfPlugin = false;
  3991. function isEmptyLine(line)
  3992. {
  3993. for(var loop = 0; loop < line.length; ++loop)
  3994. {
  3995. if(line[loop] != ' ' && line[loop] != '\t' && line[loop] != '\r' && line[loop] != '\n')
  3996. {
  3997. return false;
  3998. }
  3999. }
  4000. return true;
  4001. }
  4002. function isJS_EXT_PARALine(line)
  4003. {
  4004. return /[ \t]*[_a-zA-Z]{1}[_a-zA-Z0-9]*[ \t]*[_a-zA-Z]{1}[_a-zA-Z0-9]*[ \t]*=[ \t]*JS_EXT_PARA[ \t]*\([_a-zA-Z]{1}[_a-zA-Z0-9]*[ \t]*\,[ \t]*[0-9]+[ \t]*\)/.test(line);
  4005. }
  4006. function getJS_EXT_PARALinePrecursorSpace(line)
  4007. {
  4008. for(var loop = 0; loop < line.length; ++loop)
  4009. {
  4010. if(line[loop] != ' ' && line[loop] != '\t')
  4011. {
  4012. return line.substr(0, loop);
  4013. }
  4014. }
  4015. return '';
  4016. }
  4017. function OnPluginEntryChanged()
  4018. {
  4019. var timeID = parent.setTimeout(()=>{
  4020. parent.clearTimeout(timeID);
  4021. var line = ui.plugin.line;
  4022. if(isEmptyLine(line))
  4023. {
  4024. var old_column = ui.plugin.column;
  4025. ui.plugin.row -= 1;
  4026. line = ui.plugin.line;
  4027. if(isJS_EXT_PARALine(line))
  4028. {
  4029. var ps = getJS_EXT_PARALinePrecursorSpace(line);
  4030. ui.plugin.row += 1;
  4031. if(ui.plugin.column > ps.length)
  4032. ui.plugin.column = ps.length;
  4033. }
  4034. else
  4035. {
  4036. ui.plugin.row +=1;
  4037. ui.plugin.column = old_column;
  4038. }
  4039. }
  4040. });
  4041. OnPluginCodesChanged();
  4042. }
  4043. function OnPluginCodesChanged()
  4044. {
  4045. if(!ui.plugin_ns.value || hasNewPluginNS())
  4046. {
  4047. ui.warn_bmp.visible = true;
  4048. ui.plugin_warn.value = "<span style=\"color:blue\">WARN - Plugin: current namespace is invalid, changes you are making will be ignored!</span>";
  4049. ui.cueline_stack.index = 0;
  4050. ui.plugin_src.dirty = false;
  4051. ui.gyp.dirty = false;
  4052. ui.plugin.dirty = false;
  4053. if(timeIDOfPlugin)
  4054. {
  4055. parent.clearTimeout(timeIDOfPlugin);
  4056. timeIDOfPlugin = false;
  4057. }
  4058. timeIDOfPlugin = parent.setTimeout(()=>{
  4059. ui.cueline_stack.index = 1;
  4060. parent.clearTimeout(timeIDOfPlugin);
  4061. timeIDOfPlugin = false;
  4062. },5000);
  4063. return;
  4064. }
  4065. modified_unit_name = (ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value;
  4066. modified_namespace = ui.plugin_ns.value;
  4067. if(isPluginDirty())
  4068. {
  4069. switchSourceCodesModifiedCueline();
  4070. }
  4071. }
  4072. function isPluginDirty()
  4073. {
  4074. var plugin_dirty = ui.plugin_src.dirty || ui.plugin.dirty || ui.gyp.dirty;
  4075. if(ui.plugin_ns.value == "") plugin_dirty = false;
  4076. return plugin_dirty;
  4077. }
  4078. function isJavaScriptCodeDirty()
  4079. {
  4080. var ret = ui.callback.dirty || ui.model.dirty || g_callback_dirty;
  4081. g_callback_dirty = false;
  4082. return ret;
  4083. }
  4084. function isDocumentDirty()
  4085. {
  4086. return isPluginDirty() || ui.callback.dirty || ui.model.dirty;
  4087. }
  4088. function isModifiedNamespaceValid()
  4089. {
  4090. var unit_name = modified_unit_name;//(ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value;
  4091. var namespace = modified_namespace;//ui.plugin_ns.value;
  4092. if(namespace == false || namespace == ""){ return false; }
  4093. return true;
  4094. }
  4095. function cleanPluginDocumentDirtyStatus()
  4096. {
  4097. ui.plugin.dirty = false;
  4098. ui.plugin_src.dirty = false;
  4099. ui.gyp.dirty = false;
  4100. }
  4101. function switchSourceCodesModifiedCueline()
  4102. {
  4103. ui.warn_bmp.visible = true;
  4104. ui.plugin_warn.value = "<span style=\"color:blue\">WARN : sources codes have been modified!" +
  4105. " press Ctrl+S save it.</span>";
  4106. ui.cueline_stack.index = 0;
  4107. }
  4108. function setTimedCueline(msg, timeout)
  4109. {
  4110. var warn_info = ui.plugin_warn.value;
  4111. var cueline_index = ui.cueline_stack.index;
  4112. ui.plugin_warn.value = `<span style=\"color:red\">WARN : ${msg}.</span>`;
  4113. ui.cueline_stack.index = 0;
  4114. parent.setTimeout(()=>{
  4115. ui.plugin_warn.value = warn_info;
  4116. ui.cueline_stack.index = cueline_index;
  4117. },timeout);
  4118. }
  4119. function resetCueline()
  4120. {
  4121. if(ui.pb_save.enable)
  4122. {
  4123. setCuelineInfo('Preview form is ready.');
  4124. parent.setTimeout(()=>{
  4125. ui.cueline_stack.index = 0;
  4126. },1000);
  4127. }
  4128. else
  4129. {
  4130. setCuelineInfo('Ready.');
  4131. }
  4132. ui.Activate();
  4133. var g_focus_handle = false;
  4134. if(isCallbackTab()) g_focus_handle = ui.callback.handle;
  4135. if(isModelTab()) g_focus_handle = ui.model.handle;
  4136. if(g_focus_handle)
  4137. {
  4138. ui.SetFocus(g_focus_handle);
  4139. }
  4140. }
  4141. var g_previous_main_tabctrl_index = 0;
  4142. function onSwitch()
  4143. {
  4144. if(isPluginTab() && isJavaScriptCodeDirty())
  4145. {
  4146. setTimedCueline('Callback/Model codes have been modified, ' +
  4147. 'save them and then switch to Plugin mode again please',
  4148. 10000);
  4149. ui.main_tabctrl.index = g_previous_main_tabctrl_index;
  4150. return;
  4151. }
  4152. if((!isPluginTab()) && isPluginDirty())
  4153. {
  4154. setTimedCueline('Plugin codes have been modified, ' +
  4155. 'save them and then leave Plugin mode again please',
  4156. 10000);
  4157. ui.main_tabctrl.index = g_previous_main_tabctrl_index;
  4158. return;
  4159. }
  4160. g_previous_main_tabctrl_index = ui.main_tabctrl.index;
  4161. }
  4162. function setCuelineInfo(msg){
  4163. ui.cueline_title.value = '<b><u> Cue Line:</u></b> ';
  4164. ui.cueline.value = `${msg}`;
  4165. ui.cueline_stack.index = 1;
  4166. }
  4167. function refreshDocumentModifiedStatus()
  4168. {
  4169. ui.pb_save.enable = isDocumentDirty();
  4170. if(isDocumentDirty())
  4171. {
  4172. switchSourceCodesModifiedCueline();
  4173. }
  4174. else
  4175. {
  4176. resetCueline();
  4177. }
  4178. }
  4179. function savePluginSourceCodesSync()
  4180. {
  4181. var unit_name = modified_unit_name;//(ui.plugin_category.index == 0) ? 'comx_sdk' : ui.units.value;
  4182. var namespace = modified_namespace;//ui.plugin_ns.value;
  4183. if(!isPluginDirty() || !isModifiedNamespaceValid()){ return; }
  4184. var cache = {
  4185. 'src_fname' : ui.plugin_src_file_list.value,
  4186. 'entry' : ui.plugin.dirty ? ui.plugin.document : false,
  4187. 'gyp' : ui.gyp.dirty ? ui.gyp.document : false,
  4188. 'src' : ui.plugin_src.dirty ? ui.plugin_src.document : false
  4189. };
  4190. model.savePluginFiles(unit_name, namespace, cache);
  4191. cleanPluginDocumentDirtyStatus();
  4192. refreshDocumentModifiedStatus();
  4193. }
  4194. function PromptSavePluginFilesSync(cb)
  4195. {
  4196. var need_close_preview = ui.pb_preview.valid;
  4197. if(need_close_preview)
  4198. OnPreview();
  4199. if(ui.MessageBox("Warning", "plugin source codes have been modified, \ndo you want to save them?",
  4200. MessageBox.Icon.Warning,
  4201. MessageBox.Button.Yes|MessageBox.Button.No)
  4202. == MessageBox.Button.Yes)
  4203. {
  4204. if(cb)cb();
  4205. }
  4206. if(need_close_preview)
  4207. OnPreview();
  4208. }
  4209. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4210. // Get Namespace List from IDE when preview form is off.
  4211. function getNamespaceListOfIDE(ns_list)
  4212. {
  4213. var obj = pane;
  4214. var flag = true;
  4215. for(var loop = 0; loop < ns_list.length - 1; ++loop)
  4216. {
  4217. if(typeof(obj[ns_list[loop]]) == 'object')
  4218. {
  4219. obj = obj[ns_list[loop]];
  4220. }
  4221. else
  4222. {
  4223. flag = false;
  4224. break;
  4225. }
  4226. }
  4227. var ret = [];
  4228. if(flag)
  4229. {
  4230. for(var prop in obj)
  4231. {
  4232. var tar = ns_list[ns_list.length - 1];
  4233. if(prop.indexOf(tar) == 0)
  4234. {
  4235. ret.push(prop);
  4236. }
  4237. }
  4238. }
  4239. return ret;
  4240. }
  4241. function getModelNamespaceListOfIDE(ns_list)
  4242. {
  4243. var obj = pane.parent;
  4244. var flag = true;
  4245. for(var loop = 0; loop < ns_list.length - 1; ++loop)
  4246. {
  4247. if(typeof(obj[ns_list[loop]]) == 'object')
  4248. {
  4249. obj = obj[ns_list[loop]];
  4250. }
  4251. else
  4252. {
  4253. flag = false;
  4254. break;
  4255. }
  4256. }
  4257. var ret = [];
  4258. if(flag)
  4259. {
  4260. for(var prop in obj)
  4261. {
  4262. var tar = ns_list[ns_list.length - 1];
  4263. if(prop.indexOf(tar) == 0)
  4264. {
  4265. ret.push(prop);
  4266. }
  4267. }
  4268. }
  4269. return ret;
  4270. }
  4271. /////////////////////////////////////////////////////////////////////////////////////////////
  4272. // Manage Scintilla Editor.
  4273. function updateApiCallTip()
  4274. {
  4275. model.callTip.updateApiCallTip(ui.callback, ui.model);
  4276. }
  4277. function acCallbackOfCallback(ns_list)
  4278. {
  4279. var ret = false;
  4280. try
  4281. {
  4282. if(model.callTip.checkCommentTypeAutoCompleteStatus(ui.callback) && ns_list.length > 1)
  4283. {
  4284. return model.callTip.nlCommentTypeAutoComplete;
  4285. }
  4286. model.callTip.installCallTipOnce(ui.callback, ns_list);
  4287. if(model.callTip.installPane(ui.callback, ns_list))return [];
  4288. if(!(ret = model.callTip.getPredefineNS(ns_list)))
  4289. {
  4290. ns_list = model.callTip.preThisNS(ns_list, ui.forms.value);
  4291. ret = model.getNamespaceList(ui.forms.value, ns_list);
  4292. if(ns_list.length == 1)
  4293. {
  4294. var varLocalList = model.callTip.parseLocalVariable(ui.callback);
  4295. var ns = ns_list[0];
  4296. if(varLocalList)
  4297. {
  4298. varLocalList = varLocalList.filter(item=>{
  4299. return item.indexOf(ns) == 0;
  4300. });
  4301. if(ret)
  4302. {
  4303. ret = ret.concat(varLocalList);
  4304. }
  4305. else
  4306. {
  4307. ret = varLocalList;
  4308. }
  4309. }
  4310. }
  4311. if(ret[ret.length - 1] == '822DD938B2AC4FC6924C9864B7BD2EEE')
  4312. {
  4313. ret.pop();
  4314. var snip = ret[ret.length - 1];
  4315. ret.pop();
  4316. parent.setTimeout(()=>{
  4317. ui.callback.tabAutoComplete();
  4318. });
  4319. }
  4320. if(ret[ret.length - 1] == 'B5AAED47BFB64CAAB94BA52424C3371B')
  4321. {
  4322. var last_name = ns_list[ns_list.length - 1];
  4323. ret.pop();
  4324. ui.callback.callTipOnce = ret.filter(item=>{
  4325. return item.indexOf(last_name) == 0;
  4326. });
  4327. return [];
  4328. }
  4329. if(ret && model.callTip.installGlobalVarCallTipOnce(ui.callback, ret, ns_list))return [];
  4330. }
  4331. return model.callTip.postFilterNS(ns_list, ret, ui.callback, ui.forms.value);
  4332. }
  4333. catch(err)
  4334. {
  4335. console.log(err);
  4336. return [];
  4337. }
  4338. }
  4339. function OnCallbackCursorChange()
  4340. {
  4341. if(g_code_snip){
  4342. g_code_snip.hide();
  4343. }
  4344. }
  4345. var g_snip_buffer = false;
  4346. function initCallbackEditor()
  4347. {
  4348. model.callTip.registerImage(ui.callback);
  4349. model.callTip.installJSPrebuiltAutoComplete(ui.callback);
  4350. model.callTip.installSciLexerType(ui.callback, 'javascript');
  4351. ui.callback.autoCompleteListItemChange = function(ns_list){
  4352. outputInfo('');
  4353. model.getNamespaceListDescription(ui.forms.value, ns_list, (desc, snip)=>{
  4354. outputInfo(formatUiDesc(desc));
  4355. var sub_name = ns_list[ns_list.length - 1];
  4356. });
  4357. if(ns_list.length == 2 && ns_list[0] == 'pui' && ns_list[1] == 'fireEvent')
  4358. {
  4359. outputInfo('向父窗体发送消息, 父窗体中预定义函数OnChildDockerMessage响应该消息');
  4360. }
  4361. if(ns_list.length == 1 && ns_list[0] == 'injectToParentContext')
  4362. {
  4363. outputInfo('将子窗体中的ui命名空间内置变量注入主窗体,同时callback函数转移到主窗体.' +
  4364. '<span style="color:red"> 注意:该函数仅在子窗体中生效, ' +
  4365. '建议该用法仅用于已有应用主窗体的一部分拆分成侧栏进行重构,' +
  4366. '否则不利于模块化,将造成主窗体命名空间污染/膨胀!!!</span>');
  4367. }
  4368. };
  4369. ui.callback.autoCompleteSelection = function(ns_list){
  4370. outputInfo('');
  4371. if(g_code_snip)
  4372. {
  4373. g_code_snip.hide();
  4374. }
  4375. g_snip_buffer = false;
  4376. model.getNamespaceListDescription(ui.forms.value, ns_list, (desc, snip)=>{
  4377. if(snip)
  4378. {
  4379. parent.setTimeout(()=>{
  4380. if(!g_code_snip)
  4381. {
  4382. g_code_snip = ui.docker.load('snip_code_panel', 2,
  4383. 'Code Snip Sample - Right Value');
  4384. }
  4385. g_code_snip.fireEvent('code', snip);
  4386. g_code_snip.show();
  4387. ui.SetFocus(ui.callback.handle);
  4388. g_snip_buffer = snip;
  4389. });
  4390. }
  4391. });
  4392. };
  4393. ui.callback.autoCompleteCallback = function(ns_list){
  4394. return acCallbackOfCallback(ns_list);
  4395. };
  4396. }
  4397. var g_model_require_pkg = false;
  4398. function OnModelChanged()
  4399. {
  4400. model.parseModelReqirePackageAutocompleteInfo(ui.model.document, 'model', ui.units.value, pkg=>{
  4401. g_model_require_pkg = pkg;
  4402. });
  4403. }
  4404. function formatUiDesc(str)
  4405. {
  4406. return str.replace(/\n/g, "<br/>");
  4407. }
  4408. function hasOwnProperty(prop, obj)
  4409. {
  4410. return ({}).hasOwnProperty.call(obj, prop);
  4411. }
  4412. function acCallbackOfModel(sci, require_pkg_cb){
  4413. return function(ns_list){
  4414. try
  4415. {
  4416. var ret = false;
  4417. if(model.callTip.checkCommentTypeAutoCompleteStatus(sci))
  4418. {
  4419. return model.callTip.nlCommentTypeAutoComplete;
  4420. }
  4421. model.callTip.installCallTipOnce(sci, ns_list);
  4422. if(!(ret = model.callTip.getPredefineNS(ns_list)))
  4423. {
  4424. //ns_list = model.callTip.preThisNS(ns_list);
  4425. ret = model.getModelNamespaceList(ui.forms.value, ns_list);
  4426. if(ns_list.length == 1)
  4427. {
  4428. var varLocalList = model.callTip.parseLocalVariable(sci);
  4429. var ns = ns_list[0];
  4430. if(varLocalList)
  4431. {
  4432. varLocalList = varLocalList.filter(item=>{
  4433. return item.indexOf(ns) == 0;
  4434. });
  4435. if(!ret) ret = [];
  4436. ret = ret.concat(varLocalList);
  4437. }
  4438. }
  4439. if(model.callTip.installGlobalVarCallTipOnce(sci, ret, ns_list))return [];
  4440. }
  4441. var word = ns_list[ns_list.length - 1];
  4442. /*
  4443. if(!ret)
  4444. {
  4445. ret = getModelNamespaceListOfIDE(ns_list);
  4446. }
  4447. */
  4448. if(require_pkg_cb)
  4449. {
  4450. var require_pkg = require_pkg_cb();
  4451. if(ns_list.length == 1 && require_pkg)
  4452. {
  4453. if(ret)
  4454. {
  4455. ret = ret.concat(
  4456. Object.keys(require_pkg).map(item=>{
  4457. return item + '?3';
  4458. })
  4459. );
  4460. }
  4461. else
  4462. {
  4463. ret = Object.keys(require_pkg).map(item=>{
  4464. return item + '?3';
  4465. })
  4466. }
  4467. }
  4468. if(ns_list.length == 2 && require_pkg)
  4469. {
  4470. var pkg_name = ns_list[0];
  4471. if(hasOwnProperty(pkg_name, require_pkg))
  4472. {
  4473. sci.callTipOnce = require_pkg[pkg_name].filter(item=>{
  4474. return item.indexOf(word) == 0;
  4475. });
  4476. }
  4477. }
  4478. }
  4479. ret = model.callTip.postFilterNS(ns_list, ret, sci, ui.forms.value).filter(item=>{
  4480. return item.indexOf(word) == 0;
  4481. });
  4482. return ret;
  4483. }
  4484. catch(err)
  4485. {
  4486. console.log(err);
  4487. return [];
  4488. }
  4489. }
  4490. }
  4491. function initModelEditor()
  4492. {
  4493. model.callTip.registerImage(ui.model);
  4494. model.callTip.installJSPrebuiltAutoComplete(ui.model,
  4495. ['require?1(id);\n' +
  4496. '\tUsed to import modules, JSON, and local files. \n\n' +
  4497. '\tid: <string> module name or path.\n'+
  4498. '\n' +
  4499. '\tReturns: <any> exported module content.\n'
  4500. ]);
  4501. model.callTip.installSciLexerType(ui.model, 'javascript');
  4502. ui.model.autoCompleteCallback = acCallbackOfModel(ui.model, ()=>{
  4503. return g_model_require_pkg;
  4504. });
  4505. ui.model.autoCompleteListItemChange = function(ns_list){
  4506. outputInfo('');
  4507. model.getNamespaceListDescription(ui.forms.value, ns_list, (desc)=>{
  4508. outputInfo(formatUiDesc(desc));
  4509. });
  4510. };
  4511. }
  4512. function InitLessaonPane()
  4513. {
  4514. //This function is empty at present.
  4515. }
  4516. function InitKulEditor()
  4517. {
  4518. ui.codes.autoComplete = [
  4519. "xml","widget","property","name","type","kul_pkg",
  4520. "width", "height","adjust","vertical",
  4521. "horizontal","name", "form", "pushbutton"];
  4522. ui.codes.lexer="xml";
  4523. }
  4524. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  4525. // Util Functions for Preview Form Attachment Manage.
  4526. var g_geo_init = false;
  4527. function getUiGeometry()
  4528. {
  4529. if(model.getDevAttachProp() < 0)
  4530. {
  4531. return ui.geometry;
  4532. }
  4533. if(isCallbackTab())
  4534. {
  4535. return ui.GetWidgetGeometry(ui.callback.handle);
  4536. }
  4537. if(isModelTab())
  4538. {
  4539. return ui.GetWidgetGeometry(ui.model.handle);
  4540. }
  4541. if(isPluginTab())
  4542. {
  4543. var ret = ui.GetWidgetGeometry(ui.plugin.handle);
  4544. ret.height -= 23;
  4545. return ret;
  4546. }
  4547. return ui.geometry;
  4548. }
  4549. function clearSysLog()
  4550. {
  4551. ui.global_log_info.document = '';
  4552. model.saveGlobalLogInfo('');
  4553. }
  4554. function OnDockChange()
  4555. {
  4556. if(!g_side_docker) return;
  4557. ui.pb_unit.visible = !g_side_docker.isVisible();
  4558. if(!g_log_sidepane) return;
  4559. ui.log_flag.valid = g_log_sidepane.isVisible();
  4560. if(!g_logplugin_sidepane) return;
  4561. ui.plugin_info_btn.valid = g_logplugin_sidepane.isVisible();
  4562. if(g_is_compiling) return;
  4563. parent.setTimeout(()=>{
  4564. if(ui.preview_visible.valid)model.updateGeometryToPreviewForm(ui.forms.value, getUiGeometry());
  4565. },100);
  4566. }
  4567. function OnShowHideSolutionPane()
  4568. {
  4569. g_side_docker.show();
  4570. }