>setPosition <-- interface\n Morph>>morphicSetter <-- set attribute for persistence and fast retrieval + invoking renderer\n Morph>>renderContextDispatch <-- What kind of rendering?\n Morph>>setPositionHTML <-- the specific render method","_id":"_6","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"26":{"fontFamily":"Courier ","fontSize":13,"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"27":{"style":{"__isSmartRef__":true,"id":28},"morph":{"__isSmartRef__":true,"id":18},"chunkOwner":{"__isSmartRef__":true,"id":18},"storedString":"\n\nAs you can see morph calls a helper method Morph>>morphicSetter('Position', newPosition) that is used to store the position attribute (it will add a property to morph _Position for fast access and serialization) and it will invoke the RenderContext object to really change the rendered representation. For that Morph>>morphicSetter calls Morph>>renderContextDispatch('setPosition', newPosition). This method does the render-dependent lookup to find a method for rendering the Position for the currently set RenderContext. In case of HTML \"setPosition\" is mapped to \"setPositionHTML\". The table itself (\"htmlDispatchTable\") is a property of the morph but the currently used table is set when the RenderContext object is assigned to the morph (in Morph>>setRenderContext()). Morph also implements such tables for other RenderContexts (\"svgDispatchTable\", \"canvasDispatchTable\"). Finally Morph>>setPositionHTML is called and triggers the actual change in the morph's HTML node.\n","_id":"_7","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"28":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"29":{"morph":{"__isSmartRef__":true,"id":18},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"30":{"submorphs":[],"scripts":[],"id":1016,"shape":{"__isSmartRef__":true,"id":31},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","padding","_Padding"],"_MaxTextWidth":985.6149222295369,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"layout":{"__isSmartRef__":true,"id":32},"textChunks":[{"__isSmartRef__":true,"id":33},{"__isSmartRef__":true,"id":35},{"__isSmartRef__":true,"id":37},{"__isSmartRef__":true,"id":39}],"charsReplaced":"restoreRenderContextAfterCopy","lastFindLoc":412,"_ClipMode":"visible","priorSelectionRange":[467,441],"prevScroll":[0,0],"name":"Text1","_Scale":1,"_WhiteSpaceHandling":"pre-wrap","lastSearchString":"Rectangle(Box)","owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":41},"_MinTextWidth":985.6149222295369,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(39.0,1535.9)","textColor":"Color.rgb(0,0,0)","padding":"lively.rect(5,0,0,0)","_Padding":"lively.rect(5,0,0,0)"},"31":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Fill","_Padding"],"_BorderWidth":1,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(987.6,446.0)","_BorderColor":"Color.rgb(255,255,255)","_Fill":"Color.rgb(255,255,255)","_Padding":"lively.rect(0,0,0,0)"},"32":{"resizeWidth":true,"resizeHeight":true},"33":{"style":{"__isSmartRef__":true,"id":34},"morph":{"__isSmartRef__":true,"id":30},"chunkOwner":{"__isSmartRef__":true,"id":30},"storedString":"How rendering is initialized","_id":"_8","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"34":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"35":{"style":{"__isSmartRef__":true,"id":36},"morph":{"__isSmartRef__":true,"id":30},"chunkOwner":{"__isSmartRef__":true,"id":30},"storedString":"\nThe rendering is initialized when a new morph is created and when a morph is serialized. For that Morph>>initialize and Morph>>restoreRenderContextAfterCopy call Morph>>renderContextDispatch('init').\n\nExample: What happens when a Part from the PartsBin is loaded.\nThis shows a selected part of tracing the expression \"lively.PartsBin.getPart('Rectangle', 'PartsBin/NewWorld')\"\n","_id":"_9","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"36":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"37":{"style":{"__isSmartRef__":true,"id":38},"morph":{"__isSmartRef__":true,"id":30},"chunkOwner":{"__isSmartRef__":true,"id":30},"storedString":"Morph>>onLoadFromPartsBin\n Morph>>prepareForNewRenderContext\n Morph>>renderContextDispatch(init) \n Morph>>initHTML\n Shape>>renderUsing\n Shape>>renderContextDispatch(init)\n Shape>>initHTML\n Morph>>registerForEvents\n Morph>>registerForMouseEvents","_id":"_10","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"38":{"italics":"normal","fontFamily":"Courier ","fontSize":13,"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"39":{"style":{"__isSmartRef__":true,"id":40},"morph":{"__isSmartRef__":true,"id":30},"chunkOwner":{"__isSmartRef__":true,"id":30},"storedString":"\n\nAs you can see Morph>>restoreRenderContextAfterCopy triggers an initialize of the rendering of both the shape and the Morph. The mechanism is the same as for setting an attribute. The RenderContext object of the morph looks up and dispatches \"init\" that is mapped to \"initHTML\" (lookup table used for the morph is Morph>>htmlDispatchTable, lookup table used for the shape is Shape>>hmtlDispatchTable). Also the mouse events are registered here.","_id":"_11","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"40":{"italics":"normal","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"41":{"morph":{"__isSmartRef__":true,"id":30},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"42":{"submorphs":[],"scripts":[],"id":1449,"shape":{"__isSmartRef__":true,"id":43},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","padding","_Padding"],"_MaxTextWidth":985.6149222295369,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"layout":{"__isSmartRef__":true,"id":44},"textChunks":[{"__isSmartRef__":true,"id":45},{"__isSmartRef__":true,"id":47},{"__isSmartRef__":true,"id":49},{"__isSmartRef__":true,"id":51},{"__isSmartRef__":true,"id":53},{"__isSmartRef__":true,"id":55},{"__isSmartRef__":true,"id":57},{"__isSmartRef__":true,"id":59},{"__isSmartRef__":true,"id":61},{"__isSmartRef__":true,"id":63}],"charsReplaced":"","lastFindLoc":987,"_ClipMode":"visible","priorSelectionRange":[170,174],"prevScroll":[0,0],"name":"Text2","_Scale":1,"_WhiteSpaceHandling":"pre-wrap","lastSearchString":"Rectangle(Box)","owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":65},"_MinTextWidth":985.6149222295369,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(41.0,2033.9)","textColor":"Color.rgb(0,0,0)","padding":"lively.rect(5,0,0,0)","_Padding":"lively.rect(5,0,0,0)"},"43":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Fill","_Padding"],"_BorderWidth":1,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(987.6,690.0)","_BorderColor":"Color.rgb(255,255,255)","_Fill":"Color.rgb(255,255,255)","_Padding":"lively.rect(0,0,0,0)"},"44":{"resizeWidth":true,"resizeHeight":true},"45":{"style":{"__isSmartRef__":true,"id":46},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"How to add rendering attributes to existing morphs and shapes","_id":"_12","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"46":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"47":{"style":{"__isSmartRef__":true,"id":48},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"\nTo add a new attribute to a morph or shape and define how it is renders includes XX steps:\n1) Add a general morph/shape method that triggers the RenderContext dispatch mechanism with some value. This is the interface used by clients of the morph/shape.\n2) Add a mapping to the RenderContext.morphDispatchTable or RenderContext.shapeDispatchTable\n3) Implement the actual method that does the rendering in the morph/shape\n4) Make sure the attribute is restored correctly by extending the rendering init method\n\nExample: Adding an opacity attribute to shapes.\n1) Implement Shape>>getOpacity and Shape>>setOpacity\n","_id":"_13","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"48":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"49":{"style":{"__isSmartRef__":true,"id":50},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"lively.morphic.Shapes.Shape.addMethods({\n\tsetOpacity: function (opacity) { return this.shapeSetter('Opacity', opacity) },\n\tgetOpacity: function () { return this.shapeGetter('Opacity') },\n});","_id":"_14","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"50":{"fontFamily":"Courier ","fontSize":13,"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"51":{"style":{"__isSmartRef__":true,"id":52},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"\nIf opacity should not be a property that should be \"gettable\" it would also be possible to implement Shape>>setOpacity with ","_id":"_15","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"52":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"53":{"style":{"__isSmartRef__":true,"id":54},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"shape.renderContextDispatch('setOpacity', opacity)","_id":"_16","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"54":{"fontFamily":"Courier ","fontSize":13,"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"55":{"style":{"__isSmartRef__":true,"id":56},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":".\n\n2) For every RenderContext you want to implement this feature in, add \"setOpacity\" mapping.\nIf you want to implement it for HTML.RenderContext add ","_id":"_17","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"56":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"57":{"style":{"__isSmartRef__":true,"id":58},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"setOpacity: 'setOpacityHTML'","_id":"_18","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"58":{"fontFamily":"Courier ","fontSize":13,"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"59":{"style":{"__isSmartRef__":true,"id":60},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":" to HTML.RenderContext>> shapeDispatchTable.\n\n3) Implement Shape>>setOpacityHTML. An implementation could be:\n","_id":"_19","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"60":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"61":{"style":{"__isSmartRef__":true,"id":62},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"lively.morphic.Shapes.Shape.addMethods({\n\tsetOpacityHTML:function (ctx, value) {\n\t\tctx.shapeNode.style.opacity = value;\n\t}\n});","_id":"_20","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"62":{"fontFamily":"Courier ","fontSize":13,"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"63":{"style":{"__isSmartRef__":true,"id":64},"morph":{"__isSmartRef__":true,"id":42},"chunkOwner":{"__isSmartRef__":true,"id":42},"storedString":"\n\n4) Extend Shape>>initHTML\nAdd this.setOpacityHTML(ctx, this.getOpacity()) to this method. (Shape>>getOpacity will read the value from '_Opacity' which will be serialized together with the shape itself).","_id":"_21","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"64":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"65":{"morph":{"__isSmartRef__":true,"id":42},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"66":{"submorphs":[],"scripts":[],"id":1777,"shape":{"__isSmartRef__":true,"id":67},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","padding","_Padding"],"_MaxTextWidth":985.6149222295369,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"layout":{"__isSmartRef__":true,"id":68},"textChunks":[{"__isSmartRef__":true,"id":69},{"__isSmartRef__":true,"id":71},{"__isSmartRef__":true,"id":73}],"charsReplaced":"","lastFindLoc":235,"_ClipMode":"visible","priorSelectionRange":[0,0],"prevScroll":[0,0],"name":"Text3","_Scale":1,"_WhiteSpaceHandling":"pre-wrap","lastSearchString":"Rectangle(Box)","owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":75},"_MinTextWidth":985.6149222295369,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(39.0,2787.9)","textColor":"Color.rgb(0,0,0)","padding":"lively.rect(5,0,0,0)","_Padding":"lively.rect(5,0,0,0)"},"67":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Fill","_Padding"],"_BorderWidth":1,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(987.6,135.0)","_BorderColor":"Color.rgb(255,255,255)","_Fill":"Color.rgb(255,255,255)","_Padding":"lively.rect(0,0,0,0)"},"68":{"resizeWidth":true,"resizeHeight":true},"69":{"style":{"__isSmartRef__":true,"id":70},"morph":{"__isSmartRef__":true,"id":66},"chunkOwner":{"__isSmartRef__":true,"id":66},"storedString":"How to implement new kinds of Morphs and Shapes","_id":"_22","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"70":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"71":{"style":{"__isSmartRef__":true,"id":72},"morph":{"__isSmartRef__":true,"id":66},"chunkOwner":{"__isSmartRef__":true,"id":66},"storedString":"\n1) Subclass the morph or shape class you want to extend.\n2) Overwrite the rendering specific init methods, e.g. initHTML if you have specific behavior to actually render your new object.\n3) Define the properties of the new class using the process described in ","_id":"_23","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"72":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"73":{"style":{"__isSmartRef__":true,"id":74},"morph":{"__isSmartRef__":true,"id":66},"chunkOwner":{"__isSmartRef__":true,"id":66},"storedString":"How to add rendering attributes to existing morphs and shapes","_id":"_24","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"74":{"italics":"italic","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"75":{"morph":{"__isSmartRef__":true,"id":66},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"76":{"submorphs":[],"scripts":[],"id":66,"shape":{"__isSmartRef__":true,"id":77},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":376,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text4","partsBinMetaInfo":{"__isSmartRef__":true,"id":78},"textChunks":[{"__isSmartRef__":true,"id":79},{"__isSmartRef__":true,"id":81}],"charsReplaced":"some text","lastFindLoc":-9,"priorSelectionRange":[0,0],"prevScroll":[0,0],"_Scale":1,"owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":83},"_ClipMode":"visible","_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":376,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1081.0,2359.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(0,0,204)"},"77":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(376.0,66.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"78":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"79":{"style":{"__isSmartRef__":true,"id":80},"morph":{"__isSmartRef__":true,"id":76},"chunkOwner":{"__isSmartRef__":true,"id":76},"storedString":"MR:","_id":"_25","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"80":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"81":{"style":{"__isSmartRef__":true,"id":82},"morph":{"__isSmartRef__":true,"id":76},"chunkOwner":{"__isSmartRef__":true,"id":76},"storedString":" I would rather say that this attribute would be transient/not serializable and not \"gettable\" if I do so.","_id":"_26","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"82":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"83":{"morph":{"__isSmartRef__":true,"id":76},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"84":{"submorphs":[],"scripts":[],"id":305,"shape":{"__isSmartRef__":true,"id":85},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":376,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text5","partsBinMetaInfo":{"__isSmartRef__":true,"id":86},"textChunks":[{"__isSmartRef__":true,"id":87},{"__isSmartRef__":true,"id":89}],"charsReplaced":"r","lastFindLoc":12,"priorSelectionRange":[0,109],"prevScroll":[0,0],"_Scale":1,"owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":91},"_ClipMode":"visible","_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":376,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1080.0,2518.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(0,0,204)"},"85":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(376.0,66.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"86":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"87":{"style":{"__isSmartRef__":true,"id":88},"morph":{"__isSmartRef__":true,"id":84},"chunkOwner":{"__isSmartRef__":true,"id":84},"storedString":"MR:","_id":"_27","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"88":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"89":{"style":{"__isSmartRef__":true,"id":90},"morph":{"__isSmartRef__":true,"id":84},"chunkOwner":{"__isSmartRef__":true,"id":84},"storedString":" Does the RenderContext-specific method always get the context + the arguments of the initial method call?","_id":"_28","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"90":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"91":{"morph":{"__isSmartRef__":true,"id":84},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"92":{"submorphs":[],"scripts":[],"id":466,"shape":{"__isSmartRef__":true,"id":93},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":376,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text6","partsBinMetaInfo":{"__isSmartRef__":true,"id":94},"textChunks":[{"__isSmartRef__":true,"id":95},{"__isSmartRef__":true,"id":97}],"charsReplaced":"Does the RenderContext-specific method always get the context + the arguments of the initial method call?","lastFindLoc":-101,"priorSelectionRange":[0,76],"prevScroll":[0,0],"_Scale":1,"owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":99},"_ClipMode":"visible","_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":376,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1080.0,2688.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(0,0,204)"},"93":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(376.0,44.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"94":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"95":{"style":{"__isSmartRef__":true,"id":96},"morph":{"__isSmartRef__":true,"id":92},"chunkOwner":{"__isSmartRef__":true,"id":92},"storedString":"MR:","_id":"_29","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"96":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"97":{"style":{"__isSmartRef__":true,"id":98},"morph":{"__isSmartRef__":true,"id":92},"chunkOwner":{"__isSmartRef__":true,"id":92},"storedString":" You would not do this if you only have a transient/not-\"gettable\" morph.","_id":"_30","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"98":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"99":{"morph":{"__isSmartRef__":true,"id":92},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"100":{"submorphs":[],"scripts":[],"id":24,"shape":{"__isSmartRef__":true,"id":101},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":323,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text7","partsBinMetaInfo":{"__isSmartRef__":true,"id":102},"textChunks":[{"__isSmartRef__":true,"id":103},{"__isSmartRef__":true,"id":105}],"charsReplaced":"influencing the rest of the ","lastFindLoc":38,"priorSelectionRange":[39,57],"prevScroll":[0,0],"_Scale":1,"owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":107},"_ClipMode":"visible","_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":323,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1079.0,2250.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(0,204,0)"},"101":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_BorderRadius":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(323.0,88.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"102":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"103":{"style":{"__isSmartRef__":true,"id":104},"morph":{"__isSmartRef__":true,"id":100},"chunkOwner":{"__isSmartRef__":true,"id":100},"storedString":"GP:","_id":"_31","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"104":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"105":{"style":{"__isSmartRef__":true,"id":106},"morph":{"__isSmartRef__":true,"id":100},"chunkOwner":{"__isSmartRef__":true,"id":100},"storedString":" What if I wanted a morph-specific transient property without changing the interface of Shape for all other consumers?","_id":"_32","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"106":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"107":{"morph":{"__isSmartRef__":true,"id":100},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"108":{"submorphs":[],"scripts":[],"id":3041,"shape":{"__isSmartRef__":true,"id":109},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":323,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text8","partsBinMetaInfo":{"__isSmartRef__":true,"id":110},"textChunks":[{"__isSmartRef__":true,"id":111},{"__isSmartRef__":true,"id":113}],"charsReplaced":"i","lastFindLoc":73,"priorSelectionRange":[10,42],"prevScroll":[0,0],"_Scale":1,"owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":115},"_ClipMode":"visible","_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":323,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1073.0,2116.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(0,204,0)"},"109":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_BorderRadius":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(323.0,111.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"110":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"111":{"style":{"__isSmartRef__":true,"id":112},"morph":{"__isSmartRef__":true,"id":108},"chunkOwner":{"__isSmartRef__":true,"id":108},"storedString":"GP:","_id":"_33","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"112":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"113":{"style":{"__isSmartRef__":true,"id":114},"morph":{"__isSmartRef__":true,"id":108},"chunkOwner":{"__isSmartRef__":true,"id":108},"storedString":" \"Add a general the morph/shape method\". Under what circumstances do I need to add either (i.e. what is the effect of doing so on shape and morph)?","_id":"_34","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"114":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"115":{"morph":{"__isSmartRef__":true,"id":108},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"116":{"submorphs":[],"scripts":[],"id":631,"shape":{"__isSmartRef__":true,"id":117},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":485,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text9","partsBinMetaInfo":{"__isSmartRef__":true,"id":118},"textChunks":[{"__isSmartRef__":true,"id":119},{"__isSmartRef__":true,"id":121}],"charsReplaced":"E.g","lastFindLoc":120,"priorSelectionRange":[0,0],"prevScroll":[0,0],"_Scale":1,"owner":{"__isSmartRef__":true,"id":0},"_WhiteSpaceHandling":"pre-wrap","eventHandler":{"__isSmartRef__":true,"id":123},"_ClipMode":"visible","_MinTextWidth":485,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1435.0,2113.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(255,143,0)"},"117":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_BorderRadius":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(485.0,111.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"118":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"119":{"style":{"__isSmartRef__":true,"id":120},"morph":{"__isSmartRef__":true,"id":116},"chunkOwner":{"__isSmartRef__":true,"id":116},"storedString":"RK:","_id":"_35","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"120":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"121":{"style":{"__isSmartRef__":true,"id":122},"morph":{"__isSmartRef__":true,"id":116},"chunkOwner":{"__isSmartRef__":true,"id":116},"storedString":" With \"general the morph/shape method\" I mean the interface, e.g. a method like setPosition. You don't have to do this. Example: the \"'init'\" methods (initHTML, initSVG, etc.) don't have that. They are triggered directly with renderContextDispatch(), e.g. in Morph>>initialize","_id":"_36","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"122":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"123":{"morph":{"__isSmartRef__":true,"id":116},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"124":{"submorphs":[],"scripts":[],"id":1687,"shape":{"__isSmartRef__":true,"id":125},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":485,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text10","partsBinMetaInfo":{"__isSmartRef__":true,"id":126},"textChunks":[{"__isSmartRef__":true,"id":127},{"__isSmartRef__":true,"id":129}],"charsReplaced":"add any property to morph you like. Do you have an example?","lastFindLoc":7,"priorSelectionRange":[0,0],"prevScroll":[0,0],"_Scale":1,"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":131},"_ClipMode":"visible","_MinTextWidth":485,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1439.0,2252.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(255,143,0)"},"125":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_BorderRadius":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(485.0,66.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"126":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"127":{"style":{"__isSmartRef__":true,"id":128},"morph":{"__isSmartRef__":true,"id":124},"chunkOwner":{"__isSmartRef__":true,"id":124},"storedString":"RK:","_id":"_37","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"128":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"129":{"style":{"__isSmartRef__":true,"id":130},"morph":{"__isSmartRef__":true,"id":124},"chunkOwner":{"__isSmartRef__":true,"id":124},"storedString":" I don't know what you mean with \"transient property\". You can of course just call renderContextDispatch() without using shapeGetter/shapeSetter.","_id":"_38","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"130":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"131":{"morph":{"__isSmartRef__":true,"id":124},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"132":{"submorphs":[],"scripts":[],"id":1928,"shape":{"__isSmartRef__":true,"id":133},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":485,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text11","partsBinMetaInfo":{"__isSmartRef__":true,"id":134},"textChunks":[{"__isSmartRef__":true,"id":135},{"__isSmartRef__":true,"id":137}],"charsReplaced":"RK: I don't know what you mean with \"transient property\". You can of course just call renderContextDispatch() without using shapeGetter/shapeSetter.","lastFindLoc":-148,"priorSelectionRange":[0,0],"prevScroll":[0,0],"_Scale":1,"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":139},"_ClipMode":"visible","_MinTextWidth":485,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1441.0,2511.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(255,143,0)"},"133":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_BorderRadius":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(485.0,133.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"134":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"135":{"style":{"__isSmartRef__":true,"id":136},"morph":{"__isSmartRef__":true,"id":132},"chunkOwner":{"__isSmartRef__":true,"id":132},"storedString":"RK:","_id":"_39","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"136":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"137":{"style":{"__isSmartRef__":true,"id":138},"morph":{"__isSmartRef__":true,"id":132},"chunkOwner":{"__isSmartRef__":true,"id":132},"storedString":" Yes, the signature is 1) renderContext 2) value that changed. I did not have the need to pass in more than one argument but we could easily extend the implementation to allow that (however we would than have to use var args \"arguments\" pseudo array which makes the implementation slower).","_id":"_40","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"138":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"139":{"morph":{"__isSmartRef__":true,"id":132},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"140":{"submorphs":[],"scripts":[],"id":2083,"shape":{"__isSmartRef__":true,"id":141},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_TextColor"],"_MaxTextWidth":485,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"name":"Text12","partsBinMetaInfo":{"__isSmartRef__":true,"id":142},"textChunks":[{"__isSmartRef__":true,"id":143},{"__isSmartRef__":true,"id":145}],"charsReplaced":"Yes, the signature is 1) renderContext 2) value that changed. I did not have the need to pass in more than one argument but we could easily extend the implementation to allow that (however we would than have to use var args \"arguments\" pseudo array which makes the implementation slower).","lastFindLoc":-284,"priorSelectionRange":[38,38],"prevScroll":[0,0],"_Scale":1,"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":147},"_ClipMode":"visible","_MinTextWidth":485,"_MinTextHeight":null,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(1460.0,2693.0)","textColor":"Color.rgb(0,0,0)","_TextColor":"Color.rgb(255,143,0)"},"141":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_BorderRadius":0,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(485.0,22.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"142":{"partsSpaceName":"PartsBin/NewWorld","migrationLevel":1,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"143":{"style":{"__isSmartRef__":true,"id":144},"morph":{"__isSmartRef__":true,"id":140},"chunkOwner":{"__isSmartRef__":true,"id":140},"storedString":"RK:","_id":"_41","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"144":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"145":{"style":{"__isSmartRef__":true,"id":146},"morph":{"__isSmartRef__":true,"id":140},"chunkOwner":{"__isSmartRef__":true,"id":140},"storedString":" Let's call it a \"transient render aspect\".","_id":"_42","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"146":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"147":{"morph":{"__isSmartRef__":true,"id":140},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"148":{"submorphs":[],"scripts":[],"id":2204,"shape":{"__isSmartRef__":true,"id":149},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","padding","_Padding"],"_MaxTextWidth":985.6149222295369,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"_Rotation":0,"layout":{"__isSmartRef__":true,"id":150},"textChunks":[{"__isSmartRef__":true,"id":151},{"__isSmartRef__":true,"id":153},{"__isSmartRef__":true,"id":155},{"__isSmartRef__":true,"id":157},{"__isSmartRef__":true,"id":159},{"__isSmartRef__":true,"id":161}],"charsReplaced":"exact thing","lastFindLoc":3319,"_ClipMode":"visible","priorSelectionRange":[3308,3319],"prevScroll":[0,0],"name":"Text13","_Scale":1,"_WhiteSpaceHandling":"pre-wrap","lastSearchString":"Rectangle(Box)","owner":{"__isSmartRef__":true,"id":0},"eventHandler":{"__isSmartRef__":true,"id":163},"_MinTextWidth":985.6149222295369,"_MinTextHeight":null,"isBeingDragged":false,"previousSelection":[3306,3306],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(52.0,3056.9)","textColor":"Color.rgb(0,0,0)","padding":"lively.rect(5,0,0,0)","_Padding":"lively.rect(5,0,0,0)"},"149":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Fill","_Padding"],"_BorderWidth":1,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(987.6,1468.0)","_BorderColor":"Color.rgb(255,255,255)","_Fill":"Color.rgb(255,255,255)","_Padding":"lively.rect(0,0,0,0)"},"150":{"resizeWidth":true,"resizeHeight":true},"151":{"style":{"__isSmartRef__":true,"id":152},"morph":{"__isSmartRef__":true,"id":148},"chunkOwner":{"__isSmartRef__":true,"id":148},"storedString":"A followup on the design decision to use the dispatching scheme and not simply render strategy objects:","_id":"_43","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"152":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"153":{"style":{"__isSmartRef__":true,"id":154},"morph":{"__isSmartRef__":true,"id":148},"chunkOwner":{"__isSmartRef__":true,"id":148},"storedString":"\n\n","_id":"_44","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"154":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"155":{"style":{"__isSmartRef__":true,"id":156},"morph":{"__isSmartRef__":true,"id":148},"chunkOwner":{"__isSmartRef__":true,"id":148},"storedString":"Q:","_id":"_45","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"156":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"157":{"style":{"__isSmartRef__":true,"id":158},"morph":{"__isSmartRef__":true,"id":148},"chunkOwner":{"__isSmartRef__":true,"id":148},"storedString":" I have a question on the rendering mechanism concerning the concept of delegation between Morph and RenderContext.\n\nAs per your description of how rendering is separated from general visualization, the call stack for e.g. changing the position of a morph starts from (this is recap) the invocation of the respective method on the morph (setPosition), goes through the generic morphicSetter, then in morphDispatch of the current rendering context, then using a recorded association between the original method invocation on morph (setPosition) and a concrete implementation for the rendering context (setPositionHTML) it ends up in invocation of the latter on the morph.\n\nThe last looks a bit controversial in terms of abstraction of the rendering context implementation from the morph and responsibilities separation as well.\nIn my understanding the rendering context is a common interface to the underlying rendering system provided to the Morph. In fact when I look at Rendering.js it looks like implemented with this strategy in mind. In reality however on setPosition (for example), it acts as a dispatcher to the morph's own implementation of a concrete rendering mechanism. I infer that the reason for this is that each morph can specify own rendering implementation? I also noted that Rendering.js code for setPosition never comes to the scene at all. Is it leftover/work in progress?\n\nReferring back to abstraction and separation of concerns, I don't expect the morph to know or care about the underlying rendering mechanism. In the current approach the *HTML and *SVG methods pollute the interface of Morph and takeaway some of the responsibility that natively should belong to RenderConextSVG/HTML.\nThe goal to be able to delegate rendering per Morph can be achieved just the same if the rendering specific method implementations were added to the HTML/SVG render context interfaces and invoked by delegation using the dispatch table in the RenderContext implementation object, instead of delegating back to the morph a render context specific SVG/HTML operation to accomplish. Since the renderContext object seems to be per morph again, by the proposed approach you get:\n1. clean Morph interface (no redundant *HTML/SVG methods inside)\n2. separation of concerns - if you need to implement own rendering mechanism or augment the default implementation you can override the renderContext method.\n3. minimalistic requirements for changes (you change only if and only what you need to change from the rendering properties/behavior using the default renderContext implementation object)\n\nThe point about the morph interface as 'main' invocation point also raises some concerns as this seems to translate to a huge set of methods aggregated from the interfaces of all/most composed main players. I don't find a several screens long set of methods very consumable as opposed to composition of objects, each with a clearly defined role (by which you can therefore infer what kind of behavior you should expect from it).\n\n","_id":"_46","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"158":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"159":{"style":{"__isSmartRef__":true,"id":160},"morph":{"__isSmartRef__":true,"id":148},"chunkOwner":{"__isSmartRef__":true,"id":148},"storedString":"A: ","_id":"_47","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"160":{"fontWeight":"bold","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"161":{"style":{"__isSmartRef__":true,"id":162},"morph":{"__isSmartRef__":true,"id":148},"chunkOwner":{"__isSmartRef__":true,"id":148},"storedString":"The decision to relay calls back to Morphs and to not specify everything in a render strategy object is intentional and I came to that solution after having implemented the strategy you mention.\n\nThe first approach was: Morphs have a strategy object they call when their rendering specific attributes change and those \"renderers\" then take care of how the real rendering is done.\nPro: Clear separation of concerns, simple solution for one rendering scheme\nCon: There are cases when the solution does not work well. The first specific example I stumbled upon was when implementing ellipses and rectangle shapes. The way the extent is set for ellipse and rectangle shapes differs for SVG rendering. When the renderer does all the work in renderer.setExtent(shape, extent) then we need to add a switch statement there for every shape type (we would have to do this at multiple points and when addind a new shape/morph go back to all the switch statements and extend those -- ugly). Alternatively we could implement renderer.setRectangleExtent and renderer.setEllipseExtent. However, this does change the complete renderer interface even for other render modes. In HTML, for example, setting the extent for rectangles and ellipses is the same so setEllipseExtent and setRectangleExtent are identical. So sending an update/render request back to the morph/shape seemed natural for me since this solves the problem through polymorphism. The same problem appears at other places as well.\n\nSo what we generally need to know for rendering are three things: 1) aspect to update (e.g. position), 2) morph or shape type, 3) render mode.\n\nI implemented the tables that map the methods to each other to remove unnecessary glue code and the possibility to later 'compile' one render mode directly into the morphs (this is than just replacing methods Shape.setPosition gets Shape.setPositionHTML assigned, for example). Thus the runtime overhead of dispatching the requests back would then not occur (however, it is only very small).\n\nThat said I also want to add that I don't agree that the current solution extends the interface of morphs/shapes. The render specific methods are clearly separated from the \"official\" interface methods, e.g. they have a property saying they were defined in lively.morphic.HTML. Tools used for browsing can easily hide them/mark them as render specific.\n","_id":"_48","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"162":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"163":{"morph":{"__isSmartRef__":true,"id":148},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"164":{"submorphs":[],"scripts":[],"id":226,"shape":{"__isSmartRef__":true,"id":165},"grabbingEnabled":false,"droppingEnabled":false,"showsMorphMenu":false,"halosEnabled":false,"registeredForMouseEvents":true,"_world":{"__isSmartRef__":true,"id":0},"__serializedExpressions__":["_Position"],"owner":{"__isSmartRef__":true,"id":0},"carriesGrabbedMorphs":false,"_Scale":1,"_Rotation":0,"eventHandler":{"__isSmartRef__":true,"id":166},"lastScrollTime":1363080993431,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.HandMorph","__SourceModuleName__":"Global.lively.morphic.Events","withLayers":["Global.NoMagnetsLayer"],"_Position":"lively.pt(1182.0,1356.0)"},"165":{"__serializedExpressions__":["_Position","_Extent","_Fill","_Padding"],"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(2.0,2.0)","_Fill":"Color.rgb(204,0,0)","_Padding":"lively.rect(0,0,0,0)"},"166":{"morph":{"__isSmartRef__":true,"id":164},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"167":{"__serializedExpressions__":["_Position","_Extent","_Fill","_Padding"],"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(3000.0,10000.0)","_Fill":"Color.rgb(255,255,255)","_Padding":"lively.rect(0,0,0,0)"},"168":{"name":"Local code","__LivelyClassName__":"ChangeSet","__SourceModuleName__":"Global.lively.ChangeSet"},"169":{"sourceObj":{"__isSmartRef__":true,"id":0},"sourceAttrName":"savedWorldAsURL","targetObj":{"__isSmartRef__":true,"id":0},"targetMethodName":"visitNewPageAfterSaveAs","converterString":null,"updaterString":"function ($upd, v) { \n if (v && v.toString() !== URL.source.toString()) {\n $upd(v) \n }\n }","varMapping":{"__isSmartRef__":true,"id":170},"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"170":{"source":{"__isSmartRef__":true,"id":0},"target":{"__isSmartRef__":true,"id":0}},"171":{"morph":{"__isSmartRef__":true,"id":0},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"172":{"protocol":"http:","hostname":"lively-kernel.org","pathname":"/repository/webwerkstatt/documentation/Rendering.xhtml","__LivelyClassName__":"URL","__SourceModuleName__":"Global.lively.Network"},"173":{"submorphs":[{"__isSmartRef__":true,"id":174}],"scripts":[],"id":"FA60271E-B690-4AB0-9781-05815AD64FFB","shape":{"__isSmartRef__":true,"id":185},"droppingEnabled":true,"halosEnabled":true,"registeredForMouseEvents":true,"__serializedExpressions__":["_Position","distanceToDragEvent"],"showsHalos":false,"name":"LoadingMorph","partsBinMetaInfo":{"__isSmartRef__":true,"id":186},"eventHandler":{"__isSmartRef__":true,"id":284},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"derivationIds":[127,"59692BC3-6C7B-4E23-B820-8699260EA722","486BB935-1313-4103-B2A8-642B19437478","18AFFD44-46CD-489E-B1D6-DED43E2B6B06","2608C892-2204-4981-9A87-8E749F8944AB","5535861F-4EA2-44AB-8A40-0538124E0AAC","16C292B3-86E8-4622-B516-27C48263B8CC","87731A20-D455-44D0-97E5-98A7CFD4E417","A17081E7-E597-47ED-BD32-6E4D206BD7D7","CFB4A44C-BFEA-4584-BCBA-AE2A56739200","76B3DD9B-8D01-42BA-A574-AB99D5F899BB","1EBC5512-8F54-4B24-998C-69A285EC8533","DD1165C7-6C1A-4361-A4AE-FCF6F31152FD","4D6D36E8-48F3-408A-B03C-202E4DC182BD","5F3B3E0F-BBC6-4DDA-BAA0-7EFC05FF2011","E0A6B33B-767A-4532-9021-892414520200","F5F5E2B1-5FF0-4E09-B323-AE88A3920B8D","0C7E832A-A741-430F-B295-8BC181D066FE","472AED3B-CB76-49BD-BF49-354A2D568F86","A7C52F65-D140-4791-880F-F7584C7BB570","3516412B-8B36-4E52-9416-6B7FB358BDC2","1840CACC-078C-4795-AD3F-E9D6F8D557A0","1FEDCA25-0131-46FA-840F-DC5F1B05C6CA","C620CED3-0AE9-4097-9AA7-2706A042F9C9","679A861B-40E0-4DB2-B22F-95B454C6978D","FEF39B3C-E634-4825-BAB8-2D44FE647B03"],"isBeingDragged":false,"layout":{"__isSmartRef__":true,"id":285},"prevScroll":[0,0],"moved":true,"_Rotation":0,"_Scale":1,"headRevision":146469,"_ClipMode":"visible","__serializedLivelyClosures__":{"__isSmartRef__":true,"id":286},"__LivelyClassName__":"lively.morphic.Box","__SourceModuleName__":"Global.lively.morphic.Core","_Position":"lively.pt(0.0,0.0)","distanceToDragEvent":"lively.pt(171.0,-13.0)"},"174":{"submorphs":[{"__isSmartRef__":true,"id":175}],"scripts":[],"shape":{"__isSmartRef__":true,"id":181},"id":"DD1C67FA-CD91-4838-A4CE-60FF00D9AE88","eventHandler":{"__isSmartRef__":true,"id":182},"droppingEnabled":true,"halosEnabled":true,"__serializedExpressions__":["_Position","distanceToDragEvent"],"name":"ProgressIndicator","showsHalos":false,"partsBinMetaInfo":{"__isSmartRef__":true,"id":183},"derivationIds":[520,"071F18BE-FF28-40F5-ACAD-1916E0D25C38","DF185A10-743D-45FC-B9C2-76E12D908BCF","BF125D2C-596A-4C1E-A5F8-DAE4801E9497","3CEE8CFF-B8F1-4B4B-A405-CB583080252A","D0652878-8F9C-4591-8A82-296898AACDB6","31441DDF-2220-43BE-A99F-69E1FEC68030","14A90039-0D3E-46DC-8445-D42B8E02EB42","681EF5DE-A344-4114-B2F3-B96CE3872524","C0381116-5116-4F33-B082-A411D0E4534E","24E9581E-B008-46EE-9CBC-D5190E100D98","C69D1041-2C5E-48FE-B04C-04E66450658A","4830945B-4FFF-4564-9424-34D7995DAE60","8602C233-B3E7-4682-9B0E-D7549761D934","B4E0E11F-2BED-462E-B708-89D63971856E","EE0144C2-D016-4390-8A67-4E7DEF171C83","F44DF6E4-5F27-440E-AB5F-3721C0A10CA6","73FC6648-DAAF-4673-8CF4-7DA219513F22","B78EB1B5-780C-45F7-B0A7-B988B52B1FF1","DFDB8CD1-72F7-40F4-849B-1F9B866277AB","66111105-B1FC-41F7-BF70-D45118C9E09F","02420416-1E35-4831-AABB-91CD0460CA1A","7C6B2EB2-4510-4A8E-BAFF-5CF0040DD7F5","0503F5A1-1732-4610-9A5A-920D658CA766","07C5AE03-36AD-4849-BACD-27D7D9A2CCF2","9FFF9D73-931C-404C-AA4B-5AC2E7C53504"],"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"owner":{"__isSmartRef__":true,"id":173},"isBeingDragged":false,"layout":{"__isSmartRef__":true,"id":184},"prevScroll":[0,0],"_Rotation":0,"_Scale":1,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Image","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(113.5,81.0)","distanceToDragEvent":"lively.pt(39.0,-11.0)"},"175":{"submorphs":[],"scripts":[],"id":"F13F6CDD-0395-40CA-9439-109F6F9A1FFB","shape":{"__isSmartRef__":true,"id":176},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"_MaxTextWidth":257,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"name":"loadedMorphName","partsBinMetaInfo":{"__isSmartRef__":true,"id":177},"textChunks":[{"__isSmartRef__":true,"id":178}],"charsReplaced":"MorphName","lastFindLoc":18,"priorSelectionRange":[9,0],"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":180},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"visible","derivationIds":[355,"023045B3-2D6B-4425-89FB-F4806D527BE0","DC0C2365-868C-41AE-8369-51C31E91493E","C6D9D314-86A1-4015-970B-F6787F535E1A","6AA4552E-2E85-447E-9033-99D5AA1A94BC","D94BE49C-8A3E-4F1F-BF28-FEDD9B40D213","AA8F0470-654C-4AA2-8135-4607F5429AC5","E0BAABCC-FFB2-4EDF-BAE5-C63CC99B6A97","1A86AE17-73AE-442E-AB36-DD90C6DFC8BC","EF750075-E964-4CD3-B6A4-161511E1D058","CED69CBF-FFA5-45E7-B333-FBACE4F278AC","E56978C1-7424-4C10-8168-11FD3237B540","D5AB2532-A4DC-42D6-AF17-99CBBCEAA848","245866CB-598A-4172-A3A0-A06D4D26C6AD","43B0F12E-5793-43AA-80E1-496774E0EBA6","1B776A8C-0413-475F-8EBD-120BBD91D2BB","F84F2C9A-8003-4E81-833A-83F48C92F3B8","3124B389-9FA4-4348-BC5D-0DFF9C59CD1B","1A1BCBAC-D7CC-4BAE-B8C2-7C693F7327A1","1CB201BA-5E0B-4771-821A-139FA2AEFBC2","195520FA-4816-47A4-B0F5-BA890AFD9DF9","0D15F28A-24C9-46B7-89C5-6D2354728AC1","316FE9D3-62EC-4FD6-9B0F-FFA622B79575","739F3743-9BE1-48C8-813D-C0BFB0DCACA6","01877B3B-7DA7-4222-B011-7B5F4E501862","B8FE7DEE-9568-4BE6-BA12-EA674BA79E08"],"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":174},"_MinTextWidth":257,"_MinTextHeight":null,"previousSelection":[6,6],"_Align":"center","isBeingDragged":false,"_Rotation":0,"_Scale":1,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(-109.0,38.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(179.0,-11.0)"},"176":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_ClipMode":"visible","_BorderRadius":0,"_Opacity":1,"_BorderStyle":"solid","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(257.0,23.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"177":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"178":{"style":{"__isSmartRef__":true,"id":179},"chunkOwner":{"__isSmartRef__":true,"id":175},"storedString":"loading part","_id":"_49","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"179":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"180":{"morph":{"__isSmartRef__":true,"id":175},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"181":{"__serializedExpressions__":["_Position","_Extent","_Padding"],"_ImageURL":"data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==","attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"isLoaded":true,"_ClipMode":"visible","_BorderWidth":0,"_BorderRadius":0,"_Opacity":1,"_BorderStyle":"solid","__LivelyClassName__":"lively.morphic.Shapes.Image","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(31.0,31.0)","_Padding":"lively.rect(0,0,0,0)"},"182":{"morph":{"__isSmartRef__":true,"id":174},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"183":{"partName":"ProgressIndicator","requiredModules":[],"migrationLevel":2,"partsSpaceName":"PartsBin/Widgets/","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"184":{"centeredHorizontal":true,"centeredVertical":true},"185":{"__serializedExpressions__":["position","_Extent","_BorderColor","_Fill","_Padding"],"_BorderWidth":1,"_ClipMode":"visible","_BorderRadius":8.515,"_Opacity":0.8146,"_BorderStyle":"solid","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(266.0,223.0)","_BorderColor":"Color.rgb(0,0,0)","_Fill":"Color.rgb(214,214,214)","_Padding":"lively.rect(0,0,0,0)"},"186":{"partsSpaceName":"PartsBin/iPadWidgets","comment":"This is a placeholder to indicate that a morph is being loaded. It will be replaced by the morph as soon as the requested morph finished loading.","migrationLevel":4,"partName":"LoadingMorph","changes":[{"__isSmartRef__":true,"id":187},{"__isSmartRef__":true,"id":189},{"__isSmartRef__":true,"id":191},{"__isSmartRef__":true,"id":193},{"__isSmartRef__":true,"id":195},{"__isSmartRef__":true,"id":197},{"__isSmartRef__":true,"id":199},{"__isSmartRef__":true,"id":201},{"__isSmartRef__":true,"id":203},{"__isSmartRef__":true,"id":205},{"__isSmartRef__":true,"id":207},{"__isSmartRef__":true,"id":209},{"__isSmartRef__":true,"id":211},{"__isSmartRef__":true,"id":213},{"__isSmartRef__":true,"id":215},{"__isSmartRef__":true,"id":217},{"__isSmartRef__":true,"id":219},{"__isSmartRef__":true,"id":221},{"__isSmartRef__":true,"id":223},{"__isSmartRef__":true,"id":225},{"__isSmartRef__":true,"id":227},{"__isSmartRef__":true,"id":229},{"__isSmartRef__":true,"id":231},{"__isSmartRef__":true,"id":233},{"__isSmartRef__":true,"id":235},{"__isSmartRef__":true,"id":237},{"__isSmartRef__":true,"id":239},{"__isSmartRef__":true,"id":241},{"__isSmartRef__":true,"id":243},{"__isSmartRef__":true,"id":245},{"__isSmartRef__":true,"id":247},{"__isSmartRef__":true,"id":249},{"__isSmartRef__":true,"id":251},{"__isSmartRef__":true,"id":253},{"__isSmartRef__":true,"id":255},{"__isSmartRef__":true,"id":257},{"__isSmartRef__":true,"id":259},{"__isSmartRef__":true,"id":261},{"__isSmartRef__":true,"id":263},{"__isSmartRef__":true,"id":265},{"__isSmartRef__":true,"id":267},{"__isSmartRef__":true,"id":269},{"__isSmartRef__":true,"id":271},{"__isSmartRef__":true,"id":273},{"__isSmartRef__":true,"id":275},{"__isSmartRef__":true,"id":277},{"__isSmartRef__":true,"id":279},{"__isSmartRef__":true,"id":281}],"revisionOnLoad":151069,"lastModifiedDate":{"__isSmartRef__":true,"id":283},"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"187":{"date":{"__isSmartRef__":true,"id":188},"author":"sstamm","message":"","id":"1C1391AE-5722-4707-BE52-F0094FC56829"},"188":{"isSerializedDate":true,"string":"Wed Feb 22 2012 14:02:04 GMT+0100 (CET)"},"189":{"date":{"__isSmartRef__":true,"id":190},"author":"sstamm","message":"","id":"663F147A-9084-4AC3-81A7-1E7BA6547F08"},"190":{"isSerializedDate":true,"string":"Wed Feb 22 2012 12:43:10 GMT+0100 (CET)"},"191":{"date":{"__isSmartRef__":true,"id":192},"author":"sstamm","message":"","id":"F72B746E-B170-4EFB-9074-5E8770640B8A"},"192":{"isSerializedDate":true,"string":"Wed Feb 22 2012 12:36:14 GMT+0100 (CET)"},"193":{"date":{"__isSmartRef__":true,"id":194},"author":"sstamm","message":"","id":"568D2EFD-C535-43AE-8944-6D8B967129F5"},"194":{"isSerializedDate":true,"string":"Wed Feb 22 2012 12:23:04 GMT+0100 (CET)"},"195":{"date":{"__isSmartRef__":true,"id":196},"author":"sstamm","message":"","id":"AB2484A6-0707-4E13-845E-F0A5F48BBA3D"},"196":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:59:45 GMT+0100 (CET)"},"197":{"date":{"__isSmartRef__":true,"id":198},"author":"sstamm","message":"","id":"97D20633-F76C-46A5-A32A-FFE9BC83CAB3"},"198":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:59:10 GMT+0100 (CET)"},"199":{"date":{"__isSmartRef__":true,"id":200},"author":"sstamm","message":"","id":"8A697DF5-9A45-4A84-B709-9719BF55083E"},"200":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:56:54 GMT+0100 (CET)"},"201":{"date":{"__isSmartRef__":true,"id":202},"author":"sstamm","message":"","id":"F2157D66-1571-4B9A-B325-6FA96488260F"},"202":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:51:05 GMT+0100 (CET)"},"203":{"date":{"__isSmartRef__":true,"id":204},"author":"sstamm","message":"","id":"E5E808CA-06AB-47DC-A9C9-CA7967591545"},"204":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:47:19 GMT+0100 (CET)"},"205":{"date":{"__isSmartRef__":true,"id":206},"author":"sstamm","message":"","id":"009DC4E0-23CA-485A-A796-801AA0F75049"},"206":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:46:25 GMT+0100 (CET)"},"207":{"date":{"__isSmartRef__":true,"id":208},"author":"sstamm","message":"","id":"C0CE1397-6E2E-4E8C-AEFF-9017E24BB7E4"},"208":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:45:05 GMT+0100 (CET)"},"209":{"date":{"__isSmartRef__":true,"id":210},"author":"sstamm","message":"","id":"FFE16986-548D-4AC2-A627-CF6416282BC4"},"210":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:37:15 GMT+0100 (CET)"},"211":{"date":{"__isSmartRef__":true,"id":212},"author":"sstamm","message":"","id":"57213D63-7147-4057-ADC9-30994443B066"},"212":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:35:29 GMT+0100 (CET)"},"213":{"date":{"__isSmartRef__":true,"id":214},"author":"sstamm","message":"","id":"75A31364-B380-4312-BB5B-F8F2DA1CE824"},"214":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:31:52 GMT+0100 (CET)"},"215":{"date":{"__isSmartRef__":true,"id":216},"author":"sstamm","message":"","id":"5AA50B7E-7D33-44C4-807B-BF1ABA31D530"},"216":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:14:10 GMT+0100 (CET)"},"217":{"date":{"__isSmartRef__":true,"id":218},"author":"sstamm","message":"","id":"BCDCC505-534C-45E5-9BB2-5238959A5AD0"},"218":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:02:56 GMT+0100 (CET)"},"219":{"date":{"__isSmartRef__":true,"id":220},"author":"sstamm","message":"","id":"890D14F4-E89D-4E05-BFB9-875D6AB6C765"},"220":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:01:50 GMT+0100 (CET)"},"221":{"date":{"__isSmartRef__":true,"id":222},"author":"sstamm","message":"","id":"B6FE0805-0D24-4267-8238-8B332352617E"},"222":{"isSerializedDate":true,"string":"Wed Feb 22 2012 10:55:44 GMT+0100 (CET)"},"223":{"date":{"__isSmartRef__":true,"id":224},"author":"sstamm","message":"callbacks are working","id":"9348260A-3B55-4659-BC85-440BFBD98EA4"},"224":{"isSerializedDate":true,"string":"Fri Feb 10 2012 09:45:55 GMT+0100 (CET)"},"225":{"date":{"__isSmartRef__":true,"id":226},"author":"sstamm","message":"made it more opaque","id":"1B84264C-2822-407F-A58F-19217BCD2762"},"226":{"isSerializedDate":true,"string":"Wed Feb 08 2012 11:41:50 GMT+0100 (CET)"},"227":{"date":{"__isSmartRef__":true,"id":228},"author":"sstamm","message":"","id":"0FB41D7D-2A52-4782-814B-A66C24FCE569"},"228":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:13:49 GMT+0100 (CET)"},"229":{"date":{"__isSmartRef__":true,"id":230},"author":"sstamm","message":"","id":"A0C2D7C1-04AF-493A-A7D7-70750F7D3E2F"},"230":{"isSerializedDate":true,"string":"Thu Feb 02 2012 17:22:07 GMT+0100 (CET)"},"231":{"date":{"__isSmartRef__":true,"id":232},"author":"sstamm","message":"trollolol","id":"F6CFAD78-AC72-4DE2-9F38-79776C2E9462"},"232":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:55:14 GMT+0100 (CET)"},"233":{"date":{"__isSmartRef__":true,"id":234},"author":"sstamm","message":"should be centered now","id":"EE366B4D-C272-477F-8C28-4EAE5A7EC7CB"},"234":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:54:35 GMT+0100 (CET)"},"235":{"date":{"__isSmartRef__":true,"id":236},"author":"sstamm","message":"initial commit","id":"8920D925-DD16-4667-B8C7-FB74D78C2424"},"236":{"isSerializedDate":true,"string":"Thu Feb 02 2012 13:26:01 GMT+0100 (CET)"},"237":{"date":{"__isSmartRef__":true,"id":238},"author":"sstamm","message":"changed text morph name","id":"80E88A3C-5AF3-48F2-A600-710877630997"},"238":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:04:01 GMT+0100 (CET)"},"239":{"date":{"__isSmartRef__":true,"id":240},"author":"sstamm","message":"added loading script","id":"EE9B8F4D-1F03-4232-82E6-794046974F8F"},"240":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:28:30 GMT+0100 (CET)"},"241":{"date":{"__isSmartRef__":true,"id":242},"author":"sstamm","message":"added disconnection","id":"11F19267-924E-4087-99ED-998245576BD2"},"242":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:32:58 GMT+0100 (CET)"},"243":{"date":{"__isSmartRef__":true,"id":244},"author":"sstamm","message":"removed connections before deletion","id":"35A88218-6864-4D52-83A2-BFF7B9A6907C"},"244":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:41:00 GMT+0100 (CET)"},"245":{"date":{"__isSmartRef__":true,"id":246},"author":"sstamm","message":"now able to load parts by name and category as well as per partItem","id":"F36A5782-461D-4813-95F8-0207990A261C"},"246":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:24:30 GMT+0100 (CET)"},"247":{"date":{"__isSmartRef__":true,"id":248},"author":"sstamm","message":"now with round corners","id":"F42C39CB-CC37-467D-BF10-D362241F047E"},"248":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:26:23 GMT+0100 (CET)"},"249":{"date":{"__isSmartRef__":true,"id":250},"author":"sstamm","message":"loadingMorph is sync now","id":"12ACFFC9-BA53-4A2A-ABD4-894A5ECE1145"},"250":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:48:04 GMT+0100 (CET)"},"251":{"date":{"__isSmartRef__":true,"id":252},"author":"sstamm","message":"display the loadingMorph in new thread","id":"2BA51E30-F02B-4AF0-B3BE-52DD4ED522CC"},"252":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:53:49 GMT+0100 (CET)"},"253":{"date":{"__isSmartRef__":true,"id":254},"author":"sstamm","message":"","id":"DF0AE4EA-1B08-4556-8BBE-E6488F23B8A3"},"254":{"isSerializedDate":true,"string":"Thu Feb 02 2012 16:49:48 GMT+0100 (CET)"},"255":{"date":{"__isSmartRef__":true,"id":256},"author":"sstamm","message":"","id":"220821B3-C589-41C9-A324-8E7E6D9D6CEB"},"256":{"isSerializedDate":true,"string":"Thu Feb 02 2012 16:58:43 GMT+0100 (CET)"},"257":{"date":{"__isSmartRef__":true,"id":258},"author":"sstamm","message":"","id":"DEBFACE2-7EC5-4A86-AD46-5A0A88A73707"},"258":{"isSerializedDate":true,"string":"Thu Feb 02 2012 17:04:28 GMT+0100 (CET)"},"259":{"date":{"__isSmartRef__":true,"id":260},"author":"sstamm","message":"load request in new thread if loading should be async","id":"18282D28-D6D4-48C9-A508-6E3244449BD8"},"260":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:10:27 GMT+0100 (CET)"},"261":{"date":{"__isSmartRef__":true,"id":262},"author":"sstamm","message":"added benchmarking output","id":"249CFF90-DDF5-4A83-9759-0289E96D7D58"},"262":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:31:50 GMT+0100 (CET)"},"263":{"date":{"__isSmartRef__":true,"id":264},"author":"sstamm","message":"","id":"882082E1-29B6-418D-9B8B-672729D60619"},"264":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:38:26 GMT+0100 (CET)"},"265":{"date":{"__isSmartRef__":true,"id":266},"author":"sstamm","message":"","id":"5179AEF9-E19F-4B0C-BBD8-556C5687988A"},"266":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:44:11 GMT+0100 (CET)"},"267":{"date":{"__isSmartRef__":true,"id":268},"author":"sstamm","message":"","id":"1159C5B4-724E-4124-9D7B-5CD5DC4A8EE3"},"268":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:48:14 GMT+0100 (CET)"},"269":{"date":{"__isSmartRef__":true,"id":270},"author":"sstamm","message":"","id":"2A718D1F-1036-41D6-999A-336F2B14E65D"},"270":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:49:47 GMT+0100 (CET)"},"271":{"date":{"__isSmartRef__":true,"id":272},"author":"sstamm","message":"","id":"EB6BDD0C-7EEC-4124-B77F-2F106A601538"},"272":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:59:48 GMT+0100 (CET)"},"273":{"date":{"__isSmartRef__":true,"id":274},"author":"sstamm","message":"","id":"63EC8D07-AB6A-450A-BB84-9B4D37E03647"},"274":{"isSerializedDate":true,"string":"Tue Feb 07 2012 12:02:33 GMT+0100 (CET)"},"275":{"date":{"__isSmartRef__":true,"id":276},"author":"sstamm","message":"","id":"19CE12E4-5AA5-48DC-B1D1-B0EB0EDF1CB9"},"276":{"isSerializedDate":true,"string":"Tue Feb 07 2012 12:03:42 GMT+0100 (CET)"},"277":{"date":{"__isSmartRef__":true,"id":278},"author":"sstamm","message":"first attempt to introduce callback functions to part loading","id":"22BD0B95-8948-411A-A56E-AD7CBE445F1D"},"278":{"isSerializedDate":true,"string":"Thu Feb 09 2012 20:20:11 GMT+0100 (CET)"},"279":{"date":{"__isSmartRef__":true,"id":280},"author":"sstamm","message":"","id":"A216DFD2-9D1F-4E62-A22F-6B5472823E1B"},"280":{"isSerializedDate":true,"string":"Fri Mar 16 2012 15:37:34 GMT+0100 (CET)"},"281":{"date":{"__isSmartRef__":true,"id":282},"author":"sstamm","message":"","id":"464E723A-08DC-433C-AA5C-CEC850DBAF0B"},"282":{"isSerializedDate":true,"string":"Fri Mar 16 2012 15:42:29 GMT+0100 (CET)"},"283":{"isSerializedDate":true,"string":"Thu Mar 07 2013 01:25:14 GMT+0100 (CET)"},"284":{"morph":{"__isSmartRef__":true,"id":173},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"285":{"adjustForNewBounds":true},"286":{"loadPart":{"__isSmartRef__":true,"id":287},"loadFinished":{"__isSmartRef__":true,"id":291},"loadPartByName":{"__isSmartRef__":true,"id":295}},"287":{"varMapping":{"__isSmartRef__":true,"id":288},"source":"function loadPart(partItem, isAsync) {\n this.partItem = partItem;\n \n this.openInWorld();\n if(partItem.part) {\n this.setExtent(partItem.part.getExtent());\n }\n this.align(this.bounds().center(), $world.visibleBounds().center());\n \n \n if(typeof isAsync === \"function\") {\n this.callback = isAsync;\n }\n\n connect(partItem, 'part', this, \"loadFinished\");\n\n partItem.loadPart(isAsync);\n\n return partItem.part;\n\n}","funcProperties":{"__isSmartRef__":true,"id":289},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"288":{"this":{"__isSmartRef__":true,"id":173}},"289":{"timestamp":{"__isSmartRef__":true,"id":290},"user":"sstamm","tags":[]},"290":{"isSerializedDate":true,"string":"Fri Mar 16 2012 15:42:18 GMT+0100 (CET)"},"291":{"varMapping":{"__isSmartRef__":true,"id":292},"source":"function loadFinished(part) {\n if(this.owner === $world.firstHand()) {\n $world.firstHand().removeAllMorphs();\n } else {\n this.owner.addMorph(part);\n part.align(part.bounds().center(), this.bounds().center());\n this.remove();\n }\n disconnect(this.partItem, 'part', this, \"loadFinished\");\n if(this.callback) {\n this.callback(part);\n }\n}","funcProperties":{"__isSmartRef__":true,"id":293},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"292":{"this":{"__isSmartRef__":true,"id":173}},"293":{"timestamp":{"__isSmartRef__":true,"id":294},"user":"sstamm","tags":[]},"294":{"isSerializedDate":true,"string":"Wed Feb 22 2012 14:01:53 GMT+0100 (CET)"},"295":{"varMapping":{"__isSmartRef__":true,"id":296},"source":"function loadPartByName(partName, optPartsSpaceName, isAsync) {\n var partItem = lively.PartsBin.getPartItem(partName, optPartsSpaceName);\n return this.loadPart(partItem, isAsync);\n}","funcProperties":{"__isSmartRef__":true,"id":297},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"296":{"this":{"__isSmartRef__":true,"id":173}},"297":{"timestamp":{"__isSmartRef__":true,"id":298},"user":"sstamm","tags":[]},"298":{"isSerializedDate":true,"string":"Thu Feb 02 2012 17:03:18 GMT+0100 (CET)"},"299":{"isSerializedDate":true,"string":"Thu Mar 07 2013 01:25:14 GMT+0100 (CET)"},"isSimplifiedRegistry":true}}]]>