kineticjs.js 93 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320
  1. "use strict";
  2. define( [ "module",
  3. "vwf/model",
  4. "vwf/utility",
  5. "vwf/utility/color"
  6. ], function( module, model, utility, color ) {
  7. var self;
  8. return model.load( module, {
  9. // == Module Definition ====================================================================
  10. // -- initialize ---------------------------------------------------------------------------
  11. initialize: function( options ) {
  12. self = this;
  13. this.arguments = Array.prototype.slice.call( arguments );
  14. this.options = ( options !== undefined ) ? options : {};
  15. this.state = {
  16. nodes: {},
  17. stages: {},
  18. prototypes: {},
  19. createLocalNode: function( nodeID, childID, childExtendsID, childImplementsIDs,
  20. childSource, childType, childIndex, childName, callback ) {
  21. return {
  22. "parentID": nodeID,
  23. "ID": childID,
  24. "extendsID": childExtendsID,
  25. "implementsIDs": childImplementsIDs,
  26. "source": childSource,
  27. "type": childType,
  28. "name": childName,
  29. "prototypes": undefined,
  30. "kineticObj": undefined,
  31. "stage": undefined,
  32. "uniqueInView": false,
  33. "hasMouseEvents": false,
  34. "hasTouchEvents": false
  35. };
  36. },
  37. isKineticClass: function( prototypes, classID ) {
  38. if ( prototypes ) {
  39. for ( var i = 0; i < prototypes.length; i++ ) {
  40. if ( prototypes[ i ] === classID ) {
  41. //console.info( "prototypes[ i ]: " + prototypes[ i ] );
  42. return true;
  43. }
  44. }
  45. }
  46. return false;
  47. },
  48. isKineticComponent: function( prototypes ) {
  49. var found = false;
  50. if ( prototypes ) {
  51. for ( var i = 0; i < prototypes.length && !found; i++ ) {
  52. found = ( prototypes[ i ] === "http://vwf.example.com/kinetic/node.vwf" );
  53. }
  54. }
  55. return found;
  56. }
  57. };
  58. // turns on logger debugger console messages
  59. this.debug = {
  60. "creation": false,
  61. "native": false,
  62. "initializing": false,
  63. "parenting": false,
  64. "deleting": false,
  65. "properties": false,
  66. "setting": false,
  67. "getting": false,
  68. "methods": false,
  69. "events": false,
  70. "prototypes": false
  71. };
  72. },
  73. // == Model API ============================================================================
  74. // -- creatingNode ------------------------------------------------------------------------
  75. creatingNode: function( nodeID, childID, childExtendsID, childImplementsIDs,
  76. childSource, childType, childIndex, childName, callback ) {
  77. var appID = this.kernel.application();
  78. if ( this.debug.creation ) {
  79. this.logger.infox( "creatingNode", nodeID, childID, childExtendsID, childImplementsIDs, childSource, childType, childIndex, childName );
  80. }
  81. // If the node being created is a prototype, construct it and add it to the array of prototypes,
  82. // and then return
  83. var prototypeID = utility.ifPrototypeGetId( appID, this.state.prototypes, nodeID, childID );
  84. if ( prototypeID !== undefined ) {
  85. if ( this.debug.prototypes ) {
  86. this.logger.infox( "prototype: ", prototypeID );
  87. }
  88. this.state.prototypes[ prototypeID ] = {
  89. parentID: nodeID,
  90. ID: childID,
  91. extendsID: childExtendsID,
  92. implementsID: childImplementsIDs,
  93. source: childSource,
  94. type: childType,
  95. name: childName
  96. };
  97. return;
  98. }
  99. var protos = getPrototypes( this.kernel, childExtendsID );
  100. var node;
  101. if ( this.state.isKineticComponent( protos ) ) {
  102. if ( this.debug.native ) {
  103. this.logger.infox( "creatingNode", nodeID, childID, childExtendsID, childImplementsIDs, childSource, childType, childIndex, childName );
  104. }
  105. // Create the local copy of the node properties
  106. if ( this.state.nodes[ childID ] === undefined ){
  107. this.state.nodes[ childID ] = this.state.createLocalNode( nodeID, childID, childExtendsID, childImplementsIDs,
  108. childSource, childType, childIndex, childName, callback );
  109. }
  110. node = this.state.nodes[ childID ];
  111. node.prototypes = protos;
  112. node.kineticObj = createKineticObject( node );
  113. // If the kineticObj was created, attach it to the parent kineticObj, if it is a
  114. // kinetic container
  115. // (if a kinteticObj is created asynchronously ... like an Image, it will be
  116. // undefined here, but will be added to its parent in the appropriate callback)
  117. addNodeToHierarchy( node );
  118. }
  119. },
  120. // initializingNode: function( nodeID, childID, childExtendsID, childImplementsIDs,
  121. // childSource, childType, childIndex, childName ) {
  122. // if ( this.debug.initializing ) {
  123. // this.logger.infox( "initializingNode", nodeID, childID, childExtendsID, childImplementsIDs, childSource, childType, childName );
  124. // }
  125. // },
  126. // -- deletingNode -------------------------------------------------------------------------
  127. deletingNode: function( nodeID ) {
  128. if ( this.debug.deleting ) {
  129. this.logger.infox( "deletingNode", nodeID );
  130. }
  131. if ( this.state.nodes[ nodeID ] !== undefined ) {
  132. var node = this.state.nodes[ nodeID ];
  133. if ( node.kineticObj !== undefined ) {
  134. // removes and destroys object
  135. node.kineticObj.destroy();
  136. node.kineticObj = undefined;
  137. }
  138. delete this.state.nodes[ nodeID ];
  139. }
  140. },
  141. // -- addingChild ------------------------------------------------------------------------
  142. // addingChild: function( nodeID, childID, childName ) {
  143. // if ( this.debug.parenting ) {
  144. // this.logger.infox( "addingChild", nodeID, childID, childName );
  145. // }
  146. // },
  147. // -- movingChild ------------------------------------------------------------------------
  148. movingChild: function( nodeID, childID, childName ) {
  149. if ( this.debug.parenting ) {
  150. this.logger.infox( "movingChild", nodeID, childID, childName );
  151. }
  152. if ( this.state.nodes[ childID ] !== undefined ) {
  153. if ( this.state.nodes[ nodeID ] !== undefined ) {
  154. var parentNode = this.state.nodes[ nodeID ];
  155. if ( isContainerDefinition( parentNode.prototypes ) && parentNode.kineticObj ) {
  156. var node = this.state.nodes[ childID ];
  157. if ( node.kineticObj !== undefined ) {
  158. // removes object only
  159. node.kineticObj.remove();
  160. parentNode.kineticObj.add( node.kineticObj );
  161. }
  162. }
  163. }
  164. }
  165. },
  166. // -- removingChild ------------------------------------------------------------------------
  167. // removingChild: function( nodeID, childID, childName ) {
  168. // if ( this.debug.parenting ) {
  169. // this.logger.infox( "removingChild", nodeID, childID, childName );
  170. // }
  171. // },
  172. // -- creatingProperty ---------------------------------------------------------------------
  173. creatingProperty: function( nodeID, propertyName, propertyValue ) {
  174. var value = undefined;
  175. if ( this.debug.properties ) {
  176. this.logger.infox( "C === creatingProperty ", nodeID, propertyName, propertyValue );
  177. }
  178. var node = this.state.nodes[ nodeID ];
  179. if ( node !== undefined ) {
  180. value = this.settingProperty( nodeID, propertyName, propertyValue );
  181. }
  182. return value;
  183. },
  184. // -- initializingProperty -----------------------------------------------------------------
  185. initializingProperty: function( nodeID, propertyName, propertyValue ) {
  186. var value = undefined;
  187. if ( this.debug.properties ) {
  188. this.logger.infox( " I === initializingProperty ", nodeID, propertyName, propertyValue );
  189. }
  190. var node = this.state.nodes[ nodeID ];
  191. if ( node !== undefined ) {
  192. value = this.settingProperty( nodeID, propertyName, propertyValue );
  193. }
  194. return value;
  195. },
  196. // -- settingProperty ----------------------------------------------------------------------
  197. settingProperty: function( nodeID, propertyName, propertyValue ) {
  198. if ( this.debug.properties || this.debug.setting ) {
  199. this.logger.infox( " S === settingProperty ", nodeID, propertyName, propertyValue );
  200. }
  201. var node = this.state.nodes[ nodeID ];
  202. var imageObj;
  203. var value = undefined;
  204. if ( node && node.kineticObj && utility.validObject( propertyValue ) ) {
  205. var kineticObj = node.kineticObj;
  206. if ( isNodeDefinition( node.prototypes ) ) {
  207. // 'id' will be set to the nodeID
  208. value = propertyValue;
  209. switch ( propertyName ) {
  210. case "x":
  211. kineticObj.modelX = Number( propertyValue );
  212. // Update the view - though this would be more appropriate to do in the
  213. // view driver's satProperty, it is important that it be updated
  214. // atomically with the model so there is no risk that "ticked" will
  215. // discover the descrepancy between model and view values and assume
  216. // that the user has dragged the node via kinetic (thus triggering it to
  217. // set the model value from the old view value)
  218. if ( !node.uniqueInView ) {
  219. kineticObj.x( kineticObj.modelX );
  220. }
  221. break;
  222. case "y":
  223. kineticObj.modelY = Number( propertyValue );
  224. // Update the view - though this would be more appropriate to do in the
  225. // view driver's satProperty, it is important that it be updated
  226. // atomically with the model so there is no risk that "ticked" will
  227. // discover the descrepancy between model and view values and assume
  228. // that the user has dragged the node via kinetic (thus triggering it to
  229. // set the model value from the old view value)
  230. if ( !node.uniqueInView ) {
  231. kineticObj.y( Number( kineticObj.modelY ) );
  232. }
  233. break;
  234. case "width":
  235. kineticObj.width( Number( propertyValue ) );
  236. break;
  237. case "height":
  238. kineticObj.height( Number( propertyValue ) );
  239. break;
  240. case "visible":
  241. if ( propertyValue === 'inherit' ) {
  242. kineticObj.visible( propertyValue );
  243. } else {
  244. kineticObj.visible( Boolean( propertyValue ) );
  245. }
  246. break;
  247. case "listening":
  248. if ( propertyValue === 'inherit' ) {
  249. kineticObj.listening( propertyValue );
  250. } else {
  251. kineticObj.listening( Boolean( propertyValue ) );
  252. }
  253. break;
  254. case "opacity":
  255. kineticObj.opacity( parseFloat( propertyValue ) );
  256. break;
  257. case "scale":
  258. if ( propertyValue instanceof Array ) {
  259. kineticObj.modelScaleX = Number( propertyValue[ 0 ] );
  260. kineticObj.modelScaleY = Number( propertyValue[ 1 ] );
  261. } else {
  262. kineticObj.modelScaleX = Number( propertyValue.x );
  263. kineticObj.modelScaleY = Number( propertyValue.y );
  264. }
  265. break;
  266. case "scaleX":
  267. kineticObj.modelScaleX = Number( propertyValue );
  268. break;
  269. case "scaleY":
  270. kineticObj.modelScaleY = Number( propertyValue );
  271. break;
  272. case "rotation":
  273. kineticObj.rotation( Number( propertyValue ) );
  274. break;
  275. // check code, not in docs
  276. case "offset":
  277. if ( propertyValue instanceof Array ) {
  278. kineticObj.offset( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  279. } else {
  280. kineticObj.offset( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  281. }
  282. break;
  283. // check code, not in docs
  284. case "offsetX":
  285. kineticObj.offsetX( Number( propertyValue ) );
  286. break;
  287. case "offsetY":
  288. kineticObj.offsetY( Number( propertyValue ) );
  289. break;
  290. case "draggable":
  291. // Store the model value separately in case the view wants
  292. // to change the value for one user
  293. kineticObj.isDraggable = Boolean( propertyValue );
  294. // Set the view value from the model value
  295. kineticObj.draggable( kineticObj.isDraggable );
  296. break;
  297. // check code, not in docs
  298. case "dragDistance":
  299. kineticObj.dragDistance( Number( propertyValue ) );
  300. break;
  301. case "zIndex":
  302. kineticObj.setZIndex( Number( propertyValue ) );
  303. break;
  304. case "position":
  305. if ( propertyValue instanceof Array ) {
  306. kineticObj.modelX = Number( propertyValue[ 0 ] );
  307. kineticObj.modelY = Number( propertyValue[ 1 ] );
  308. } else {
  309. kineticObj.modelX = Number( propertyValue.x );
  310. kineticObj.modelY = Number( propertyValue.y );
  311. }
  312. // Update the view - though this would be more appropriate to do in the
  313. // view driver's satProperty, it is important that it be updated
  314. // atomically with the model so there is no risk that "ticked" will
  315. // discover the descrepancy between model and view values and assume
  316. // that the user has dragged the node via kinetic (thus triggering it to
  317. // set the model value from the old view value)
  318. // If the node is being dragged by this client, then its view has
  319. // already updated, and we risk updating it with a stale value.
  320. // Therefore, if the view has told us to ignore the next update, we will
  321. // do that. Otherwise, update the view value.
  322. if ( node.viewIgnoreNextPositionUpdate ) {
  323. node.viewIgnoreNextPositionUpdate = false;
  324. } else if ( !node.uniqueInView ) {
  325. kineticObj.setPosition( {
  326. x: kineticObj.modelX,
  327. y: kineticObj.modelY
  328. } );
  329. }
  330. break;
  331. case "absolutePosition":
  332. // Store the current absolute position because we are about to tamper
  333. // with the view value to get kinetic to compute the new model values
  334. // for us. If uniqueInView is true, we should not change the view
  335. // value, so we will need to put this one back.
  336. var oldAbsolutePosition = kineticObj.getAbsolutePosition();
  337. // Compute new modelX and modelY values
  338. if ( propertyValue instanceof Array ) {
  339. kineticObj.setAbsolutePosition( {
  340. "x": Number( propertyValue[ 0 ] ),
  341. "y": Number( propertyValue[ 1 ] )
  342. });
  343. } else {
  344. kineticObj.setAbsolutePosition( {
  345. "x": Number( propertyValue.x ),
  346. "y": Number( propertyValue.y )
  347. });
  348. }
  349. kineticObj.modelX = kineticObj.x();
  350. kineticObj.modelY = kineticObj.y();
  351. // If each user has a unique view value, setting the model value should
  352. // not change the view value, so we set the original view value back now
  353. // that we are done using it to calculate the new model value.
  354. if ( node.uniqueInView ) {
  355. kineticObj.setAbsolutePosition( oldAbsolutePosition );
  356. }
  357. break;
  358. case "uniqueInView":
  359. node.uniqueInView = Boolean( propertyValue );
  360. // If we no longer have unique views, all view positions should be set
  361. // to the model value
  362. // Note: though this would be more appropriate to do in the view
  363. // driver's satProperty, it is important that it be updated atomically
  364. // with the model so there is no risk that "ticked" will discover the
  365. // descrepancy between model and view values and assume that the user
  366. // has dragged the node via kinetic (thus triggering it to set the model
  367. // value from the old view value)
  368. if ( !node.uniqueInView ) {
  369. kineticObj.x( kineticObj.modelX );
  370. kineticObj.y( kineticObj.modelY );
  371. }
  372. break;
  373. case "dragBoundFunc":
  374. var functionString = propertyValue;
  375. if ( !utility.isString( functionString ) ) {
  376. this.logger.errorx( "settingProperty",
  377. "The value of dragBoundFunc should be a string of the " +
  378. "function to be used." );
  379. break;
  380. }
  381. node.kineticObj.dragBoundFunc( eval( "(" + functionString + ")" ) );
  382. break;
  383. case "transform":
  384. case "absoluteTransform":
  385. case "absoluteOpacity":
  386. case "absoluteZIndex":
  387. this.logger.errorx( "settingProperty", "Cannot set property ",
  388. propertyName );
  389. value = undefined;
  390. default:
  391. value = undefined;
  392. break;
  393. }
  394. }
  395. if ( value === undefined && isShapeDefinition( node.prototypes ) ) {
  396. value = propertyValue;
  397. switch ( propertyName ) {
  398. case "fill":
  399. var vwfColor = new utility.color( propertyValue );
  400. if ( vwfColor ) {
  401. kineticObj.fill( vwfColor.toString() );
  402. }
  403. break;
  404. case "fillRed":
  405. kineticObj.fillRed( Number( propertyValue ) );
  406. break;
  407. case "fillGreen":
  408. kineticObj.fillGreen( Number( propertyValue ) );
  409. break;
  410. case "fillBlue":
  411. kineticObj.fillGreen( Number( propertyValue ) );
  412. break;
  413. case "fillAlpha":
  414. kineticObj.fillAlpha( parseFloat( propertyValue ) );
  415. break;
  416. case "fillPatternImage":
  417. if ( utility.validObject( propertyValue ) ) {
  418. var imageObj = kineticObj.fillPatternImage();
  419. if ( imageObj !== undefined ) {
  420. imageObj.src = propertyValue;
  421. } else {
  422. imageObj = new Image();
  423. imageObj.onload = function() {
  424. kineticObj.fillPatternImage( imageObj );
  425. };
  426. imageObj.src = propertyValue;
  427. }
  428. }
  429. break;
  430. case "fillPatternX":
  431. kineticObj.fillPatternX( Number( propertyValue ) );
  432. break;
  433. case "fillPatternY":
  434. kineticObj.fillPatternY( Number( propertyValue ) );
  435. break;
  436. case "fillPatternOffset":
  437. if ( propertyValue instanceof Array ) {
  438. kineticObj.fillPatternOffset( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  439. } else {
  440. kineticObj.fillPatternOffset( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  441. }
  442. break;
  443. case "fillPatternOffsetX":
  444. kineticObj.fillPatternOffsetX( Number( propertyValue ) );
  445. break;
  446. case "fillPatternOffsetY":
  447. kineticObj.fillPatternOffsetY( Number( propertyValue ) );
  448. break;
  449. case "fillPatternScale":
  450. if ( propertyValue instanceof Array ) {
  451. kineticObj.fillPatternScale( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  452. } else {
  453. kineticObj.fillPatternScale( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  454. }
  455. break;
  456. case "fillPatternScaleX":
  457. kineticObj.fillPatternScaleX( Number( propertyValue ) );
  458. break;
  459. case "fillPatternScaleY":
  460. kineticObj.fillPatternScaleY( Number( propertyValue ) );
  461. break;
  462. case "fillPatternRotation":
  463. kineticObj.fillPatternRotation( Number( propertyValue ) );
  464. break;
  465. case "fillPatternRepeat":
  466. switch( propertyValue ) {
  467. case "repeat":
  468. case "repeat-x":
  469. case "repeat-y":
  470. case "no-repeat":
  471. kineticObj.fillPatternRepeat( propertyValue );
  472. break;
  473. default:
  474. this.logger.warnx( "incorrect value for fillPatternRepeat: " + propertyValue );
  475. break;
  476. }
  477. break;
  478. case "fillLinearGradientStartPoint":
  479. if ( propertyValue instanceof Array ) {
  480. kineticObj.fillLinearGradientStartPoint( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  481. } else {
  482. kineticObj.fillLinearGradientStartPoint( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  483. }
  484. break;
  485. case "fillLinearGradientStartPointX":
  486. kineticObj.fillLinearGradientStartPointX( Number( propertyValue ) );
  487. break;
  488. case "fillLinearGradientStartPointY":
  489. kineticObj.fillLinearGradientStartPointY( Number( propertyValue ) );
  490. break;
  491. case "fillLinearGradientEndPoint":
  492. if ( propertyValue instanceof Array ) {
  493. kineticObj.fillLinearGradientEndPoint( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  494. } else {
  495. kineticObj.fillLinearGradientEndPoint( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  496. }
  497. break;
  498. case "fillLinearGradientEndPointX":
  499. kineticObj.fillLinearGradientEndPointX( Number( propertyValue ) );
  500. break;
  501. case "fillLinearGradientEndPointY":
  502. kineticObj.fillLinearGradientEndPointY( Number( propertyValue ) );
  503. break;
  504. case "fillLinearGradientColorStops":
  505. kineticObj.fillLinearGradientColorStops( propertyValue );
  506. break;
  507. case "fillRadialGradientStartPoint":
  508. if ( propertyValue instanceof Array ) {
  509. kineticObj.fillRadialGradientStartPoint( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  510. } else {
  511. kineticObj.fillRadialGradientStartPoint( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  512. }
  513. break;
  514. case "fillRadialGradientStartPointX":
  515. kineticObj.fillRadialGradientStartPointX( Number( propertyValue ) );
  516. break;
  517. case "fillRadialGradientStartPointY":
  518. kineticObj.fillRadialGradientStartPointX( Number( propertyValue ) );
  519. break;
  520. case "fillRadialGradientEndPoint":
  521. if ( propertyValue instanceof Array ) {
  522. kineticObj.fillRadialGradientEndPoint( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  523. } else {
  524. kineticObj.fillRadialGradientEndPoint( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  525. }
  526. break;
  527. case "fillRadialGradientEndPointX":
  528. kineticObj.fillRadialGradientEndPointX( Number( propertyValue ) );
  529. break;
  530. case "fillRadialGradientEndPointY":
  531. kineticObj.fillRadialGradientEndPointY( Number( propertyValue ) );
  532. break;
  533. case "fillRadialGradientStartRadius":
  534. kineticObj.fillRadialGradientStartRadius( Number( propertyValue ) );
  535. break;
  536. case "fillRadialGradientEndRadius":
  537. kineticObj.fillRadialGradientEndRadius( Number( propertyValue ) );
  538. break;
  539. case "fillRadialGradientColorStops":
  540. kineticObj.fillRadialGradientColorStops( propertyValue );
  541. break;
  542. case "fillEnabled":
  543. kineticObj.fillEnabled( Boolean( propertyValue ) );
  544. break;
  545. case "fillPriority":
  546. switch( propertyValue ) {
  547. case "color":
  548. case "pattern":
  549. case "linear-gradient":
  550. case "radial-gradient":
  551. kineticObj.fillPriority( propertyValue );
  552. break;
  553. default:
  554. this.logger.warnx( "incorrect value for fillPriority: " + propertyValue );
  555. break;
  556. }
  557. break;
  558. case "stroke":
  559. var vwfColor = new utility.color( propertyValue );
  560. if ( vwfColor ) {
  561. kineticObj.stroke( vwfColor.toString() );
  562. }
  563. break;
  564. case "strokeRed":
  565. kineticObj.strokeRed( Number( propertyValue ) );
  566. break;
  567. case "strokeGreen":
  568. kineticObj.strokeGreen( Number( propertyValue ) );
  569. break;
  570. case "strokeBlue":
  571. kineticObj.strokeBlue( Number( propertyValue ) );
  572. break;
  573. case "strokeAlpha":
  574. kineticObj.strokeAlpha( parseFloat( propertyValue ) );
  575. break;
  576. case "strokeWidth":
  577. kineticObj.strokeWidth( Number( propertyValue ) );
  578. break;
  579. case "strokeScaleEnabled":
  580. kineticObj.strokeScaleEnabled( Boolean( propertyValue ) );
  581. break;
  582. case "strokeEnabled":
  583. kineticObj.strokeEnabled( Boolean( propertyValue ) );
  584. break;
  585. case "lineJoin":
  586. switch( propertyValue ) {
  587. case "miter":
  588. case "round":
  589. case "bevel":
  590. kineticObj.lineJoin( propertyValue );
  591. break;
  592. default:
  593. this.logger.warnx( "incorrect value for lineJoin: " + propertyValue );
  594. break;
  595. }
  596. break;
  597. case "lineCap":
  598. switch( propertyValue ) {
  599. case "butt":
  600. case "round":
  601. case "square":
  602. kineticObj.lineCap( propertyValue );
  603. break;
  604. default:
  605. this.logger.warnx( "incorrect value for lineCap: " + propertyValue );
  606. break;
  607. }
  608. break;
  609. case "shadowColor":
  610. var vwfColor = new utility.color( propertyValue );
  611. if ( vwfColor ) {
  612. kineticObj.shadowColor( vwfColor.toString() );
  613. }
  614. break;
  615. case "shadowRed":
  616. kineticObj.shadowRed( Number( propertyValue ) );
  617. break;
  618. case "shadowGreen":
  619. kineticObj.shadowGreen( Number( propertyValue ) );
  620. break;
  621. case "shadowBlue":
  622. kineticObj.shadowBlue( Number( propertyValue ) );
  623. break;
  624. case "shadowBlue":
  625. kineticObj.shadowBlue( parseFloat( propertyValue ) );
  626. break;
  627. case "shadowBlur":
  628. kineticObj.shadowBlur( Number( propertyValue ) );
  629. break;
  630. case "shadowOffset":
  631. if ( propertyValue instanceof Array ) {
  632. kineticObj.shadowOffset( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  633. } else {
  634. kineticObj.shadowOffset( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  635. }
  636. break;
  637. case "shadowOffsetX":
  638. kineticObj.shadowOffsetX( Number( propertyValue ) );
  639. break;
  640. case "shadowOffsetY":
  641. kineticObj.shadowOffsetY( Number( propertyValue ) );
  642. break;
  643. case "shadowOpacity":
  644. kineticObj.shadowOpacity( parseFloat( propertyValue ) );
  645. break;
  646. case "shadowEnabled":
  647. kineticObj.shadowEnabled( Boolean( propertyValue ) );
  648. break;
  649. case "dash":
  650. kineticObj.dash( propertyValue );
  651. break;
  652. case "dashEnabled":
  653. kineticObj.dashEnabled( Boolean( propertyValue ) );
  654. break;
  655. default:
  656. value = undefined;
  657. break;
  658. }
  659. }
  660. if ( value === undefined && isContainerDefinition( node.prototypes ) ) {
  661. value = propertyValue;
  662. switch ( propertyName ) {
  663. case "clipFunc":
  664. default:
  665. value = undefined;
  666. break;
  667. }
  668. }
  669. if ( value === undefined && kineticObj instanceof Kinetic.Arc ) {
  670. value = propertyValue;
  671. switch ( propertyName ) {
  672. case "angle":
  673. kineticObj.angle( Number( propertyValue ) );
  674. break;
  675. case "innerRadius":
  676. kineticObj.innerRadius( Number( propertyValue ) );
  677. break;
  678. case "outerRadius":
  679. kineticObj.outerRadius( Number( propertyValue ) );
  680. break;
  681. case "clockwise":
  682. kineticObj.clockwise( Boolean( propertyValue ) );
  683. break;
  684. default:
  685. value = undefined;
  686. break;
  687. }
  688. }
  689. if ( value === undefined &&
  690. ( kineticObj instanceof Kinetic.BaseLayer ||
  691. kineticObj instanceof Kinetic.FastLayer ||
  692. kineticObj instanceof Kinetic.Layer
  693. ) ) {
  694. value = propertyValue;
  695. switch ( propertyName ) {
  696. case "clearBeforeDraw":
  697. kineticObj.clearBeforeDraw( Boolean( propertyValue ) );
  698. break;
  699. case "hitGraphEnabled":
  700. kineticObj.hitGraphEnabled( Boolean(propertyValue) );
  701. break;
  702. default:
  703. value = undefined;
  704. break;
  705. }
  706. }
  707. if ( value === undefined && kineticObj instanceof Kinetic.Canvas ) {
  708. value = propertyValue;
  709. switch ( propertyName ) {
  710. case "width":
  711. kineticObj.setWidth( Number( propertyValue ) );
  712. break;
  713. case "height":
  714. kineticObj.setHeight( Number( propertyValue ) );
  715. break;
  716. case "pixelRatio":
  717. kineticObj.setPixelRatio( parseFloat( propertyValue ) );
  718. break;
  719. default:
  720. value = undefined;
  721. break;
  722. }
  723. }
  724. if ( value === undefined && kineticObj instanceof Kinetic.Circle ) {
  725. value = propertyValue;
  726. switch ( propertyName ) {
  727. case "radius":
  728. kineticObj.radius( Number( propertyValue ) );
  729. break;
  730. default:
  731. value = undefined;
  732. break;
  733. }
  734. }
  735. if ( value === undefined && kineticObj instanceof Kinetic.Ellipse ) {
  736. value = propertyValue;
  737. switch ( propertyName ) {
  738. case "radius":
  739. if ( propertyValue instanceof Array ) {
  740. kineticObj.radius( { "x": Number( propertyValue[ 0 ] ), "y": Number( propertyValue[ 1 ] ) });
  741. } else {
  742. kineticObj.radius( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ) });
  743. }
  744. break;
  745. default:
  746. value = undefined;
  747. break;
  748. }
  749. }
  750. if ( value === undefined && kineticObj instanceof Kinetic.Image ) {
  751. value = propertyValue;
  752. switch ( propertyName ) {
  753. case "image":
  754. if ( utility.validObject( propertyValue ) ) {
  755. loadImage( node, propertyValue );
  756. }
  757. break;
  758. case "crop":
  759. if ( propertyValue instanceof Array ) {
  760. var cropObj = {
  761. "x": Number( propertyValue[ 0 ] ),
  762. "y": Number( propertyValue[ 1 ] ),
  763. "width": Number( propertyValue[ 2 ] ),
  764. "height": Number( propertyValue[ 3 ] )
  765. }
  766. kineticObj.crop( cropObj );
  767. } else {
  768. kineticObj.crop( { "x": Number( propertyValue.x ), "y": Number( propertyValue.y ),
  769. "width": Number( propertyValue.width ), "height": Number( propertyValue.height )
  770. } );
  771. }
  772. break;
  773. case "scaleOnLoad":
  774. node.scaleOnLoad = Boolean( propertyValue );
  775. break;
  776. default:
  777. value = undefined;
  778. break;
  779. }
  780. }
  781. if ( value === undefined && kineticObj instanceof Kinetic.Line ) {
  782. value = propertyValue;
  783. switch ( propertyName ) {
  784. case "points":
  785. kineticObj.points( propertyValue );
  786. break;
  787. case "tension":
  788. kineticObj.tension( Number( propertyValue ) );
  789. break;
  790. case "closed":
  791. kineticObj.closed( Boolean( propertyValue ) );
  792. break;
  793. default:
  794. value = undefined;
  795. break;
  796. }
  797. }
  798. if ( value === undefined && kineticObj instanceof Kinetic.Path ) {
  799. value = propertyValue;
  800. switch ( propertyName ) {
  801. case "data":
  802. kineticObj.data( propertyValue );
  803. break;
  804. default:
  805. value = undefined;
  806. break;
  807. }
  808. }
  809. if ( value === undefined && kineticObj instanceof Kinetic.Rect ) {
  810. value = propertyValue;
  811. switch ( propertyName ) {
  812. case "cornerRadius":
  813. kineticObj.cornerRadius( Number( propertyValue ) );
  814. break;
  815. default:
  816. value = undefined;
  817. break;
  818. }
  819. }
  820. if ( value === undefined && kineticObj instanceof Kinetic.RegularPolygon ) {
  821. value = propertyValue;
  822. switch ( propertyName ) {
  823. case "sides":
  824. kineticObj.sides( Number( propertyValue ) );
  825. break;
  826. case "radius":
  827. kineticObj.radius( Number( propertyValue ) );
  828. break;
  829. default:
  830. value = undefined;
  831. break;
  832. }
  833. }
  834. if ( value === undefined && kineticObj instanceof Kinetic.Ring ) {
  835. value = propertyValue;
  836. switch ( propertyName ) {
  837. case "innerRadius":
  838. kineticObj.innerRadius( Number( propertyValue ) );
  839. break;
  840. case "outerRadius":
  841. kineticObj.outerRadius( Number( propertyValue ) );
  842. break;
  843. default:
  844. value = undefined;
  845. break;
  846. }
  847. }
  848. if ( value === undefined && kineticObj instanceof Kinetic.Sprite ) {
  849. value = propertyValue;
  850. switch ( propertyName ) {
  851. case "animation":
  852. kineticObj.animation( propertyValue );
  853. break;
  854. case "animations":
  855. kineticObj.animations( JSON.eval( propertyValue ) );
  856. break;
  857. case "frameIndex":
  858. kineticObj.frameIndex( Number( propertyValue ) );
  859. break;
  860. case "image":
  861. if ( utility.validObject( propertyValue ) ) {
  862. loadImage( node, propertyValue );
  863. }
  864. break;
  865. case "scaleOnLoad":
  866. node.scaleOnLoad = Boolean( propertyValue );
  867. break;
  868. default:
  869. value = undefined;
  870. break;
  871. }
  872. }
  873. if ( value === undefined && kineticObj instanceof Kinetic.Star ) {
  874. value = propertyValue;
  875. switch ( propertyName ) {
  876. case "numPoints":
  877. kineticObj.animation( Number( propertyValue ) );
  878. break;
  879. case "innerRadius":
  880. kineticObj.innerRadius( Number( propertyValue ) );
  881. break;
  882. case "outerRadius":
  883. kineticObj.outerRadius( Number( propertyValue ) );
  884. break;
  885. default:
  886. value = undefined;
  887. break;
  888. }
  889. }
  890. if ( value === undefined && kineticObj instanceof Kinetic.Text ) {
  891. value = propertyValue;
  892. switch ( propertyName ) {
  893. case "fontFamily":
  894. kineticObj.fontFamily( propertyValue );
  895. break;
  896. case "fontSize":
  897. kineticObj.fontSize( Number( propertyValue ) );
  898. break;
  899. case "fontStyle":
  900. switch( propertyValue ) {
  901. case "normal":
  902. case "bold":
  903. case "italic":
  904. kineticObj.fontStyle( propertyValue );
  905. break;
  906. default:
  907. this.logger.warnx( "incorrect value for fontStyle: " + propertyValue );
  908. break;
  909. }
  910. break;
  911. case "fontVariant":
  912. switch( propertyValue ) {
  913. case "normal":
  914. case "small-caps":
  915. kineticObj.fontVariant( propertyValue );
  916. break;
  917. default:
  918. this.logger.warnx( "incorrect value for fontVariant: " + propertyValue );
  919. break;
  920. }
  921. break;
  922. case "text":
  923. kineticObj.text( propertyValue );
  924. break;
  925. case "align":
  926. switch( propertyValue ) {
  927. case "left":
  928. case "center":
  929. case "right":
  930. kineticObj.align( propertyValue );
  931. break;
  932. default:
  933. this.logger.warnx( "incorrect value for align: " + propertyValue );
  934. break;
  935. }
  936. break;
  937. case "padding":
  938. kineticObj.padding( Number( propertyValue ) );
  939. break;
  940. case "width":
  941. kineticObj.width( Number( propertyValue ) );
  942. break;
  943. case "height":
  944. kineticObj.height( Number( propertyValue ) );
  945. break;
  946. case "lineHeight":
  947. kineticObj.lineHeight( Number( propertyValue ) );
  948. break;
  949. case "wrap":
  950. switch( propertyValue ) {
  951. case "word":
  952. case "char":
  953. case "none":
  954. kineticObj.wrap( propertyValue );
  955. break;
  956. default:
  957. this.logger.warnx( "incorrect value for wrap: " + propertyValue );
  958. break;
  959. }
  960. break;
  961. default:
  962. value = undefined;
  963. break;
  964. }
  965. }
  966. if ( value === undefined && kineticObj instanceof Kinetic.TextPath ) {
  967. value = propertyValue;
  968. switch ( propertyName ) {
  969. case "fontFamily":
  970. kineticObj.fontFamily( propertyValue );
  971. break;
  972. case "fontSize":
  973. kineticObj.fontSize( Number( propertyValue ) );
  974. break;
  975. case "fontStyle":
  976. switch( propertyValue ) {
  977. case "normal":
  978. case "bold":
  979. case "italic":
  980. kineticObj.fontStyle( propertyValue );
  981. break;
  982. default:
  983. this.logger.warnx( "incorrect value for fontStyle: " + propertyValue );
  984. break;
  985. }
  986. break;
  987. case "fontVariant":
  988. switch( propertyValue ) {
  989. case "normal":
  990. case "small-caps":
  991. kineticObj.fontVariant( propertyValue );
  992. break;
  993. default:
  994. this.logger.warnx( "incorrect value for fontVariant: " + propertyValue );
  995. break;
  996. }
  997. break;
  998. case "text":
  999. kineticObj.text( propertyValue );
  1000. break;
  1001. case "data":
  1002. kineticObj.data( propertyValue );
  1003. break;
  1004. default:
  1005. value = undefined;
  1006. break;
  1007. }
  1008. }
  1009. if ( value === undefined && kineticObj instanceof Kinetic.Wedge ) {
  1010. value = propertyValue;
  1011. switch ( propertyName ) {
  1012. case "angle":
  1013. kineticObj.angle( Number( propertyValue ) );
  1014. break;
  1015. case "radius":
  1016. kineticObj.radius( Number( propertyValue ) );
  1017. break;
  1018. case "clockwise":
  1019. kineticObj.clockwise( Boolean( propertyValue ) );
  1020. break;
  1021. default:
  1022. value = undefined;
  1023. break;
  1024. }
  1025. }
  1026. }
  1027. return value;
  1028. },
  1029. // -- gettingProperty ----------------------------------------------------------------------
  1030. gettingProperty: function( nodeID, propertyName, propertyValue ) {
  1031. if ( this.debug.properties || this.debug.getting ) {
  1032. this.logger.infox( " G === gettingProperty ", nodeID, propertyName );
  1033. }
  1034. var node = this.state.nodes[nodeID];
  1035. var value = undefined;
  1036. if ( node && node.kineticObj ) {
  1037. var kineticObj = node.kineticObj;
  1038. if ( isNodeDefinition( node.prototypes ) ) {
  1039. switch ( propertyName ) {
  1040. case "x":
  1041. value = kineticObj.modelX || 0;
  1042. break;
  1043. case "y":
  1044. value = kineticObj.modelY || 0;
  1045. break;
  1046. case "width":
  1047. value = kineticObj.width();
  1048. break;
  1049. case "height":
  1050. value = kineticObj.height();
  1051. break;
  1052. case "visible":
  1053. value = kineticObj.visible();
  1054. break;
  1055. case "isVisible":
  1056. value = kineticObj.isVisible();
  1057. break;
  1058. case "listening":
  1059. value = kineticObj.listening();
  1060. break;
  1061. case "isListening":
  1062. value = kineticObj.isListening();
  1063. break;
  1064. case "opacity":
  1065. value = kineticObj.opacity();
  1066. break;
  1067. case "scale":
  1068. value = kineticObj.scale();
  1069. break;
  1070. case "scaleX":
  1071. value = kineticObj.scaleX();
  1072. break;
  1073. case "scaleY":
  1074. value = kineticObj.scaleY();
  1075. break;
  1076. case "rotation":
  1077. value = kineticObj.rotation();
  1078. break;
  1079. // check code, not in docs
  1080. case "offset":
  1081. value = kineticObj.offset();
  1082. break;
  1083. // check code, not in docs
  1084. case "offsetX":
  1085. value = kineticObj.offsetX();
  1086. break;
  1087. case "offsetY":
  1088. value = kineticObj.offsetY();
  1089. break;
  1090. case "draggable":
  1091. // Return the model value that we have stored separately,
  1092. // not the value that is directly in the kinetic object
  1093. // because a user's view might have changed that for only
  1094. // that user
  1095. value = kineticObj.isDraggable;
  1096. break;
  1097. // check code, not in docs
  1098. case "dragDistance":
  1099. value = kineticObj.dragDistance();
  1100. break;
  1101. case "zIndex":
  1102. value = kineticObj.getZIndex();
  1103. break;
  1104. case "dragBoundFunc":
  1105. var dragBoundFunc = node.kineticObj.dragBoundFunc();
  1106. value = dragBoundFunc ? dragBoundFunc.toString() : undefined;
  1107. break;
  1108. case "id":
  1109. value = kineticObj.getId();
  1110. break
  1111. case "name":
  1112. value = kineticObj.getName();
  1113. break;
  1114. case "position":
  1115. value = {
  1116. x: kineticObj.modelX || 0,
  1117. y: kineticObj.modelY || 0
  1118. };
  1119. break;
  1120. case "transform":
  1121. value = kineticObj.getTransform().m;
  1122. value[ 4 ] = kineticObj.modelX || 0;
  1123. value[ 5 ] = kineticObj.modelY || 0;
  1124. break;
  1125. case "absolutePosition":
  1126. if ( !node.uniqueInView ) {
  1127. value = kineticObj.getAbsolutePosition();
  1128. } else {
  1129. // TODO: Since we are allowing the view to drag objects independent
  1130. // of the model, we can't be sure that kinetic has the proper
  1131. // model value. Therefore, we need to compute the math
  1132. // ourselves.
  1133. this.logger.errorx( "gettingProperty", "getter for ",
  1134. "absolutePosition when uniqueInView is not implemented" );
  1135. }
  1136. break;
  1137. case "absoluteTransform":
  1138. if ( !node.uniqueInView ) {
  1139. value = kineticObj.getAbsoluteTransform();
  1140. } else {
  1141. // TODO: Since we are allowing the view to drag objects independent
  1142. // of the model, we can't be sure that kinetic has the proper
  1143. // model value. Therefore, we need to compute the math
  1144. // ourselves.
  1145. this.logger.errorx( "gettingProperty", "getter for ",
  1146. "absoluteTransform when uniqueInView is not implemented" );
  1147. }
  1148. break;
  1149. case "absoluteOpacity":
  1150. value = kineticObj.getAbsoluteOpacity();
  1151. break;
  1152. case "absoluteZIndex":
  1153. value = kineticObj.getAbsoluteZIndex();
  1154. break;
  1155. case "uniqueInView":
  1156. value = node.uniqueInView;
  1157. break;
  1158. }
  1159. }
  1160. if ( value === undefined && isShapeDefinition( node.prototypes ) ) {
  1161. var img = undefined;
  1162. switch ( propertyName ) {
  1163. case "fill":
  1164. value = kineticObj.fill();
  1165. break;
  1166. case "fillRed":
  1167. value = kineticObj.fillRed();
  1168. break;
  1169. case "fillGreen":
  1170. value = kineticObj.fillGreen();
  1171. break;
  1172. case "fillBlue":
  1173. value = kineticObj.fillGreen();
  1174. break;
  1175. case "fillAlpha":
  1176. value = kineticObj.fillAlpha();
  1177. break;
  1178. case "fillPatternImage":
  1179. img = kineticObj.fillPatternImage();
  1180. if ( img ){
  1181. value = img.src;
  1182. }
  1183. break;
  1184. case "fillPatternX":
  1185. value = kineticObj.fillPatternX();
  1186. break;
  1187. case "fillPatternY":
  1188. value = kineticObj.fillPatternY();
  1189. break;
  1190. case "fillPatternOffset":
  1191. value = kineticObj.fillPatternOffset();
  1192. break;
  1193. case "fillPatternOffsetX":
  1194. value = kineticObj.fillPatternOffsetX();
  1195. break;
  1196. case "fillPatternOffsetY":
  1197. value = kineticObj.fillPatternOffsetY();
  1198. break;
  1199. case "fillPatternScale":
  1200. value = kineticObj.fillPatternScale();
  1201. break;
  1202. case "fillPatternScaleX":
  1203. value = kineticObj.fillPatternScaleX();
  1204. break;
  1205. case "fillPatternScaleY":
  1206. value = kineticObj.fillPatternScaleY();
  1207. break;
  1208. case "fillPatternRotation":
  1209. value = kineticObj.fillPatternRotation();
  1210. break;
  1211. case "fillPatternRepeat":
  1212. value = kineticObj.fillPatternRepeat();
  1213. break;
  1214. case "fillLinearGradientStartPoint":
  1215. value = kineticObj.fillLinearGradientStartPoint();
  1216. break;
  1217. case "fillLinearGradientStartPointX":
  1218. value = kineticObj.fillLinearGradientStartPointX();
  1219. break;
  1220. case "fillLinearGradientStartPointY":
  1221. value = kineticObj.fillLinearGradientStartPointY();
  1222. break;
  1223. case "fillLinearGradientEndPoint":
  1224. value = kineticObj.fillLinearGradientEndPoint();
  1225. break;
  1226. case "fillLinearGradientEndPointX":
  1227. value = kineticObj.fillLinearGradientEndPointX();
  1228. break;
  1229. case "fillLinearGradientEndPointY":
  1230. value = kineticObj.fillLinearGradientEndPointY();
  1231. break;
  1232. case "fillLinearGradientColorStops":
  1233. value = kineticObj.fillLinearGradientColorStops();
  1234. break;
  1235. case "fillRadialGradientStartPoint":
  1236. value = kineticObj.fillRadialGradientStartPoint();
  1237. break;
  1238. case "fillRadialGradientStartPointX":
  1239. value = kineticObj.fillRadialGradientStartPointX();
  1240. break;
  1241. case "fillRadialGradientStartPointY":
  1242. value = kineticObj.fillRadialGradientStartPointX();
  1243. break;
  1244. case "fillRadialGradientEndPoint":
  1245. value = kineticObj.fillRadialGradientEndPoint();
  1246. break;
  1247. case "fillRadialGradientEndPointX":
  1248. value = kineticObj.fillRadialGradientEndPointX();
  1249. break;
  1250. case "fillRadialGradientEndPointY":
  1251. value = kineticObj.fillRadialGradientEndPointY();
  1252. break;
  1253. case "fillRadialGradientStartRadius":
  1254. value = kineticObj.fillRadialGradientStartRadius();
  1255. break;
  1256. case "fillRadialGradientEndRadius":
  1257. value = kineticObj.fillRadialGradientEndRadius();
  1258. break;
  1259. case "fillRadialGradientColorStops":
  1260. value = kineticObj.fillRadialGradientColorStops();
  1261. break;
  1262. case "fillEnabled":
  1263. value = kineticObj.fillEnabled();
  1264. break;
  1265. case "fillPriority":
  1266. value = kineticObj.fillPriority();
  1267. break;
  1268. case "stroke":
  1269. value = kineticObj.stroke();
  1270. break;
  1271. case "strokeRed":
  1272. value = kineticObj.strokeRed();
  1273. break;
  1274. case "strokeGreen":
  1275. value = kineticObj.strokeGreen();
  1276. break;
  1277. case "strokeBlue":
  1278. value = kineticObj.strokeBlue();
  1279. break;
  1280. case "strokeAlpha":
  1281. value = kineticObj.strokeAlpha();
  1282. break;
  1283. case "strokeWidth":
  1284. value = kineticObj.strokeWidth();
  1285. break;
  1286. case "strokeScaleEnabled":
  1287. value = kineticObj.strokeScaleEnabled();
  1288. break;
  1289. case "strokeEnabled":
  1290. value = kineticObj.strokeEnabled();
  1291. break;
  1292. case "lineJoin":
  1293. value = kineticObj.lineJoin();
  1294. break;
  1295. case "lineCap":
  1296. value = kineticObj.lineCap();
  1297. break;
  1298. case "shadowColor":
  1299. value = kineticObj.shadowColor();
  1300. break;
  1301. case "shadowRed":
  1302. value = kineticObj.shadowRed();
  1303. break;
  1304. case "shadowGreen":
  1305. value = kineticObj.shadowGreen();
  1306. break;
  1307. case "shadowBlue":
  1308. value = kineticObj.shadowBlue();
  1309. break;
  1310. case "shadowBlue":
  1311. value = kineticObj.shadowBlue();
  1312. break;
  1313. case "shadowBlur":
  1314. value = kineticObj.shadowBlur();
  1315. break;
  1316. case "shadowOffset":
  1317. value = kineticObj.shadowOffset();
  1318. break;
  1319. case "shadowOffsetX":
  1320. value = kineticObj.shadowOffsetX();
  1321. break;
  1322. case "shadowOffsetY":
  1323. value = kineticObj.shadowOffsetY();
  1324. break;
  1325. case "shadowOpacity":
  1326. value = kineticObj.shadowOpacity();
  1327. break;
  1328. case "shadowEnabled":
  1329. value = kineticObj.shadowEnabled();
  1330. break;
  1331. case "dash":
  1332. value = kineticObj.dash();
  1333. break;
  1334. case "dashEnabled":
  1335. value = kineticObj.dashEnabled();
  1336. break;
  1337. default:
  1338. value = undefined;
  1339. break;
  1340. }
  1341. }
  1342. if ( value === undefined && isContainerDefinition( node.prototypes ) ) {
  1343. switch ( propertyName ) {
  1344. case "clipFunc":
  1345. break;
  1346. }
  1347. }
  1348. // this is causing the editor to cause a infinite loop
  1349. // need to understand why, but no time now
  1350. // if ( value === undefined && kineticObj instanceof Kinetic.Stage ) {
  1351. // switch ( propertyName ) {
  1352. // case "container":
  1353. // value = kineticObj.getAttr( 'container' );
  1354. // break;
  1355. // }
  1356. // }
  1357. if ( value === undefined && kineticObj instanceof Kinetic.Arc ) {
  1358. switch ( propertyName ) {
  1359. case "angle":
  1360. value = kineticObj.angle();
  1361. break;
  1362. case "innerRadius":
  1363. value = kineticObj.innerRadius();
  1364. break;
  1365. case "outerRadius":
  1366. value = kineticObj.outerRadius();
  1367. break;
  1368. case "clockwise":
  1369. value = kineticObj.clockwise();
  1370. break;
  1371. }
  1372. }
  1373. if ( value === undefined &&
  1374. ( kineticObj instanceof Kinetic.BaseLayer ||
  1375. kineticObj instanceof Kinetic.FastLayer ||
  1376. kineticObj instanceof Kinetic.Layer
  1377. ) ) {
  1378. switch ( propertyName ) {
  1379. case "clearBeforeDraw":
  1380. value = kineticObj.clearBeforeDraw();
  1381. break;
  1382. }
  1383. }
  1384. if ( value === undefined && kineticObj instanceof Kinetic.Canvas ) {
  1385. switch ( propertyName ) {
  1386. case width:
  1387. value = kineticObj.getWidth();
  1388. break;
  1389. case height:
  1390. value = kineticObj.getHeight();
  1391. break;
  1392. case pixelRatio:
  1393. value = kineticObj.getPixelRatio();
  1394. break;
  1395. }
  1396. }
  1397. if ( value === undefined && kineticObj instanceof Kinetic.Circle ) {
  1398. switch ( propertyName ) {
  1399. case "radius":
  1400. value = kineticObj.radius();
  1401. break;
  1402. }
  1403. }
  1404. if ( value === undefined && kineticObj instanceof Kinetic.Ellipse ) {
  1405. switch ( propertyName ) {
  1406. case "radius":
  1407. value = kineticObj.radius();
  1408. break;
  1409. }
  1410. }
  1411. if ( value === undefined && kineticObj instanceof Kinetic.Image ) {
  1412. switch ( propertyName ) {
  1413. case "image":
  1414. var imageObj = kineticObj.image();
  1415. if ( imageObj !== undefined ) {
  1416. value = imageObj.src;
  1417. }
  1418. break;
  1419. case "crop":
  1420. value = kineticObj.crop();
  1421. break;
  1422. case "scaleOnLoad":
  1423. value = node.scaleOnLoad;
  1424. break;
  1425. }
  1426. }
  1427. if ( value === undefined && kineticObj instanceof Kinetic.Line ) {
  1428. switch ( propertyName ) {
  1429. case "points":
  1430. value = kineticObj.points();
  1431. break;
  1432. case "tension":
  1433. value = kineticObj.tension();
  1434. break;
  1435. case "closed":
  1436. value = kineticObj.closed();
  1437. break;
  1438. }
  1439. }
  1440. if ( value === undefined && kineticObj instanceof Kinetic.Path ) {
  1441. switch ( propertyName ) {
  1442. case "data":
  1443. value = kineticObj.data();
  1444. break;
  1445. }
  1446. }
  1447. if ( value === undefined && kineticObj instanceof Kinetic.Rect ) {
  1448. switch ( propertyName ) {
  1449. case "cornerRadius":
  1450. value = kineticObj.cornerRadius();
  1451. break;
  1452. }
  1453. }
  1454. if ( value === undefined && kineticObj instanceof Kinetic.RegularPolygon ) {
  1455. switch ( propertyName ) {
  1456. case "sides":
  1457. value = kineticObj.sides();
  1458. break;
  1459. case "radius":
  1460. value = kineticObj.radius();
  1461. break;
  1462. }
  1463. }
  1464. if ( value === undefined && kineticObj instanceof Kinetic.Ring ) {
  1465. switch ( propertyName ) {
  1466. case "innerRadius":
  1467. value = kineticObj.innerRadius();
  1468. break;
  1469. case "outerRadius":
  1470. value = kineticObj.outerRadius();
  1471. break;
  1472. }
  1473. }
  1474. if ( value === undefined && kineticObj instanceof Kinetic.Sprite ) {
  1475. switch ( propertyName ) {
  1476. case "animation":
  1477. value = kineticObj.animation();
  1478. break;
  1479. case "animations":
  1480. value = JSON.stringify( kineticObj.animations() );
  1481. break;
  1482. case "frameIndex":
  1483. value = kineticObj.frameIndex();
  1484. break;
  1485. case "image":
  1486. var imageObj = kineticObj.image();
  1487. if ( imageObj !== undefined ) {
  1488. value = imageObj.src;
  1489. }
  1490. break;
  1491. case "scaleOnLoad":
  1492. value = node.scaleOnLoad;
  1493. break;
  1494. }
  1495. }
  1496. if ( value === undefined && kineticObj instanceof Kinetic.Star ) {
  1497. switch ( propertyName ) {
  1498. case "numPoints":
  1499. value = kineticObj.animation();
  1500. break;
  1501. case "innerRadius":
  1502. value = kineticObj.innerRadius();
  1503. break;
  1504. case "outerRadius":
  1505. value = kineticObj.outerRadius();
  1506. break;
  1507. }
  1508. }
  1509. if ( value === undefined && kineticObj instanceof Kinetic.Text ) {
  1510. switch ( propertyName ) {
  1511. case "fontFamily":
  1512. value = kineticObj.fontFamily();
  1513. break;
  1514. case "fontSize":
  1515. value = kineticObj.fontSize();
  1516. break;
  1517. case "fontStyle":
  1518. value = kineticObj.fontStyle();
  1519. break;
  1520. case "fontVariant":
  1521. value = kineticObj.fontVariant();
  1522. break;
  1523. case "text":
  1524. value = kineticObj.text();
  1525. break;
  1526. case "align":
  1527. value = kineticObj.align();
  1528. break;
  1529. case "padding":
  1530. value = kineticObj.padding();
  1531. break;
  1532. case "width":
  1533. value = kineticObj.width();
  1534. break;
  1535. case "height":
  1536. value = kineticObj.height();
  1537. break;
  1538. case "lineHeight":
  1539. value = kineticObj.lineHeight();
  1540. break;
  1541. case "wrap":
  1542. value = kineticObj.wrap();
  1543. break;
  1544. }
  1545. }
  1546. if ( value === undefined && kineticObj instanceof Kinetic.TextPath ) {
  1547. switch ( propertyName ) {
  1548. case "fontFamily":
  1549. value = kineticObj.fontFamily();
  1550. break;
  1551. case "fontSize":
  1552. value = kineticObj.fontSize();
  1553. break;
  1554. case "fontStyle":
  1555. value = kineticObj.fontStyle();
  1556. break;
  1557. case "fontVariant":
  1558. value = kineticObj.fontVariant();
  1559. break;
  1560. case "text":
  1561. value = kineticObj.text();
  1562. break;
  1563. case "data":
  1564. value = kineticObj.data();
  1565. break;
  1566. }
  1567. }
  1568. if ( value === undefined && kineticObj instanceof Kinetic.Wedge ) {
  1569. switch ( propertyName ) {
  1570. case "angle":
  1571. value = kineticObj.angle();
  1572. break;
  1573. case "radius":
  1574. value = kineticObj.radius();
  1575. break;
  1576. case "clockwise":
  1577. kineticObj.clockwise();
  1578. break;
  1579. }
  1580. }
  1581. }
  1582. if ( value !== undefined ) {
  1583. propertyValue = value;
  1584. }
  1585. return value;
  1586. },
  1587. // TODO: deletingMethod
  1588. // -- callingMethod --------------------------------------------------------------------------
  1589. callingMethod: function( nodeID, methodName, methodParameters, methodValue ) {
  1590. if ( this.debug.methods ) {
  1591. this.logger.infox( " M === callingMethod ", nodeID, methodName );
  1592. }
  1593. },
  1594. // -- executing ------------------------------------------------------------------------------
  1595. // executing: function( nodeID, scriptText, scriptType ) {
  1596. // return undefined;
  1597. // },
  1598. // ticking: function( vwfTime ) {
  1599. // }
  1600. } );
  1601. // == PRIVATE ========================================================================================
  1602. function getPrototypes( kernel, extendsID ) {
  1603. var prototypes = [];
  1604. var id = extendsID;
  1605. while ( id !== undefined ) {
  1606. prototypes.push( id );
  1607. id = kernel.prototype( id );
  1608. }
  1609. return prototypes;
  1610. }
  1611. function createKineticObject( node, config ) {
  1612. var protos = node.prototypes;
  1613. var kineticObj = undefined;
  1614. if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/arc.vwf" ) ) {
  1615. kineticObj = new Kinetic.Arc( config || {} );
  1616. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/baseLayer.vwf" ) ) {
  1617. kineticObj = new Kinetic.BaseLayer( config || {} );
  1618. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/canvas.vwf" ) ) {
  1619. kineticObj = new Kinetic.Canvas( config || {} );
  1620. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/circle.vwf" ) ) {
  1621. kineticObj = new Kinetic.Circle( config || {} );
  1622. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/ellipse.vwf" ) ) {
  1623. kineticObj = new Kinetic.Ellipse( config || {} );
  1624. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/fastLayer.vwf" ) ) {
  1625. kineticObj = new Kinetic.FastLayer( config || {} );
  1626. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/group.vwf" ) ) {
  1627. kineticObj = new Kinetic.Group( config || {} );
  1628. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/image.vwf" ) ) {
  1629. var imageObj = new Image();
  1630. node.scaleOnLoad = false;
  1631. kineticObj = new Kinetic.Image( {
  1632. image: imageObj
  1633. } );
  1634. if ( node.source !== undefined ) {
  1635. imageObj.src = node.source;
  1636. }
  1637. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/layer.vwf" ) ) {
  1638. kineticObj = new Kinetic.Layer( config || {} );
  1639. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/line.vwf" ) ) {
  1640. kineticObj = new Kinetic.Line( config || { "points": [] } );
  1641. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/path.vwf" ) ) {
  1642. kineticObj = new Kinetic.Path( config || {} );
  1643. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/rect.vwf" ) ) {
  1644. kineticObj = new Kinetic.Rect( config || {} );
  1645. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/regularPolygon.vwf" ) ) {
  1646. kineticObj = new Kinetic.RegularPolygon( config || {} );
  1647. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/ring.vwf" ) ) {
  1648. kineticObj = new Kinetic.Ring( config || {} );
  1649. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/sprite.vwf" ) ) {
  1650. var imageObj = new Image();
  1651. node.scaleOnLoad = false;
  1652. kineticObj = new Kinetic.Sprite( {
  1653. image: imageObj
  1654. } );
  1655. if ( node.source !== undefined ) {
  1656. imageObj.src = node.source;
  1657. }
  1658. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/stage.vwf" ) ) {
  1659. var stageWidth = ( window && window.innerWidth ) ? window.innerWidth : 800;
  1660. var stageHeight = ( window && window.innerHeight ) ? window.innerHeight : 600;
  1661. var stageContainer = ( config && config.container ) || 'vwf-root';
  1662. var stageWidth = ( config && config.width ) || stageWidth;
  1663. var stageHeight = ( config && config.height ) || stageHeight;
  1664. var stageDef = {
  1665. "container": stageContainer,
  1666. "width": stageWidth,
  1667. "height": stageHeight
  1668. };
  1669. kineticObj = new Kinetic.Stage( stageDef );
  1670. self.state.stages[ node.ID ] = kineticObj;
  1671. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/star.vwf" ) ) {
  1672. kineticObj = new Kinetic.Star( config || {} );
  1673. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/text.vwf" ) ) {
  1674. kineticObj = new Kinetic.Text( config || {} );
  1675. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/textPath.vwf" ) ) {
  1676. kineticObj = new Kinetic.TextPath( config || {} );
  1677. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/wedge.vwf" ) ) {
  1678. kineticObj = new Kinetic.Wedge( config || {} );
  1679. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/shape.vwf" ) ) {
  1680. kineticObj = new Kinetic.Shape( config || {} );
  1681. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/container.vwf" ) ) {
  1682. kineticObj = new Kinetic.Container( config || {} );
  1683. } else if ( self.state.isKineticClass( protos, "http://vwf.example.com/kinetic/node.vwf" ) ) {
  1684. kineticObj = new Kinetic.Node( config || {} );
  1685. }
  1686. return kineticObj;
  1687. }
  1688. function findStage( kineticObj ) {
  1689. var stage = undefined
  1690. var parent = kineticObj;
  1691. while ( parent !== undefined && stage === undefined ) {
  1692. if ( parent.nodeType === "Stage" ) {
  1693. stage = parent;
  1694. }
  1695. parent = parent.parent;
  1696. }
  1697. return stage;
  1698. }
  1699. function addNodeToHierarchy( node ) {
  1700. if ( node.kineticObj ) {
  1701. if ( self.state.nodes[ node.parentID ] !== undefined ) {
  1702. var parent = self.state.nodes[ node.parentID ];
  1703. if ( parent.kineticObj && isContainerDefinition( parent.prototypes ) ) {
  1704. if ( parent.children === undefined ) {
  1705. parent.children = [];
  1706. }
  1707. parent.children.push( node.ID );
  1708. //console.info( "Adding child: " + childID + " to " + nodeID );
  1709. parent.kineticObj.add( node.kineticObj );
  1710. }
  1711. }
  1712. node.kineticObj.setId( node.ID );
  1713. node.kineticObj.name( node.name );
  1714. node.stage = findStage( node.kineticObj );
  1715. }
  1716. }
  1717. function isStageDefinition( prototypes ) {
  1718. var found = false;
  1719. if ( prototypes ) {
  1720. for ( var i = 0; i < prototypes.length && !found; i++ ) {
  1721. found = ( prototypes[i] == "http://vwf.example.com/kinetic/stage.vwf" );
  1722. }
  1723. }
  1724. return found;
  1725. }
  1726. function isLayerDefinition( prototypes ) {
  1727. var found = false;
  1728. if ( prototypes ) {
  1729. for ( var i = 0; i < prototypes.length && !found; i++ ) {
  1730. found = ( prototypes[i] == "http://vwf.example.com/kinetic/layer.vwf" );
  1731. }
  1732. }
  1733. return found;
  1734. }
  1735. function isCanvasDefinition( prototypes ) {
  1736. var found = false;
  1737. if ( prototypes ) {
  1738. for ( var i = 0; i < prototypes.length && !found; i++ ) {
  1739. found = ( prototypes[i] == "http://vwf.example.com/kinetic/canvas.vwf" );
  1740. }
  1741. }
  1742. return found;
  1743. }
  1744. function isShapeDefinition( prototypes ) {
  1745. var found = false;
  1746. if ( prototypes ) {
  1747. for ( var i = 0; i < prototypes.length && !found; i++ ) {
  1748. found = ( prototypes[i] == "http://vwf.example.com/kinetic/shape.vwf" );
  1749. }
  1750. }
  1751. return found;
  1752. }
  1753. function isContainerDefinition( prototypes ) {
  1754. var found = false;
  1755. if ( prototypes ) {
  1756. for ( var i = 0; i < prototypes.length && !found; i++ ) {
  1757. found = ( prototypes[i] == "http://vwf.example.com/kinetic/container.vwf" );
  1758. }
  1759. }
  1760. return found;
  1761. }
  1762. function isNodeDefinition( prototypes ) {
  1763. var found = false;
  1764. if ( prototypes ) {
  1765. for ( var i = 0; i < prototypes.length && !found; i++ ) {
  1766. found = ( prototypes[i] == "http://vwf.example.com/kinetic/node.vwf" );
  1767. }
  1768. }
  1769. return found;
  1770. }
  1771. function loadImage( node, url ) {
  1772. if ( node && node.kineticObj ) {
  1773. var kineticObj = node.kineticObj;
  1774. var imageObj = kineticObj.image();
  1775. var validImage = ( imageObj !== undefined );
  1776. var width = kineticObj.width();
  1777. var height = kineticObj.height();
  1778. if ( !validImage ) {
  1779. imageObj = new Image();
  1780. }
  1781. imageObj.onload = function() {
  1782. if ( !validImage ) {
  1783. kineticObj.image( imageObj );
  1784. }
  1785. if ( node.scaleOnLoad ) {
  1786. if ( width > height ) {
  1787. kineticObj.scale( { "x": width / imageObj.width ,"y": width / imageObj.width } );
  1788. } else {
  1789. kineticObj.scale( { "x": height / imageObj.height ,"y": height / imageObj.height } );
  1790. }
  1791. }
  1792. self.kernel.fireEvent( node.ID, "imageLoaded", [ url ] );
  1793. }
  1794. imageObj.onerror = function() {
  1795. self.logger.errorx( "loadImage", "Invalid image url:", url );
  1796. imageObj.src = oldSrc;
  1797. self.kernel.fireEvent( node.ID, "imageLoadError", [ url ] );
  1798. }
  1799. var oldSrc = imageObj.src;
  1800. imageObj.src = url;
  1801. }
  1802. }
  1803. });