","__LivelyClassName__":"lively.morphic.TextChunk"},"272":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"273":{"submorphs":[{"__isSmartRef__":true,"id":274}],"scripts":[],"id":569,"shape":{"__isSmartRef__":true,"id":283},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":286},"priorExtent":{"__isSmartRef__":true,"id":287},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":76},"lighterFill":{"__isSmartRef__":true,"id":288},"label":{"__isSmartRef__":true,"id":274},"owner":{"__isSmartRef__":true,"id":264},"layout":{"__isSmartRef__":true,"id":297},"attributeConnections":[{"__isSmartRef__":true,"id":298},{"__isSmartRef__":true,"id":299}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"274":{"submorphs":[],"scripts":[],"id":570,"shape":{"__isSmartRef__":true,"id":275},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":278},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":279},"priorExtent":{"__isSmartRef__":true,"id":280},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":281}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":273},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"275":{"_Position":{"__isSmartRef__":true,"id":276},"_Extent":{"__isSmartRef__":true,"id":277},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":44},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"276":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"277":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"278":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"279":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"280":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"281":{"style":{"__isSmartRef__":true,"id":282},"morph":{"__isSmartRef__":true,"id":274},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"X","__LivelyClassName__":"lively.morphic.TextChunk"},"282":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"283":{"_Position":{"__isSmartRef__":true,"id":284},"_Extent":{"__isSmartRef__":true,"id":285},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":75},"_Fill":{"__isSmartRef__":true,"id":76},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"284":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"285":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"286":{"x":480,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"287":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"288":{"stops":[{"__isSmartRef__":true,"id":289},{"__isSmartRef__":true,"id":291},{"__isSmartRef__":true,"id":293},{"__isSmartRef__":true,"id":295}],"vector":{"__isSmartRef__":true,"id":85},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"289":{"offset":0,"color":{"__isSmartRef__":true,"id":290}},"290":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"291":{"offset":0.4,"color":{"__isSmartRef__":true,"id":292}},"292":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"293":{"offset":0.6,"color":{"__isSmartRef__":true,"id":294}},"294":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"295":{"offset":1,"color":{"__isSmartRef__":true,"id":296}},"296":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"297":{"moveHorizontal":true},"298":{"sourceObj":{"__isSmartRef__":true,"id":273},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":254},"targetMethodName":"getCloseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"299":{"sourceObj":{"__isSmartRef__":true,"id":273},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":254},"targetMethodName":"initiateShutdown","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"300":{"submorphs":[{"__isSmartRef__":true,"id":301}],"scripts":[],"id":571,"shape":{"__isSmartRef__":true,"id":310},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":313},"priorExtent":{"__isSmartRef__":true,"id":314},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":76},"lighterFill":{"__isSmartRef__":true,"id":315},"label":{"__isSmartRef__":true,"id":301},"owner":{"__isSmartRef__":true,"id":264},"attributeConnections":[{"__isSmartRef__":true,"id":324},{"__isSmartRef__":true,"id":325}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"301":{"submorphs":[],"scripts":[],"id":572,"shape":{"__isSmartRef__":true,"id":302},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":305},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":306},"priorExtent":{"__isSmartRef__":true,"id":307},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":308}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":300},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"302":{"_Position":{"__isSmartRef__":true,"id":303},"_Extent":{"__isSmartRef__":true,"id":304},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":44},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"303":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"304":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"305":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"306":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"307":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"308":{"style":{"__isSmartRef__":true,"id":309},"morph":{"__isSmartRef__":true,"id":301},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"M","__LivelyClassName__":"lively.morphic.TextChunk"},"309":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"310":{"_Position":{"__isSmartRef__":true,"id":311},"_Extent":{"__isSmartRef__":true,"id":312},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":75},"_Fill":{"__isSmartRef__":true,"id":76},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"311":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"312":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"313":{"x":3,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"314":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"315":{"stops":[{"__isSmartRef__":true,"id":316},{"__isSmartRef__":true,"id":318},{"__isSmartRef__":true,"id":320},{"__isSmartRef__":true,"id":322}],"vector":{"__isSmartRef__":true,"id":85},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"316":{"offset":0,"color":{"__isSmartRef__":true,"id":317}},"317":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"318":{"offset":0.4,"color":{"__isSmartRef__":true,"id":319}},"319":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"320":{"offset":0.6,"color":{"__isSmartRef__":true,"id":321}},"321":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"322":{"offset":1,"color":{"__isSmartRef__":true,"id":323}},"323":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"324":{"sourceObj":{"__isSmartRef__":true,"id":300},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":254},"targetMethodName":"getMenuHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"325":{"sourceObj":{"__isSmartRef__":true,"id":300},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":254},"targetMethodName":"showTargetMorphMenu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"326":{"submorphs":[{"__isSmartRef__":true,"id":327}],"scripts":[],"id":573,"shape":{"__isSmartRef__":true,"id":336},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":339},"priorExtent":{"__isSmartRef__":true,"id":340},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":76},"lighterFill":{"__isSmartRef__":true,"id":341},"label":{"__isSmartRef__":true,"id":327},"owner":{"__isSmartRef__":true,"id":264},"layout":{"__isSmartRef__":true,"id":350},"attributeConnections":[{"__isSmartRef__":true,"id":351},{"__isSmartRef__":true,"id":352}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"327":{"submorphs":[],"scripts":[],"id":574,"shape":{"__isSmartRef__":true,"id":328},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":331},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":332},"priorExtent":{"__isSmartRef__":true,"id":333},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":334}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":326},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"328":{"_Position":{"__isSmartRef__":true,"id":329},"_Extent":{"__isSmartRef__":true,"id":330},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":44},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"329":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"330":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"331":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"332":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"333":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"334":{"style":{"__isSmartRef__":true,"id":335},"morph":{"__isSmartRef__":true,"id":327},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"–","__LivelyClassName__":"lively.morphic.TextChunk"},"335":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"336":{"_Position":{"__isSmartRef__":true,"id":337},"_Extent":{"__isSmartRef__":true,"id":338},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":75},"_Fill":{"__isSmartRef__":true,"id":76},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"337":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"338":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"339":{"x":461,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"340":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"341":{"stops":[{"__isSmartRef__":true,"id":342},{"__isSmartRef__":true,"id":344},{"__isSmartRef__":true,"id":346},{"__isSmartRef__":true,"id":348}],"vector":{"__isSmartRef__":true,"id":85},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"342":{"offset":0,"color":{"__isSmartRef__":true,"id":343}},"343":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"344":{"offset":0.4,"color":{"__isSmartRef__":true,"id":345}},"345":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"346":{"offset":0.6,"color":{"__isSmartRef__":true,"id":347}},"347":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"348":{"offset":1,"color":{"__isSmartRef__":true,"id":349}},"349":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"350":{"moveHorizontal":true},"351":{"sourceObj":{"__isSmartRef__":true,"id":326},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":254},"targetMethodName":"getCollapseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"352":{"sourceObj":{"__isSmartRef__":true,"id":326},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":254},"targetMethodName":"toggleCollapse","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"353":{"_Position":{"__isSmartRef__":true,"id":354},"_Extent":{"__isSmartRef__":true,"id":355},"_BorderWidth":2,"_BorderColor":{"__isSmartRef__":true,"id":156},"_Fill":{"__isSmartRef__":true,"id":157},"_StrokeOpacity":1,"_BorderRadius":"8px 8px 0px 0px","__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"354":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"355":{"x":500,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"356":{"resizeWidth":true,"adjustForNewBounds":true},"357":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"358":{"x":500,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"359":{"_BorderWidth":0,"_Fill":null,"_StrokeOpacity":0,"_BorderRadius":0,"_Extent":{"__isSmartRef__":true,"id":360},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"360":{"x":500,"y":222,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"361":{"adjustForNewBounds":true},"362":{"x":835,"y":842,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"363":{"x":500,"y":222,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"364":{"x":903,"y":844,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"365":{"submorphs":[{"__isSmartRef__":true,"id":366},{"__isSmartRef__":true,"id":377}],"scripts":[],"id":641,"shape":{"__isSmartRef__":true,"id":485},"droppingEnabled":true,"halosEnabled":true,"draggingEnabled":true,"layout":{"__isSmartRef__":true,"id":487},"_Position":{"__isSmartRef__":true,"id":488},"priorExtent":{"__isSmartRef__":true,"id":489},"targetMorph":{"__isSmartRef__":true,"id":366},"titleBar":{"__isSmartRef__":true,"id":377},"contentOffset":{"__isSmartRef__":true,"id":372},"collapsedTransform":null,"collapsedExtent":null,"expandedTransform":null,"expandedExtent":null,"ignoreEventsOnExpand":false,"owner":{"__isSmartRef__":true,"id":0},"highlighted":true,"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Window"},"366":{"submorphs":[],"scripts":[],"id":640,"shape":{"__isSmartRef__":true,"id":367},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":371},"_ClipMode":"auto","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":372},"priorExtent":{"__isSmartRef__":true,"id":373},"_MaxTextWidth":500,"_MaxTextHeight":200,"textChunks":[{"__isSmartRef__":true,"id":374}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":365},"layout":{"__isSmartRef__":true,"id":376},"doitContext":{"__isSmartRef__":true,"id":184},"priorSelectionRange":[0,32],"charsReplaced":"submorphs:\t[]\nscripts:\t[]\nid:\t408\nshape:\t[object Object]\ngrabbingEnabled:\tfalse\ndroppingEnabled:\tfalse\nhalosEnabled:\ttrue\n_Padding:\trect(pt(2.0,1.0),pt(2.0,1.0))\nfixedWidth:\ttrue\n_WhiteSpaceHandling:\tpre-wrap\nfixedHeight:\ttrue\nallowInput:\ttrue\n_OverflowMode:\tauto\n_FontFamily:\tMonaco,Courier\n_Position:\tpt(125.0,846.0)\n_MaxTextWidth:\t689\n_MaxTextHeight:\t296\ntextChunks:\t[TextChunk(\nthis.a...,TextEmphasis(__SourceModuleName__:Global.lively.morphic...\nlayout:\t[object Object]\nshowsHalos:\tfalse\nprevScroll:\t[0, 0]\n_Rotation:\t0\n_Scale:\t1\npriorSelectionRange:\t[0, 0]\nname:\tCodePane\ncharsReplaced:\twithAllMethodsDo\nlastFindLoc:\t9\npartsBinMetaInfo:\t[object Object]\n__SourceModuleName__:\tGlobal.lively.morphic.TextCore\npriorExtent:\tpt(689.0,296.0)\n_ClipMode:\tauto\nowner:\t\nwithLayers:\t[SyntaxHighlightLayer]\ncharsTyped:\t\n_renderContext:\talively.morphic.HTML.RenderContext\neventHandler:\t, , ","__LivelyClassName__":"lively.morphic.TextChunk"},"386":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"387":{"submorphs":[{"__isSmartRef__":true,"id":388}],"scripts":[],"id":644,"shape":{"__isSmartRef__":true,"id":397},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":411},"priorExtent":{"__isSmartRef__":true,"id":412},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":413},"label":{"__isSmartRef__":true,"id":388},"owner":{"__isSmartRef__":true,"id":377},"layout":{"__isSmartRef__":true,"id":422},"attributeConnections":[{"__isSmartRef__":true,"id":423},{"__isSmartRef__":true,"id":424}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"388":{"submorphs":[],"scripts":[],"id":645,"shape":{"__isSmartRef__":true,"id":389},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":392},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":393},"priorExtent":{"__isSmartRef__":true,"id":394},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":395}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":387},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"389":{"_Position":{"__isSmartRef__":true,"id":390},"_Extent":{"__isSmartRef__":true,"id":391},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"390":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"391":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"392":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"393":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"394":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"395":{"style":{"__isSmartRef__":true,"id":396},"morph":{"__isSmartRef__":true,"id":388},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"X","__LivelyClassName__":"lively.morphic.TextChunk"},"396":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"397":{"_Position":{"__isSmartRef__":true,"id":398},"_Extent":{"__isSmartRef__":true,"id":399},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"398":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"399":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"400":{"r":0.7411764705882353,"g":0.7450980392156863,"b":0.7529411764705882,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"401":{"stops":[{"__isSmartRef__":true,"id":402},{"__isSmartRef__":true,"id":404},{"__isSmartRef__":true,"id":406},{"__isSmartRef__":true,"id":408}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"402":{"offset":0,"color":{"__isSmartRef__":true,"id":403}},"403":{"r":0.9600000000000001,"g":0.9600000000000001,"b":0.9600000000000001,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"404":{"offset":0.4,"color":{"__isSmartRef__":true,"id":405}},"405":{"r":0.8200000000000001,"g":0.8200000000000001,"b":0.8200000000000001,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"406":{"offset":0.6,"color":{"__isSmartRef__":true,"id":407}},"407":{"r":0.8200000000000001,"g":0.8200000000000001,"b":0.8200000000000001,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"408":{"offset":1,"color":{"__isSmartRef__":true,"id":409}},"409":{"r":0.94,"g":0.94,"b":0.94,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"410":{"x":0,"y":0,"width":0,"height":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"411":{"x":480,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"412":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"413":{"stops":[{"__isSmartRef__":true,"id":414},{"__isSmartRef__":true,"id":416},{"__isSmartRef__":true,"id":418},{"__isSmartRef__":true,"id":420}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"414":{"offset":0,"color":{"__isSmartRef__":true,"id":415}},"415":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"416":{"offset":0.4,"color":{"__isSmartRef__":true,"id":417}},"417":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"418":{"offset":0.6,"color":{"__isSmartRef__":true,"id":419}},"419":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"420":{"offset":1,"color":{"__isSmartRef__":true,"id":421}},"421":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"422":{"moveHorizontal":true},"423":{"sourceObj":{"__isSmartRef__":true,"id":387},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":365},"targetMethodName":"getCloseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"424":{"sourceObj":{"__isSmartRef__":true,"id":387},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":365},"targetMethodName":"initiateShutdown","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"425":{"submorphs":[{"__isSmartRef__":true,"id":426}],"scripts":[],"id":646,"shape":{"__isSmartRef__":true,"id":435},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":438},"priorExtent":{"__isSmartRef__":true,"id":439},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":440},"label":{"__isSmartRef__":true,"id":426},"owner":{"__isSmartRef__":true,"id":377},"attributeConnections":[{"__isSmartRef__":true,"id":449},{"__isSmartRef__":true,"id":450}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"426":{"submorphs":[],"scripts":[],"id":647,"shape":{"__isSmartRef__":true,"id":427},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":430},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":431},"priorExtent":{"__isSmartRef__":true,"id":432},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":433}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":425},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"427":{"_Position":{"__isSmartRef__":true,"id":428},"_Extent":{"__isSmartRef__":true,"id":429},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"428":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"429":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"430":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"431":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"432":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"433":{"style":{"__isSmartRef__":true,"id":434},"morph":{"__isSmartRef__":true,"id":426},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"M","__LivelyClassName__":"lively.morphic.TextChunk"},"434":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"435":{"_Position":{"__isSmartRef__":true,"id":436},"_Extent":{"__isSmartRef__":true,"id":437},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"436":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"437":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"438":{"x":3,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"439":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"440":{"stops":[{"__isSmartRef__":true,"id":441},{"__isSmartRef__":true,"id":443},{"__isSmartRef__":true,"id":445},{"__isSmartRef__":true,"id":447}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"441":{"offset":0,"color":{"__isSmartRef__":true,"id":442}},"442":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"443":{"offset":0.4,"color":{"__isSmartRef__":true,"id":444}},"444":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"445":{"offset":0.6,"color":{"__isSmartRef__":true,"id":446}},"446":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"447":{"offset":1,"color":{"__isSmartRef__":true,"id":448}},"448":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"449":{"sourceObj":{"__isSmartRef__":true,"id":425},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":365},"targetMethodName":"getMenuHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"450":{"sourceObj":{"__isSmartRef__":true,"id":425},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":365},"targetMethodName":"showTargetMorphMenu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"451":{"submorphs":[{"__isSmartRef__":true,"id":452}],"scripts":[],"id":648,"shape":{"__isSmartRef__":true,"id":461},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":464},"priorExtent":{"__isSmartRef__":true,"id":465},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":466},"label":{"__isSmartRef__":true,"id":452},"owner":{"__isSmartRef__":true,"id":377},"layout":{"__isSmartRef__":true,"id":475},"attributeConnections":[{"__isSmartRef__":true,"id":476},{"__isSmartRef__":true,"id":477}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"452":{"submorphs":[],"scripts":[],"id":649,"shape":{"__isSmartRef__":true,"id":453},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":456},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":457},"priorExtent":{"__isSmartRef__":true,"id":458},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":459}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":451},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"453":{"_Position":{"__isSmartRef__":true,"id":454},"_Extent":{"__isSmartRef__":true,"id":455},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"454":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"455":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"456":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"457":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"458":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"459":{"style":{"__isSmartRef__":true,"id":460},"morph":{"__isSmartRef__":true,"id":452},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"–","__LivelyClassName__":"lively.morphic.TextChunk"},"460":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"461":{"_Position":{"__isSmartRef__":true,"id":462},"_Extent":{"__isSmartRef__":true,"id":463},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"462":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"463":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"464":{"x":461,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"465":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"466":{"stops":[{"__isSmartRef__":true,"id":467},{"__isSmartRef__":true,"id":469},{"__isSmartRef__":true,"id":471},{"__isSmartRef__":true,"id":473}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"467":{"offset":0,"color":{"__isSmartRef__":true,"id":468}},"468":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"469":{"offset":0.4,"color":{"__isSmartRef__":true,"id":470}},"470":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"471":{"offset":0.6,"color":{"__isSmartRef__":true,"id":472}},"472":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"473":{"offset":1,"color":{"__isSmartRef__":true,"id":474}},"474":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"475":{"moveHorizontal":true},"476":{"sourceObj":{"__isSmartRef__":true,"id":451},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":365},"targetMethodName":"getCollapseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"477":{"sourceObj":{"__isSmartRef__":true,"id":451},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":365},"targetMethodName":"toggleCollapse","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"478":{"_Position":{"__isSmartRef__":true,"id":479},"_Extent":{"__isSmartRef__":true,"id":480},"_BorderWidth":2,"_BorderColor":{"__isSmartRef__":true,"id":481},"_Fill":{"__isSmartRef__":true,"id":157},"_StrokeOpacity":1,"_BorderRadius":"8px 8px 0px 0px","__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"479":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"480":{"x":500,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"481":{"r":0.4,"g":0.4,"b":0.4,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"482":{"resizeWidth":true,"adjustForNewBounds":true},"483":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"484":{"x":500,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"485":{"_BorderWidth":0,"_Fill":null,"_StrokeOpacity":0,"_BorderRadius":0,"_Extent":{"__isSmartRef__":true,"id":486},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"486":{"x":500,"y":222,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"487":{"adjustForNewBounds":true},"488":{"x":821,"y":1041,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"489":{"x":500,"y":222,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"490":{"submorphs":[{"__isSmartRef__":true,"id":491},{"__isSmartRef__":true,"id":2024}],"scripts":[],"id":689,"shape":{"__isSmartRef__":true,"id":2119},"droppingEnabled":true,"halosEnabled":true,"draggingEnabled":true,"layout":{"__isSmartRef__":true,"id":2121},"_Position":{"__isSmartRef__":true,"id":2122},"priorExtent":{"__isSmartRef__":true,"id":2123},"targetMorph":{"__isSmartRef__":true,"id":491},"titleBar":{"__isSmartRef__":true,"id":2024},"contentOffset":{"__isSmartRef__":true,"id":495},"collapsedTransform":null,"collapsedExtent":null,"expandedTransform":null,"expandedExtent":null,"ignoreEventsOnExpand":false,"owner":{"__isSmartRef__":true,"id":0},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Window"},"491":{"submorphs":[],"scripts":[],"id":688,"shape":{"__isSmartRef__":true,"id":492},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":371},"_ClipMode":"auto","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":495},"priorExtent":{"__isSmartRef__":true,"id":496},"_MaxTextWidth":500,"_MaxTextHeight":200,"textChunks":[{"__isSmartRef__":true,"id":497}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":490},"layout":{"__isSmartRef__":true,"id":499},"doitContext":{"__isSmartRef__":true,"id":500},"priorSelectionRange":[33,33],"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"492":{"_Position":{"__isSmartRef__":true,"id":493},"_Extent":{"__isSmartRef__":true,"id":494},"_BorderWidth":2,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":370},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"493":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"494":{"x":500,"y":200,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"495":{"x":0,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"496":{"x":500,"y":200,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"497":{"style":{"__isSmartRef__":true,"id":498},"morph":{"__isSmartRef__":true,"id":491},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"this.highlightJavaScriptSyntax()","__LivelyClassName__":"lively.morphic.TextChunk"},"498":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"499":{"resizeWidth":true,"resizeHeight":true},"500":{"submorphs":[],"scripts":[],"id":389,"shape":{"__isSmartRef__":true,"id":501},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":505},"_ClipMode":"scroll","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Courier","_Position":{"__isSmartRef__":true,"id":506},"priorExtent":{"__isSmartRef__":true,"id":507},"_MaxTextWidth":820,"_MaxTextHeight":269.5,"textChunks":[{"__isSmartRef__":true,"id":508}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":510},"layout":{"__isSmartRef__":true,"id":2022},"_FontSize":10,"noEval":true,"attributeConnections":[{"__isSmartRef__":true,"id":2023}],"doNotSerialize":["$$savedTextString"],"doNotCopyProperties":["$$savedTextString"],"styleClass":["Browser_codePaneText"],"focusHaloBorderWidth":0.5,"priorSelectionRange":[471,508],"prevScroll":[0,464],"showsHalos":false,"__SourceModuleName__":"Global.lively.morphic.TextCore","savedTextString":"module('lively.deprecated.SyntaxHighlighting').requires().toRun(function() {\n\nRunArray.addMethods('SyntaxHighlight', {\n\t// does not coerce\n\tsimpleMergeStyle: function(emph, start, stop) {\n\t\tvar newRun = this.slice(start, stop+1).mergeAllStyle(emph);\n\t\tif (start > 0) newRun = this.slice(0, start).concat(newRun);\n\t\tif (stop < this.length()-1) newRun = newRun.concat(this.slice(stop+1, this.length()));\n\t\treturn newRun;\n\t},\n})\n\nTextMorph.addMethods('SyntaxHighlight',{\n\t// does not compose after edit\n\tsimpleEmphasizeFromTo: function(emph, from, to) {\n\t\tvar txt = new lively.Text.Text(this.textString, this.textStyle);\n\t\ttxt.emphasize(emph, from, to);\n\t\tthis.textStyle = txt.style;\n\t},\n\n\thighlightJavaScriptSyntaxFromTo: function(from, to) {\n\t\tthis.emphasizeFromTo({color: Color.black, style: 'unbold'}, 0, this.textString.length);\n\t\tvar string = this.textString.substring(from,to),\n\t\t\tstyle = this.textStyle,\n\t\t\thighlighterRules = SyntaxHighlighter.JavaScriptRules;\n\t\t// var style = new RunArray([s.length],\t[new TextEmphasis({})]);\n\t\t\n\t\tfor (var ruleName in highlighterRules) {\n\t\t\tif (!highlighterRules.hasOwnProperty(ruleName)) continue;\n\t\t\tvar rule = highlighterRules[ruleName],\n\t\t\t\texp = rule.match, m;\n\t\t\twhile(m = exp.exec(string)) {\n\t\t\t\t// this.emphasizeFromTo(rule.style, from + m.index, from + m.index + m[0].length - 1 )\n\t\t\t\tstyle = style.simpleMergeStyle(new TextEmphasis(rule.style), from + m.index, from + m.index + m[0].length - 1) // TODO ckeck \"-1\"\n\t\t\t}\n\t\t};\n\n\t\t// override all other styles... to be refactored\n\t\t// this.textStyle = this.textStyle.mergeStyle(style, from, to)\t\n\t\tthis.textStyle = style.coalesce();\n\t\tvar replacementHints = {selStart: from, selStop: to, repLength: string.length};\n\t\tthis.composeAfterEdits(replacementHints);\n\t},\n\n\thighlightJavaScriptSyntax: function() {\n\t\tthis.highlightJavaScriptSyntaxFromTo(0, this.textString.length);\n\t},\n\n\tdelayedSyntaxHighlighting: function(optFrom, optTo) {\n\t\t// console.log(\"delayedSyntaxHig....\" + optFrom + \",\" + optTo)\n\t\tvar string = this.textString,\n\t\t\tself = this,\n\t\t\tfrom = optFrom || 0,\n\t\t\tto = optTo || self.textString.length;\t\t\t\n\n\t\tthis.highlightJavaScriptMinFrom = Math.min(this.highlightJavaScriptMinFrom, from) || from\n\t\tthis.highlightJavaScriptMaxTo = Math.max(this.highlightJavaScriptMaxTo, to) || to\n\n\t\t// console.log(\"to \" + to)\n\t\t// console.log(\"highlightJavaScriptMaxTo \" + this.highlightJavaScriptMaxTo)\n\n\t\tvar lastHighlightJavaScriptProgress = this.highlightJavaScriptProgress;\n\t\tthis.highlightJavaScriptProgress = {last: Date.now()};\n\n\t\tif ((Date.now() - lastHighlightJavaScriptProgress < 2000)) {\n\t\t\t// WorldMorph.current().setStatusMessage(\"delayed hightlight in Progress\", Color.darkGray, 3)\n\t\t\treturn\n\t\t}\n\t\tvar func = function() {\n\t\t\tif ((Date.now() - self.highlightJavaScriptProgress) < 500) {\n\t\t\t\t// WorldMorph.current().setStatusMessage(\"delay hightlight\", Color.red, 2)\n\t\t\t\tfunc.delay(0);\n\t\t\t} else {\t\n\t\t\t\tvar time = Functions.timeToRun(function() {\n\t\t\t\t\t\tself.highlightJavaScriptSyntaxFromTo(\n\t\t\t\t\t\t\tself.highlightJavaScriptMinFrom, self.highlightJavaScriptMaxTo)});\n\t\t\t\t// WorldMorph.current().setStatusMessage(\"delayed hightlight in \" + time +\"ms \" + \n\t\t\t\t//\tself.highlightJavaScriptMinFrom + \",\" + self.highlightJavaScriptMaxTo, Color.blue, 3)\n\t\t\t\tdelete self.highlightJavaScriptProgress\n\t\t\t\tdelete self.highlightJavaScriptMinFrom\n\t\t\t\tdelete self.highlightJavaScriptMaxTo\n\t\t\t}\n\t\t};\n\t\tfunc(0)\n\t},\n})\n\ncop.create(\"SyntaxHighlightLayer\").refineClass(TextMorph, {\n\n\t// replaceSelectionWith: function(replacement) {\n\t//\tvar result = cop.proceed(replacement);\n\t//\tvar cursorPos = t.getCursorPos();\n\t//\tthis.delayedSyntaxHighlighting(this.textString.lastIndexOf(\"\\n\", cursorPos - 1), this.textString.indexOf(\"\\n\", cursorPos));\n\t//\treturn result;\t\n\t// },\n\n \t// tryBoundEval: function(str, offset, printIt) {\n\t\t// var result = cop.proceed(str, offset, printIt);\n\t\t// The syntax highlighting triggers a bug in TextMorph\n\t\t// where newlines are not composed correctly\n\t\t// this.highlightJavaScriptSyntaxFromTo(offset, offset + str.length);\n\t\t// this.delayedSyntaxHighlighting(offset, offset + str.length)\t\n\t\t// return result\n\t// },\n\n\tsubMenuStyleItems: function(evt) {\n\t\tvar items;\n\t\twithoutLayers([SyntaxHighlightLayer], function() {\n\t\t\titems= cop.proceed(evt);\n\t\t});\n\t\tvar enabled = this.getWithLayers().include(BrowserSyntaxHighlightLayer);\n\t\titems.push([(enabled ? \"[X]\" : \"[]\") + \" Syntax Highlighting\", function() {\n\t\t\tif(!enabled) {\n\t\t\t\tthis.highlightJavaScriptSyntax();\n\t\t\t\tthis.setWithLayers(this.getWithLayers().concat([BrowserSyntaxHighlightLayer]))\n\t\t\t} else {\n\t\t\t\tthis.emphasizeAll({color: \"black\", style: 'unbold'})\n\t\t\t\tthis.setWithLayers(this.getWithLayers().reject(\n\t\t\t\t\tfunction(ea){return ea === BrowserSyntaxHighlightLayer}))\n\t\t\t}\n\t\t}])\t\t\n\t\treturn items\n\t},\n})\n.refineClass(lively.ide.BasicBrowser, {\n\n\thightlightSourcePane: function() {\n\t\tvar m = this.panel.sourcePane.innerMorph();\n\t\tif (m.textString.length < 10000) {\n\t\t\ttry {\n\t\t\t\t// var time = Functions.timeToRun(function(){m.highlightJavaScriptSyntax()});\n\t\t\t\tm.delayedSyntaxHighlighting();\n\t\t\t} catch (er) {\n\t\t\t\tconsole.log(\"Error during Syntax Highligthing \" + er)\n\t\t\t}\n\t\t\tm.setFontFamily('Courier')\n\t\t}\n\t\t// WorldMorph.current().setStatusMessage('Browser Syntax Highligth ' +time+ \"ms\", Color.blue, 3)\n\t},\n\n\tonPane2SelectionUpdate: function(node) {\n\t\tcop.proceed(node);\n\t\tthis.hightlightSourcePane();\n },\n\n\tonPane4SelectionUpdate: function(node) {\n\t\tcop.proceed(node);\n\t\tthis.hightlightSourcePane();\n },\n\n\tbuildView: function(extent) {\n\t\tvar morph = cop.proceed(extent)\n\t\tthis.panel.sourcePane.innerMorph().setWithLayers([BrowserSyntaxHighlightLayer])\n\t\treturn morph\n\t}\n});\n\ncop.create('BrowserSyntaxHighlightLayer').refineClass(TextMorph, {\n\tdoSave: function() {\n\t\tcop.proceed();\n\t\tthis.highlightJavaScriptSyntax()\n\t},\n});\n\nSyntaxHighlightLayer.beGlobal()\n\n}) // end of module","__LivelyClassName__":"lively.morphic.Text"},"501":{"_Position":{"__isSmartRef__":true,"id":502},"_Extent":{"__isSmartRef__":true,"id":503},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":504},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"502":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"503":{"x":820,"y":269.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"504":{"r":1,"g":1,"b":1,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"505":{"x":5,"y":5,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"506":{"x":0,"y":247.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"507":{"x":820,"y":269.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"508":{"style":{"__isSmartRef__":true,"id":509},"morph":{"__isSmartRef__":true,"id":500},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"module('lively.oldCore.Morphs').requires('lively.OldModel', 'lively.oldCore.Misc', 'lively.oldCore.Hacks').toRun(function() {\n\n// ===========================================================================\n// Morph functionality\n// ===========================================================================\n\nObject.subclass('MouseHandlerForDragging', {\n\n\thandleMouseEvent: function(evt, targetMorph) {\n\t\tif (evt.type == \"MouseDown\") evt.hand.setMouseFocus(targetMorph);\n\t\tevt.hand.resetMouseFocusChanges();\n\n\t\tvar handler = targetMorph[evt.handlerName()];\n\t\tif (handler) handler.call(targetMorph, evt, targetMorph);\n\n\t\tif (evt.type == \"MouseUp\") {\n\t\t\t// cancel focus unless it was set in the handler\n\t\t\tif (evt.hand.resetMouseFocusChanges() == 0) {\n\t\t\t\tevt.hand.setMouseFocus(null);\n\t\t\t}\n\t\t}\n\t\treturn true; \n\t},\n\n handlesMouseDown: Functions.False\n});\n\nObject.subclass('MouseHandlerForRelay', {\n\n\tdefaultEventSpec: {onMouseDown: \"onMouseDown\", onMouseMove: \"onMouseMove\", onMouseUp: \"onMouseUp\"},\n\t\n\tinitialize: function (target, eventSpec) {\n\t\t// Send events to a different target, with different methods\n\t\t// Ex: box.relayMouseEvents(box.owner, {onMouseUp: \"boxReleased\", onMouseDown: \"boxPressed\"})\n\t\tthis.target = target;\n\t\tthis.eventSpec = eventSpec || this.defaultEventSpec;\n\t},\n\n\thandleMouseEvent: function(evt, originalTarget) {\n\t\tif (evt.type == \"MouseDown\") evt.hand.setMouseFocus(originalTarget);\n\t\tevt.hand.resetMouseFocusChanges();\n\n\t\tvar handler = this.target[this.eventSpec[evt.handlerName()]];\n\t\tif (handler) handler.call(this.target, evt, originalTarget);\n\n\t\tif (evt.type == \"MouseUp\") {\n\t\t\t// cancel focus unless it was set in the handler\n\t\t\tif (evt.hand.resetMouseFocusChanges() == 0) {\n\t\t\t\tevt.hand.setMouseFocus(null);\n\t\t\t}\n\t\t}\n\t\treturn true; \n\t},\n\n handlesMouseDown: Functions.True\n\n});\n\n/**\n * Morph Class \n */\nlively.data.Wrapper.subclass('Morph');\n\nObject.extend(Morph, {\n\t// Functions for change management\n \t// this static function is needed to bind it during the defintion of some Morph methods\n\tonLayoutChange: function(fieldName) { \n\t\treturn function layoutChangeAdvice(/* arguments*/) {\n\t\t\tvar priorExtent = this.innerBounds().extent();\n\t\t\tthis.changed();\n\t\t\tvar args = $A(arguments);\n\t\t\tvar proceed = args.shift();\n\t\t\tvar result = proceed.apply(this, args);\n\t\t\tthis.layoutChanged(priorExtent);\n\t\t\tthis.changed(); \n\t\t\treturn result;\n\t\t}\n\t},\n\n\tfromLiteral: function(literal) {\n\t\tvar morph = new Morph(literal.shape);\n\t\tif (literal.submorphs) {\n\t\t\tif (Object.isArray(literal.submorphs))\n\t\t\t\tmorph.setSubmorphs(literal.submorphs);\n\t\t\telse throw new TypeError();\n\t\t}\n\t\tif (literal.transforms) {\n\t\t\tmorph.setTransforms(literal.transforms);\n\t\t}\n\t\treturn morph;\n\t},\n\n\t// factory methods\n\tmakeLine: function(verts, lineWidth, lineColor) {\n\t\tif (verts.length < 2) return;\n\t\tvar morph = new PathMorph(verts);\n\t\tmorph.applyStyle({fill: null, borderWidth: lineWidth || 1, borderColor: lineColor || Color.black});\n\t\tmorph.enableInsertionPoints()\n\t\treturn morph;\n\n\t\t// make a line with its origin at the first vertex\n\t\t// Note this works for simple lines (2 vertices) and general polylines\n\t\t// verts = verts.invoke('subPt', verts[0]);\n\t\t// var shape = new lively.scene.Polyline(verts);\n\t\t// var morph = new Morph(shape);\n\t\t// morph.setBorderWidth(lineWidth);\n\t\t// morph.setBorderColor(lineColor);\n\t\t// morph.setFill(null);\n\t\t// return morph;\n\t},\n\n\tmakeCircle: function(location, radius, lineWidth, lineColor, fill) {\n\t\t// make a circle of the given radius with its origin at the center\n\t\tvar morph = new Morph(new lively.scene.Ellipse(location, radius));\n\t\tmorph.setBorderWidth(lineWidth);\n\t\tmorph.setBorderColor(lineColor);\n\t\tmorph.setFill(fill || Color.blue);\n\t\treturn morph;\n\t},\n\n\tmakeEllipse: function(bounds, lineWidth, lineColor, fill) {\n\t\t// make a circle first (a bit wasteful)\n\t\tvar morph = this.makeCircle(bounds.center(), 0, lineWidth, lineColor, fill);\n\t\tmorph.setBounds(bounds);\n\t\tmorph.moveOriginBy(morph.innerBounds().center())\n\t\treturn morph;\n\t},\n\n\tmakeRectangle: function(/**/) {\n\t\tvar morph;\n\t\tswitch (arguments.length) {\n\t\t\tcase 1: // rectangle\n\t\t\tif (!(arguments[0] instanceof Rectangle)) throw new TypeError(arguments[0] + ' not a rectangle');\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(arguments[0]));\n\t\t\tbreak;\n\t\t\tcase 2: // location and extent\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(arguments[0].extent(arguments[1])));\n\t\t\tbreak;\n\t\t\tcase 4: // x,y,width, height\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(new Rectangle(arguments[0], arguments[1], arguments[2], arguments[3])));\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\tthrow new Error(\"bad arguments \" + arguments);\n\t\t}\n\t\treturn morph.applyStyle({borderWidth: 1, borderColor: Color.black, fill: Color.blue});\n\t},\n\n\tmakePolygon: function(verts, lineWidth, lineColor, fill) {\n\t\tvar morph = new Morph(new lively.scene.Polygon(verts));\n\t\tmorph.setBorderWidth(lineWidth);\n\t\tmorph.setBorderColor(lineColor);\n\t\tmorph.setFill(fill);\n\t\treturn morph;\n\t\t//return morph.applyStyle({fill: fill, borderWidth: lineWidth, borderColor: lineColor});\n\t},\n\n\tmakeStar: function(position) {\n\t\tvar makeStarVertices = function(r,center,startAngle) {\n\t\t\tvar vertices = [];\n\t\t\tvar nVerts = 10;\n\t\t\tfor (var i=0; i <= nVerts; i++) {\n\t\t\t\tvar a = startAngle + (2*Math.PI/nVerts*i);\n\t\t\t\tvar p = Point.polar(r,a);\n\t\t\t\tif (i%2 == 0) p = p.scaleBy(0.39);\n\t\t\t\tvertices.push(p.addPt(center)); \n\t\t\t}\n\t\t\treturn vertices; \n\t\t}\n\t\tvar morph = Morph.makePolygon(makeStarVertices(50,pt(0,0),0), 1, Color.black, Color.yellow);\n\t\tmorph.setPosition(position);\n\t\treturn morph\n\t},\n\t\n\tmakeCurve: function(verts, ctrls, closed) {\n\t\t// Make up a new quadratic spline from the supplied vertices and control points.\n\t\t// ctrls[i] is the ctrl point for segment from verts[i-1] to verts[i]. (ctrls[0] is never used)\n\t\tif (verts.length < 2) return;\n\t\t// console.log(\"verts = \" + Object.inspect(verts));\n\t\t// console.log(\"ctrls = \" + Object.inspect(ctrls));\n\t\tvar g = lively.scene;\n\t\tvar cmds = [];\n\t\tcmds.push(new g.MoveTo(true, verts[0].x, verts[0].y));\n\t\tfor (var i=1; i 1) console.warn('More than one code node');\n\t\t\t// ChangeSet of World gets evaluated in main\n \t}\n\t},\n\n restoreFromSubnodes: function(importer) {\n // wade through the children\n var children = [];\n var helperNodes = [];\n\n for (var desc = this.rawNode.firstChild; desc != null; desc = desc.nextSibling) {\n if (desc.nodeType == Node.TEXT_NODE || desc.nodeType == Node.COMMENT_NODE) {\n if (desc.textContent == \"\\n\") \n helperNodes.push(desc); // remove newlines, which will be reinserted for formatting\n continue; // ignore whitespace and maybe other things\n }\n var type = lively.data.Wrapper.getEncodedType(desc);\n // depth first traversal\n\n\t\t\t// WebCards...\n\t\t \t// if (type && !type.startsWith(\"anonymous_\")) { //I have no idea what that mean\n\n if (type) {\n var wrapper = importer.importWrapperFromNode(desc);\n if (wrapper instanceof Morph) {\n this.submorphs.push(wrapper); \n wrapper.owner = this;\n } else children.push(desc);\n } else {\n children.push(desc);\n }\n }\n\n for (var i = 0; i < children.length; i++) {\n var node = children[i];\n var shape = lively.scene.Shape.importFromNode(importer, node);\n if (shape) {\n this.shape = shape;\n continue;\n }\n switch (node.localName) {\n // nodes from the Lively namespace\n case \"field\": {\n // console.log(\"found field \" + Exporter.stringify(node));\n helperNodes.push(node);\n this.deserializeFieldFromNode(importer, node); \n break;\n }\n case \"widget\": {\n this.deserializeWidgetFromNode(importer, node);\n break;\n }\n case \"array\": {\n helperNodes.push(node);\n this.deserializeArrayFromNode(importer, node);\n break;\n }\n case \"relay\": {\n this.deserializeRelayFromNode(importer, node);\n break;\n }\n case \"record\": {\n this.deserializeRecordFromNode(importer, node);\n break;\n }\n case \"defs\": { \n\t\t\t\tthis.restoreFromDefsNode(importer, node);\n break;\n }\n default: {\n if (node.nodeType === Node.TEXT_NODE) {\n //console.log('text tag name %s', node.tagName);\n // whitespace, ignore\n } else if (!this.restoreFromSubnode(importer, node)) {\n console.warn('not handling %s, %s', node.tagName || node.nodeType, node.textContent);\n }\n }\n }\n } // end for\n\n for (var i = 0; i < helperNodes.length; i++) {\n var n = helperNodes[i];\n n.parentNode.removeChild(n);\n }\n },\n\n\tresolveUriToObject: function(uri) {\n\t\tif (this.id() == uri)\n\t\t\treturn this;\n\t\tif (this.ownerWidget) {\n\t\t\tvar result = this.ownerWidget.resolveUriToObject(uri)\n\t\t\tif (result)\n\t\t\t\treturn result;\n\t\t};\t\n\t\tfor (var i=0; i < this.submorphs.length; i++) {\n\t\t\tvar result = this.submorphs[i].resolveUriToObject(uri);\n\t\t\tif (result)\n\t\t\t\treturn result;\n\t\t}\n\t\treturn null\n\t},\n\t\t\n\t// Fill Garbage Collection on Serialization...\n\tcollectAllUsedFills: function(/*$super, */result) {\n\t\t// result = $super(result);\n\t\tvar fill = this.getFill();\n\t\tif (fill instanceof lively.paint.Gradient) result.push(fill);\n\t\tvar stroke = this.shape.getStroke(); // fixme\n\t\tif (stroke instanceof lively.paint.Gradient) result.push(stroke);\n\t\tif (this.submorphs) this.submorphs.invoke('collectAllUsedFills', result);\n\t\treturn result\n\t},\n\n\texportLinkedFile: function(filename) {\n\t\tvar url;\n\t\tif (Global[\"WikiNavigator\"] && WikiNavigator.current) {\n\t\t\tvar nav = WikiNavigator.current;\n\t\t\turl = WikiNavigator.fileNameToURL(filename);\n\t\t\tnav.interactiveSaveWorld(url);\n\t\t} else {\n\t\t\turl = WorldMorph.current().saveWorld(filename);\n\t\t}\n\t\tif (url) this.world().reactiveAddMorph(new ExternalLinkMorph(url));\n\t\treturn url;\n\t},\n\n},\n'accessing', {\n\tgetName: function() { return this.name },\n\n\tsetName: function(str) { this.name = str; return name },\n\n\tcanvas: function() {\n\t\treturn locateCanvas(this.rawNode);\n\t},\n\t\n getOwnerWidget: function() {\n\t\treturn this.ownerWidget || this.owner.getOwnerWidget();\n\t},\n\n\townerChain: function() {\n\t\t// Return an array of me and all my owners\n\t\t// First item is, eg, world; last item is me\n\t\tif (!this.owner) return [this];\n\t\tvar owners = this.owner.ownerChain();\n\t\towners.push(this);\n\t\treturn owners;\n\t},\n\n},\n'styling',{\t// tmp copy\n\n\tgetStyleClass: function() { return this.styleClass || [] },\n\n\tsetStyleClass: function(value) {\n\t\tvar attr;\n\t\tif (value instanceof Array) {\n\t\t\tthis.styleClass = value;\n\t\t\tattr = value.join(' ');\n\t\t} else {\n\t\t\tthis.styleClass = [value];\n\t\t\tattr = String(value);\n\t\t}\n\t\tthis.rawNode.setAttribute(\"class\", attr);\n\t\treturn value;\n\t},\n\n\tapplyStyle: function(specs) { // note: use reflection instead?\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar spec = arguments[i];\n\t\t\tif(!spec) return; // dbgOn(!spec);\n\n\t\t\tif (spec.position !== undefined) this.setPosition(spec.position);\n\t\t\tif (spec.extent !== undefined) this.setExtent(spec.extent);\n\t\t\tif (spec.scale !== undefined) this.setScale(spec.scale);\n\t\t\tif (spec.rotation !== undefined) this.setRotation(spec.rotation);\n\n\t\t\tif (spec.borderWidth !== undefined) this.setBorderWidth(spec.borderWidth);\n\t\t\tif (spec.borderColor !== undefined) this.setBorderColor(spec.borderColor);\n\t\t\tif (spec.fill !== undefined) this.setFill(spec.fill);\n\t\t\tif (spec.opacity !== undefined) {\n\t\t\t\tthis.setFillOpacity(spec.opacity);\n\t\t\t\tthis.setStrokeOpacity(spec.opacity); \n\t\t\t}\n\t\t\tif (spec.fillOpacity !== undefined) this.setFillOpacity(spec.fillOpacity);\n\t\t\tif (spec.strokeOpacity !== undefined) this.setStrokeOpacity(spec.strokeOpacity);\n\n\t\t\tif (this.shape.roundEdgesBy && spec.borderRadius !== undefined) { \n\t\t\t\tthis.shape.roundEdgesBy(spec.borderRadius);\n\t\t\t}\n\t\t\tif (spec.suppressGrabbing !== undefined) this.suppressGrabbing = spec.suppressGrabbing;\n\t\t\tif (spec.suppressHandles !== undefined) this.suppressHandles = spec.suppressHandles;\n\n\t\t\tif (spec.focusHaloBorderWidth !== undefined) this.focusHaloBorderWidth = spec.focusHaloBorderWidth;\n\t\t\tif (spec.focusHaloInset !== undefined) this.focusHaloInset = spec.focusHaloInset;\n\t\t\tif (spec.padding !== undefined) this.padding = spec.padding;\n\t\t\tif (spec.margin !== undefined) this.margin = spec.margin;\n\t\t}\n\t\treturn this;\n\t},\n\n\tmakeStyleSpec: function() {\n\t\t// Adjust all visual attributes specified in the style spec\n\t\tvar spec = { };\n\t\tspec.borderWidth = this.getBorderWidth();\n\t\tspec.borderColor = this.getBorderColor();\n\t\tspec.fill = this.getFill();\n\t\tif (this.shape.getBorderRadius) spec.borderRadius = this.shape.getBorderRadius() || 0.0;\n\t\tspec.fillOpacity = typeof this.shape.getFillOpacity() !== undefined ? this.shape.getFillOpacity() : 1.0;\n\t\tspec.strokeOpacity = typeof this.shape.getStrokeOpacity() !== undefined ? this.shape.getStrokeOpacity() : 1.0;\t\t\n\t\treturn spec;\n\t},\n\n\tapplyStyleNamed: function(name) {\n\t\tvar style = this.styleNamed(name);\n\t\tif (style) this.applyStyle(style);\n\t\telse console.warn(\"applyStyleNamed: no style named \" + name)\n\t},\n\n\tstyleNamed: function(name) {\n\t\t// Look the name up in the Morph tree, else in current world\n\t\tif (this.displayTheme) return this.displayTheme[name];\n\t\tif (this.owner) return this.owner.styleNamed(name);\n\t\tvar world = WorldMorph.current();\n\t\tif (world && (this !== world)) return world.styleNamed(name);\n\t\treturn DisplayThemes[Config.defaultDisplayTheme || \"lively\"][name]; // FIXME for onDeserialize, when no world exists yet\n\t},\n\n\tlinkToStyles: function(styleClassList, optSupressApplication) {\n\t\t// Record the links for later updates, and apply them now\n\t\tthis.setStyleClass(styleClassList);\n\t\tif (!optSupressApplication) this.applyLinkedStyles();\n\t\treturn this;\n\t},\n\n\tapplyLinkedStyles: function() {\n\t\t// Apply all the styles to which I am linked, in order\n\t\tvar styleClasses = this.getStyleClass();\n\t\tif (!styleClasses) return;\n\t\tfor (var i = 0; i < styleClasses.length; i++) {\n\t\t\tthis.applyStyleNamed(styleClasses[i]); \n\t\t}\n\t},\n},\n'appearance', { // Functions for manipulating the visual attributes of Morphs\n\t\n\tsetFill: function(fill) {\n\t\tthis.shape.setFill(fill);\n\t\tthis.changed();\n\t\treturn fill;\n\t},\n\n\tgetFill: function() { return this.shape.getFill() },\n\n\tsetBorderColor: function(newColor) {\n\t\tthis.shape.setStroke(newColor);\n\t\t// this.changed();\n\t\treturn newColor\n\t},\n\n\tgetBorderColor: function() {\n\t\treturn new Color(Importer.marker, this.shape.getStroke());\n\t},\n\n\t// FIXME for Chrome border bug\n\tnearlyZeroBorderWidth: 0.00001,\n\n\tsetBorderWidth: function(newWidth) {\n\t\tif (!newWidth) newWidth = 0;\t\t\n\t\tvar oldWidth = this.getBorderWidth();\n\t\tif (newWidth === oldWidth) return;\n\n\t\t// Opt: only notify change with the bigger of two bounds\n\t\tif (oldWidth > newWidth) this.changed();\n\t\tthis.shape.setStrokeWidth(newWidth); \n\t\tif (newWidth > oldWidth) this.changed();\n\t\treturn newWidth\n\t},\n\n\tgetBorderWidth: function() {\n\t\treturn this.shape.getStrokeWidth() || 0; // FIXME: fix defaults logic\n\t},\n\n \tsetBorderRadius: function(r) {//jd\n \tthis.shape.roundEdgesBy(r);\n\t\tthis.changed();\n\t\treturn r\n },\n\n \tgetBorderRadius: function() {\n\t\treturn this.shape.getBorderRadius(); \n\t},\n\n\tshapeRoundEdgesBy: function(r) {\n\t\tthis.setBorderRadius(r);\n\t},\n\n\tgetFillOpacity: function() { return this.shape.getFillOpacity(); },\n\n\tsetFillOpacity: function(op) {\n\t\tthis.shape.setFillOpacity(op);\n\t\tthis.changed(); // FIXME better use specific update\n\t\treturn op;\n\t},\n\n\tsetStrokeOpacity: function(op) { \n\t\tthis.shape.setStrokeOpacity(op);\n\t\tthis.changed(); // FIXME better use specific update\n\t\treturn op;\n\t},\n\n\tgetStrokeOpacity: function() { return this.shape.getStrokeOpacity() },\n\n setLineJoin: function(joinType) { this.shape.setLineJoin(joinType); return joinType },\n\n\tgetLineJoin: function() { return this.shape.getLineJoin() }, \n\n setLineCap: function(capType) { this.shape.setLineCap(capType); return capType },\n\n \tgetLineCap: function() { return this.shape.getLineCap() },\n\n // toggle fisheye effect on/off\n\ttoggleFisheye: function() { \n\t\t// if fisheye is true, we need to scale the morph to original size\n\t\tif (this.fishEye) {\n\t\t\tthis.setScale(this.getScale() / this.fisheyeScale);\n\t\t\tthis.setFisheyeScale(1.0);\n\t\t}\n\t\t// toggle fisheye\n\t\tthis.fishEye = !this.fishEye;\n\t},\n\n\t// sets the scaling factor for the fisheye between 1..fisheyeGrowth\n\tsetFisheyeScale: function (newScale) {\n\t\t// take the original centerpoint\n\t\tvar p = this.bounds().center();\n\n\t\tthis.fisheyeScale = newScale;\n\t\tthis.pvtCachedTransform = null;\n\t\tthis.layoutChanged(); \n\t\tthis.changed();\n\n\t\t// if the fisheye was on move the fisheye'd morph by the difference between \n\t\t// original center point and the new center point divided by 2\n\t\tif (this.fishEye) {\n\t\t\t// (new.center - orig.center)/2\n\t\t\tvar k = this.bounds().center().subPt(p).scaleBy(.5).negated();\n\t\t\tif (!pt(0,0).eqPt(k)) {\n\t\t\t\tthis.setPosition(this.position().addPt(k));\n\t\t\t\tthis.layoutChanged(); \n\t\t\t\tthis.changed();\n\t\t\t}\n\t\t}\n\t},\n\n\tisVisible: function() { // FIXME delegate to sceneNode when conversion finished\n\t\t// Note: this may not be correct in general in SVG due to inheritance,\n\t\t// but should work in LIVELY.\n\t\tvar hidden = this.rawNode.getAttributeNS(null, \"display\") == \"none\";\n\t\treturn hidden == false;\n\t},\n\n\tsetVisible: function(flag) { // FIXME delegate to sceneNode when conversion finished\n\t\tif (flag) this.rawNode.removeAttributeNS(null, \"display\");\n\t\telse this.rawNode.setAttributeNS(null, \"display\", \"none\");\n\t\treturn this;\n\t},\n\t\n\tapplyFilter: function(filterUri) {// FIXME delegate to sceneNode when conversion finished\n\t\tif (filterUri) \n\t\t\tthis.rawNode.setAttributeNS(null, \"filter\", filterUri);\n\t\telse\n\t\t\tthis.rawNode.removeAttributeNS(null, \"filter\");\n\t},\n\t\n},\n'shape related', {\n\n\t// NOTE: The following four methods should all be factored into a single bit of reshaping logic\n\tapplyFunctionToShape: function() { // my kingdom for a Smalltalk block!\n\t\tvar args = $A(arguments);\n\t\tvar func = args.shift();\n\t\tfunc.apply(this.shape, args);\n\t\tthis.adjustForNewBounds();\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tinternalSetShape: function(newShape) {\n\t\tif (!newShape.rawNode) {\n\t\t\tconsole.log('newShape is ' + newShape);\n\t\t\tlively.lang.Execution.showStack();\n\t\t}\n\n\t\tthis.rawNode.replaceChild(newShape.rawNode, this.shape.rawNode);\n\t\tthis.shape = newShape;\n\t\tthis.adjustForNewBounds();\n\t},\n\n\tsetShape: function(newShape) {\n\t\tthis.internalSetShape(newShape);\n\t\treturn newShape;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\treshape: function(partName, newPoint, lastCall) {\n\t\ttry {\n\t\t\treturn this.shape.reshape(partName,newPoint,lastCall);\n\t\t} finally {\n\t\t\t// FIXME: consider converting polyline to polygon when vertices merge.\n\t\t\tif (this.layoutManager && this.layoutManager.onReshape) this.layoutManager.onReshape(this);\n\t\t}\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tsetVertices: function(newVerts) {\n\t\t// particular to polygons\n\t\tthis.shape.setVertices(newVerts);\n\t\tthis.adjustForNewBounds();\n\t\treturn newVerts;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tbeClipMorph: function() {\n\t\t// For simple morphs (rectangles, ellipses, polygons) this will cause all submorphs\n\t\t// to be clipped to the shape of this morph.\n\t\t// Note: the bounds function should probably be copied from ClipMorph as\n\t\t//\t\tpart of this mutation\n\t\tvar defs = this.rawNode.appendChild(NodeFactory.create('defs'));\n\t\tthis.clip = new lively.scene.Clip(this.shape);\n\t\tdefs.appendChild(this.clip.rawNode);\n\t\tthis.clip.applyTo(this);\n\t\tthis.isClipMorph = true;\n\t},\n\n},\n'layouting',{\n\n // FIXME: this doesn't account properly for border width\n // the CSS box model, see http://www.w3.org/TR/REC-CSS2/box.html \n padding: new Rectangle(0, 0, 0, 0), // between morph borders and its content (inwards)\n margin: new Rectangle(0, 0, 0, 0), // between morph border and its siblings\n \n\tlayoutManager: null, // singleton, intialzided later\n\n\t// Simple hack until the layout manager can relayout\n\trelayout: function() {\n\t\tif (this.layoutManager) this.layoutManager.layout(this);\n\t},\n\n\tsetBounds: function(newRect) {\n\t\tif (!newRect) return;\n\t\tthis.layoutManager.setBounds(this, newRect);\n\t\treturn newRect;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tsetExtent: function(newExtent) {\n\t\tthis.layoutManager.setExtent(this, newExtent);\n\t\treturn newExtent;\n\t},\n\n\tgetExtent: function(newRect) { return this.shape.bounds().extent() },\n\n\tposition: function() { // Deprecated -- use getPosition\n\t\treturn this.shape.bounds().topLeft().addPt(this.origin); \n\t},\n\n\tgetPosition: function() {\n\t\treturn this.shape.bounds().topLeft().addPt(this.origin); \n\t},\n\n\tsetPosition: function(newPosition) {\n\t\tthis.layoutManager.setPosition(this, newPosition);\n\t\treturn newPosition;\n\t},\n\n\tcontainsPoint: function(p) { \n\t\t// p is in owner coordinates\n\t\tif (!this.bounds().containsPoint(p)) return false;\n\t\treturn this.shape.containsPoint(this.relativize(p)); \n\t},\n\n\tcontainsWorldPoint: function(p) { // p is in world coordinates\n\t\tif (this.owner == null) return this.containsPoint(p);\n\t\treturn this.containsPoint(this.owner.localize(p)); \n\t},\n\n\tfullContainsPoint: function(p) { // p is in owner coordinates\n\t\treturn this.bounds().containsPoint(p); \n\t},\n\n\tfullContainsWorldPoint: function(p) { // p is in world coordinates\n\t\tif (this.owner == null) return this.fullContainsPoint(p);\n\t\treturn this.fullContainsPoint(this.owner.localize(p)); \n\t},\n\n\t// Morph bounds, coordinates, moving and damage reporting functions\n // bounds returns the full bounding box in owner coordinates of this morph and all its submorphs\n\tbounds: function(ignoreTransients, ignoreTransform) {\n\t\tif (this.fullBounds != null) return this.fullBounds;\n\n\t\tvar tfm = this.getTransform();\n\t\tvar fullBounds = this.localBorderBounds(ignoreTransform ? null : tfm);\n\n\t\tvar subBounds = this.submorphBounds(ignoreTransients);\n\t\tif (subBounds != null) {\n\t\t\t// could be simpler when no rotation...\n\t\t\tfullBounds = fullBounds.union(tfm.transformRectToRect(subBounds));\n\t\t}\n\n\t\tif (fullBounds.width < 3 || fullBounds.height < 3) {\n\t\t\t// Prevent Horiz or vert lines from being ungrabable\n\t\t\tfullBounds = fullBounds.expandBy(3); \n\t\t}\n\t\tthis.fullBounds = fullBounds;\n\t\treturn fullBounds; \n\t},\n \n\tsubmorphBounds: function(ignoreTransients) {\n\t\tvar subBounds = null;\n\t\tfor (var i = 0; i < this.submorphs.length; i++) {\n\t\t\tvar m = this.submorphs[i];\n\t\t\tif ((ignoreTransients && m.isEpimorph))\n\t\t\t\tcontinue;\n\t\t\tif (!m.isVisible()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsubBounds = subBounds == null ? m.bounds(ignoreTransients) : subBounds.union(m.bounds(ignoreTransients));\n\t\t}\n\t\treturn subBounds;\n\t},\n \n // innerBounds returns the bounds of this morph only, and in local coordinates\n innerBounds: function() { \n return this.shape.bounds().insetByRect(this.padding);\n },\n \n\tlocalBorderBounds: function(optTfm) {\n\t\t// defined by the external edge of the border\n\t\t// if optTfm is defined, transform the vertices first, then take the union\n\t\tdbgOn(!this.shape);\n\t\tvar bounds = optTfm ? Rectangle.unionPts(this.shape.vertices().invoke('matrixTransform', optTfm)) : this.shape.bounds();\n\n\t\tvar borderMargin = this.getBorderWidth()/2;\n\t\t// double border margin for polylines to account for elbow protrusions\n\t\tif (this.shape.hasElbowProtrusions) borderMargin = borderMargin*2 + 1;\n\t\tbounds = bounds.expandBy(borderMargin);\n\t\treturn bounds;\n\t},\n\t\n\tchanged: function() {\n\t\t// Note most morphs don't need this in SVG, but text needs the \n\t\t// call on bounds() to trigger layout on new bounds\n\t\tif(this.owner && this.owner.invalidRect) this.owner.invalidRect(this.bounds());\n\t},\n\n\tinvalidRect: function() {\n\t\t// Do nothing (handled by SVG). Overridden in canvas.\n },\n\n layoutOnSubmorphLayout: function(submorph) {\n\t\t// override to return false, in which case layoutChanged() will not be propagated to\n\t\t// the receiver when a submorph's layout changes. \n\t\treturn true;\n },\n\n\ttransformChanged: function() {\n\t\tvar scalePt = this.scalePoint;\n\t\tif (this.fisheyeScale != 1) scalePt = scalePt.scaleBy(this.fisheyeScale);\n\t\tthis.pvtCachedTransform = new lively.scene.Similitude(this.origin, this.rotation, scalePt);\n\t\tthis.pvtCachedTransform.applyTo(this.rawNode);\n\t\tthis.signalGeometryChange();\n\t},\n\n\tlayoutChanged: function Morph$layoutChanged() {\n\t\t// layoutChanged() is called whenever the cached fullBounds may have changed\n\t\t// It invalidates the cache, which will be recomputed when bounds() is called\n\t\t// Naturally it must be propagated up its owner chain.\n\t\t// Note the difference in meaning from adjustForNewBounds()\n\t\t// KP: the following may or may not be necessary:\n\n\t\tthis.transformChanged(); // DI: why is this here?\n\t\tif(! this.fullBounds) return; // already called\n\n\t\tthis.fullBounds = null;\n\t\tif (this.owner && this.owner.layoutOnSubmorphLayout(this) && !this.isEpimorph) { // May affect owner as well...\n\t\t\tthis.owner.layoutChanged();\n\t\t}\n\t\tthis.layoutManager.layoutChanged(this);\n\t},\n\n\tadjustForNewBounds: function() {\n\t\t// adjustForNewBounds() is called whenever the innerBounds may have changed in extent\n\t\t// -- it should really be called adjustForNewExtent --\n\t\t// Depending on the morph and its layoutManager, it may then re-layout its\n\t\t// submorphs and, in the process, propagate the message down to leaf morphs (or not)\n\t\t// Of course a change in innerBounds implies layoutChanged() as well,\n\t\t// but, for now, these are called separately.\n\t\t// NB: Because some morphs may re-lay themselves out in response to adjustForNewBounds()\n\t\t// adjustForNewBounds() *must never be called from* a layout operation;\n\t\t// The layout process should only move and resize submorphs, but never change the innerBounds\n\n\t\t// If this method is overridden by a subclass, it should call super as well\n\t\tif (this.focusHalo) this.adjustFocusHalo();\n\t},\n},\n// Submorph management functions\n'submorphs',{ \n\n addMorph: function(morph) { return this.addMorphFrontOrBack(morph, true) },\n\n\taddMorphAt: function(morph, position) {\n\t\tvar morph = this.addMorphFrontOrBack(morph, true);\n\t\tmorph.setPosition(position);\n\t\treturn morph;\n\t},\n\n addMorphFront: function(morph) { return this.addMorphFrontOrBack(morph, true) },\n\n addMorphBack: function(morph) { return this.addMorphFrontOrBack(morph, false) },\n\n\taddMorphFrontOrBack: function(m, isFront) {\n\t\t// assertion seems to be really expensive?!\n\t\t// console.assert(m instanceof Morph, \"not an instance\");\n\t\tif (m.owner) {\n\t\t\tvar tfm = m.transformForNewOwner(this);\n\t\t\tm.owner.removeMorph(m); // KP: note not m.remove(), we don't want to stop stepping behavior\n\t\t\tm.setTransform(tfm); \n\t\t\t// FIXME transform is out of date\n\t\t\t// morph.setTransform(tfm); \n\t\t\t// m.layoutChanged(); \n\t\t} \n\t\tthis.layoutManager.beforeAddMorph(this, m, isFront);\n\t\tthis.insertMorph(m, isFront);\n\t\tthis.layoutManager.afterAddMorph(this, m, isFront);\n\t\tm.changed();\n\t\tm.layoutChanged();\n\t\tif (Config.ChromeSVGRenderingHotfix)\n\t\t\t(function() { m.transformChanged() }).delay(0);\n\t\tthis.layoutChanged();\n\t\treturn m;\n\t},\n\t\n\taddNonMorph: function(node) {\n\t\tif (node instanceof lively.data.Wrapper) throw new Error(\"add rawNode, not the wrapper itself\");\n\t\treturn this.rawNode.insertBefore(node, this.shape && this.shape.rawNode.nextSibling);\n\t},\n\n\taddWrapper: function(w) {\n\t\tif (w && w.rawNode) {\n\t\t\tthis.addNonMorph(w.rawNode);\n\t\t\treturn w;\n\t\t} else return null;\n\t},\n\n\taddPseudoMorph: function(pseudomorph) {\n\t\tif (pseudomorph instanceof Global.PseudoMorph) {\n\t\t\treturn this.addMorph(pseudomorph);\n\t\t} else \n\t\t\tthrow new Error(pseudomorph + \" is not a PseudoMorph\");\n\t},\n\n\tbringToFront: function() {\n\t\tif (!this.owner) return;\n\t\tif (this.owner.topSubmorph() === this) return;\n\t\tvar owner = this.owner;\n\t\tthis.remove();\n\t\towner.addMorphFront(this);\n\t},\n\n\tsetSubmorphs: function(morphs) {\n\t\tconsole.assert(morphs instanceof Array, \"not an array\");\n\t\tif (morphs != null) {\n\t\t\tthis.submorphs = [].concat(morphs);\n\t\t\tthis.submorphs.forEach(function (m) { \n\t\t\t\tif (m.owner) {\n\t\t\t\t\tvar tfm = m.transformForNewOwner(this);\n\t\t\t\t\tm.owner.removeMorph(m);\n\t\t\t\t\tm.setTransform(tfm); \n\t\t\t\t} \n\t\t\t\tthis.rawNode.appendChild(m.rawNode); \n\t\t\t\tm.owner = this;\n\t\t\t\tm.changed();\n\t\t\t\tm.layoutChanged();\n\t\t\t}, this);\n\t\t}\n\t\tthis.layoutChanged();\n\t},\n\n indexOfSubmorph: function(m) {\n\t\tif (this.submorphs.length == 0) return -1; // no submorphs at all\n\t\tfor (var i=0; i 0\n\t\tvar rot = this.getTransform().getRotation().toRadians(); \n\t\tif (this.scalePoint.x >= 0) return rot;\n\n\t\t// if scale.x is negative, then we have to decode the difference\n\t\tif (rot < 0) return rot + Math.PI;\n\t\treturn rot - Math.PI;\n\t},\n\n\tgetScale: function() {\n\t\treturn this.getTransform().getScale(); \n\t},\n\n\tmoveBy: function(delta) {\n\t\tthis.translateBy(delta);\n\t},\n\n\trotateBy: function(delta) {\n\t\tthis.setRotation(this.getRotation()+delta);\n\t},\n\n\tscaleBy: function(factor) {\n\t\t// Perform a linear scaling (based on x scale) by the given factor\n\t\tthis.setScale(this.getScale()*factor);\n\t},\n\n\tthrob: function() {\n\t\tthis.scaleBy(this.getScale() <= 1 ? 2 : 0.9);\n\t},\n\n\talign: function(p1, p2) {\n\t\treturn this.translateBy(p2.subPt(p1)); \n\t},\n\n centerAt: function(p) {\n\t\treturn this.align(this.bounds().center(), p); \n },\n\n\tgetCenter: function() { return this.bounds().center() },\n\tsetCenter: function(pos) {\n\t\tthis.setPosition(pos.subPt(this.shape.bounds().center()))\n\t},\n\n\n\tmoveOriginBy: function(delta) {\n\t\t// This method changes the origin (and thus center of rotation) without changing any other effect\n\t\t// To center a rectangular morph, use m.moveOriginBy(m.innerBounds().center())\n\t\tthis.origin = this.origin.addPt(delta);\n\t\tthis.shape.translateBy(delta.negated());\n\t\tthis.submorphs.forEach(function (ea) { ea.translateBy(delta.negated()); });\n\t},\n\n moveSubmorphs: function(evt) {\n var world = this.world();\n\t\n // Display height is returned incorrectly by many web browsers.\n // We use an absolute Y-value instead. \n var towardsPoint = pt(world.bounds().center().x, 350);\n\n switch (evt.getKeyCode()) {\n case Event.KEY_LEFT:\n this.submorphs.invoke('moveBy', pt(-10,0));\n evt.stop();\n return true;\n case Event.KEY_RIGHT:\n // forget the existing selection\n this.submorphs.invoke('moveBy', pt(10, 0));\n evt.stop();\n return true;\n case Event.KEY_UP:\n this.submorphs.invoke('moveBy', pt(0, -10));\n evt.stop();\n return true;\n case Event.KEY_DOWN:\n this.submorphs.invoke('moveBy', pt(0, 10));\n evt.stop();\n return true;\n\n // Experimental radial scrolling feature\n // Read the comments near method Morph.moveRadially()\n case Event.KEY_PAGEUP:\n case 65: // The \"A\" key\n\t world.submorphs.invoke('moveRadially', towardsPoint, 10);\n this.moveRadially(towardsPoint, 10); \n evt.stop();\n return true;\n case Event.KEY_PAGEDOWN:\n case 90: // The \"Z\" key\n\t world.submorphs.invoke('moveRadially', towardsPoint, -10);\n this.moveRadially(towardsPoint, -10); \n evt.stop();\n return true;\n }\n \n return false;\n },\n\n transformSubmorphs: function(evt) {\n\t\tvar fun = null;\n\t\tswitch (evt.getKeyChar()) {\n\t\t\tcase '>':\n\t\t\t\tfun = function(m) { m.setScale(m.getScale()*1.1) };\n\t\t\t\tbreak;\n\t\t\tcase '<':\n\t\t\t\tfun = function(m) { m.setScale(m.getScale()/1.1) };\n\t\t\t\tbreak;\n\t\t\tcase ']':\n\t\t\t\tfun = function(m) { m.setRotation(m.getRotation() + 2*Math.PI/16) };\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\tfun = function(m) { m.setRotation(m.getRotation() - 2*Math.PI/16) };\n\t\t\t\tbreak;\n\t\t}\n\t\tif (fun) {\n\t\t\tthis.submorphs.forEach(fun);\n\t\t\tevt.stop();\n\t\t\treturn true;\n\t\t} else return false;\n\t},\n\n\tmoveForwardBy: function(amount) {\n\t\tvar nose = pt(1,0)\n\t\tvar dir = nose.matrixTransformDirection(this.getTransform()).normalized();\n\t\tthis.moveBy(dir.scaleBy(amount))\n\t},\n\n\t// TODO: There is a bug in Safari (the matrix multiplication is the wrong way around)\n\t// that is not taken into account here....\n\trotateAround: function(angle, center) {\n\t\tvar tfm = new lively.scene.Similitude().toMatrix();\n\t\ttfm = tfm.translate(center.x, center.y);\n\t\ttfm = tfm.rotate(angle)\t\t\n\t\ttfm = tfm.translate( -center.x, -center.y);\t\n\t\tvar oldTfm = this.getTransform().toMatrix();\n\t\tvar newTfm = oldTfm.multiply(tfm);\n\t\tthis.setTransform(new lively.scene.Similitude(newTfm));\n\t},\n\n\tturnBy: function(angle) {\n\t\tthis.rotateAround(angle, this.shape.bounds().center())\t\t\n\t},\n\n\t// Experimental radial \"black hole\" scrolling feature: When\n // an object comes close enough to the \"event horizon\" (specified\n // by 'towardsPoint'), the object is zoomed into the black hole.\n // Negative 'howMuch' values are used to \"collapse\" the display, \n // while positive values expand and restore the display back to its \n // original state. For further information, see \n // Sun Labs Technical Report SMLI TR-99-74, March 1999.\n\tmoveRadially: function(towardsPoint, howMuch) {\n\t\tvar position = this.getPosition();\n\t\tvar relativePt = position.subPt(towardsPoint);\n\t\tvar distance = towardsPoint.dist(position);\n\t\tif (!this.inBlackHole) this.inBlackHole = 0;\n\n\t\t// The object disappears entirely when it is less than 5 pixels away\n\t\t// The 'inBlackHole' counter keeps track of how many levels deep\n\t\t// the object is in the black hole, allowing the display to be\n\t\t// restored correctly.\n\t\tif (distance <= 5) {\n\t\t\tif (howMuch < 0) {\n\t\t\t\tthis.inBlackHole++;\n\t\t\t\tthis.setScale(0);\n\t\t\t} else {\n\t\t\t\tthis.inBlackHole--; \n\t\t\t}\n\t\t} \n\n\t\tif (this.inBlackHole == 0) {\n\t\t\t// Start shrinking the object when it is closer than 200 pixels away\n\t\t\tif (distance > 5 && distance < 200) this.setScale(distance/200);\n\t\t\telse if (distance >= 200 && this.getScale() != 1) this.setScale(1);\n\n\t\t\t// Calculate new location for the object\n\t\t\tvar theta = Math.atan2(relativePt.y, relativePt.x);\n\t\t\tvar newDistance = distance + howMuch;\n\t\t\tif (newDistance < 0) newDistance = 1; \n\t\t\tvar newX = newDistance * Math.cos(theta);\n\t\t\tvar newY = newDistance * Math.sin(theta);\n\t\t\tthis.setPosition(towardsPoint.addPt(pt(newX,newY)));\n\t\t}\n\t},\n},\n'animations', {\n\t// Animated moves for, eg, window collapse/expand\n\tanimatedInterpolateTo: function(destination, nSteps, msPer, callBackFn, finalScale) {\n\t\tif (nSteps <= 0) return;\n\t\tvar loc = this.position();\n\t\tvar delta = destination.subPt(loc).scaleBy(1 / nSteps);\n\t\tvar scaleDelta = finalScale ? (this.getScale() - finalScale) / nSteps : 0;\n\t\t// console.log(\"scaleDelta = \" + scaleDelta);\n\t\tvar path = [];\n\t\tfor (var i = 1; i<=nSteps; i++) { loc = loc.addPt(delta); path.unshift(loc); }\n\t\tthis.animatedFollowPath(path, msPer, callBackFn, scaleDelta);\n },\n\n animatedFollowPath: function(path, msPer, callBackFn, scaleDelta) {\n\t\tvar spec = {path: path.clone(), callBack: callBackFn, scaleDelta: scaleDelta};\n\t\tspec.action = this.startStepping(msPer, 'animatedPathStep', spec);\t\n },\n\n\tanimatedPathStep: function(spec, scaleDelta) {\n\t\tif (spec.path.length >= 1){\n\t\t\tthis.setScale(this.getScale()-spec.scaleDelta);\n\t\t\tthis.setPosition(spec.path.pop());\n\t\t}\n\t\tif (spec.path.length >= 1) return\n\t\t//spec.action.stop(this.world()); //JD: out\n\t\t//JD: delte script out of activeScripts, neede for deserialization\n\t\tthis.stopSteppingScriptNamedAndRemoveFromSubmorphs('animatedPathStep');\n\t\tspec.callBack.call(this);\n\t},\n\n},\n'particle behavior',{ \n\n\tbounceInOwnerBounds: function() {\n\t\tthis.bounceInBounds(this.owner.innerBounds());\n\t},\n\t\n\tbounceInBounds: function(ob) {\n\t\t// typcially ob = this.owner.innerBounds()\n\t\t// Bounce by reversing the component of velocity that put us out of bounds\n\t\tif (!this.velocity) return; // Can't bounce without a velocity vector\n\n\t\t// We take care to only reverse the direction if it's wrong,\n\t\t//\tbut we move in any case, since we might be deeply out of bounds\n\t\tvar b = this.bounds();\n\t\tif (b.x < ob.x) {\n\t\t\tif (this.velocity.x < 0) this.velocity = this.velocity.scaleByPt(pt(-1, 1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.maxX() > ob.maxX()) {\n\t\t\tif (this.velocity.x > 0) this.velocity = this.velocity.scaleByPt(pt(-1, 1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.y < ob.y) {\n\t\t\tif (this.velocity.y < 0) this.velocity = this.velocity.scaleByPt(pt(1, -1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.maxY() > ob.maxY()) {\n\t\t\tif (this.velocity.y > 0) this.velocity = this.velocity.scaleByPt(pt(1, -1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t},\n\t\n\tstepByVelocities: function() {\n\t\tif (this.velocity) this.moveBy(this.velocity);\n\t\tif (this.angularVelocity) this.rotateBy(this.angularVelocity);\n\t},\n\t\n\tstepAndBounce: function() { // convenience for tile scripting\n\t\tthis.stepByVelocities();\n\t\tthis.bounceInOwnerBounds();\n\t},\n\t\n},\n'balloon help', {\n\n\tgetHelpText: Functions.Null, // override to supply help text\n\n\tshowHelp: function(evt) {\n\n\t\tif (this.suppressBalloonHelp) return false;\n\t\tif (this.owner instanceof HandMorph) return false;\n\t\tvar helpText = this.getHelpText();\n\t\tif (!helpText) return false;\n\n\t\t// Create only one help balloon at a time\n\t\tif (this.helpBalloonMorph && !this.helpBalloonMorph.getPosition().eqPt(evt.point())) {\n\t\t\tthis.helpBalloonMorph.setPosition(this.window().localize(evt.point()));\n\t\t\treturn false;\n\t\t} else {\n\t\t\tvar width = Math.min(helpText.length * 20, 260); // some estimate of width.\n\t\t\tvar window = this.window();\n\t\t\tvar pos = window.localize(evt.point());\n\t\t\tthis.helpBalloonMorph = new TextMorph(pos.addXY(10, 10).extent(pt(width, 20)), helpText);\n\t\t\twindow.addMorph(this.helpBalloonMorph.beHelpBalloonFor(this));\n\t\t\treturn true;\n\t\t}\n\t},\n\n\thideHelp: function() {\n\t\tif (!this.helpBalloonMorph) \n\t\t\treturn;\n\t\tthis.helpBalloonMorph.remove();\n\t\tdelete this.helpBalloonMorph;\n\t},\n\n},\n'mouse events', {\n\n\t// KP: equivalent of the DOM capture phase\n\t// KP: hasFocus is true if the receiver is the hands's focus (?)\n\tcaptureMouseEvent: function Morph$captureMouseEvent(evt, hasFocus) {\n\t\t// Dispatch this event to the frontmost receptive morph that contains it\n\t\t// Note boolean return for event consumption has not been QA'd\n\t\t// if we're using the fisheye... \n\t\tif (this.fishEye) {\n\t\t\t// get the distance to the middle of the morph and check if we're \n\t\t\t// close enough to start the fisheye\n\t\t\tvar size = Math.max(this.bounds().width, this.bounds().height);\n\n\t\t\tvar dist = evt.mousePoint.dist(this.bounds().center()) / this.fisheyeProximity;\n\t\t\tif (dist <= size) {\n\t\t\t\t// the fisheye factor is between 1..fisheyeGrowth\n\t\t\t\tthis.setFisheyeScale(1 + this.fisheyeGrowth * Math.abs(dist/size - 1));\n\t\t\t} else {\n\t\t\t\t// just a precaution to make sure fisheye scaling isn't \n\t\t\t\t// affecting its surrounding any more\n\t\t\t\tthis.setFisheyeScale(1.0);\n\t\t\t}\n\t\t}\n\t\tif (hasFocus) return this.mouseHandler.handleMouseEvent(evt, this);\n\n\t\tif (!evt.priorPoint || !this.fullContainsWorldPoint(evt.priorPoint)) return false;\n\n\t\tif (this.hasSubmorphs()) {\n\t\t\t// If any submorph handles it (ie returns true), then return\n\t\t\tfor (var i = this.submorphs.length - 1; i >= 0; i--) {\n\t\t\t\tif (this.submorphs[i].captureMouseEvent(evt, false)) return true;\n\t\t\t}\n\t\t}\n\t\tif (this.mouseHandler == null)\n\t\t\treturn false;\n\n\t\tif (!evt.priorPoint || !this.shape.containsPoint(this.localize(evt.priorPoint))) \n\t\t\treturn false;\n\n\n\t\treturn this.mouseHandler.handleMouseEvent(evt, this); \n\t},\n\n\n\tareEventsIgnored: function() {\n\t\treturn this.getTrait(\"pointer-events\") == \"none\";\n\t},\n\n\tignoreEvents: function() { // will not respond nor get focus\n\t\tthis.mouseHandler = null;\n\t\tthis.setTrait(\"pointer-events\", \"none\");\n\t\treturn this;\n\t},\n\n\tenableEvents: function() {\n\t\tthis.mouseHandler = MouseHandlerForDragging.prototype;\n\t\tthis.removeTrait(\"pointer-events\");\n\n\t\treturn this;\n\t},\n\n\trelayMouseEvents: function(target, eventSpec) {\n\t\tthis.mouseHandler = new MouseHandlerForRelay(target, eventSpec); \n\t},\n\n\thandlesMouseDown: function(evt) {\n\t\tif (this.mouseHandler == null || evt.isCommandKey()) return false;\t//default behavior\n\t\treturn this.mouseHandler.handlesMouseDown(); \n\t},\n\n\tonMouseDown: function(evt) { \n\t\tthis.hideHelp();\n\t}, //default behavior\n\n\tonMouseMove: function(evt, hasFocus) { //default behavior\n\t\tif (evt.mouseButtonPressed && this==evt.hand.mouseFocus && this.owner && this.owner.openForDragAndDrop) { \n\t\t\tthis.moveBy(evt.mousePoint.subPt(evt.priorPoint));\n\t\t} // else this.checkForControlPointNear(evt);\n\t\tif (!evt.mouseButtonPressed && !this.hasHandles()) this.checkForControlPointNear(evt);\n\t},\n\n\tonMouseUp: function(evt) { }, //default behavior\n\n\tconsiderShowHelp: function(oldEvt) {\n\t\t// if the mouse has not moved reasonably\n\t\tvar hand = oldEvt.hand;\n\t\tif (!hand) return; // this is not an active world so it doesn't have a hand\n\t\telse if (hand.getPosition().dist(oldEvt.mousePoint) < 10)\n\t\tthis.showHelp(oldEvt);\n\t},\n\n\tdelayShowHelp: function(evt) {\n\t\tvar scheduledHelp = new SchedulableAction(this, \"considerShowHelp\", evt, 0);\n\t\tif (this.world())\n\t\t\tthis.world().scheduleForLater(scheduledHelp, Config.ballonHelpDelay || 1000, false);\n\t},\n\n\tonMouseOver: function(evt) {\n\t\tthis.delayShowHelp(evt);\n\t}, \n\n\tonMouseOut: function(evt) { \n\t\tthis.hideHelp();\n\t}, \n\n\tonMouseWheel: function(evt) {\n\t\tif (!this.world()) return false;\n\t\treturn this.world().onMouseWheel(evt);\n\t},\n\n\ttakesKeyboardFocus: Functions.False,\n\n\tsetHasKeyboardFocus: Functions.False, // no matter what, say no\n\n\trequestKeyboardFocus: function(hand) {\n\t\tif (!hand) return;\n\t\tif (this.takesKeyboardFocus()) {\n\t\t\tif (this.setHasKeyboardFocus(true)) {\n\t\t\t\thand.setKeyboardFocus(this);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\trelinquishKeyboardFocus: function(hand) {\n\t\thand.setKeyboardFocus(null);\n\t\treturn this.setHasKeyboardFocus(false); \n\t},\n\n\tonFocus: function(hand) {\n\t\tthis.addFocusHalo();\n\t},\n\n\tonBlur: function(hand) {\n\t\tthis.removeFocusHalo();\n\t},\n\n\tremoveFocusHalo: function() {\n\t\tif (!this.focusHalo) return false;\n\t\t//this.focusHalo.removeRawNode();\n\t\tthis.focusHalo.remove();\n\t\tthis.focusHalo = null;\n\t\treturn true;\n\t},\n\n\tfocusHaloInset: 1,\n\n\tfocusStyle: {\n\t\tfill: null, \n\t\tborderColor: Color.blue,\n\t\tstrokeOpacity: 0.3\n\t},\n\n\tadjustFocusHalo: function() {\n\t\tthis.focusHalo.setBounds(this.localBorderBounds().expandBy(this.focusHaloInset));\n\t},\n\n\taddFocusHalo: function() {\n\t\tif (this.focusHalo || this.focusHaloBorderWidth <= 0) return false;\n\t\tthis.focusHalo = Morph.makeRectangle(this.localBorderBounds().expandBy(this.focusHaloInset));\n\t\tthis.focusHalo.name = \"FocusHalo\";\n\t\tthis.focusHalo.isEpimorph = true; // Do this before adding the halo\n\t\tthis.addMorph(this.focusHalo);\n\t\t// old\n\t\tthis.focusHalo.applyStyle(this.focusStyle);\n\t\t// new\n\t\tthis.focusHalo.linkToStyles([\"focusHalo\"]);\n\t\tthis.focusHalo.setBorderWidth(this.focusHaloBorderWidth);\n\t\tthis.focusHalo.setLineJoin(lively.scene.LineJoins.Round);\n\t\tthis.focusHalo.ignoreEvents();\n\t\treturn true;\n\t},\n\n},\n'handles', {\n\tcheckForControlPointNear: function(evt) {\n\t\tif (this.suppressHandles) return false; // disabled\n\t\tif (this.owner == null) return false; // cant reshape the world\n\t\tif (this.hasHandles()) return false; // handles already on - no rollovers\n\t\tvar partName = this.shape.partNameNear(this.localize(evt.point()));\n\t\tif (partName == null) return false;\n\n\t\tvar loc = this.shape.partPosition(partName);\n\t\tvar handle = this.makeHandle(loc, partName, evt);\n\t\tif (!handle) return false; // makeHandle variants may return null\n\n\t\tthis.addMorph(handle); \n\t\thandle.showHelp(evt);\n\t\tif (evt.hand.mouseFocus instanceof HandleMorph) evt.hand.mouseFocus.remove();\n\t\tevt.hand.setMouseFocus(handle);\n\t\treturn true; \n\t},\n\t\n\taddAllHandles: function(evt) {\n\t\tif (this.suppressHandles) return false; // disabled\n\t\tif (this.owner == null) return false; // can't reshape the world\n\t\tvar partNames = this.shape.allPartNames(); // Array of name\n\t\tfor (var i=0; i= 0 ? lively.scene.Rectangle : lively.scene.Ellipse;\n\t\treturn new HandleMorph(position, handleShape, evt.hand, this, partName);\n\t},\n},\n'grabbing and dragging', {\n copySubmorphsOnGrab: false, // acts as a palette if true. \n\tsuppressGrabbing: false,\n\n // May be overridden to preempt (by returning null) the default action of grabbing me\n // or to otherwise prepare for being grabbed or find a parent to grab instead\n okToBeGrabbedBy: function(evt) {\n\t\tif (this.suppressGrabbing)\n\t\t\treturn null;\n\t\treturn this; \n },\n\n\tgrid: function() {return Config.SnapGrid || pt(10,10)},\n\n\tisSnappingToGrid: function() { return Config.isSnappingToGrid},\n\n\tsnapToGrid: function(pos) {\n\t\tvar grid = this.grid();\n\t\treturn pt(pos.x - (pos.x % grid.x), pos.y - (pos.y % grid.y))\n\t},\n\n\tdragMe: function(evt) {\n\t\tvar offset = this.getPosition().subPt(this.owner.localize(evt.point()));\n\t\tvar self = this;\n\t\tvar mouseRelay= {\n\t\t\tcaptureMouseEvent: function(e) { \n\t\t\t\tif (e.type == \"MouseMove\") {\n\t\t\t\t\tvar pos = this.owner.localize(e.hand.getPosition()).addPt(offset)\n\t\t\t\t\tif (self.isSnappingToGrid()) {\n\t\t\t\t\t\tthis.setPosition(this.snapToGrid(pos));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.setPosition(pos);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tif (e.type == \"MouseDown\" || e.type == \"MouseUp\") e.hand.setMouseFocus(null); \n\t\t\t}.bind(this),\n\t\t};\n\t\tevt.hand.setMouseFocus(mouseRelay);\n\t},\n\n showAsGrabbed: function(grabbedMorph) {\n\t\t// At this time, there are three separate hand-effects:\n\t\t// 1. applyDropShadowFilter, if it works, will cause the graphics engine to put a nice\n\t\t//\t gaussian blurred drop-shadow on morphs that are grabbed by the hand\n\t\t// 2. showGrabHalo will cause a halo object to be put at the end of the hand's\n\t\t//\t submorph list for every grabbed morph (has property 'morphTrackedByHalo')\n\t\t// 3. useShadowMorphs will cause a shadowCopy of each grabbed morph to be put\n\t\t//\t at the end of the hand's submorph list (has property 'isHandMorphShadow')\n\t\t// So, if everything is working right, the hand's submorph list looks like:\n\t\t//\tfront -> Mc, Mb, Ma, Ha, Sa, Hb, Sb, Hc, Sc <- back [note front is last ;-]\n\t\t// Where M's are grabbed morphs, H's are halos if any, and S's are shadows if any\n\n if (this.applyDropShadowFilter) grabbedMorph.applyFilter(this.dropShadowFilter); \n\n\t\tif (Config.showGrabHalo) {\n\t\t var bounds = grabbedMorph.bounds(true);\n\t\t var halo = this.addMorphBack(Morph.makeRectangle(bounds).applyStyle({fill: null, borderWidth: 0.5 }));\n\t\t halo.morphTrackedByHalo = grabbedMorph;\n\t\t halo.shape.setStrokeDashArray(String([3,2]));\n\t\t halo.setLineJoin(lively.scene.LineJoins.Round);\n\t\t halo.ignoreEvents();\n\n\t\t var idLabel = new TextMorph(pt(20,10).extentAsRectangle(), String(grabbedMorph.id())).beLabel();\n\t\t idLabel.applyStyle(this.grabHaloLabelStyle);\n\t\t halo.addMorph(idLabel);\n\t\t idLabel.align(idLabel.bounds().bottomLeft(), halo.innerBounds().topRight());\n\t \n\t\t var pos = grabbedMorph.getPosition();\n\t\t var posLabel = new TextMorph(pt(20, 10).extentAsRectangle(), \"\").beLabel();\n\t\t posLabel.applyStyle(this.grabHaloLabelStyle);\n\t\t halo.positionLabel = halo.addMorph(posLabel);\n\n\t\t\tthis.updateGrabHalo();\n\t\t}\n if (this.useShadowMorphs) {\n\t\t\tvar shadow = grabbedMorph.shadowCopy();\n\t\t\tshadow.isHandMorphShadow = true;\n\t\t\tthis.addMorphBack(shadow);\n\t\t\tshadow.moveBy(pt(8, 8));\n\t\t}\n },\n\n\tshowAsUngrabbed: function (grabbedMorph) {\n\t\tif (this.applyDropShadowFilter) grabbedMorph.applyFilter(null);\n\t\tgrabbedMorph.withAllSubmorphsDo(function() {\n\t\t\tif (this.shadowConnection) {\n\t\t\t\tthis.shadowConnection.disconnect();\n\t\t\t\tdelete this.shadowConnection;\n\t\t\t}\n\t\t})\n },\n \n alignToGrid: function() {\n if(!Config.showGrabHalo) return;\n var grid = function(a) {\n return a - (a % (Config.alignToGridSpace || 5))\n\t\t};\n\t\tthis.submorphs.forEach(function(halo) {\n\t\t if (halo.morphTrackedByHalo) { // this is a tracking halo\n\t \tif (!halo.orgSubmorphPosition)\n\t\t\t halo.orgSubmorphPosition = halo.morphTrackedByHalo.getPosition();\n\t\t\tvar oldPos = this.worldPoint(halo.orgSubmorphPosition);\n\t\t\tvar gridPos = pt(grid(oldPos.x), grid(oldPos.y));\n\t\t\thalo.morphTrackedByHalo.setPosition(this.localize(gridPos));\n\t\t }\n\t\t}.bind(this));\n },\n\n updateGrabHalo: function Morph$updateGrabHalo() {\n\t\t// Note there may be several grabHalos, and drop shadows as well\n\t\t// See the comment in showAsGrabbed \n\t\tthis.submorphs.forEach(function(halo) {\n\t\t if (halo.morphTrackedByHalo) { // this is a tracking halo\n\t\t\t\thalo.setBounds(halo.morphTrackedByHalo.bounds(true).expandBy(3));\n\t\t\t\tif (halo.positionLabel) {\n\t\t\t\t var pos = this.worldPoint(halo.morphTrackedByHalo.getPosition());\n\t\t\t\t var posLabel = halo.positionLabel;\n\t\t\t\t posLabel.setTextString(pos.x.toFixed(1) + \",\" + pos.y.toFixed(1));\n\t\t\t\t posLabel.align(posLabel.bounds().bottomCenter(), halo.innerBounds().topLeft());\n\t\t\t\t}\n\t\t }\n\t\t}.bind(this));\n },\n\n\tgrabMorph: function(grabbedMorph, evt) { \n\t\tif (evt.isShiftDown() && (evt.isAltDown() || evt.isCommandKey())) {\n\t\t\tgrabbedMorph.dragMe(evt);\n\t\t\treturn;\n\t\t}\n\t\tif (evt.isShiftDown() || (grabbedMorph.owner && grabbedMorph.owner.copySubmorphsOnGrab == true)) {\n\t\t\tif (!grabbedMorph.okToDuplicate()) return;\n\t\t\tgrabbedMorph.copyToHand(this);\n\t\t\treturn;\n\t\t}\n\t\tif (evt.isCommandKey() || evt.isRightMouseButtonDown() || evt.isMiddleMouseButtonDown()) {\n\t\t\tgrabbedMorph.showMorphMenu(evt);\n\t\t\treturn;\n\t\t}\n\t\t// Give grabbed morph a chance to, eg, spawn a copy or other referent\n\t\tgrabbedMorph = grabbedMorph.okToBeGrabbedBy(evt);\n\t\tif (!grabbedMorph) return;\n\n\t\tif (grabbedMorph.owner && !grabbedMorph.owner.openForDragAndDrop) return;\n\n\t\tif (this.keyboardFocus && grabbedMorph !== this.keyboardFocus) {\n\t\t\tthis.keyboardFocus.relinquishKeyboardFocus(this);\n\t\t}\n\t\t// console.log('grabbing %s', grabbedMorph);\n\t\t// Save info for cancelling grab or drop [also need indexInOwner?]\n\t\t// But for now we simply drop on world, so this isn't needed\n\t\tthis.grabInfo = [grabbedMorph.owner, grabbedMorph.position()];\n\t\tif (this.logDnD) console.log('%s grabbing %s', this, grabbedMorph);\n\t\tthis.addMorphAsGrabbed(grabbedMorph);\n\t\t// grabbedMorph.updateOwner(); \n\t\tthis.changed(); //for drop shadow\n\t},\n \n addMorphAsGrabbed: function(grabbedMorph) { \n this.addMorph(grabbedMorph);\n\t\tthis.showAsGrabbed(grabbedMorph);\n },\n \n dropMorphsOn: function(receiver) {\n\t\tif (receiver !== this.world()) \n\t\t\tthis.unbundleCarriedSelection();\n\t\tif (this.logDnD) \n\t\t\tconsole.log(\"%s dropping %s on %s\", this, this.topSubmorph(), receiver);\n\t\tthis.carriedMorphsDo( function(m) {\n\t\t\tm.dropMeOnMorph(receiver);\n\t\t\tthis.showAsUngrabbed(m);\n\t\t});\n\t\tthis.shadowMorphsDo( function(m) { m.stopAllStepping(); });\n\t\tthis.removeAllMorphs() // remove any shadows or halos\n },\n\n carriedMorphsDo: function(func) {\n\t\t// Evaluate func for only those morphs that are being carried,\n\t\t// as opposed to, eg, halos or shadows\n\t\tthis.submorphs.clone().reverse().forEach(function(m) {\n\t\t if (!m.morphTrackedByHalo && !m.isHandMorphShadow) func.call(this, m);\n\t\t}.bind(this));\n },\n\n shadowMorphsDo: function(func) { \n\t\t// Evaluate func for only those morphs that are shadows,\n\t\tthis.submorphs.clone().reverse().forEach(function(m) {\n\t\t if (m.isHandMorphShadow) func.call(this, m);\n\t\t}.bind(this));\n },\n\n unbundleCarriedSelection: function() {\n // Unpack the selected morphs from a selection prior to drop or jump to other world\n if (!this.hasSubmorphs() || !(this.topSubmorph() instanceof SelectionMorph)) return;\n var selection = this.topSubmorph();\n for (var i=0; i>toggleDnD\");\n\t\tthis.openForDragAndDrop = !this.openForDragAndDrop;\n\t},\n\n\topenDnD: function(loc) {\n\t\tthis.openForDragAndDrop = true;\n\t},\n\n\tcloseDnD: function(loc) {\n\t\t// console.log(this + \">>closeDnD\");\n\t\tthis.openForDragAndDrop = false;\n\t},\n\n closeAllToDnD: function(loc) {\n // console.log(this + \">>closeAllDnD\");\n // Close this and all submorphs to drag and drop\n this.closeDnD(); \n // make this recursive to give children a chance to interrupt...\n this.submorphs.forEach( function(ea) { ea.closeAllToDnD(); });\n },\n\n\topenAllToDnD: function() {\n\t\t// Open this and all submorphs to drag and drop\n\t\tthis.withAllSubmorphsDo( function() { this.openDnD(); });\n\t},\n\n\tdropMeOnMorph: function(receiver) {\n\t\treceiver.addMorph(this); // this removes me from hand\n\t},\n\n\tpickMeUp: function(evt) {\n\t\tvar offset = evt.hand.getPosition().subPt(evt.point());\n\t\tthis.moveBy(offset);\n\t\tevt.hand.addMorphAsGrabbed(this);\n\t},\n},\n'morph menu', {\n\n\teditMenuItems: function(evt) { \n\t\treturn []; // Overridden by, eg, TextMorph\n\t},\n\n\tshowMorphMenu: function(evt, optMenu) {\n\t\tif (evt.hand.lastMorphMenu && evt.hand.lastMorphMenu.owner)\n\t\t\tevt.hand.lastMorphMenu.remove(); // cleanup old open menus\n\t\tvar world = this.world(),\n\t\t\tmenu = optMenu || this.morphMenu(evt),\n\t\t\tmenuCaption = this.toString(),\n\t\t\tcaptionClickAction = world.prompt.bind(world).curry(\n\t\t\t\t'edit name',\n\t\t\t\tfunction(newName) {\n\t\t\t\t\tif (!newName) { alert('Invalid name ' + newName); return }\n\t\t\t\t\talertOK(this + ' renamed to ' + newName);\n\t\t\t\t\tthis.setName(newName);\n\t\t\t\t}.bind(this),\n\t\t\t\tthis.getName());\n\t\tmenu.openIn(world, evt.point(), false, menuCaption, captionClickAction); \n\t\tevt.hand.lastMorphMenu = menu;\n\t},\n\n\tmorphMenuBasicItems: function(evt) {\n\t\tvar items = [\n\t\t\t[\"remove\", this.remove],\n\t\t\t[\"drill\", this.showOwnerChain.curry(evt)],\n\t\t\t[\"grab\", this.pickMeUp.curry(evt)],\n\t\t\t[\"drag\", this.dragMe.curry(evt)],\n\t\t\t[\"edit style\", function() { new StylePanel(this).open()}],\n\t\t\t[((this.hasHandles()) ? \"hide\" : \"show\") + \" all handles\", function(evt) {\n\t\t\t\tif (this.hasHandles()) this.removeAllHandlesExcept(null);\n\t\t\t\t\telse this.addAllHandles(evt) }.bind(this) ],\t\t\n\t\t\t[\"inspect\", function(evt) { lively.Tools.inspect(this) }],\n\t\t\t[\"show class in browser\", function(evt) { var browser = new SimpleBrowser(this);\n\t\t\t\t// browser.openIn(this.world(), evt.point());\n\t\t\t\tbrowser.open();\n\t\t\t\tbrowser. selectedClassName = this.getType();\n\t\t\t}]\n\t\t];\n\t\tif (this.okToDuplicate())\n\t\t\titems.unshift([\"duplicate\", this.copyToHand.curry(evt.hand)]);\n\n\t\tif (this.shape instanceof lively.scene.Polyline || this.shape instanceof lively.scene.Polygon)\n\t\t\titems.push( [\"copy to curve\", this.makeCurve]);\n\n\t\tif (this.getModel() instanceof SyntheticModel)\n\t\t\titems.push( [\"show Model dump\", this.addModelInspector.curry(this)]);\n\t\treturn items\n\t},\n\n\tmorphMenu: function(evt) { \n\t\tvar menu = new MenuMorph(this.morphMenuBasicItems(evt), this);\n\t\tmenu.addLine();\n\t\tmenu.addItem([\"world...\", function() {this.world().showMorphMenu(evt)}.bind(this)]);\n\t\tmenu.addLine();\n\t\tmenu.addItems(this.subMenuItems(evt));\n\t\treturn menu;\n\t},\n\tsubMenuLayoutItems: function() {\n\t\tvar morph = this;\n\t\tfunction setLayouter(klass) {\n\t\t\tmorph.layoutManager = new klass();\n\t\t\tmorph.relayout();\n\t\t};\n\t\treturn [\n\t\t\t[\"default layout\", function() { setLayouter(LayoutManager) }],\n\t\t\t[\"horizontal layout\", function() { setLayouter(HorizontalLayout) }],\n\t\t\t[\"vertical layout\", function() { setLayouter(VerticalLayout) }],\n\t\t];\t\n\t},\n\n\n\tsubMenuPropertiesItems: function(evt) {\n\t\treturn [\n\t\t\t[\"edit name...\", function() { this.world().prompt('edit name', function(input) { this.setName(input) }.bind(this), this.getName()) }],\n\t\t\t[\"reset rotation\", this.setRotation.curry(0)],\n\t\t\t[\"reset scaling\", this.setScale.curry(1)],\n\t\t\t[\"toggle fullscreen\", function() { this.isInFullScreen() ? this.leaveFullScreen() : this.enterFullScreen() }.bind(this)],\n\t\t\t[((this.suppressGrabbing) ? \"[] grabbing\" : \"[X] grabbing\"), function(){this.suppressGrabbing = !this.suppressGrabbing}.bind(this)],\n\t\t\t[((this.suppressHandles) ? \"[] handles\" : \"[X] handles\"), function(){this.suppressHandles = !this.suppressHandles}.bind(this)],\n\t\t\t[((this.openForDragAndDrop) ? \"[X] accepts Drops\" : \"[] accepts Drops\"), function(){this.openForDragAndDrop = !this.openForDragAndDrop}.bind(this)],\n\t\t\t[\"ignore events\", this.ignoreEvents.bind(this)],\n\t\t\t[\"color chooser (gray)\", function() { \n\t\t\t\tvar colorChooser = new ColorChooserWidget(this), window = colorChooser.buildView();\n\t\t\t\tthis.world().addFramedMorph(pane, \"gray\", this.world().positionForNewMorph(pane))}]\n\t\t]\n\t},\n\t\n\tsubMenuWindowItems: function(evt) {\n\t\treturn [\n\t\t\t[\"put me in a window\", this.putMeInAWindow.curry(this.position())], \n\t\t\t[\"put me in a tab\", this.putMeInATab.curry(this.position())],\n\t\t\t[\"put me in the open\", this.putMeInTheWorld.curry(this.position())],\n\t\t\t[\"show Lively markup\", this.addSvgInspector.curry(this)],\n\t\t\t[\"package\", function(evt) { // FIXME insert package morph in exactly the same position?\n\t\t\t\tnew PackageMorph(this).openIn(this.world(), evt.point()); this.remove(); } ],\n\t\t\t[\"publish packaged ...\", function() { this.world().prompt('publish as (.xhtml)', this.exportLinkedFile.bind(this)); }] \n\t\t]\n\t},\n\n\tsubMenuStyleItems: function(evt) {\n\t\treturn new StyleEditor().styleEditorMenuItems(this, evt);\n\t},\n\n\tsubMenuItems: function(evt) {\n\t\treturn [\n\t\t\t['Style', this.subMenuStyleItems(evt)],\n\t\t\t['Layout', this.subMenuLayoutItems(evt)],\n\t\t\t['Properties', this.subMenuPropertiesItems(evt)],\n\t\t\t['Window and World', this.subMenuWindowItems(evt)]\n\t\t]\n\t},\n\n showPieMenu: function(evt) {\n \tvar menu, targetMorph = this;\n\t\tvar items = [\n\t\t\t['undo (~)', function(evt) { PieMenuMorph.doUndo(); }],\n\t\t\t['duplicate (o-->o)', function(evt) {\n\t\t\t\tevt.hand.setPosition(menu.mouseDownPoint);\n\t\t\t\tmenu.targetMorph.copyToHand(evt.hand);\n\t\t\t\tvar theCopy = evt.hand.submorphs[0];\n\t\t\t\tPieMenuMorph.setUndo(function() { theCopy.remove(); }); // Why doesn't this work??\n\t\t\t\t}],\n\t\t\t['move (o-->)', function(evt) {\n\t\t\t\tvar oldPos = targetMorph.getPosition();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setPosition(oldPos); });\n\t\t\t\tevt.hand.setPosition(menu.mouseDownPoint);\n\t\t\t\tevt.hand.addMorph(menu.targetMorph);\n\t\t\t\tif (menu.targetMorph instanceof SelectionMorph) // Fixme: This should be in SelectionMorph\n\t\t\t\t\tmenu.targetMorph.selectedMorphs.forEach( function(m) { evt.hand.addMorph(m); });\n\t\t\t\t}],\n\t\t\t['scale (o < O)', function(evt) {\n\t\t\t\tvar oldScale = targetMorph.getScale();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setScale(oldScale); });\n\t\t\t\tmenu.addHandleTo(targetMorph, evt, 'scale');\n\t\t\t\t}],\n\t\t\t[((targetMorph.hasHandles()) ? \"hide\" : \"show\") + \" all handles ([])\", function(evt) {\n\t\t\t\tif (targetMorph.hasHandles()) targetMorph.removeAllHandlesExcept(null);\n\t\t\t\t\telse targetMorph.addAllHandles(evt) }],\n\t\t\t['delete (X)', function(evt) {\n\t\t\t\tvar oldOwner = targetMorph.owner;\n\t\t\t\tPieMenuMorph.setUndo(function() { oldOwner.addMorph(targetMorph); });\n\t\t\t\ttargetMorph.remove();\n\t\t\t\t}],\n\t\t\t['edit style (<>)', function() { new StylePanel(this).open()}],\n\t\t\t['rotate (G)', function(evt) {\n\t\t\t\tvar oldRotation = targetMorph.getRotation();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setRotation(oldRotation); });\n\t\t\t\tmenu.addHandleTo(targetMorph, evt, 'rotate');\n\t\t\t\t}]\n\t\t];\n\t\tmenu = new PieMenuMorph(items, this, 0.5);\n\t\tmenu.open(evt);\n },\n\n},\n'window related', {\n\n\tputMeInAWindow: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar w = this.world();\n\t\tvar wm = new WindowMorph(this.windowContent(), this.windowTitle());\n\t\t// Position it so the content stays in place\n\t\tw.addMorphAt(wm, loc.subPt(wm.contentOffset));\n\t\tif (c) c.remove();\n\t},\n\n\tputMeInATab: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar w = this.world();\n\t\tvar wm = new TabbedPanelMorph(this.windowContent(), this.windowTitle());\n\t\tw.addMorphAt(wm, wm.getPosition());\n\t\tif (c) c.remove();\n\t},\n\n\tputMeInTheWorld: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar loc = c ? c.position().addPt(c.contentOffset) : this.position();\n\t\tthis.world().addMorphAt(this, loc);\n\t\tif (c) c.remove();\n\t},\n\n\timmediateContainer: function() { // Containers override to return themselves\n\t\tif (this.owner) return this.owner.immediateContainer();\n\t\telse return null;\n\t},\n\n\twindowContent: function() {\n\t\treturn this; // Default response, overridden by containers\n\t},\n\n\twindowTitle: function() {\n\t\treturn Object.inspect(this).truncate(); // Default response, overridden by containers\n\t},\n\n\n\n\tcopyToHand: function(hand, evt, optCopier) {\n\t\t// Function.prototype.shouldTrace = true;\n\t\tif (optCopier)\n\t\t\tvar copier = optCopier;\n\t\telse\n\t\t\tvar copier = new Copier();\n\t\tvar copy = this.copy(copier);\n\t\tif (!optCopier)\n\t\t\tcopier.finish(); // if copier comes from outside it should call finish\n\n\t\t// when copying submorphs, make sure that the submorph that becomes a top-level morph \n\t\t// reappears in the same location as its original.\n\t\tconsole.log('copied %s', copy);\n\t\tcopy.owner = null; // so following addMorph will just leave the tfm alone\n\t\tthis.owner.addMorph(copy); // set up owner as the original parent so that... \n\t\thand.addMorph(copy); // ... it will be properly transformed by this addMorph()\n\t\t// copy.setPosition(pt(0,0))\n\t\thand.showAsGrabbed(copy);\n\t\t// copy.withAllSubmorphsDo(function() { this.startStepping(null); }, null);\n\t\treturn copy\n\t},\n\nshadowCopy: function(hand) {\n\t\t// copied and adapted from asLogo\n\t\tvar shapes = [], copier = new Copier(), root = this;\n\t\t\n\t\tthis.shadowCopyIntoShapes(root, shapes, copier);\n\t\t\n\t\tvar shadow = new Morph(new lively.scene.Group())\n\t\tshadow.shape.setContent(shapes)\n\t\tshadow.setTransform(root.getTransform());\n\n\t\troot.shadowConnection = connect(this, 'transformChanged', shadow, 'setTransform', {\n\t\t\tconverter: function($upd) {\n\t\t\t\treturn new lively.scene.Similitude(\n\t\t\t\t\tthis.targetObj.getTransform().getTranslation(),\n\t\t\t\t\tthis.sourceObj.getRotation(),\n\t\t\t\t\tpt(this.sourceObj.getScale(), this.sourceObj.getScale()));\n\t\t\t}\n\t\t})\n\n\t\tif (!this.isClipMorph)\n\t\t\tthis.submorphs.forEach(function(ea) {\n\t\t\t\tshadow.addMorph(ea.shadowCopy(hand));\n\t\t\t})\n\n\t\treturn shadow;\n\t},\n\tshadowCopyIntoShapes: function(root, shapes, copier) {\n\t\tif (this.isEpimorph) return;\n\n\t\tvar s = this.shape.copy(copier)\n\n\t\tif (s.getFill()) s.setFill(Color.black);\n\t\tif (s.getStroke()) s.setStroke(Color.black);\n\t\ts.setFillOpacity(0.3);\n\t\ts.setStrokeOpacity(0.3);\n\n\t\tthis.transformForNewOwner(root).applyTo(s.rawNode)\n\t\tshapes.push(s);\n\t},\n\n\n\tmorphToGrabOrReceiveDroppingMorph: function(evt, droppingMorph) {\n\t\treturn this.morphToGrabOrReceive(evt, droppingMorph, true);\n\t},\n\n\tmorphToGrabOrReceive: function(evt, droppingMorph, checkForDnD) {\n\t\t// If checkForDnD is false, return the morph to receive this mouse event (or null)\n\t\t// If checkForDnD is true, return the morph to grab from a mouse down event (or null)\n\t\t// If droppingMorph is not null, then check that this is a willing recipient (else null)\n\n\t\tif (this.isEpimorph)\n\t\t\treturn null;\n\n\t\tif (!this.fullContainsWorldPoint(evt.mousePoint)) return null; // not contained anywhere\n\t\t// First check all the submorphs, front first\n\t\tfor (var i = this.submorphs.length - 1; i >= 0; i--) {\n\t\t\tvar hit = this.submorphs[i].morphToGrabOrReceive(evt, droppingMorph, checkForDnD); \n\t\t\tif (hit != null) { \n\t\t\t\treturn hit; // hit a submorph\n\t\t\t}\n\t\t};\n\n\t\t// Check if it's really in this morph (not just fullBounds)\n\t\tif (!this.containsWorldPoint(evt.mousePoint)) return null;\n\n\t\t// If no DnD check, then we have a hit (unless no handler in which case a miss)\n\t\tif (!checkForDnD) return this.mouseHandler ? this : null;\n\n\t\t// On drops, check that this is a willing recipient\n\t\tif (droppingMorph != null) {\n\t\t\treturn this.acceptsDropping(droppingMorph) ? this : null;\n\t\t} else {\n\t\t\t// On grabs, can't pick up the world or morphs that handle mousedown\n\t\t\t// DI: I think the world is adequately checked for now elsewhere\n\t\t\t// else return (!evt.isCommandKey() && this === this.world()) ? null : this; \n\t\t\treturn this;\n\t\t}\n\n\t},\n\n\tmorphToReceiveEvent: function(evt) {\n\t\t// This should replace morphToGrabOrReceive... in Hand where events\n\t\t// must be displatched to morphs that are closed to DnD\n\t\treturn this.morphToGrabOrReceive(evt, null, false);\n\t},\n\n\n\tacceptsDropping: function(morph) { \n\t\treturn !this.suppressDropping && this.openForDragAndDrop && !(morph instanceof WindowMorph);\n\t},\n\n},\n'fullscreen', {\n\tenterFullScreen: function() {\n\t\tvar world = this.world();\n\t\tif (this._isInFullScreen || !world) return;\n\t\tthis._isInFullScreen = true;\n\t\tthis.oldPosition = this.getPosition();\n\t\tthis.oldWorldScale = world.getScale();\n\t\tthis.oldWorldExtent = world.getExtent();\n\t\tvar windowExtent = world.windowBounds().extent(),\n\t\t\tratioY = (windowExtent.y / this.getExtent().y) * world.getScale(),\n\t\t\tratioX = (windowExtent.x / this.getExtent().x) * world.getScale(),\n\t\t\tratio = Math.min(ratioX, ratioY);\n\t\tif (ratio > 0 && ratio < 100) {\n\t\t\tworld.setScale(ratio);\t\t\t\n\t\t\tvar pos = this.getTransform().transformPoint(this.shape.bounds().topLeft());\n\t\t\tthis.setPosition(pt(0,0))\n\t\t\tGlobal.scrollTo(0, 0)\n\t\t\tworld.setExtent(windowExtent);\n\t\t\tworld.resizeCanvasToFitWorld();\n\t\t\t// rk actually the following three lines should be unnecessary because of resizeCanvasToFitWorld\n\t\t\tvar canvas = world.canvas();\n\t\t\tcanvas.setAttribute(\"width\", windowExtent.x);\t\n\t\t\tcanvas.setAttribute(\"height\", windowExtent.y);\n\t\t\tthis.clipWorld();\n\t\t};\n\t},\n\n\tleaveFullScreen: function() {\n\t\tif (!this._isInFullScreen) return;\n\t\tthis._isInFullScreen = false;\n\t\tthis.setPosition(this.oldPosition)\n\t\tthis.unclipWorld();\n\t\tthis.world().setScale(this.oldWorldScale);\n\t\tthis.world().setExtent(this.oldWorldExtent);\n\t\tthis.world().resizeCanvasToFitWorld();\n\t\tGlobal.scrollTo(this.oldPosition.x, this.oldPosition.y)\n\t\tdelete this.oldWorldExtent;\n\t\tdelete this.oldWorldScale;\n\t\tdelete this.oldPosition;\n\t},\n\tisInFullScreen: function() { return this._isInFullScreen },\n\n\n\tclipWorld: function() {\n\t\tthis.unclipWorld();\n\t\tthis.owner.addMorphFront(this);\n\t\tvar clipBounds = this.getPosition().extent(this.shape.bounds().extent()),\n\t\t\tclip = new lively.scene.Clip(new lively.scene.Rectangle(clipBounds)),\n\t\t\tworld = this.world();\n\t\tclip.reference();\n\t\tclip.applyTo(world);\t\t\n\t\tworld.worldClip = clip;\n\t},\n\n\tunclipWorld: function() {\n\t\tvar world = this.world();\n\t\tif (world.worldClip) {\n\t\t\tworld.worldClip.dereference();\n\t\t\tdelete world.worldClip;\n\t\t};\n\t\tworld.setTrait(\"clip-path\", \"\");\n\t},\n},\n'stepping', { // Morph stepping/timer functions\n\n startSteppingScripts: function() { }, // May be overridden to start stepping scripts\n\n\tstopStepping: function() {\n\t\tif (!this.activeScripts) return;\n\t\t// ignore null values\n\t\tvar scripts = this.activeScripts.select(function (ea) { return ea });\n\t\tscripts.invoke('stop', this.world());\n\t\tscripts.forEach(function(ea) { this.removeMorph(ea) }, this)\n\t\tthis.activeScripts = null;\n\t},\n\t\n\tstopSteppingScriptNamed: function(sName) {\n\t\tif (!this.activeScripts) return;\n\t\tthis.activeScripts.select(function (ea) { return ea.scriptName == sName }).invoke('stop', this.world());\n\t\tthis.activeScripts = this.activeScripts.select(function (ea) { return ea.scriptName !== sName });\t\n\t\tif (this.activeScripts.length == 0) this.activeScripts = null;\n\t},\n \tstopSteppingScriptNamedAndRemoveFromSubmorphs: function(sName) {\n\t\tif (!this.activeScripts) return;\n\t\tvar all = this.activeScripts.select(function (ea) { return ea.scriptName == sName });\n\t\tif (this.world()) all.invoke('stop', this.world());\n\t\tall.each(function(ea) {this.removeMorph(ea);}.bind(this));//remove\n\t\tthis.activeScripts = this.activeScripts.select(function (ea) { return ea.scriptName !== sName });\t\n\t\tif (this.activeScripts.length == 0) this.activeScripts = null;\n },\n\n\n\tstartStepping: function(stepTime, scriptName, argIfAny) {\n\t\tif (!scriptName) throw Error(\"Old code\");\n\t\tvar action = new SchedulableAction(this, scriptName, argIfAny, stepTime);\n\t\tthis.addActiveScript(action);\n\t\taction.start(this.world());\n\t\treturn action;\n\t},\n\n\taddActiveScript: function(action) {\n\t\t// Every morph carries a list of currently active actions (alarms and repetitive scripts)\n\t\tif (!this.activeScripts) this.activeScripts = [action];\n\t\telse this.activeScripts.push(action);\n\t\tif (!action.rawNode.parentNode) \n\t\t\tthis.addMorph(action);\n\t\treturn this;\n\t\t// if we're deserializing the rawNode may already be in the markup\n\t},\n\n stopAllStepping: function() { // For me and all my submorphs \n\t\tthis.withAllSubmorphsDo( function() { this.stopStepping(); });\n },\n\n suspendAllActiveScripts: function() { // For me and all my submorphs\n\t\tthis.withAllSubmorphsDo(function() { this.suspendActiveScripts(); });\n },\n\n\tsuspendActiveScripts: function() {\n\t\tif (this.activeScripts) { \n\t\t\tthis.suspendedScripts = this.activeScripts.clone();\n\t\t\tthis.stopStepping();\n\t\t}\n\t},\n\n\tresumeAllSuspendedScripts: function() {\n\t\tvar world = WorldMorph.current();\n\t\tthis.withAllSubmorphsDo( function() {\n\t\t\tif (this.suspendedScripts) {\n\t\t\t\t// ignore null values\n\t\t\t\tthis.suspendedScripts.select(function (ea) { return ea }).invoke('start', world);\n\t\t\t\tthis.activeScripts = this.suspendedScripts;\n\t\t\t\tthis.suspendedScripts = null;\n\t\t\t}\n\t\t});\n\t},\n\tforceRestartAllActiveScripts: function() {\n\t\tvar world = WorldMorph.current();\n\t\tthis.withAllSubmorphsDo( function() {\n\t\t\tif (this.activeScripts) {\n\t\t\t\tthis.activeScripts.select(function (ea) { return ea }).invoke('start', world);\n\t\t\t}\n\t\t});\n\t},\n\n\n},\n'scripts', {\n\taddScript: function(funcOrString, optName) {\n\t\tvar func = Function.fromString(funcOrString);\n\t\treturn func.asScriptOf(this, optName);\n\t},\n\n\taddScriptNamed: function(name, funcOrString) {\n\t\t// DEPRECATED!!!\n\t\treturn this.addScript(funcOrString, name);\n\t},\n},\n'debugging', {\n\tnotify: function(msg, loc) {\n\t\tif (!loc) loc = this.world().positionForNewMorph();\n\t\tnew MenuMorph([[\"OK\", 0, \"toString\"]], this).openIn(this.world(), loc, false, msg); \n\t},\n\n\tshowOwnerChain: function(evt) {\n\t\tvar items = this.ownerChain().reverse().map(\n\t\t\tfunction(each) { \n\t\t\t\treturn [Object.inspect(each).truncate(), function(evt2) { each.showMorphMenu(evt) }]; \n\t\t\t});\n\t\tnew MenuMorph(items, this).openIn(this.world(), evt.point(), false, \"Top item is topmost\");\n\t},\n\n\ttoString: function() {\n\t\ttry {\n\t\t\tvar name = this.getName();\n\t\t\tif (name && name != '') name += '(' + this.constructor.name + ')';\n\t\t\telse name = (this.rawNode && this.id()) || 'morph without rawNode';\n\t\t\treturn name;\n\t\t} catch (e) {\n\t\t\t//console.log(\"toString failed on %s\", [this.id(), this.getType()]);\n\t\t\treturn \"#\";\n\t\t}\n\t},\n\n\tinspect: function() {\n\t\ttry {\n\t\t\treturn this.toString();\n\t\t} catch (err) {\n\t\t\treturn \"#\";\n\t\t}\n\t},\n\t\n\taddSvgInspector: function() {\n\t\tvar xml = Exporter.stringify(new Exporter(this).serialize(Global.document));\n\t\tvar txt = this.world().addTextWindow({\n\t\t\tcontent: xml,\n\t\t\ttitle: \"XML dump\", \n\t\t\tposition: this.world().positionForNewMorph(null, this)\n\t\t});\n\t\ttxt.innerMorph().xml = xml; // FIXME a sneaky way of passing original text.\n\t},\n\n\taddModelInspector: function() {\n\t\tvar model = this.getModel();\n\t\tif (model instanceof SyntheticModel) {\n\t\t\tvar variables = model.variables();\n\t\t\tvar list = [];\n\t\t\tfor (var i = 0; i < variables.length; i++) {\n\t\t\t\tvar varName = variables[i];\n\t\t\t\tlist.push(varName + \" = \" + model.get(varName));\n\t\t\t}\n\t\t\tthis.world().addTextListWindow({\n\t\t\t\tcontent: list,\n\t\t\t\ttitle: \"Simple Model dump\",\n\t\t\t\tposition: this.world().positionForNewMorph(null, this)\n\t\t\t});\n\t\t}\n\t},\n\n},\n'Fabrik',{\n\tisContainedIn: function(morph) {\n\t\tif (!this.owner) return false;\n\t\tif (this.owner === morph) return true;\n\t\treturn this.owner.isContainedIn(morph)\n\t},\n},\n'signals',{\n\tsignalGeometryChange: function() {\n\t\tsignal(this, 'geometryChanged')\n\t\tvar morphs = this.submorphs;\n\t\tfor(var i=0; i < morphs.length; i++) {\n\t\t\tmorphs[i].signalGeometryChange()\n\t\t}\n\t},\n\n});\n\nMorph.addMethods(ViewTrait);\n\n// ===========================================================================\n// World-related widgets\n// ===========================================================================\n\n// A unique characteristics of the Morphic graphics system is that\n// all the objects (morphs) live in a \"world\" that is shared between \n// different objects and even between different users. A world can\n// contain a large number of different applications/widgets, much like\n// in an operating system a folder can contain a lot of files. Worlds\n// can be linked to each other using LinkMorphs. As a consequence,\n// the entire system can contain a large number of worlds, each of\n// which contains a large number of simultaneously running applications\n// and widgets. \n\nMorph.subclass(\"PasteUpMorph\", {\n\n documentation: \"used for layout, most notably the world and, e.g., palettes\",\n\n initialize: function($super, bounds, shapeType) {\n return $super(bounds, shapeType);\n },\n \n\tcaptureMouseEvent: function PasteUpMorph$captureMouseEvent($super, evt, hasFocus) {\n\t\tif (evt.type == \"MouseDown\" && this.onMouseDown(evt)) return;\n\t\tif (evt.type == \"MouseWheel\" && this.onMouseWheel(evt)) return;\n\t\t$super(evt, hasFocus); \n\t},\n\n\tonMouseDown: function PasteUpMorph$onMouseDown($super, evt) { //default behavior is to grab a submorph\n\t\t$super(evt);\n\t\tvar m = this.morphToReceiveEvent(evt);\n\t\tif (false && m instanceof HandleMorph) { // Verify handles work with pie menus, then delete\n\t\t\tm.onMouseDown(evt); // fixme\n\t\t\treturn true;\n\t\t}\n\t\tif (Config.usePieMenus) {\n\t\t\tif (m.handlesMouseDown(evt)) return false;\n\t\t\tm.showPieMenu(evt, m);\n\t\t\treturn true;\n\t\t}\n\t\tif (m == null) { \n\t\t\tthis.makeSelection(evt); \n\t\t\treturn true; \n\t\t} else if (!evt.isCommandKey() && evt.isLeftMouseButtonDown()) {\n\t\t\tif (m === this.world()) { \n\t\t\t\tthis.makeSelection(evt); \n\t\t\t\treturn true; \n\t\t\t} else if (m.handlesMouseDown(evt)) \n\t\t\t\treturn false;\n\t\t}\n\t\tevt.hand.grabMorph(m, evt);\n\t\treturn true; \n\t},\n\n\n\tbounds: function($super, ignoreTransients, ignoreTransform) {\n\t\treturn $super(ignoreTransients, true);\n\t},\n\t\n\tonMouseWheel: function(evt) {\t\t\n\t\tif (!evt.isCommandKey()) return false;\n\t\tevt.preventDefault();\n\n\t\tvar wheelDelta = evt.wheelDelta(),\n\t\t\toldScale = this.getScale();\n\n\t\tvar minScale = 0.1, maxScale = 10;\n\t\tif (oldScale < minScale && wheelDelta < 0) return false;\n\t\tif (oldScale > maxScale && wheelDelta > 0) return false;\n\t\tvar scaleDelta = 1 + evt.wheelDelta() / 500;\n\t\n\t\t// this.scaleBy(scaleDelta);\n\t\tvar newScale = oldScale * scaleDelta,\n\t\t\tnewScale = Math.max(Math.min(newScale, maxScale), minScale);\n\t\tthis.setScale(newScale)\n\t\tif (this.hands && this.hands[0]) this.hands[0].setScale(1/newScale)\n\n\t\t// actually this should be a layoutChanged but implementing\n\t\t// layoutChanged in WorldMorph is expensive since it is always called when a\n\t\t// submorph's layout is changed (owner chain propagation)\n\t\tthis.resizeCanvasToFitWorld();\n\t\t\n\t\t// Zoom into/out of the current mouse position:\n\t\t// p is the current mouse position. If we wouldn't move the window the new mouse pos would be scaledP.\n\t\t// We calculate the vector from scaledP to p and scale that by the current scale factor\n\t\t// We end up with a vector that can be used to scroll the screen to zoom in/out\n\t\tvar p = evt.point(),\n\t\t\tscaledP = p.scaleBy(1/scaleDelta),\n\t\t\ttranslatedP = p.subPt(scaledP).scaleBy(this.getScale());\n\t\twindow.scrollBy(translatedP.x, translatedP.y)\n\n\t\treturn true\n\t},\n\t\n okToBeGrabbedBy: function(evt) {\n // Paste-ups, especially the world, cannot be grabbed normally\n return null; \n },\n\n\tmakeSelection: function(evt) {\t//default behavior is to grab a submorph\n\t\tif (this.world().currentSelection != null) this.world().currentSelection.removeOnlyIt();\n\t\t\n\t\tvar m = new SelectionMorph(evt.point().asRectangle());\n\t\tthis.world().currentSelection = m;\n\t\t\n\t\tthis.world().addMorph(m);\n\t\tvar handle = new HandleMorph(pt(0,0), lively.scene.Rectangle, evt.hand, m, \"bottomRight\");\n\t\thandle.setExtent(pt(0, 0));\n\t\thandle.mode = 'reshape';\n\t\tm.addMorph(handle);\n\t\tevt.hand.setMouseFocus(handle);\n\t\tevt.hand.setKeyboardFocus(handle);\n\t}, \n});\n\nPasteUpMorph.subclass(\"WorldMorph\", \n'defaults', {\n documentation: \"A Morphic world (a visual container of other morphs)\",\n fill: Color.primary.blue,\n defaultExtent: pt(1280, 1024),\n\tstyleClass: ['world'],\n\t\n // Default theme for the theme manager \n},\n'initialization', {\n\tinitialize: function($super, canvas, backgroundImageId) {\n\t\tvar bounds = Rectangle.fromElement(canvas);\n\t\t// sometimes bounds has zero dimensions (when reloading thes same page, timing issues?\n\t\t// in Firefox bounds may be 1x1 size?? maybe everything should be run from onload or sth?\n\t\tif (bounds.width < 2) {\n\t\t\tbounds.width = this.defaultExtent.x;\n\t\t}\n\n\t\tif (bounds.height < 2) {\n\t\t\tbounds.height = this.defaultExtent.y;\n\t\t}\n\n\t\tif (backgroundImageId) {\n\t\t\tvar background = NodeFactory.create(\"use\");\n\t\t\tXLinkNS.setHref(background, backgroundImageId);\n\t\t\tthis.addNonMorph(background);\n\t\t}\n\t\t$super(new lively.scene.Rectangle(bounds));\n\n\t\tthis.setDisplayTheme(this.displayTheme); // apply display theme\n\n\t\t//gradient.rawNode.setAttributeNS(null, \"gradientTransform\", \"translate(0, -0.1) skewY(10)\");\t\t \n\t\tthis.enterCount = 0;\n\t},\n\n\tdoNotSerialize: ['hands', 'scheduledActions', 'lastStepTime', 'mainLoop', 'worldId', 'secondTick', 'currentScript', 'currentSelection', '_statusMessageContainer'],\n\n initializeTransientState: function($super) {\n $super();\n\n this.hands = [];\n\n\t\t\t\t\n\t\tvar theme = DisplayThemes[Config.defaultDisplayTheme];\n\t\tif (!theme)\n\t\t\tconsole.log('ERROR: could not find Theme ' + Config.defaultDisplayTheme)\n\t\tthis.displayTheme = theme; // set display them without applying it\n\t\tconsole.log('WorldMorph: updated display theme ')\n\n\n\t\tthis.withAllSubmorphsDo( function() { this.layoutChanged(); }); // Force installation of transforms\n\n this.scheduledActions = []; // an array of schedulableActions to be evaluated\n this.lastStepTime = (new Date()).getTime();\n this.mainLoopFunc = this.doOneCycle.bind(this).logErrors('Main Loop');\n this.mainLoop = Global.setTimeout(this.mainLoopFunc, 30);\n this.worldId = ++WorldMorph.worldCount;\n\t\tvar self = this;\n\t\twindow.onscroll = function() {signal(self, 'scrollChange')}\n\n return this;\n },\n\n\tcollectAllUsedFills: function($super, usedFills) {\n\t\tusedFills = $super(usedFills);\n\t\tProperties.forEachOwn(this.displayTheme, function(ea) {\n\t\t\tvar style = this[ea]\n\t\t\tif (style && (style.fill instanceof lively.paint.Gradient)) {\n\t\t\t\tusedFills.push(style.fill);\n\t\t\t} \n\t\t}.bind(this.displayTheme))\n\t\treturn usedFills\n\t},\n \n\tremove: function() {\n\t\tif (!this.rawNode.parentNode) return null; // already removed\n\t\tthis.hands.clone().forEach(function(hand) { this.removeHand(hand) }, this);\n\t\tthis.stopStepping();\n\t\tthis.removeRawNode();\n\t\treturn this;\n\t},\n},\n'private', {\n\n\t// called by insertMorph to determine the rawNode after the new inserted morph\n\tgetInsertPositionFor: function(m, isFront) {\n\t\tif (this.submorphs.length == 0) return this.hands.length > 0 ? this.hands.last().rawNode : null;\n\t\treturn isFront ? this.submorphs.last().rawNode.nextSibling : this.submorphs.first().rawNode;\n\t},\n\t\n\ttoggleNativeCursor: function(flag) {\n\t\tthis.canvas().setAttributeNS(null, \"cursor\", flag ? \"auto\" : \"none\");\n\t},\n\n\tresizeCanvasToFitWorld: function () {\n\t\tvar canvas = this.canvas();\n\t\tif (!canvas) return;\n\t\tthis.transformChanged();\n\t\tthis.fullBounds = null;\n\n\t\tvar w = this.getExtent().x * this.getScale() , h = this.getExtent().y * this.getScale();\n\n\t\tif (canvas.clientWidth != w && canvas.clientHeight != h) {\n\t\t\tif (canvas.offsetLeft) w += canvas.offsetLeft * this.getScale();\n\t\t\tif (canvas.offsetTop) h += canvas.offsetTop * this.getScale();\n\t\t\tcanvas.setAttribute(\"width\", w);\n\t\t\tcanvas.setAttribute(\"height\", h);\n\t\t}\n\t},\n\n\tdisplayOnCanvas: function(canvas) {\n\t\t// this.remove();\n\t\tif (this.rawNode.parentNode !== canvas) canvas.appendChild(this.rawNode);\n\t\tthis.hands.forEach(function(ea) { this.removeHand(ea) }, this);\n\t\tthis.addHand(new HandMorph(true));\n\t\tWorldMorph.currentWorld = this; // this conflicts with mutliple worlds\n\t\tif (Config.resizeScreenToWorldBounds)\n\t\t\tthis.resizeCanvasToFitWorld(this);\n\t\tthis.onEnter(); \n\t\tthis.enterCount ++;\n\t},\n \n\taddHand: function(hand) {\n\t\tif (this.hands.length > 0 && !this.hands.first())\n\t\t\tthis.hands.shift(); // FIXME: Quick bugfix. When deserializing the world the hands.first() is sometimes undefined\n\t\tthis.hands.push(hand);\n\t\thand.owner = this;\n\t\t// FIXME mouse events are correctly dispatched when using canvas or world\n\t\t// keyboard events only work when using documentElement --> problem with multiple worlds\n\t\thand.registerForKeyboardEvents(document.documentElement); // FIXME!!!\n\t\thand.registerForEvents(this.canvas());\n\t\thand.layoutChanged();\n\n\t\tthis.rawNode.appendChild(hand.rawNode);\n\t\treturn hand;\n\t},\n \n\tremoveHand: function(hand) {\n\t\thand.setMouseFocus(null); // cleanup, just in case\n\t\thand.setKeyboardFocus(null); // cleanup (calls blur(), which will remove the focus halo)\n\t\thand.removeRawNode();\n\t\thand.unregisterForKeyboardEvents(document.documentElement); // FIXME!!!\n\t\thand.unregisterForEvents(this.canvas());\n\n\t\tthis.hands.splice(this.hands.indexOf(hand), 1);\n\t},\n\n\n toggleBalloonHelp: function() {\n Morph.prototype.suppressBalloonHelp = !Morph.prototype.suppressBalloonHelp;\n },\n\n\n\n chooseDisplayTheme: function(evt) { \n var themes = DisplayThemes;\n var target = this; // trouble with function scope\n var themeNames = Properties.own(themes);\n var items = themeNames.map(\n function(each) { return [each, target, \"setDisplayTheme\", themes[each]]; });\n var menu = new MenuMorph(items, this);\n menu.openIn(this.world(), evt.point());\n },\n \n setDisplayTheme: function(styleDict) { \n this.displayTheme = styleDict;\n this.withAllSubmorphsDo( function() { this.applyLinkedStyles(); });\n },\n \n restart: function() {\n window.location && window.location.reload();\n },\n\n},\n'accessing', {\n\tgetMorphNamed: function($super, name) {\n\t\treturn $super(name) || (this.hands[0] && this.hands[0].getMorphNamed(name));\n\t},\n},\n'geometry', {\n \n layoutChanged: function() {\n\t// do nothing\n },\n\n layoutOnSubmorphLayout: function() {\n\treturn false;\n },\n \n\n moveBy: function(delta) { // don't try to move the world\n },\n},\n'world', {\n\n world: function() { \n return this; \n },\n\t\n validatedWorld: function() { \n return this; \n },\n \n firstHand: function() {\n\t\tif (!this.hands || this.hands.length === 0) return undefined;\n return this.hands[0];\n },\n\n onEnter: function() {},\n onExit: function() {},\n\n /**\n * override b/c of parent treatement\n */\n relativize: function(pt) { \n return pt;\n //return pt.matrixTransform(this.rawNode.parentNode.getTransformToElement(this.rawNode)); \n },\n\thideHostMouseCursor: function() {\n\t\tif (!Config.hideSystemCursor) return;\n\t\tif (UserAgent.isChrome && UserAgent.isWindows)\n\t\t\t// chrome on windows cannot display cur files\n\t\t\tvar\tpath = URL.codeBase.withFilename('media/nocursor.gif').pathname;\n\t\telse\n\t\t\tvar\tpath = URL.codeBase.withFilename('media/nocursor.cur').pathname;\n\t\tdocument.body.style.cursor = 'url(\"' + path + '\"), none';\n\t},\n\tshowHostMouseCursor: function() {\n\t\tdocument.body.style.cursor = 'default'\n\t},\n\n\n\n},\n'stepping', {\n \n // *** The new truth about ticking scripts ***\n // A morph may have any number of active scripts\n // Each is activated by a call such as\n // this.startStepping(50, \"rotateBy\", 0.1);\n // Note that stepTime is in milliseconds, as are all lower-level methods\n // The arguments are: stepTime, scriptName, argIfAny\n // This in turn will create a SchedulableAction of the form\n // { actor: aMorph, scriptName: \"rotateBy\", argIfAny: 0.1, stepTime: 50, ticks: 0 }\n // and this action will be both added to an array, activeScripts in the morph,\n // and it will be added to the world's scheduledActions list, which is an array of\n // tuples of the form [msTimeToRun, action]\n // The ticks field is used to tally ticks spent in each schedulableAction --\n // It is incremented on every execution, and it is multiplied by 0.9 every second\n // Thus giving a crude 10-second average of milliseconds spent in this script\n // every 10 seconds. The result is divided by 10 in the printouts.\n //\n // The message startSteppingScripts can be sent to morphs when they are placed in the world.\n // It is intended that this may be overridden to start any required stepping.\n // The message stopStepping will be sent when morphs are removed from the world.\n // In this case the activeScripts array of the morph is used to determine exactly what\n // scripts need to be unscheduled. Note that startSteppingScripts is not sent\n // automatically, whereas stopStepping is. We know you won't forget to \n // turn your gadgets on, but we're more concerned to turn them off when you're done.\n\n\tgetScheduledActions: function() {\n\t\treturn this.scheduledActions.collect(function(ea) { return ea[1] });\n\t},\n\n scheduleForLater: function(action, delayInMs, removePrior) {\n if (removePrior) this.stopSteppingFor(action, true); // unschedule earlier\n this.scheduleAction(new Date().getTime() + delayInMs, action);\n },\n \n startSteppingFor: function(action) {\n\t\tif (!action.scriptName) {\n\t\t\t// throw new Error(\"old code\");\n\t\t\tconsole.log(\"faild to startSteppingFor with no scriptName \")\n\t\t\treturn \n\t\t}\t\t\n\t\tthis.stopSteppingFor(action, true); // maybe replacing arg or stepTime\n\t\tthis.scheduleAction(new Date().getTime(), action);\n\t},\n \n stopSteppingFor: function(action, fromStart) { // should be renamed to unschedule()\n // fromStart means it is just getting rid of a previous one if there,\n\t // so not an error if not found\n\n if (this.currentScript === action) {\n\t\t // Not in queue; just prevent it from being rescheduled\n\t\t this.currentScript = null;\n\t\t return;\n\t\t};\n\n\t\tif (!this.scheduledActions) return;\n\t\tthis.scheduledActions = this.scheduledActions.reject(function(ea) {\n\t\t\tvar eaAction = ea[1]\n\t\t\treturn action.equalActorAndName(eaAction)\n\t\t})\n },\n\tstopSteppingForActionsMatching: function(func) {\n\t\tthis.getScheduledActions()\n\t\t\t.select(func)\n\t\t\t.forEach(function(action) { this.stopSteppingFor(action) }, this);\n\t},\n\n\n\n \n\tvalidateScheduler: function() {\n\t\tthis.getScheduledActions().forEach(function(action) {\n\t\t\tif (action.actor instanceof Morph && action.actor.validatedWorld() !== this)\n\t\t\t\tthis.stopSteppingFor(action)\n\t\t}, this);\n\t},\n\n inspectScheduledActions: function() {\n // inspect an array of all the actions in the scheduler. Note this\n // is not the same as scheduledActions which is an array of tuples with times\n\t\t// doit: [WorldMorph.current().inspectScheduledActions()]\n lively.Tools.inspect(this.getScheduledActions());\n },\n\n\tdoOneCycle: function WorldMorph$doOneCycle(world) {\n // Process scheduled scripts\n\n // Run through the scheduledActions queue, executing those whose time has come\n // and rescheduling those that have a repeatRate\n // Note that actions with error will not get rescheduled\n // (and, unless we take the time to catch here, will cause all later \n // ones in the queue to miss this tick. Better less overhead, I say\n // DI: **NOTE** this needs to be reviewed for msClock rollover\n // -- also note we need more time info for multi-day alarm range\n // When we do this, I suggest that actions carry a date and msTime\n // and until their day is come, they carry a msTime > a day\n // That way they won't interfere with daily scheduling, but they can\n // still be dealt with on world changes, day changes, save and load.\n\t\tvar msTime = new Date().getTime(),\n\t\t\ttimeOfNextStep = Infinity,\n\t\t\tlist = this.scheduledActions, // shorthand\n\t\t\ttimeStarted = msTime; // for tallying script overheads\n\t\twhile (list.length > 0 && list[list.length - 1][0] <= msTime) {\n\t\t\tvar schedNode = list.pop(), // [time, action] -- now removed\n\t\t\t\taction = schedNode[1];\n\t\t\tthis.currentScript = action; // so visible from stopStepping\n\t\t\tlively.lang.Execution.resetDebuggingStack(); // Reset at each tick event\n\t\t\ttry {\n\t\t\t\taction.exec();\n\t\t\t} catch (er) {\n\t\t\t\tvar msg = \"error on actor ' + action.actor + ': \" + (er.stack || er);\n\t\t\t\tconsole.warn(msg);\n\t\t\t\talert(msg)\n\t\t\t\tdbgOn(true);\n\t\t\t\tlively.lang.Execution.showStack();\n\t\t\t\ttimeStarted = new Date().getTime();\n\t\t\t\tcontinue; // Note: if error in script above, it won't get rescheduled below (this is good)\n\t\t\t}\n \n\t\t\t// Note: stopStepping may set currentScript to null so it won't get rescheduled\n\t\t\tif (this.currentScript && action.stepTime > 0) {\n\t\t\t\tvar nextTime = msTime + action.stepTime;\n\t\t\t\tthis.scheduleAction(nextTime, action)\n\t\t\t}\n\t\t\tthis.currentScript = null;\n\n\t\t\tvar timeNow = new Date().getTime(),\n\t\t\t\tticks = timeNow - timeStarted;\n\t\t\tif (ticks > 0) action.ticks += ticks; // tally time spent in that script\n\t\t\ttimeStarted = timeNow;\n\t\t}\n\n\t\t// Generate a mouseMove if any ticking scripts have run so that\n\t\t// simulations can respond where, eg, a morph moves under the mouse\n\t\t// DI: This is *only* needed for the slide-keyboard-under-mouse demo (very cool)\n\t\t//\tUses extra cycles, though, and currently fails in Opera\n\t\tif (Config.nullMoveAfterTicks) { // set this true in localConfig for the demo\n\t\t\tvar myHand = this.firstHand();\n\t\t\tif (myHand) myHand.makeANullMove();\n\t\t}\n\t\tif (list.length > 0) timeOfNextStep = Math.min(list[list.length-1][0], timeOfNextStep);\n\n\t\t// Each second, run through the tick tallies and mult by 0.9 to 10-sec \"average\"\n\t\tif (!this.secondTick) this.secondTick = 0;\n\t\tvar secondsNow = Math.floor(msTime / 1000);\n\t\tif (this.secondTick != secondsNow) {\n\t\t\tthis.secondTick = secondsNow;\n\t\t\tvar tallies = {};\n\t\t\tfor (var i=0; i=0; i--) {\n\t\t\tvar schedNode = list[i];\n\t\t\tif (schedNode[0] > msTime) {\n\t\t\t\tlist.splice(i+1, 0, [msTime, action]);\n\t\t\t\tif (!this.mainLoop) this.kickstartMainLoop();\n\t\t\t\treturn; \n\t\t\t}\n\t\t}\n\t\tlist.splice(0, 0, [msTime, action]);\n\t\tif (!this.mainLoop) this.kickstartMainLoop();\n\t},\n},\n'dialogs', {\n \n\topenURLasText: function(url, title) {\n\t\t// FIXME: This should be moved with other handy services like confirm, notify, etc\t\t\n\t\tvar pane = this.addTextWindow({content: \"fetching ... \", title: title});\n\t\tvar r = new WebResource(url);\n\t\tlively.bindings.connect(r, 'content', pane.innerMorph(), 'setTextString');\n\t\tr.beAsync().get();\n\t\t\n\t},\n\n\tviewport: function() {\n\t\ttry {\n\t\t\treturn Rectangle.ensure(this.canvas().viewport);\n\t\t\t} catch (er) { // FF doesn't implement viewport ?\n\t\t\treturn this.shape.bounds();\n\t\t}\n\t},\n\n\talert: function(varargs) {\n\t\tvar message = Strings.formatFromArray($A(arguments)),\n\t\t\topenDialog = function() { alert(message) };\n\t\tthis.setStatusMessage(message, Color.red, undefined, openDialog, undefined, \"alert: \")\n\t}.logErrors('alert'),\n\n\tprompt: function(message, callback, defaultInput) {\n\t\t// this.world().prompt(\"your name\", function(v) { alert(\"your name is: \" + v)}, \"joe\")\n\t\tvar model = Record.newPlainInstance({Message: message, Input: defaultInput || \"\", Result: null});\n\t\tmodel.addObserver({ \n\t\t\tonResultUpdate: function(value) { \n\t\t\t\tif (value == true && callback) callback.call(Global, model.getInput());\n\t\t\t}\n\t\t});\n\t\tvar dialog = new PromptDialog(model.newRelay({Message: \"-Message\", Result: \"+Result\", Input: \"Input\"}));\n\t\tvar window = dialog.openIn(this, pt(0,0));\n\t\twindow.setPosition(this.positionForNewMorph(window));\n\t\treturn dialog;\n\t},\n\n editPrompt: function(message, callback, defaultInput, optContext) {\n\t\tvar dialog = new PromptDialogMorph();\n\t\tdialog.title = message;\n\t\tdialog.setText(defaultInput);\n\t\tdialog.callback = callback;\n\t\tif (optContext) {\n\t\t\tdialog.textPane.innerMorph().evalContext = optContext; \n\t\t\tdialog.textPane.innerMorph().addScript(function getDoitContext() {\n\t\t\t\treturn this.evalContext;\n\t\t\t})\n\t\t}\n\t\tdialog.openIn(this, this.positionForNewMorph(dialog));\n\t\treturn dialog\n },\n\n\tconfirm: function(message, callback) {\n\t\tvar model = Record.newPlainInstance({Message: message, Result: null});\n\t\tmodel.addObserver({ \n\t\t\tonResultUpdate: function(value) { callback && callback.call(Global, value) }});\n\t\tvar dialog = new ConfirmDialog(model.newRelay({Message: \"-Message\", Result: \"+Result\"})),\n\t\t\twindow = dialog.openIn(this, pt(0,0));\n\t\twindow.setPosition(this.positionForNewMorph(window));\n\t\treturn dialog;\n\t},\n\tshowErrorDialog: function(error) {\n\t\t// Chrome\n\t\tif (error.stack) {\n\t\t\tvar pane = new lively.ide.ErrorStackViewer();\n\t\t\tpane.setError(error);\n\t\t\tpane.open();\n\t\t\treturn\n\t\t};\n\n\t\tvar pane = this.addTextWindow({\n\t\t\tcontent: \"\",\n\t\t\ttitle: \"Error\", \n\t\t});\n\t\tpane.owner.setPosition(this.positionForNewMorph(pane))\n\t\tLastPane = pane\n\n\t\t// Safari\n\t\tif (error.expressionEndOffset && error.expressionBeginOffset && error.sourceURL) {\n\t\t\t// works under Safari 5\n\t\t\tvar urlString = error.sourceURL;\n\t\t\tvar source = new WebResource(new URL(urlString)).get().content\n\t\t\tthis.showErrorDiaglogInWorkspace(source, error.expressionBeginOffset, error.expressionEndOffset, pane)\n\t\t\tpane.owner.setTitle('Error:' + urlString)\n\t\t\treturn pane\n\t\t}\n\n\t\tif (error.expressionEndOffset && error.expressionBeginOffset && error.sourceId) {\n\t\t\tvar sourceReference = EvalSourceRegistry.current().sourceReference(error.sourceId);\n\t\t\tif (sourceReference !== undefined) {\n\t\t\t\tconsole.log('error ' + printObject(error))\n\t\t\t\tvar expressionBeginOffset = error.expressionBeginOffset - sourceReference.evalCodePrefixLength;\n\t\t\t\tvar expressionEndOffset = error.expressionEndOffset - sourceReference.evalCodePrefixLength;\n\t\t\t\tthis.showErrorDiaglogInWorkspace(sourceReference.sourceString, expressionBeginOffset, expressionEndOffset, pane)\n\t\t\t\tif (sourceReference.morph) {\n\t\t\t\t\tsourceReference.morph.showError(error, (sourceReference.offset || 0) - sourceReference.evalCodePrefixLength)\n\t\t\t\t}\n\n\t\t\t\treturn pane\n\t\t\t}\n\t\t} \n\n\t\t// Fallback...\n\t\tpane.innerMorph().setTextString(printObject(error))\t\n\t\treturn pane\n\t},\nlogError: function(er) {\n\tLastError = er;\n\tvar msg = \"\" + er\n\tvar world = this;\n\tthis.setStatusMessage(msg, Color.red, 15, \n\t\tfunction() {\n\t\t\tworld.showErrorDialog(er)\n\t\t},\n\t\t{fontSize: 12, fillOpacity: 1});\n},\n\n\tshowErrorDiaglogInWorkspace: function(source, expressionBeginOffset, expressionEndOffset, pane) {\n\t\t// PRIVATE HELPER\n\t\tconsole.log(\"begin \" + expressionBeginOffset + \" end \" + expressionEndOffset)\n\t\tvar start = source.lastIndexOf(\"\\n\\n\", expressionBeginOffset)\n\t\tif (start == -1) start = 0;\n\t\tvar startOffset = expressionBeginOffset - start;\n\t\tvar stop = source.indexOf(\"\\n\", expressionEndOffset + 1);\n\t\tif (stop != -1)\tstop = source.indexOf(\"\\n\", stop + 1);\n\t\tif (stop != -1)\tstop = source.indexOf(\"\\n\", stop + 1);\n\n\t\tif (stop == -1) stop = source.length;\n\n\t\tconsole.log(\"source: \" + source + \"| \" + source.length+\" expressionEndOffset: \" + expressionEndOffset)\n\t\tvar excerpt = source.slice(start, stop)\n\t\tpane.innerMorph().setTextString(excerpt)\n\n\t\tpane.innerMorph().emphasizeFromTo({color: Color.red}, \n\t\t\tstartOffset, startOffset + expressionEndOffset - expressionBeginOffset);\n\t\tpane.innerMorph().replaceSelectionWith\n\t\tconsole.log(\"found excerpt: \" + excerpt + \" start: \" + start + \" stop:\" + stop)\n\t},\n},\n'new content', {\n \n\taddFramedMorph: function(morph, title, optLoc, optSuppressControls) {\n\t\tvar displ = pt(5, 5);\n\t\tvar w = this.addMorphAt(\n\t\t\tnew WindowMorph(morph, title, optSuppressControls), \n\t\t\toptLoc || this.positionForNewMorph(morph).subPt(displ));\n\t\tw.adjustForNewBounds(); // hack\n\t\treturn w\n\t},\n\n\taddTextWindow: function(spec) {\n\t\t// FIXME: typecheck the spec \n\t\tif (Object.isString(spec.valueOf())) spec = {content: spec}; // convenience\n\t\tvar extent = spec.extent || pt(500, 200);\n\t\tvar pane = this.internalAddWindow(\n\t\t\t\tnewTextPane(extent.extentAsRectangle(), spec.content || \"\"),\n\t\t\t\tspec.title, spec.position);\n\t\tif (spec.acceptInput !== undefined) pane.innerMorph().acceptInput = spec.acceptInput;\n\t\tif (spec.plug) pane.connectModel(spec.plug, true);\n\t\treturn pane;\n\t},\n\n\taddTextListWindow: function(spec) {\n\t\t// FIXME: typecheck the spec \n\t\tif (spec instanceof Array) spec = {content: spec }; // convenience\n\t\tvar content = spec.content;\n\t\tif (!content) content = \"\";\n\t\tif (!(content instanceof Array)) content = [content];\n\t\tvar extent = spec.extent || pt(500, Math.min(300, content.length * TextMorph.prototype.fontSize * 1.5));\n\t\tvar rec = extent.extentAsRectangle();\n\t\tvar pane = this.internalAddWindow(newTextListPane(rec, content), spec.title, spec.position);\n\t\tif (spec.plug) pane.connectModel(spec.plug, true);\n\t\treturn pane;\n\t},\n\n\tinternalAddWindow: function(pane, titleSpec, posSpec) {\n\t\tvar pos = (posSpec instanceof Point) ? posSpec : undefined;\n\t\tpane.setBorderWidth(2); pane.setBorderColor(Color.black);\n\t\tvar win = this.addFramedMorph(pane, String(titleSpec || \"\"), pos || this.firstHand().position().subPt(pt(5, 5)));\n\t\tif (posSpec == \"center\") {\n\t\t\twin.align(win.bounds().center(), this.viewport().center());\n\t\t}\n\t\treturn pane;\n\t},\n\n\n\taddMorphFrontOrBack: function($super, m, front) {\n\t\tvar oldTop = this.topWindow();\n\t\tvar result = $super(m, front);\n\t\tif (!front || !(m instanceof WindowMorph)) return result;\n\t\t// if adding a new window on top, then make it active\n\t\tif (oldTop) oldTop.titleBar.highlight(false);\n\t\tm.takeHighlight();\n\t\treturn result;\n\t},\n\n\ttopWindow: function() {\n\t\tfor (var i= this.submorphs.length - 1; i >= 0; i--) {\n\t\t\tvar sub = this.submorphs[i];\n\t\t\tif (sub instanceof WindowMorph) return sub;\n\t\t}\n\t\treturn null;\n\t},\n\n\tpositionForNewMorph: function(newMorph, relatedMorph) {\n\t\t// this should be much smarter than the following:\n\t\tif (relatedMorph)\n\t\t\treturn relatedMorph.bounds().topLeft().addPt(pt(5, 0));\n\t\tvar pos = this.firstHand().getPosition();\n\t\tif (!newMorph) return pos;\n\t\tvar viewRect = this.windowBounds();\n\t\tvar newMorphBounds = pos.extent(newMorph.getExtent());\n\t\tif (viewRect.containsRect(newMorphBounds)) return pos;\n\t\treturn viewRect.center().subPt(newMorphBounds.extent().scaleBy(0.5));\n\t},\n\n\treactiveAddMorph: function(morph, relatedMorph) { \t// add morph in response to a user action, make it prominent\n\t\treturn this.addMorphAt(morph, this.positionForNewMorph(morph, relatedMorph));\n\t},\n \n resizeByUser: function() {\n var world = this;\n var cb = function(newSizePtLiteral) {\n \t try {\n \t var newPoint = eval(newSizePtLiteral);\n \t basicResize(world, world.canvas(), newPoint.x, newPoint.y);\n } catch(e) {\n \t world.alert('Wrong input ' + newSizePtLiteral);\n \t\t }\n \t};\n \tworld.prompt('Enter extent', cb, world.bounds().bottomRight().toString());\n },\n\n\taddProgressBar: function(optPt) {\n\t\tvar center = optPt || this.windowBounds().center()\n\t\tvar progressBar = new ProgressBarMorph(new Rectangle(0,0, 450, 30))\n\t\tthis.addMorph(progressBar);\n\t\tprogressBar.align(progressBar.bounds().center(), center);\n\t\tprogressBar.ignoreEvents();\n\t\treturn progressBar\n\t},\n}, \n'Requirements', {\n\t// this.world().showAddWorldRequirementsMenu(pt(100,100))\n\tshowAddWorldRequirementsMenu: function(pos) {\n\t\t\tvar ignoreModules = \"lively.Widgets lively.WikiWidget lively.Data lively.Base lively.defaultconfig lively.CanvasExpt lively.obsolete lively.Helper lively.miniprototype lively.demofx lively.Text lively.EmuDom lively.Core lively.bindings lively.rhino-compat lively.Tools lively.localconfig lively.Main lively.Network lively.scene lively.simpleMain lively.ChangeSet lively.ide\".split(\" \")\n\n\t\t\tvar items = ['apps', 'lively', 'Tests', 'draft']\n\t\t\t\t.select(function(ea){\n\t\t\t\t\treturn new WebResource(new URL(Config.codeBase).withFilename(ea)).exists()})\n\t\t\t\t.collect(function(eaDir) {\n\t\t\treturn [eaDir, ChangeSet.current()\n\t\t\t\t.moduleNamesInNamespace(eaDir)\n\t\t\t\t.sort()\n\t\t\t\t.reject(function(ea) { return ignoreModules.include(ea) })\n\t\t\t\t.collect(function(ea){ \n\t\t\t\t\treturn [ea, function(){\n\t\t\t\t\t\tmodule(ea).load();\n\t\t\t\t\t\tChangeSet.current().addWorldRequirement(ea);\n\t\t\t\t\t\tthis.alert(\"load \" + ea + \" module\")}\n\t\t\t\t]}\n\t\t\t)]\n\t\t});\n\n\t\tvar menu = new MenuMorph(items, this.world());\n\t\tmenu.openIn(this.world(), pos, false, \n\t\t\t\"require module for this page\");\n\n\t},\n\t// this.world().showRemoveWorldRequirementsMenu(pt(100,100))\n\tshowRemoveWorldRequirementsMenu: function(pos) {\n\t\tvar pageModules = ChangeSet.current().getWorldRequirementsList().evaluate() \n\t\tvar items = pageModules\n\t\t\t.sort()\n\t\t\t.collect(function(ea){ \n\t\t\treturn [ea, function(){\n\t\t\t\tChangeSet.current().removeWorldRequirement(ea);\n\t\t\t\tthis.alert(\"remove \" + ea + \" module requirement\")}]\n\t\t})\n\t\tvar menu = new MenuMorph(items, this.world())\n\t\tmenu.openIn(this.world(), pos, false, \n\t\t\t\"remove module requirement for this page\");\n\t}\n},\n'Feedback and Saving', {\n\n\tpromptAndSaveWorld: function(asJson) {\n\t\tthis.prompt(\"world file (.xhtml)\", function(filename) {\n\t\t\tif (!filename.endsWith('.xhtml')) filename += '.xhtml'\n\t\t\tvar start = new Date().getTime();\t\n\t\t\tvar onFinish = function(url) {\n\t\t\t\tWorldMorph.current().setStatusMessage('goto ' + url, Color.green, undefined, \n\t\t\t\t\tfunction(){ window.open(url)});\n\n\t\t\t\tif (Config.changeLocationOnSaveWorldAs)\n\t\t\t\t\twindow.location = url;\n\t\t\t};\n\t\t\tif (asJson) this.saveWorldWithJSON(filename, onFinish);\n\t\t\telse this.exportLinkedFile(filename);\n\t\t\tvar time = new Date().getTime() - start;\n\t\t\tthis.setStatusMessage(\"world save as \" + filename + \" in \" + time + \"ms\", Color.green, 3)\t\n\n\n\t\t}.bind(this)); \n\t},\n\n\tsaveWorldWithJSON: function(optURLOrPath, optOnFinish) {\n\t\tvar world = this,\n\t\t\turl = optURLOrPath || URL.source,\n\t\t\tstart = new Date().getTime(),\n\t\t\tonFinished = function(status) {\n\t\t\t\tif (!status.isDone() || !status.isSuccess()) return;\n\t\t\t\tvar time = new Date().getTime() - start;\n\t\t\t\tworld.setStatusMessage(\"world saved to \" + url + \" in \" + time +\n\t\t\t\t\t\"ms \\n(\" + time + \"ms serialization)\", Color.green, 3)\n\t\t\t\toptOnFinish && optOnFinish.call(this, url);\n\t\t\t};\n\t\t\t\n\t\t// make relative to absolute URL\n\t\ttry { url = new URL(url) } catch(e) { url = URL.source.withFilename(url) };\n\t\tvar warnIfOverriden = url.toString() === URL.source.toString();\n\t\trequire(\"lively.persistence.Serializer\").toRun(function() {\n\t\t\tif (world._statusMessageContainer) world._statusMessageContainer.remove();\n\t\t\tvar doc = lively.persistence.Serializer.serializeWorld(world),\n\t\t\t\ttitleTag = doc.getElementsByTagName('title')[0];\n\t\t\tif (titleTag) titleTag.textContent = url.filename().replace('.xhtml', '');\n\t\t\tnew DocLinkConverter(URL.codeBase, url.getDirectory()).convert(doc);\n\t\t\tExporter.saveDocumentToFile(doc, url, onFinished, warnIfOverriden);\n\t\t});\n\n\t\treturn url;\n\t},\n\t\n\tsaveWorld: function(optURLOrPath) {\n\t\tvar url = optURLOrPath || URL.source;\n\t\t// make relative to absolute URL\n\t\ttry { url = new URL(url) } catch(e) { url = URL.source.withFilename(url) };\n\t\tvar start = new Date().getTime(),\n\t\t\tself = this,\n\t\t\tserializeTime,\n\t\t\tonFinished = function() {\n\t\t\t\tvar time = new Date().getTime() - start;\n\t\t\t\tself.setStatusMessage(\"world saved to \" + url +\n\t\t\t\t\t\" in \" + time + \"ms \\n(\" + serializeTime + \"ms serialization)\", Color.green, 3);\n\t\t\t\t},\n\t\t\tstatusMessage = WorldMorph.current().setStatusMessage(\"serializing....\");\n\t\t(function() {\n\t\t\tvar doc, world = this, oldHand = this.firstHand(),\n\t\t\t\toldKeyboardFocus = oldHand.keyboardFocus;\n\t\t\tthis.removeHand(oldHand);\n\t\t\ttry {\n\t\t\t\tdoc = Exporter.shrinkWrapMorph(this.world());\n\t\t\t} catch(e) {\n\t\t\t\tthis.setStatusMessage(\"Save failed due to:\\n\" + e, Color.red, 10, function() {\n\t\t\t\t\tworld.showErrorDialog(e)\n\t\t\t\t})\n\t\t\t} finally {\n\t\t\t\tthis.addHand(oldHand);\n\t\t\t\tconsole.log(\"setting back keyboard focus to\" + oldKeyboardFocus)\n\t\t\t\tif (oldKeyboardFocus)\n\t\t\t\t\toldKeyboardFocus.requestKeyboardFocus(oldHand);\n\t\t\t}\n\t\t\tnew DocLinkConverter(URL.codeBase, url.getDirectory()).convert(doc);\n\t\t\tstatusMessage.remove();\n\t\t\t(function removeJSONIfPresent() {\n\t\t\t\tvar jsonEl = doc.getElementById('LivelyJSONWorld');\n\t\t\t\tif (jsonEl) jsonEl.parentNode.removeChild(jsonEl);\n\t\t\t})()\n\t\t\tserializeTime = new Date().getTime() - start;\n\t\t\t(function() {\n\t\t\t\tExporter.saveDocumentToFile(doc, url, onFinished);\n\t\t\t}).bind(this).delay(0);\n\t\t}).bind(this).delay(0);\n\t\treturn url;\n\t},\n\n\twindowBounds: function () {\n\t\tvar canvas = this.canvas();\n\t\tvar scale = 1/this.world().getScale();\n\t\tvar topLeft = pt(Global.pageXOffset - (canvas.offsetLeft || 0), Global.pageYOffset - (canvas.offsetTop || 0));\n\t\tvar width = Math.min(\n\t\t\tGlobal.document.documentElement.clientWidth * scale,\n\t\t\tWorldMorph.current().getExtent().x);\n\t\tvar height = Math.min(\n\t\t\tGlobal.document.documentElement.clientHeight * scale,\n\t\t\tWorldMorph.current().getExtent().y)\n\t\treturn topLeft.scaleBy(scale).extent(pt(width, height));\n\t},\n\t\n\tvisibleBounds: function() {\n\t\tvar windowBounds = this.windowBounds();\n\t\tvar worldBounds = this.shape.bounds(); // use shape so no stick-outs are included\n\t\tvar upperLeft = pt(Math.max(windowBounds.x, worldBounds.x), Math.max(windowBounds.y, worldBounds.y));\n\t\tvar lowerRight = pt(Math.min(windowBounds.width, worldBounds.width), Math.min(windowBounds.height, worldBounds.height));\n\t\treturn upperLeft.extent(lowerRight);\n\t},\n\n\tensureStatusMessageContainer: function() {\n\t\tif (!this._statusMessageContainer || ! this._statusMessageContainer.owner) {\n\t\t\tthis._statusMessageContainer = new StatusMessageContainer();\n\t\t\tthis._statusMessageContainer.setName(\"statusMorphContainer\");\n\t\t\tthis.addMorph(this._statusMessageContainer);\n\t\t\tthis._statusMessageContainer.startUpdate();\n\t\t};\n\t\treturn this._statusMessageContainer\n\t},\n\n\tsetStatusMessage: function(msg, color, delay, callback, optStyle, messageKind) {\n\t\tvar container = this.ensureStatusMessageContainer();\n\t\treturn container.addStatusMessage(msg, color, delay, callback, optStyle, messageKind);\n\t},\t\n\n\tshowStatusProgress: function(msg) {\n\t\tvar container = this.ensureStatusMessageContainer();\n\t\tvar progressBar = container.addProgressBar(msg);\t\t\n\t\treturn progressBar\n\t},\n\t\n\taskForWorldTitle: function() {\n\t\tvar self = this;\n\t\tthis.prompt('new world title', function(input) {\n\t\t\tdocument.title = input;\n\t\t\tvar titleTag = document.getElementsByTagName('title')[0];\n\t\t\ttitleTag.textContent = input;\n\t\t}, document.title);\n\t},\n\taskForUserName: function() {\n\t\tvar world = this;\n\t\tthis.prompt(\"Please, give your username\", function(name) {\n\t\t\tif (name) {\n\t\t\t\talertOK(\"setting username to: \" + name)\n\t\t\t\tworld.setCurrentUser(name);\n\t\t\t} else {\n\t\t\t\talertOK(\"removing username\")\n\t\t\t\tworld.setCurrentUser(undefined);\n\t\t\t}\n\t\t})\n\t},\n\tsetCurrentUser: function(username) {\n\t\tthis.currentUser = username;\n\t\tif (Global.localStorage)\n\t\t\tlocalStorage.livelyUserName = username;\n\t},\n\n},\n/**\n *\tWorldMorph Menu \n *\n * Question: Should features register itself in the menu, \n * or should the menu give an overview of available features \n * and load the modules on demand?\n */\n'Menus ', {\n\tisProtectedWorld: function() {\n\t\treturn Global.URL && (URL.source.filename() == \"index.xhtml\")\n\t},\n\t\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.keepOnlyItemsNamed([\"inspect\", \"edit style\"]);\n\t\tmenu.addItems([['reset scale', function(evt) {\n\t\t\tvar h = evt.hand, w = h.world();\n\t\t\th.setScale(1); w.setScale(1); w.resizeCanvasToFitWorld();\n\t\t}]]);\n\t\tmenu.addLine();\n\t\tmenu.addItems(this.subMenuItems(evt, menu));\n\t\tmenu.addLine();\n\t\tmenu.addItem([\"save world as ... \", function() { this.promptAndSaveWorld(true/*asJson*/) }]);\n\n\t\tif (!this.isProtectedWorld())\n\t\t\tmenu.addItem([\"save world (s)\", function() { menu.remove(); this.saveWorldWithJSON() }]);\n\n\t\tmenu.addItem([\"download world\", function() {\n\t\t\trequire('lively.persistence.StandAlonePackaging').toRun(function() {\n\t\t\t\tlively.persistence.StandAlonePackaging.packageCurrentWorld();\n\t\t\t});\n\t\t}]);\n\n\t\treturn menu;\n\t},\n\t\n\tsimpleMorphsSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"Line\", function(evt) { \n\t\t\t\tvar p = evt.point(); \n\t\t\t\tvar m = Morph.makeLine([p, p.addXY(60, 30)], 2, Color.black);\n\t\t\t\tworld.addMorph(m);\n\t\t\t\tm.setPosition(evt.point())}],\n\t\t\t[\"Connector\", function(evt) { \n\t\t\t\trequire('lively.Connector').toRun(function() {\n\t\t\t\t\tvar m = Morph.makeConnector(evt.point())\n\t\t\t\t\tworld.addMorph(m);\n\t\t\t\t\tm.setGlobalEndPos(evt.point().addXY(60, 30))\n\t\t\t\t})}],\n\t\t\t[\"Rectangle\", function(evt) { world.addMorph(Morph.makeRectangle(evt.point(), pt(60, 30)));}],\n\t\t\t[\"Ellipse\", function(evt) { world.addMorph(Morph.makeCircle(evt.point(), 25)); }],\n\t\t\t[\"TextMorph\", function(evt) { \n\t\t\t\tvar text = new TextMorph(evt.point().extent(pt(120, 10)), \"This is a TextMorph\");\n\t\t\t\tworld.addMorph(text);}],\n\t\t\t[\"Star\",function(evt) { world.addMorph(Morph.makeStar(evt.point()))}],\n\t\t\t[\"Heart\", function(evt) { world.addMorph(Morph.makeHeart(evt.point()))}],\n\t\t\t[\"Marker\", function(evt) {world.addMorph(new MarkerMorph(evt.point().extent(pt(100, 100))))}]\n\t\t];\n\t},\n\n\tcomplexMorphsSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"ButtonMorph\", function(evt) { world.addMorph(new ScriptableButtonMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t[\"SliderMorph\", function(evt) { world.addMorph(Widget.makeSlider(evt.point().extent(pt(120, 40))))}],\n\t\t\t[\"List pane\", function(evt) {\n\t\t\t\tvar m = world.addMorph(newRealListPane(evt.point().extent(pt(300, 400))));\n\t\t\t\tm.applyStyle({fill: Color.gray, padding: Rectangle.inset(3), suppressHandles: false});\n\t\t\t\tm.adjustForNewBounds(); // for padding\n\t\t\t}],\n \t\t\t[\"Text pane\", function(evt) { \n\t\t\t\tvar m = world.addMorph(newTextPane(evt.point().extent(pt(300, 400)), 'empty'));\n\t\t\t\tm.applyStyle({fill: Color.gray, padding: Rectangle.inset(3), suppressHandles: false});\n\t\t\t\tm.adjustForNewBounds(); // for padding\n\t\t\t}],\n\n\t\t\t// [\"ProgressBarMorph\", function(evt) { world.addMorph(new ProgressBarMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t// [\"ScaleMorph\", function(evt) { world.addMorph(new ScaleMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t[\"Clock\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar m = world.addMorph(new ClockMorph(evt.point(), 50));\n\t\t\t\t\tm.startSteppingScripts();\n\t\t\t\t\tChangeSet.current().addWorldRequirement('lively.Examples')\n\t\t\t\t})}],\n\t\t\t// [\"FabrikClock\", function(evt) {\n\t\t\t\t// require('lively.Fabrik').toRun(function() {\n\t\t\t\t\t// var clock = new FabrikClockWidget();\n\t\t\t\t\t// var morph = clock.buildView();\n\t\t\t\t\t// world.addMorph(morph);\n\t\t\t\t\t// morph.setPosition(evt.point());\n\t\t\t\t\t// morph.startSteppingScripts(); }); }],\n\t\t\t[\"Piano Keyboard\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar m = new PianoKeyboard(evt.point());\n\t\t\t\t\tm.scaleBy(1.5);\t m.rotateBy(-Math.PI*2/12);\n\t\t\t\t\tworld.addMorph(m); }); }],\n\t\t\t[\"Kaleidoscope\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar kal = WorldMorph.current().addMorph(new SymmetryMorph(300, 7)); \n\t\t\t\t\tkal.startUp(); }) } ],\n\t\t\t[\"Image Morph\", function(evt) {\n\t\t\t\tworld.prompt('Enter image URL', function(urlString) {\n\t\t\t\t\tvar img = new ImageMorph(evt.point().extent(pt(100,100)), urlString);\n\t\t\t\t\timg.openInWorld() }) }],\n\t\t\t[\"Video Morph\", function(evt) {\n\t\t\t\tVideoMorph.openAndInteractivelyEmbed(evt.point()) }],\n\n\t\t\t// [\"Duplicator Panel\", function(evt) { \n\t\t\t// \trequire('lively.Graffle').toRun(function(){\n\t\t\t// \t\tworld.addMorph(Morph.makeDefaultDuplicatorPanel(evt.point()))\n\t\t\t// \t}); \n\t\t\t// }], \n\t\t\t[\"FileUpload Morph\", function(evt) { \n\t\t\t\trequire('lively.FileUploadWidget').toRun(function(){\n\t\t\t\t\tvar morph = new FileUploadMorph();\n\t\t\t\t\tworld.addMorph(morph)\n\t\t\t\t\tmorph.setPosition(evt.point());\n\t\t\t\t}); \n\t\t\t}],\n\t\t];\n\t},\n\t\n\ttoolSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\tvar toolMenuItems = [\n\t\t\t[\"System code browser (b)\", function(evt) { require('lively.ide').toRun(function(unused, ide) {new ide.SystemBrowser().openIn(world)})}],\n\t\t\t[\"Local code Browser (l)\", function(evt) { require('lively.ide').toRun(function(unused, ide) {new ide.LocalCodeBrowser().openIn(world)})}],\n\t\t\t// [\"Wiki code Browser\", function(evt) { require('lively.ide', 'lively.LKWiki').toRun(function(unused, ide) {\n\t\t\t\t// var cb = function(input) {\n\t\t\t\t\t// var repo = new URL(input);\n\t\t\t\t\t// new ide.WikiCodeBrowser(repo).open()\n\t\t\t\t// };\n\t\t\t\t// world.prompt('Wiki base URL?', cb, URL.source.getDirectory().toString());\n\t\t\t\t// })}],\n\t\t\t// [\"Switch System browser directory...\", function(evt) { require('lively.ide').toRun(function(unused, ide) {\n\t\t\t\t// var cb = function(input) {\n\t\t\t\t\t// if (!input.endsWith('/')) input += '/';\n\t\t\t\t\t// ide.startSourceControl().switchCodeBase(new URL(input));\n\t\t\t\t// };\n\t\t\t\t// world.prompt('Enter System browser directory (URL)', cb, URL.source.getDirectory().toString());\n\t\t\t\t// })}],\t\t\t\t\n\t\t\t[\"TestRunner\", function(evt) { require('lively.TestFramework').toRun(function() { new TestRunner().openIn(world) }) }],\n\t\t\t// [\"OMetaWorkspace\", function(evt) { require('lively.Ometa').toRun(function() { new OmetaWorkspace().open() }) }],\n\t\t\t[\"Viewer for latest file changes\", function(evt) {\n\t\t\t\tvar cb = function(input) {\n\t\t\t\t\trequire('lively.LKWiki').toRun(function(u,m) {\n\t\t\t\t\t\tvar url = new URL(input);\n\t\t\t\t\t\tconsole.log(url);\n\t\t\t\t\t\tnew LatestWikiChangesList(url).openIn(world);\n\t\t\t\t}); }\n\t\t\t\tworld.prompt('Url to observe', cb, URL.source.getDirectory().toString()); \n\t\t\t}],\n\t\t\t[\"Version Viewer\", function(evt) {\n\t\t\t\trequire('lively.ide').toRun(function() {\n\t\t\t\t\tChangeSet.current().addWorldRequirement('lively.ide');\n\t\t\t\t\tnew lively.ide.FileVersionViewer().openForURL(URL.source);\n\t\t\t\t});\n\t\t\t}],\n\t\t\t[\"MiniMap\", function(evt) {\n\t\t\t\tvar map = new MiniMapMorph();\n\t\t\t\tmap.name = 'MiniMap';\n\t\t\t\tmap.openInWorld();\n\t\t\t\tmap.setTargetWorld(world);\n\t\t\t\tmap.startSteppingScripts()\n\t\t\t}],\t\t\t\n\t\t\t[\"load Scripting\", function(evt) {\n\t\t\t\tmodule('lively.Scripting').load()\n\t\t\t}],\t\t\t\n\t\t];\n\n\t\treturn toolMenuItems\n\t},\n\n\tscriptingSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"TileScriptingBox\", function(evt) { require('lively.TileScripting').toRun(function() {new lively.TileScripting.TileBox().openIn(world); }) }],\n\t\t\t[\"Fabrik Component Box\", function(evt) { require('lively.Fabrik').toRun(function() { Fabrik.openComponentBox(world); }) }],\n\t\t\t[\"Webcards with name\", function(evt) { require('apps.Webcards').toRun(function(){\n\t\t\t\t\tvar sds = new SimpleDataStore(pt(600, 300));\n\t\t\t\t\tworld.prompt(\"Name of stack:\", sds.openStackWithName.bind(sds));\n\t\t\t\t\tworld.addFramedMorph(sds, 'WebCards', pt(333, 222));\n\t\t\t\t}); \n\t\t\t}],\n \n\t\t];\n\t},\n\n\tpreferencesSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[(Config.usePieMenus ? \"don't \" : \"\") + \"use pie menus\",\n\t\t\t\tfunction() { Config.usePieMenus = !Config.usePieMenus; }],\n\t\t\t[(Morph.prototype.suppressBalloonHelp ? \"enable balloon help\" : \"disable balloon help\"),\n\t\t\t\tthis.toggleBalloonHelp],\n\t\t\t[(HandMorph.prototype.useShadowMorphs ? \"don't \" : \"\") + \"show drop shadows\",\n\t\t\t\tfunction () { HandMorph.prototype.useShadowMorphs = !HandMorph.prototype.useShadowMorphs}],\n\t\t\t[(Config.showGrabHalo ? \"don't \" : \"\") + \"show bounds halos\",\n\t\t\t\tfunction () { Config.showGrabHalo = !Config.showGrabHalo}],\n\t\t\t[HandMorph.prototype.applyDropShadowFilter ? \n\t\t\t\t\"don't use filter shadows\" : \"use filter shadows (if supported)\",\n\t\t\t\tfunction () { \n\t\t\t\t\tHandMorph.prototype.applyDropShadowFilter = !HandMorph.prototype.applyDropShadowFilter}],\n\t\t\t[(Config.isSnappingToGrid ? \"[X]\": \"[]\") + \" snap to grid\",\n\t\t\t\tfunction(){Config.isSnappingToGrid = !Config.isSnappingToGrid}],\n\t\t\t[(Config.changeLocationOnSaveWorldAs ? \"[X]\": \"[]\") + \" change location on save world as\",\n\t\t\t\tfunction(){Config.changeLocationOnSaveWorldAs = !Config.changeLocationOnSaveWorldAs}],\n\t\t\t[\"set username\", this.askForUserName],\n\t\t];\n\t},\n\tpropertiesSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"choose display theme...\", this.chooseDisplayTheme],\n\t\t\t// is now set automatically...\n\t\t\t// [\"change title\", this, 'askForWorldTitle'],\n\t\t\t[\"add module requirements...\",\n\t\t\t\t function(){this.showAddWorldRequirementsMenu(evt.mousePoint)}],\n\t\t\t[\"remove module requirements...\",\n\t\t\t\t function(){this.showRemoveWorldRequirementsMenu(evt.mousePoint)}],\n\t\t\t[\"resize world\", this.resizeByUser],\n\t\t];\n\t},\n\n\tdeprecatedSubMenuItems: function(evt, menu) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"Tools\", [\n\t\t\t\t[\"Class Browser\", function(evt) { new SimpleBrowser().openIn(world, evt.point()); }],\n\t\t\t\t[\"File Browser\", function(evt) { new FileBrowser().openIn(world) }],\n\t\t\t\t[\"Object Hierarchy Browser\", function(evt) { new ObjectBrowser().openIn(world); }],\n\t\t\t\t[\"Console\", function(evt) {world.addFramedMorph(new ConsoleWidget(50).buildView(pt(800, 100)), \"Console\"); }],\n\t\t\t\t[\"XHTML Browser\", function(evt) { \n\t\t\t\t\tvar xeno = new XenoBrowserWidget('sample.xhtml');\n\t\t\t\t\txeno.openIn(world); }],\n\n\t\t\t]],\n\t\t\t[\"Scripting\", this.scriptingSubMenuItems()],\n\t\t\t[\"New subworld (LinkMorph)\", function(evt) { evt.hand.world().addMorph(new LinkMorph(null, evt.point()));}], \n\t\t\t[\"External link\", function(evt) { evt.hand.world().addMorph(new ExternalLinkMorph(URL.source, evt.point()));}],\n\t\t\t[\"authenticate for write access\", function() {\n\t\t\t\tnew WebResource(URL.source.withFilename('auth')).put();\n\t\t\t\t// sometimes the wikiBtn seems to break after an authenticate\n\t\t\t\tif (Config.showWikiNavigator) WikiNavigator.enableWikiNavigator(true); }],\n\n\t\t\t[\"save world as ... (XML)\", function() { this.promptAndSaveWorld() }],\n\t\t\t[\"save world (XML)\", function() { \n\t\t\t\tmenu.remove(); \n\t\t\t\tthis.saveWorld();\n\t\t\t}],\n\n\t\t];\n\t},\n\n\t\n\thelpSubMenuItems: function(evt) {\n\t\treturn\t[\n\t\t\t[\"Connect documentation\", function(evt) {\n\t\t\t\trequire('lively.bindings').toRun(function() {\n\t\t\t\t\tworld.openURLasText(new URL(\"http://lively-kernel.org/trac/wiki/ConnectHelp?format=txt\"), \"Connect documentation\");\n\t\t\t\t})}],\n\t\t\t[\"Command key help\", function(evt) {\n\t\t\t\tthis.openURLasText(new URL(\"http://lively-kernel.org/trac/wiki/CommandKeyHelp?format=txt\"), \"Command key help\"); }],\n\t\t];\n\t},\n\t\n\tdebuggingSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\tvar items = [\n\t\t\t[\"FrameRateMorph\", function(evt) {\n\t\t\t\tvar m = world.addMorph(new FrameRateMorph(evt.point().extent(pt(160, 10)), \"FrameRateMorph\"));\n\t\t\t\tm.startSteppingScripts(); }],\n\t\t\t[\"EllipseMaker\", function(evt) {\n\t\t\t\tvar m = world.addMorph(new EllipseMakerMorph(evt.point()));\n\t\t\t\tm.startSteppingScripts(); }],\n\t\t\t['World serialization info', function() {\n\t\t\t\trequire('lively.persistence.Debugging').toRun(function() {\n\t\t\t\t\tvar json = lively.persistence.Serializer.serialize(world),\n\t\t\t\t\t\tprinter = lively.persistence.Debugging.Helper.listObjects(json);\n\t\t\t\t\tworld.addTextWindow(printer.toString());\n\t\t\t\t});\n\t\t\t}],\n\t\t\t['inspect ticking scripts', function() {\n\t\t\t\tworld.inspectScheduledActions();\n\t\t\t}],\n\t\t\t[\"Enable profiling\", function() {\n\t\t\t\tConfig.debugExtras = true;\n\t\t\t\tlively.lang.Execution.installStackTracers(); }],\n\t\t\t[\"Call Stack Viewer\", function(evt) { \n\t\t\t\tif (Config.debugExtras) lively.lang.Execution.showStack(\"use viewer\");\n\t\t\t\telse new StackViewer(this).openIn(world); }],\n\t\t\t[\"restart system\", this.restart],\n\t\t];\n\n\n\t\tif (!Config.debugExtras) return items;\n\n\t\tvar index = -1;\n\t\tfor (var i=0; i> pasteComponentFromXMLStringIntoFabrik\n\t// TODO refactor\n\tpasteFromSource: function(source){\n\t\tvar copier = new ClipboardCopier();\n\t\tcopier.pastePosition = this.pastePosition();\n\t\tcopier.pasteMorphsFromSource(source, this.pasteDestinationMorph());\n\t},\n\t\n\tcopySelectionAsXMLString: function() {\n\t\tif (!this.currentSelection) {\n\t\t\tconsole.log(\"WorldMorph: don't know what to copy\")\n\t\t\treturn\n\t\t}\n\t\tvar selectedMorphs = this.currentSelection.selectedMorphs\n\t\tif (selectedMorphs.length == 0) {\n\t\t\tconsole.log(\"WorldMorph: selection is empty\")\n\t\t\treturn \n\t\t};\n\t\treturn new ClipboardCopier().copyMorphsAsXMLString(selectedMorphs)\n\t},\n\n\tpasteDestinationMorph: function() {\n\t\treturn this;\n\t},\n\t\n\t\n},\n'Keyboard Events',{\n\n\ttakesKeyboardFocus: Functions.True,\n\t\n\tonKeyDown: function(evt) {\n\t\t// alert(\"WorldMorph onKeyDown \" + this + \" --- \" + evt + \" char: \" + evt.getKeyChar() )\n\t\tvar key = evt.getKeyChar();\n\t\tif (! key.toLowerCase)\n\t\t\treturn;\n\n\t\tkey = key.toLowerCase();\n\n\t\tif ( evt.isAltDown()) {\n\t\t\tif (key == 'c') {\n\t\t\t\tthis.doCopyStyle()\n\t\t\t\tevt.stop()\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (key == 'v') {\n\t\t\t\tthis.doPasteStyle()\n\t\t\t\tevt.stop()\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif ( evt.isCommandKey() && evt.isShiftDown()) {\n\t\t\tif (key == 'f') {\n\t\t\t\tvar world = this;\n\t\t\t\trequire('lively.ide').toRun(function(unused, ide) {\n\t\t\t\t\tworld.prompt(\"browse references in source\", function(whatToSearch) {\n\t\t\t\t\t\tide.startSourceControl().browseReferencesTo(whatToSearch);\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (key == 'b') {\n\t\t\t\t// for safari where without shift is blocked\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.SystemBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (evt.isCommandKey() && !evt.isShiftDown()) {\n\t\t\tif (key == 'b') {\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.SystemBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 'l') { // (L)ocal code browser\n\t\t\t\t// new ConsoleWidget().open();\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.LocalCodeBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 'k') { // Workspace\n\t\t\t\tthis.addTextWindow(\"Workspace\");\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 's') { // save\n\t\t\t\tif (!this.isProtectedWorld()) {\n\t\t\t\t\tthis.saveWorldWithJSON();\n\t\t\t\t} else {\n\t\t\t\t\tthis.setStatusMessage(\"Warning: Did not save world, because it is protected!\", Color.red, 3)\n\t\t\t\t}\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\n\t\t\t}\n\t\t}\n\t\treturn ClipboardHack.tryClipboardAction(evt, this);\n\t},\n\t\n\tonKeyPress: function(evt) {\n\t\t// do nothing\n\t\t// console.log(\"World onKeyPress \" + evt + \" char: \" + evt.getKeyChar())\n\t\treturn false;\n\t},\n\n\tonKeyUp: function(evt) {\n\t\t// do nothing\n\t\t// console.log(\"World onKeyUp \" + evt + \" char: \" + evt.getKeyChar())\n\t\treturn false\n\t},\n},\n'Commands',{\n\n\tdoCopy: function() {\n\t\tvar source = this.copySelectionAsXMLString();\n\t\tTextMorph.clipboardString = source;\n\t},\n\t\n\tdoPaste: function() {\n\t\tif (TextMorph.clipboardString) {\n\t\t\t// console.log(\"paste morphs...\")\n\t\t\tthis.pasteFromSource(TextMorph.clipboardString);\n\t\t}\n\t},\n\tdoCopyStyle: function() {\n\t\tvar target = this.firstHand().keyboardFocus;\n\t\tif (this.currentSelection && this.currentSelection.selectedMorphs.length > 0) {\n\t\t\ttarget = this.currentSelection.selectedMorphs[0]\n\t\t};\n\n\t\talert('copy style: ' + target)\n\t\tif (target)\n\t\t\tnew StyleCopier().copyFromMorph(target)\n\t\telse\n\t\t\talert(\"no target\")\n\t},\n\tdoPasteStyle: function() {\n\t\tvar targets\n\t\tif (this.currentSelection && this.currentSelection.selectedMorphs.length > 0) {\n\t\t\ttargets = this.currentSelection.selectedMorphs\n\t\t} else {\n\t\t\ttargets = [this.firstHand().keyboardFocus];\n\t\t}\n\t\ttargets.forEach(function(ea){\n\t\t\tnew StyleCopier().pasteToMorph(ea)\n\t\t})\t\n\t},\n\n\n\t\n\tdoCut: function() {\n\t\tconsole.log(\"cut selection\")\n\t\tthis.doCopy();\n \t\tif (this.currentSelection) \n\t\t\tthis.currentSelection.remove();\n\t},\n},\n'local code', {\n\tgetChangeSet: function() {\n\t\treturn ChangeSet.fromWorld(this);\n\t},\n\tsetChangeSet: function(cs) {\n\t\tcs.addHookTo(cs.findOrCreateDefNodeOfWorld(this.rawNode));\n\t},\n\n\tgetCodeNode: function() {\n\t\tvar codeElement = Query.find('./svg:defs/*[local-name()=\"code\"]', this.rawNode);\n\t\treturn codeElement;\n\t},\n\treplaceCodeNode: function(newCodeNode) {\n\t\tthis.getDefsNode().replaceChild(this.getCodeNode(), newCodeNode);\n\t\treturn newCodeNode;\n\t},\n\n\n\n},'signals',{\n\tsignalGeometryChange: function() {\n\t\tsignal(this, 'geometryChanged')\n\t\t// don't go to the submorphs\n\t},\n\n})\n\n\nObject.extend(WorldMorph, { \n worldCount: 0,\n \n currentWorld: null,\n \n current: function() {\n return WorldMorph.currentWorld;\n }\n});\n\n\n\n/**\n * @class HandMorph\n * Since there may be multiple users manipulating a Morphic world\n * simultaneously, we do not want to use the default system cursor. \n */ \n\nMorph.subclass(\"HandMorph\", \n'default properties', { \n documentation: \"Defines a visual representation for the user's cursor.\",\n applyDropShadowFilter: !!Config.useDropShadow,\n dropShadowFilter: \"url(#DropShadowFilter)\",\n useShadowMorphs: Config.useShadowMorphs,\n\n shadowOffset: pt(8,8),\n handleOnCapture: false,\n logDnD: Config.logDnD,\n grabHaloLabelStyle: {fontSize: Math.floor((Config.defaultFontSize || 12) *0.85), padding: Rectangle.inset(0)},\n\n},\n'Basic',{\n initialize: function($super, local) {\n $super(new lively.scene.Polygon([pt(0,0), pt(10, 8), pt(4,9), pt(8,16), pt(4,9), pt(0, 12)]));\n\t\tthis.applyStyle({fill: local ? Color.primary.blue : Color.primary.red, borderColor: Color.black, borderWidth: 1});\n\t\n this.isLocal = local;\n\n this.keyboardFocus = null;\n this.mouseFocus = null;\n\t\tthis.mouseFocusChanges_ = 0; // count mouse focus changes until reset\n this.mouseOverMorph = null;\n this.lastMouseEvent = null;\n this.lastMouseDownPoint = pt(0,0);\n this.lastMouseDownEvent = null;\n this.hasMovedSignificantly = false;\n this.grabInfo = null;\n \n this.mouseButtonPressed = false;\n\n this.keyboardFocus = null; \n\n this.priorPoint = null;\n this.owner = null;\n\t\tthis.boundMorph = null; // surrounds bounds\n\t\tthis.layoutChangedCount = 0; // to prevent recursion on layoutChanged\n return this;\n },\n\n\tid: function() {\n\t\tif (!this.rawNode) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn this.rawNode.getAttribute(\"id\");\n\t},\n\n world: function() {\n return this.owner;\n },\n},\n'Looks',{\n\n lookNormal: function(morph) {\n this.shape.setVertices([pt(0,0), pt(10, 8), pt(4,9), pt(8,16), pt(4,9), pt(0, 12)]);\n },\n\t\n\tlookTouchy: function(morph) {\n\t\t// Make the cursor look polygonal to indicate touch events go to pan/zoom\n\t\tvar n = 5, r = 10, theta = 2*Math.PI/n;\n\t\tvar verts = [0, 1, 2, 3, 4, 0].map(function(i) { return Point.polar(r, i*theta).addXY(20,0) });\n\t\tthis.shape.setVertices(verts);\n },\n\n\n lookLinky: function(morph) {\n this.shape.setVertices([pt(0,0), pt(18,10), pt(10,18), pt(0,0)]);\n },\n\n\tlookLikeAnUpDownArrow: function() {\n\t\t// /\\\n\t\t// /_ _\\\n\t\t// _||_\n\t\t// \\ /\n\t\t// \\/\n\t\tvar verts = [\n\t\t\tpt(8.0,0.0), pt(16.0,8.0), pt(12.0,8.0), pt(12.0,16.0), pt(16.0,16.0),\n\t\t\tpt(8.0,24.0), pt(0.0,16.0), pt(4.0,16.0), pt(4.0,8.0), pt(0.0,8.0)\n\t\t];\n\t\tthis.shape.setVertices(verts);\n\t},\n},\n'Event Registering',{\n\taddOrRemoveEvents: function(morphOrNode, eventNames, isRemove) {\n\t\tvar node = morphOrNode.rawNode || morphOrNode;\n\t\tvar selector = isRemove ? 'removeEventListener' : 'addEventListener';\n\t\teventNames.forEach(function(name) { \n node[selector](name, (!UserAgent.isIE ? this : this.handleEvent.bind(this)), this.handleOnCapture);\n\t\t}, this);\n\t},\n\t\n registerForEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.basicInputEvents);\n },\n\n unregisterForEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.basicInputEvents, true);\n },\n \n registerForKeyboardEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.keyboardEvents);\n },\n\n unregisterForKeyboardEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.keyboardEvents, true);\n },\n\n},\n'Focus',{\n resetMouseFocusChanges: function() {\n\t\tvar result = this.mouseFocusChanges_;\n\t\tthis.mouseFocusChanges_ = 0;\n\t\treturn result;\n },\n\n setMouseFocus: function(morphOrNull) {\n //console.log('setMouseFocus: ' + morphOrNull);\n\t\tthis.mouseFocus = morphOrNull;\n\t\t// this.setFill(this.mouseFocus ? Color.primary.blue.lighter(2) : Color.primary.blue);\n\t\tthis.mouseFocusChanges_ ++;\n },\n \n setKeyboardFocus: function(morphOrNull) {\n if (this.keyboardFocus === morphOrNull) return;\n\n if (this.keyboardFocus != null) {\n // console.log('blur %s', this.keyboardFocus);\n this.keyboardFocus.onBlur(this);\n this.keyboardFocus.setHasKeyboardFocus(false);\n }\n \n this.keyboardFocus = morphOrNull; \n \n if (this.keyboardFocus) {\n this.keyboardFocus.onFocus(this);\n }\n },\n \n},\n'Event Handling',{\n\t// this is the DOM Event callback\n\thandleEvent: function HandMorph$handleEvent(rawEvt) {\n\t\tvar evt = new Event(rawEvt);\n\t\t// for mutliple worlds since keyboard events can only be registered for entire documentElement\n\t\tif (rawEvt.world && rawEvt.world != this.world())\n\t\t\treturn evt;\n\t\trawEvt.world = this.world();\n\t\tevt.setCanvas(this.canvas());\n\t\tevt.hand = this;\n\t\t//if(Config.showLivelyConsole) console.log(\"event type = \" + rawEvt.type + \", platform = \" + window.navigator.platform);\n\n\t\tlively.lang.Execution.resetDebuggingStack();\n\t\tswitch (evt.type) {\n\t\t\tcase \"MouseWheel\":\n\t\t\tcase \"MouseMove\":\n\t\t\tcase \"MouseDown\":\n\t\t\tcase \"MouseUp\":\n\t\t\t\tthis.handleMouseEvent(evt);\n\t\t\t\tbreak;\n\t\t\tcase \"KeyDown\":\n\t\t\tcase \"KeyPress\": \n\t\t\tcase \"KeyUp\":\n\t\t\t\tthis.handleKeyboardEvent(evt);\n\t\t\t\tbreak;\n\t\t\tcase \"touchstart\":\n\t\t\tcase \"touchmove\":\n\t\t\tcase \"touchend\": \n\t\t\tcase \"touchcancel\":\n\t\t\t\tthis.handleTouchEvent(evt);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"unknown event type \" + evt.type);\n\t\t}\n\t\tevt.stopPropagation();\n\t\treturn evt; // for touch development FIXME remove\n\t}.logErrors('Event Handler'),\n\n armProfileFor: function(evtType) { \n\t\tthis.profileArmed = evtType; // either \"MouseDown\" or \"MouseUp\"\n },\n\n\tmakeANullMove: function() {\n\t\t// Process a null mouseMove event -- no change in x, y\n\t\t// Allows simulations to respond where, eg, a morph moves under the mouse\n\t\t// Note: Fabrik generates also Mouse events with newFakeMouseEvent; to be merged\n\t\tvar last = this.lastMouseEvent;\n\t\tif (!last) return;\n\t\tvar nullMove = new Event(last.rawEvent);\n\t\tnullMove.type = \"MouseMove\";\n\t\tnullMove.hand = this;\n\t\t// console.log(\"last = \" + Object.inspect(this.lastMouseEvent));\n\t\t// console.log(\"null = \" + Object.inspect(nullMove));\n\t\tthis.reallyHandleMouseEvent(nullMove);\n\t\tthis.lastMouseEvent = last; // Restore -- necess??\n\t},\n\n\thandleMouseEvent: function HandMorph$handleMouseEvent(evt) {\n\t\tif(!Config.debugExtras || !this.profileArmed || this.profileArmed != evt.type) {\n\t\t\t// Profile not armed or event doesnt match\n\t\t\treturn this.reallyHandleMouseEvent(evt);\n\t\t}\n\t\t// Run profile during handling of this event\n\t\tthis.profileArmed = null; // Only this once\n\t\tvar result;\n\t\tlively.lang.Execution.trace(function() { result = this.reallyHandleMouseEvent(evt) }.bind(this), this.profilingOptions );\n\t\treturn result;\n\t},\n\thandleTouchEvent: function(evt) {\n\t\t// to be implemented \n\t\t// console.log('handle touch event ')\n\t},\n\n\n\treallyHandleMouseEvent: function HandMorph$reallyHandleMouseEvent(evt) { \n\t\t// console.log(\"reallyHandleMouseEvent \" + evt + \" focus \" + this.mouseFocus);\n\t\t// var rawPosition = evt.mousePoint;\n\t\tvar world = this.owner;\n\t\tevt.mousePoint = evt.mousePoint.matrixTransform(world.getTransform().createInverse()); // for scaling\n\t\tevt.setButtonPressedAndPriorPoint(this.mouseButtonPressed, \n\t\t\t\t\t this.lastMouseEvent ? this.lastMouseEvent.mousePoint : null);\n\t\t//-------------\n\t\t// mouse move\n\t\t//-------------\n\t\tif (evt.type == \"MouseMove\" || evt.type == \"MouseWheel\") { // it is just a move\n\t\t\tthis.setPosition(evt.mousePoint);\n\t\t\t\n\t\t\tif(evt.isShiftDown())\n\t\t\t\tthis.alignToGrid();\n\t\t\t\n\t\t\tthis.updateGrabHalo();\n\t\t\t\n\t\t\tif (evt.mousePoint.dist(this.lastMouseDownPoint) > 10) { \n\t\t\t\tthis.hasMovedSignificantly = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.mouseFocus) { // if mouseFocus is set, events go to that morph\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t} else if (world) {\n\t\t\t\tvar receiver = world.morphToReceiveEvent(evt);\n\t\t\t\t// console.log(\"found receiver: \" + receiver)\n\t\t\t\tif (this.checkMouseOverAndOut(receiver, evt)) {\t // mouseOverMorph has changed...\n\t\t\t\t\tif (!receiver || !receiver.canvas()) return false;\t// prevent errors after world-switch\n\t\t\t\t\t// Note if onMouseOver sets focus, it will get onMouseMove\n\t\t\t\t\tif (this.mouseFocus) this.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t\t\telse if (!evt.hand.hasSubmorphs()) world.captureMouseEvent(evt, false); \n\t\t\t\t} else if (receiver) receiver.captureMouseEvent(evt, false);\n\t\t\t}\n\t\t\tthis.lastMouseEvent = evt;\n\t\t\treturn true;\n\t\t} \n\n\t\n\t\t//-------------------\n\t\t// mouse up or down\n\t\t//-------------------\n\t\tif (!evt.mousePoint.eqPt(this.position())) { // Only happens in some OSes\n\t\t\t// and when window wake-up click hits a morph\n\t\t\tthis.moveBy(evt.mousePoint.subPt(this.position())); \n\t\t}\n\n\t\tthis.mouseButtonPressed = (evt.type == \"MouseDown\"); \n\t\tthis.setBorderWidth(this.mouseButtonPressed ? 2 : 1);\n\t\tevt.setButtonPressedAndPriorPoint(this.mouseButtonPressed, this.lastMouseEvent ? this.lastMouseEvent.mousePoint : null);\n\t\n\t\tif (this.mouseFocus != null) {\n\t\t\tif (this.mouseButtonPressed) {\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t\tthis.lastMouseDownPoint = evt.mousePoint; \n\t\t\t} else {\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.hasSubmorphs() && (evt.type == \"MouseDown\" || this.hasMovedSignificantly)) {\n\t\t\t\t// If laden, then drop on mouse up or down\n\t\t\t\tvar m = this.topSubmorph();\n\t\t\t\tvar receiver = world.morphToGrabOrReceiveDroppingMorph(evt, m);\n\t\t\t\t// For now, failed drops go to world; later maybe put them back?\n\t\t\t\tthis.dropMorphsOn(receiver || world);\n\t\t\t} else {\n\t\t\t\t// console.log(\"hand dispatching event %s to owner %s\", evt, this.owner);\n\t\t\t\t// This will tell the world to send the event to the right morph\n\t\t\t\t// We do not dispatch mouseup the same way -- only if focus gets set on mousedown\n\t\t\t\tif (evt.type == \"MouseDown\") world.captureMouseEvent(evt, false);\n\t\t\t}\n\t\t\tif (evt.type == \"MouseDown\") {\n\t\t\t\tthis.lastMouseDownPoint = evt.mousePoint;\n\t\t\t\tthis.lastMouseDownEvent = evt;\n\t\t\t\tthis.hasMovedSignificantly = false; \n\t\t\t}\n\t\t}\n\t\tthis.lastMouseEvent = evt; \n\t\treturn true;\n\t},\n},\n'Misc',{\t\n checkMouseUpIsInClickTimeSpan: function(mouseUpEvent) {\n\t\t// console.log(\"checkMouseUpIsInClickTimeSpan \" + this.lastMouseDownEvent.timeStamp )\n\t\tif (!this.lastMouseDownEvent || !mouseUpEvent)\n\t\t\treturn false;\n\t\treturn (mouseUpEvent.timeStamp - this.lastMouseDownEvent.timeStamp) < (400)\n\t},\n\n checkMouseOverAndOut: function(newMouseOverMorph, evt) {\n\t\tif (newMouseOverMorph === this.mouseOverMorph) return false;\n\n\t\t// if over a new morph, send onMouseOut, onMouseOver\n\t\tif (this.mouseOverMorph) this.mouseOverMorph.onMouseOut(evt);\n\t\tthis.mouseOverMorph = newMouseOverMorph;\n\t\t// console.log('msOverMorph set to: ' + Object.inspect(this.mouseOverMorph));\n\t\tif (this.mouseOverMorph) this.mouseOverMorph.onMouseOver(evt);\n\t\treturn true;\n\t},\n\n layoutChanged: function($super) {\n\t\tthis.layoutChangedCount ++;\n\t\ttry {\n\t\t\t$super();\n\t\t\tif (this.layoutChangedCount == 1) {\n\t\t\t\tConfig.showGrabHalo && this.updateGrabHalo();\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.layoutChangedCount --;\n\t\t}\n },\n},\n'Keyboard Events',{\n\tisKeyDown: function(character) {\n\t\tif (!this.keysDown)\n\t\t\treturn false;\n\t\treturn this.keysDown[character]\n\t},\n\t\n\tforgetKeyDown: function(evt) {\n\t\tif (!this.keysDown)\n\t\t\treturn;\n\t\tthis.keysDown[evt.getKeyChar()] = false;\n\t\t// hack, around weired events when command is pressed\n\t\tif (evt.getKeyCode() == 91) {\n\t\t\t// console.log(\"clear keydown list...\")\n\t\t\tthis.keysDown = {};\n\t\t\n\t\t};\n\t},\n\n\trememberKeyDown: function(evt) {\n\t\tif (!this.keysDown) {\n\t\t\tthis.keysDown = {};\n\t\t};\n \t\t//console.log(\"remember KeyDown \" + evt.getKeyChar())\n\t\tthis.keysDown[evt.getKeyChar().toUpperCase()] = true;\n\t},\n\n handleKeyboardEvent: function(evt) { \n\t\t// console.log(\"event: \" + evt )\n\t\tif(evt.type == \"KeyUp\") {\n \t\t\tthis.forgetKeyDown(evt);\t\t\t\n\t\t};\n if (this.hasSubmorphs()) {\n if (evt.type == \"KeyDown\" && this.moveSubmorphs(evt)) return;\n else if (evt.type == \"KeyPress\" && this.transformSubmorphs(evt)) return;\n }\n\t\tvar consumed = false;\n // manual bubbling up b/c the event won't bubble by itself\n\t\tvar world = this.world();\n for (var responder = this.keyboardFocus || world; responder != null; responder = responder.owner || world) {\n\t\t\tif (responder.takesKeyboardFocus()) {\n var handler = responder[evt.handlerName()];\n if (handler) {\n if (handler.call(responder, evt)) {\n\t\t\t\t\t\tconsumed = true;\n break; // event consumed?\t\t\n\t\t\t\t\t}\n }\n }\n\t\t\tif (responder == world) break;\n }\n\n\t\tif (!consumed) {\n\t\t\t// console.log(\"not consumed \" + evt)\n\t\t\t// the single command key evt \n\t\t\tif (evt.isCommandKey()) // rk: what is that supposed to do?\n\t\t\t\tClipboardHack.selectPasteBuffer();\t\t\t\n\t\t\t\t\n\t\t\t// remember key down for mouse events\n\t\t\tif(evt.type == \"KeyPress\") {\n\t\t\t\tthis.rememberKeyDown(evt);\n\t\t\t};\n\t\t};\n\t\tthis.blockBrowserKeyBindings(evt);\n },\n\t\n blockBrowserKeyBindings: function(evt) {\n\t\tswitch (evt.getKeyCode()) {\n\t\t\tcase Event.KEY_SPACEBAR: // [don't] scroll\n\t\t \t// stop keypress but don't try to stop preceeding keydown,\n\t\t \t// which would prevent keypress from firing and being handled by Text etc\n\t\t \tif (evt.type == \"KeyPress\") evt.stop();\n\t\t \tbreak;\n\t\t case Event.KEY_BACKSPACE: // [don't] go to the previous page \n\t\t \tevt.stop();\n\t\t \tbreak;\n\t\t\tcase 22:\n\t\t\tcase 3:\n\t\t\tcase 24:\n\t\t\t\tif (evt.isCtrlDown() && evt.type == \"KeyPress\") \n\t\t\t\t\tevt.preventDefault(); // ctrl+x, ctrl+c, or ctrl+v pressed\n\t\t\t\tbreak;\n\t\t\t}\n\t\tswitch (evt.getKeyChar()) {\n\t\t\tcase \"[\":\n\t\t\tcase \"]\":\n\t\t \tif (evt.isMetaDown() && evt.type == \"KeyPress\") {\n\t\t\t\t\t// Safari would want to navigate the history\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tbreak;\n\t\t }\n\t\t}\t\n },\n},\n'Geometry',{\n\tbounds: function($super) {\n\t\t// account for the extra extent of the drop shadow\n\t\t// FIXME drop shadow ...\n\t\treturn this.shadowMorph ? $super().expandBy(this.shadowOffset.x) : $super();\n\t},\n\n\tgetInsertPositionFor: function(m, isFront) {\n\t\tif (this.submorphs.length == 0) return this.shape.rawNode;\n\t\treturn isFront ? this.submorphs.last().rawNode : this.submorphs.first().rawNode;\n\t},\n\n toString: function($super) { \n var superString = $super();\n var extraString = Strings.format(\", local=%s,id=%s\", this.isLocal, this.id());\n if (!this.hasSubmorphs()) \n\t\t\treturn superString + \", an empty hand\" + extraString;\n return Strings.format(\"%s, a hand carrying %s%s\", superString, this.topSubmorph(), extraString);\n },\n\n\tsetPosition: function($super, pos) {\n\t\t$super(pos);\n\t\tif (this.hasSubmorphs())\n\t\t\tthis.scrollDuringDrag()\n\t\treturn pos;\n\t},\n},\n'Indicator',{\n\tremoveIndicatorMorph: function() {\n\t\tif (!this.indicatorMorph)\n\t\t\treturn;\n\t\tthis.indicatorMorph.remove();\n\t\tthis.indicatorMorph = undefined;\n\t},\n\n\tensureIndicatorMorph: function() {\n\t\tif (this.indicatorMorph)\n\t\t\treturn this.indicatorMorph;\n\t\tvar morph = new TextMorph(new Rectangle(0,0,100,20));\n\t\tmorph.setPosition(this.shape.bounds().bottomRight().addPt(pt(-5,-5)))\n\t\tmorph.ignoreEvents();\n\t\tmorph.isEpimorph = true;\n\t\tmorph.setBorderWidth(0);\n\t\tmorph.setStrokeOpacity(0);\n\t\tmorph.setFill(null);\n\t\tthis.indicatorMorph = morph;\n\t\tthis.addMorph(morph);\n\t\treturn morph\n\t},\n\n\thasSubmorphs: function() {\n\t\tif (this.submorphs.length == 0)\n\t\t\treturn false;\n\t\telse\n\t\t\treturn this.submorphs.reject(function(ea) {return ea.isEpimorph}).length != 0;\n\t},\n},\n'Scrolling',{\n\tscrollDuringDrag: function(counter) {\n\t\tvar scrollSpeed = 0.3; // should go into config options?\n\t\tvar maxSteps = 30;\n\t\t\n\t\tvar world = this.world();\n\t\tvar wb = world.windowBounds();\n\t\tvar pos = this.getPosition();\n\t\tcounter = counter || 1;\n\t\t\n\t\tvar worldScale = world.getScale();\n\t\tvar steps = counter * scrollSpeed * worldScale;\n\t\tsteps = Math.min(steps, maxSteps);\n\t\tvar animate = false;\n\t\tvar self = this;\n\t\t\n\t\tvar scroll = function(delta) {\n\t\t\tvar oldPos = pt(Global.scrollX, Global.scrollY)\n\t\t\tGlobal.scrollBy(delta.x, delta.y);\t\t\tvar newPos = pt(Global.scrollX, Global.scrollY)\n\t\t\tvar scrollDelta = newPos.subPt(oldPos).scaleBy(1 / worldScale);\n\t\t\tself.moveBy(scrollDelta.scaleBy(1))\n\t\t\tanimate = true;\n\t\t};\n\t\tvar offset = 50\n\t\tif (pos.x + offset > wb.right()) scroll(pt(steps,0));\n\t\tif (pos.x - offset < wb.left()) scroll(pt(-steps,0));\n\t\tif (pos.y - offset < wb.top()) scroll(pt(0, - steps));\n\t\tif (pos.y + offset > wb.bottom()) scroll(pt(0, steps))\n\t\tif (animate) {\n\t\t\t(function(){self.scrollDuringDrag( counter + 1)}).delay()\t\n\t\t}\n\t}\n},\n'Fabrik Extension (DEPRECATED)',{\n changed: function($super, morph) {\n $super();\n this.globalPosition = this.getPosition();\n this.submorphs.forEach(function(ea){\n // console.log(\"changed \"+ ea);\n ea.changed(\"globalPosition\", this.getPosition());\n }, this);\n },\n});\n\nMorph.subclass('LinkMorph', {\n\n documentation: \"two-way hyperlink between two Lively worlds\",\n helpText: \"Click here to enter or leave a subworld.\\n\" +\n \"Use menu 'grab' to move me. Drag objects\\n\" +\n \"onto me to transport objects between worlds.\",\n openForDragAndDrop: false,\n suppressHandles: true,\n\tstyle: {\n\t\tborderColor: Color.black, \n\t\tfill: lively.lang.let(lively.paint, function(g) { \n\t\t\treturn new g.RadialGradient([new g.Stop(0, Color.blue.lighter()) , new g.Stop(0.5, Color.blue), \n\t\t\tnew g.Stop(1, Color.blue.darker())], pt(0.4, 0.2))})\n\t},\n \n\tinitialize: function($super, otherWorld, initialPosition) {\n\t\t// In a scripter, type: world.addMorph(new LinkMorph(null))\n\n\t\t// Note: Initial position can be specified either as a rectangle or point.\n\t\t// If no position is specified, place the icon in the lower left corner\n\t\t// of the screen.\n\t\tinitialPosition = initialPosition || WorldMorph.current().bounds().bottomLeft().addXY(50, -50);\n\t\t$super(new lively.scene.Ellipse(initialPosition, 25));\n\t\tvar bounds = this.shape.bounds();\n\n\t\t// Make me look a bit like a world\n\t\t[new Rectangle(0.15,0,0.7,1), new Rectangle(0.35,0,0.3,1), new Rectangle(0,0.3,1,0.4)].forEach(function(each) {\n\t\t\t// Make longitude / latitude lines\n\t\t\tvar lineMorph = new Morph(new lively.scene.Ellipse(bounds.scaleByRect(each)));\n\t\t\tlineMorph.applyStyle({fill: null, borderWidth: 1, borderColor: Color.black}).ignoreEvents();\n\t\t\tthis.addMorph(lineMorph);\n\t\t}, this);\n\n\t\tif (!otherWorld) {\n\t\t\tthis.myWorld = this.makeNewWorld(this.canvas());\n\t\t\tthis.addPathBack();\n\t\t} else {\n\t\t\tthis.myWorld = otherWorld;\n\t\t}\n\t\treturn this;\n\t},\n \n\tmakeNewWorld: function(canvas) {\n\t\treturn new WorldMorph(canvas);\n\t},\n \n\taddPathBack: function() {\n\t\tvar pathBack = new LinkMorph(WorldMorph.current(), this.bounds().center());\n\n\t\tpathBack.setFill(lively.lang.let(lively.paint, function(gfx) {\n\t\t\treturn new gfx.RadialGradient([new gfx.Stop(0, Color.orange), \n\t\t\tnew gfx.Stop(0.5, Color.red), \n\t\t\tnew gfx.Stop(1, Color.red.darker(2))],\n\t\t\tpt(0.4, 0.2));\n\t\t}));\n\n\t\tthis.myWorld.addMorph(pathBack);\n\t\treturn pathBack;\n\t},\n \n\tonDeserialize: function() {\n\t\t//if (!this.myWorld) \n\t\tthis.myWorld = WorldMorph.current(); // a link to the current world: a reasonable default?\n\t},\n\n\thandlesMouseDown: function(evt) {\n\t\treturn true; \n\t},\n\n\tonMouseDown: function(evt) {\n\t\tthis.enterMyWorld(evt); \n\t\treturn true; \n\t},\n\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.addItem([\"publish linked world as ... \", function() { \n\t\tthis.world().prompt(\"world file (.xhtml)\", this.exportLinkedFile.bind(this)); }]);\n\t\tmenu.replaceItemNamed(\"package\", [\"package linked world\", function(evt) {\n\t\t\tnew PackageMorph(this.myWorld).openIn(this.world(), this.bounds().topLeft()); this.remove()} ]);\n\t\treturn menu;\n\t},\n\n\tenterMyWorld: function(evt) { // needs vars for oldWorld, newWorld\n\t\tcarriedMorphs = [];\n\n\t\t// Save, and suspend stepping of, any carried morphs\n\t\tevt.hand.unbundleCarriedSelection();\n\t\tevt.hand.carriedMorphsDo( function (m) {\n\t\t\tm.suspendAllActiveScripts();\n\t\t\tcarriedMorphs.splice(0, 0, m);\n\t\t\tevt.hand.shadowMorphsDo( function(m) { m.stopAllStepping(); });\n\t\t\tevt.hand.showAsUngrabbed(m);\n\t\t});\n\t\tevt.hand.removeAllMorphs();\n\t\tthis.hideHelp();\n\t\tthis.myWorld.changed();\n\t\tvar oldWorld = WorldMorph.current();\n\t\toldWorld.onExit(); \n\n\t\tif (Config.suspendScriptsOnWorldExit)\n\t\t\toldWorld.suspendAllActiveScripts();\n\n\t\tvar canvas = oldWorld.canvas();\n\t\toldWorld.remove(); // some SVG calls may stop working after this point in the old world.\n\n\t\tconsole.log('left world %s through %s', oldWorld, this);\n\n\t\t// display world first, then add hand, order is important!\n\t\tvar newWorld = this.myWorld;\n\t\tif (newWorld.owner) {\n\t\t\tconsole.log(\"new world had an owner, removing\");\n\t\t\tnewWorld.remove();\n\t\t}\n\n\t\tnewWorld.displayOnCanvas(canvas); // Becomes current at this point\n\n\t\tif (Config.suspendScriptsOnWorldExit) { \n\t\t\tnewWorld.resumeAllSuspendedScripts();\n\t\t}\n\n\t\tcarriedMorphs.forEach(function(m) {\n\t\t\tvar hand = newWorld.firstHand();\n\t\t\tm.resumeAllSuspendedScripts();\n\t\t\thand.addMorphAsGrabbed(m);\n\t\t});\n\n\t\tif (Config.showThumbnail) {\n\t\t\tvar scale = 0.1;\n\t\t\tif (newWorld.thumbnail) {\n\t\t\t\tconsole.log(\"disposing of a thumbnail\");\n\t\t\t\tnewWorld.thumbnail.remove();\n\t\t\t}\n\t\t\tnewWorld.thumbnail = Morph.makeRectangle(Rectangle.fromElement(canvas));\n\t\t\tnewWorld.thumbnail.setPosition(this.bounds().bottomRight());\n\t\t\tnewWorld.addMorph(newWorld.thumbnail);\n\t\t\tnewWorld.thumbnail.setScale(scale);\n\t\t\tnewWorld.thumbnail.addMorph(oldWorld);\n\t\t}\n\n\t\tif (carriedMorphs.length > 0) newWorld.firstHand().emergingFromWormHole = true; // prevent re-entering\n\t},\n \n\tonMouseOver: function($super, evt) {\n\t\tif (evt.hand.hasSubmorphs()) { // if hand is laden enter world bearing gifts\n\t\t\tif (!evt.hand.emergingFromWormHole) this.enterMyWorld(evt);\n\t\t} else {\n\t\t\t$super(evt);\n\t\t}\n\t},\n\n\tonMouseOut: function($super, evt) {\n\t\tevt.hand.emergingFromWormHole = false;\n\t\t$super(evt);\n\t},\n\n\tgetHelpText: function() {\n\t\treturn this.helpText;\n\t},\n\t\n\taddLabel: function(text) {\n\t\tvar label = new TextMorph(pt(110, 25).extentAsRectangle(), text).applyStyle({borderRadius: 10, borderWidth: 2});\n\t\tthis.addMorph(label);\n\t\tlabel.align(label.bounds().leftCenter(), this.shape.bounds().rightCenter().addXY(5, 0));\n\t\tlabel.linkToStyles(['raisedBorder']);\n\t\treturn label;\n\t},\n \n});\n\nLinkMorph.subclass('ExternalLinkMorph', {\n\n documentation: \"A link to a different web page, presumably containing another LK\",\n\n style: { borderColor: Color.black, fill: new lively.paint.RadialGradient([new lively.paint.Stop(0, Color.green), \n\t\t\t\t\t\t\t\t\t new lively.paint.Stop(1, Color.yellow)])},\n \n initialize: function($super, url, position) {\n\t\t$super(null, position || pt(0, 0));\n\t\tthis.url = url;\n\t\tthis.win = null; // browser window\n },\n\n makeNewWorld: Functions.Null, \n \n addPathBack: Functions.Null,\n\n\tenterMyWorld: function(evt) {\n\t\tif (evt.isCommandKey()) {\n\t\t\tthis.world().confirm(\"Leave current runtime to enter another page?\", function (answer) {\n\t\t\t\tif (answer) Global.location = this.url.toString();\n\t\t\t\telse console.log(\"cancelled loading \" + this.url);\n\t\t\t});\n\t\t} else {\n\t\t\tif (this.win && !this.win.closed) this.win.focus();\n\t\t\telse this.win = Global.window.open(this.url);\n\t\t}\n\t},\n \n getHelpText: function() {\n\t\treturn \"Click to enter \" + this.url;\n },\n\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.addItem([\"set link target...\", function() {\n\t\t\tthis.world().prompt(\"Set new target file\", function(answer) {\n\t\t\t\tthis.url = URL.source.withFilename(answer);\n\t\t\t}.bind(this), URL.source.toString());\n\t\t}]);\n\t\treturn menu;\n\t}\n \n});\n\n\n/**\n * Morpsh for Structuring and Layouting \n */\n\nMorph.subclass('BoxMorph', {\n\n documentation: \"Occupies a rectangular area of the screen, can be laid out\",\n\n initialize: function($super, initialBounds) {\n\t\t$super(new lively.scene.Rectangle(initialBounds));\n },\n\n});\n\nBoxMorph.subclass('ContainerMorph', {\n documentation: \"Box morph whose shape grows to contain all its submrphs\",\n\n\tinitialize: function($super,rect) {\n\t\t$super(rect);//new Rectangle(0,0,0,0));\n\t},\n\n initializeTransientState: function($super) {\n $super();\n this.priorExtent = this.innerBounds().extent();\n },\n\n\taddMorph: function($super, m, isFront) {\n\t\tvar ret = $super(m, isFront);\n\t\tvar submorphBounds = this.submorphBounds(true);\n\t\tif (submorphBounds)\n\t\t\tthis.shape.setBounds(submorphBounds.outsetByRect(this.padding));\n\t\treturn ret;\n\t},\n\n\tadjustForNewBounds: function ($super) {\n\t\t// borrowed from PanelMorph\n\t\t// Compute scales of old submorph extents in priorExtent, then scale up to new extent\n\t\t$super();\n\t\tvar newExtent = this.innerBounds().extent();\n\t\tvar scalePt = newExtent.scaleByPt(this.priorExtent.invertedSafely());\n\t\tthis.submorphs.forEach(function(sub) {\n\t\t\tsub.setPosition(sub.getPosition().scaleByPt(scalePt));\n\t\t\tsub.setExtent(sub.getExtent().scaleByPt(scalePt));\n\t\t});\n\t\tthis.priorExtent = newExtent;\n\t}, \n});\nMorph.subclass('PathMorph',\n'documentation', {\n\tdocumentation: 'Morph that has a path shape. Either a line or a curve. Editable. Hmmmm',\n},\n'settings', {\n\tsuppressGrabbing: false,\n\topenForDragAndDrop: false,\n\tstyle: {borderWidth: 1, borderColor: Color.black, fill: null},\n\tisCurve: false,\n},\n'initializing', {\n\tinitialize: function($super, verts) {\n\t\t$super(this.createPathShape(verts));\n\t},\n\tcreatePathShape: function(verts) {\n\t\tvar g = lively.scene,\n\t\t\tcmds = [new g.MoveTo(true, verts[0].x, verts[0].y)];\n\t\tfor (var i = 1; i < verts.length; i++)\n\t\t\tcmds.push(new g.LineTo(true, verts[i].x, verts[i].y));\n\t\treturn new g.Path(cmds);\n\t},\n},\n'accessing', {\n\tgetLength: function() { return this.shape.rawNode.getTotalLength() },\n\tgetPointAtLength: function(length) { return Point.ensure(this.shape.rawNode.getPointAtLength(length)) },\n\tgetRelativePoint: function(relativeLength) {\n\t\tvar pos = this.getPointAtLength(this.getLength() * relativeLength);\n\t\t// return this.world() ? this.worldPoint(pos).subPt(this.shape.bounds().topLeft()) : pos;\n\t\treturn pos.matrixTransform(this.getGlobalTransform())\n\t},\n\n\tenableInsertionPoints: function() { this.shape.showInsertionPoints = true },\n\tdisableInsertionPoints: function() { this.shape.showInsertionPoints = false },\n},\n'geometry computing', {\n\tpathBetweenRects: function(rect1, rect2) {\n\t\t// copied and adpated from graffle Raphael 1.2.1 - JavaScript Vector Library\n\t\tvar p = [{x: rect1.x + rect1.width / 2, y: rect1.y - 1},\n\t {x: rect1.x + rect1.width / 2, y: rect1.y + rect1.height + 1},\n\t {x: rect1.x - 1, y: rect1.y + rect1.height / 2},\n\t {x: rect1.x + rect1.width + 1, y: rect1.y + rect1.height / 2},\n\t {x: rect2.x + rect2.width / 2, y: rect2.y - 1},\n\t {x: rect2.x + rect2.width / 2, y: rect2.y + rect2.height + 1},\n\t {x: rect2.x - 1, y: rect2.y + rect2.height / 2},\n\t {x: rect2.x + rect2.width + 1, y: rect2.y + rect2.height / 2}];\n\t\tvar d = {}, dis = [];\n\t\tfor (var i = 0; i < 4; i++) {\n\t\t\tfor (var j = 4; j < 8; j++) {\n\t\t\t\tvar dx = Math.abs(p[i].x - p[j].x),\n\t\t\t\t\tdy = Math.abs(p[i].y - p[j].y);\n\t\t\t\tif ((i == j - 4) || (((i != 3 && j != 6) || \n\t\t\t\t\tp[i].x < p[j].x) && ((i != 2 && j != 7) || p[i].x > p[j].x) && ((i != 0 && j != 5) || \n\t\t\t\t\tp[i].y > p[j].y) && ((i != 1 && j != 4) || p[i].y < p[j].y))) {\n\t\t\t\t\t\tdis.push(dx + dy);\n\t\t\t\t\t\td[dis[dis.length - 1]] = [i, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t res = dis.length == 0 ? [0, 4] : d[Math.min.apply(Math, dis)];\n\n\t\tvar x1 = p[res[0]].x,\n\t\t\ty1 = p[res[0]].y,\n\t\t\tx4 = p[res[1]].x,\n\t\t\ty4 = p[res[1]].y,\n\t\t\tdx = Math.max(Math.abs(x1 - x4) / 2, 10),\n\t\t\tdy = Math.max(Math.abs(y1 - y4) / 2, 10),\n\t\t\tx2 = [x1, x1, x1 - dx, x1 + dx][res[0]].toFixed(3),\n\t\t\ty2 = [y1 - dy, y1 + dy, y1, y1][res[0]].toFixed(3),\n\t\t\tx3 = [0, 0, 0, 0, x4, x4, x4 - dx, x4 + dx][res[1]].toFixed(3),\n\t\t\ty3 = [0, 0, 0, 0, y1 + dy, y1 - dy, y4, y4][res[1]].toFixed(3);\n\n\t\tvar p1 = this.localize(pt(x1, y1)),\n\t\t\tc1 = this.localize(pt(x2, y2)),\n\t\t\tc2 = this.localize(pt(x3, y3)),\n\t\t\tp2 = this.localize(pt(x4, y4));\n\n\t\treturn [p1, c1, c2, p2];\n\t},\n},\n'converting', {\n\tconvertToLine: function() {\n\t\tthis.shape.setElements(this.shape.getElements().collect(function(e) {\n\t\t\treturn (e.charCode == 'M' || e.charCode == 'L') ? e : new lively.scene.LineTo(true, e.x, e.y);\n\t\t}));\n\t},\n\tconvertToCurve: function() {\n\t\tvar g = lively.scene, elements = this.shape.getElements().clone();\n\t\tfor (var i = 1; i < elements.length; i++) {\n\t\t\tvar e = elements[i], prev = elements[i-1];\n\t\t\t// do nothing if it is already a curve\n\t\t\tif (e.charCode == 'Q' || e.charCode == 'C' || e.charCode == 'S') continue;\n\t\t\tvar ptArr = this.pathBetweenRects(new Rectangle(prev.x,prev.y,0,0), new Rectangle(e.x,e.y,0,0)),\n\t\t\t\tc1 = ptArr[1],\n\t\t\t\tc2 = ptArr[2],\n\t\t\t\tp = ptArr[3];\n\t\t\telements[i] = new g.BezierCurve2CtlTo(true, p.x, p.y, c1.x, c1.y, c2.x, c2.y);\n\t\t}\n\t\tthis.shape.setElements(elements);\n\t},\n},\n'menu', {\n\ttoggleLineStyle: function() {\n\t\tthis.isCurve ? this.convertToLine() : this.convertToCurve();\n\t\tthis.isCurve = !this.isCurve;\n\t},\n\tsubMenuItems: function($super, evt) {\n\t\tvar items = $super(evt);\n\t\titems.unshift(['Convert to ' + (this.isCurve ? 'line' : 'curve'), this.toggleLineStyle.bind(this)]);\n\t\treturn items;\n\t},\n});\n\nMorph.subclass('PseudoMorph', {\n description: \"This hack to make various objects serializable, despite not being morphs\",\n \n\tinitialize: function($super) {\n\t\t$super(new lively.scene.Group());\n\t\tthis.setVisible(false);\n\t}\n\n});\n\n\nPseudoMorph.subclass('Invocation', {\n\n\tinitialize: function($super, actor, scriptName, argIfAny) {\n\t\t$super();\n\t\tthis.actor = actor;\n\t\tthis.scriptName = scriptName;\n\t\tthis.argIfAny = argIfAny; // better be primitive\n\t},\n\n\texec: function Invocation$exec() {\n\t\tif (!this.actor) {\n\t\t\tconsole.warn(\"no actor on script %s\", this);\n\t\t\treturn null;\n\t\t}\n\t\tvar func = this.actor[this.scriptName];\n\t\tif (func) {\n\t\t\treturn func.call(this.actor, this.argIfAny);\n\t\t} else {\n\t\t\t//console.warn(\"no callback on actor %s\", this.actor);\n\t\t\treturn null;\n\t\t}\n\t},\n\n});\n\nInvocation.subclass('SchedulableAction', {\n\n\tdocumentation: \"Description of a periodic action\",\n\tbeVerbose: false,\n\n\tinitialize: function($super, actor, scriptName, argIfAny, stepTime) {\n\t\t$super(actor, scriptName, argIfAny);\n\t\tthis.stepTime = stepTime;\n\t\tthis.ticks = 0;\n\t},\n\n\ttoString: function() {\n\t\treturn Strings.format(\"#\", \n\t\tthis.actor, this.scriptName, this.argIfAny, this.stepTime);\n\t},\n\n\tstop: function(world) {\n\t\tif (this.beVerbose) console.log(\"stopped stepping task %s\", this);\n\t\tworld.stopSteppingFor(this);\n\t},\n\n\tstart: function(world) {\n\t\tif (this.beVerbose) console.log(\"started stepping task %s\", this);\n\t\tworld.startSteppingFor(this);\n\t},\n\n\tequalActorAndName: function(other) {\n\t\tif (!other) \n\t\t\treturn false;\n\t\tif (this === other) \n\t\t\treturn true;\n\t\treturn (this.actor === other.actor) && (this.scriptName == other.scriptName)\n\t}\n});\n\nMorph.addMethods(\n'plugs', {\n\tplugTo: function(model, connectSpec) {\n\t\t// experimental protocol\n\t\t// This message preserves the model-view \"plug\" API of MVC's pluggable views,\n\t\t// while using the \"direct connect\" form of change notification\n\t\t// {dir: String, name: String, options: Object}\n\t\tvar view = this;\n\n\t\tfunction parseStringSpec(stringSpec) {\n\t\t\tvar parsed = stringSpec.match(/(->?)(.*)/);\n\t\t\treturn {dir: parsed[1], name: parsed[2]};\n\t\t};\n\n\t\tProperties.forEachOwn(connectSpec, function (viewProp, spec) {\n\t\t\tif (Object.isString(spec)) spec = parseStringSpec(spec);\n\t\t\tvar dir = spec.dir || '->',\n\t\t\t\toptions = spec.options || {};\n\t\t\tif (dir == \"->\" || dir == \"<->\")\n\t\t\t\tlively.bindings.connect(view, viewProp, model, spec.name, options)\n\t\t\tif (dir == \"<-\" || dir == \"<->\")\n\t\t\t\tlively.bindings.connect(model, spec.name, view, viewProp, options)\n\t\t});\n\t\treturn this;\n\t},\n\n});\n\n}) // end of module\n","__LivelyClassName__":"lively.morphic.TextChunk"},"509":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"510":{"submorphs":[{"__isSmartRef__":true,"id":511},{"__isSmartRef__":true,"id":1948},{"__isSmartRef__":true,"id":1973},{"__isSmartRef__":true,"id":717},{"__isSmartRef__":true,"id":1387},{"__isSmartRef__":true,"id":1440},{"__isSmartRef__":true,"id":1452},{"__isSmartRef__":true,"id":1998},{"__isSmartRef__":true,"id":500},{"__isSmartRef__":true,"id":2004},{"__isSmartRef__":true,"id":2009},{"__isSmartRef__":true,"id":522},{"__isSmartRef__":true,"id":549},{"__isSmartRef__":true,"id":576},{"__isSmartRef__":true,"id":603},{"__isSmartRef__":true,"id":630},{"__isSmartRef__":true,"id":657},{"__isSmartRef__":true,"id":684}],"scripts":[],"id":378,"shape":{"__isSmartRef__":true,"id":2017},"droppingEnabled":true,"halosEnabled":true,"layout":{"__isSmartRef__":true,"id":2021},"_Position":{"__isSmartRef__":true,"id":1933},"locationPane":{"__isSmartRef__":true,"id":511},"codeBaseDirBtn":{"__isSmartRef__":true,"id":1948},"localDirBtn":{"__isSmartRef__":true,"id":1973},"Pane1":{"__isSmartRef__":true,"id":717},"Pane2":{"__isSmartRef__":true,"id":1387},"Pane3":{"__isSmartRef__":true,"id":1440},"Pane4":{"__isSmartRef__":true,"id":1452},"midResizer":{"__isSmartRef__":true,"id":1998},"sourcePane":{"__isSmartRef__":true,"id":500},"bottomResizer":{"__isSmartRef__":true,"id":2004},"commentPane":{"__isSmartRef__":true,"id":2009},"ownerWidget":{"__isSmartRef__":true,"id":520},"owner":null,"ownerApp":{"__isSmartRef__":true,"id":520},"targetURL":{"__isSmartRef__":true,"id":1858},"__SourceModuleName__":"Global.lively.ide.BrowserFramework","__LivelyClassName__":"lively.ide.BrowserPanel"},"511":{"submorphs":[],"scripts":[],"id":379,"shape":{"__isSmartRef__":true,"id":512},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":371},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":515},"priorExtent":{"__isSmartRef__":true,"id":516},"_MaxTextWidth":656,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":517}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":510},"isInputLine":true,"noEval":true,"styleClass":["Browser_locationInput"],"attributeConnections":[{"__isSmartRef__":true,"id":519}],"doNotSerialize":["$$savedTextString"],"doNotCopyProperties":["$$savedTextString"],"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"512":{"_Position":{"__isSmartRef__":true,"id":513},"_Extent":{"__isSmartRef__":true,"id":514},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":504},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"513":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"514":{"x":656,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"515":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"516":{"x":656,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"517":{"style":{"__isSmartRef__":true,"id":518},"morph":{"__isSmartRef__":true,"id":511},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"http://www.lively-kernel.org/repository/webwerkstatt/lively/oldCore/","__LivelyClassName__":"lively.morphic.TextChunk"},"518":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"519":{"sourceObj":{"__isSmartRef__":true,"id":511},"sourceAttrName":"savedTextString","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setTargetURL","converter":null,"converterString":"function (value) { return new URL(value) }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"520":{"buttonCommands":[{"__isSmartRef__":true,"id":521},{"__isSmartRef__":true,"id":548},{"__isSmartRef__":true,"id":575},{"__isSmartRef__":true,"id":602},{"__isSmartRef__":true,"id":629},{"__isSmartRef__":true,"id":656},{"__isSmartRef__":true,"id":683}],"RootFilters":[{"__isSmartRef__":true,"id":710}],"Pane1Filters":[{"__isSmartRef__":true,"id":711},{"__isSmartRef__":true,"id":712}],"Pane2Filters":[{"__isSmartRef__":true,"id":713}],"Pane3Filters":[{"__isSmartRef__":true,"id":714}],"Pane4Filters":[{"__isSmartRef__":true,"id":715}],"evaluate":true,"panel":{"__isSmartRef__":true,"id":510},"attributeConnections":[{"__isSmartRef__":true,"id":716},{"__isSmartRef__":true,"id":1386},{"__isSmartRef__":true,"id":1439},{"__isSmartRef__":true,"id":1451},{"__isSmartRef__":true,"id":1461},{"__isSmartRef__":true,"id":1462}],"SourceString":"module('lively.oldCore.Morphs').requires('lively.OldModel', 'lively.oldCore.Misc', 'lively.oldCore.Hacks').toRun(function() {\n\n// ===========================================================================\n// Morph functionality\n// ===========================================================================\n\nObject.subclass('MouseHandlerForDragging', {\n\n\thandleMouseEvent: function(evt, targetMorph) {\n\t\tif (evt.type == \"MouseDown\") evt.hand.setMouseFocus(targetMorph);\n\t\tevt.hand.resetMouseFocusChanges();\n\n\t\tvar handler = targetMorph[evt.handlerName()];\n\t\tif (handler) handler.call(targetMorph, evt, targetMorph);\n\n\t\tif (evt.type == \"MouseUp\") {\n\t\t\t// cancel focus unless it was set in the handler\n\t\t\tif (evt.hand.resetMouseFocusChanges() == 0) {\n\t\t\t\tevt.hand.setMouseFocus(null);\n\t\t\t}\n\t\t}\n\t\treturn true; \n\t},\n\n handlesMouseDown: Functions.False\n});\n\nObject.subclass('MouseHandlerForRelay', {\n\n\tdefaultEventSpec: {onMouseDown: \"onMouseDown\", onMouseMove: \"onMouseMove\", onMouseUp: \"onMouseUp\"},\n\t\n\tinitialize: function (target, eventSpec) {\n\t\t// Send events to a different target, with different methods\n\t\t// Ex: box.relayMouseEvents(box.owner, {onMouseUp: \"boxReleased\", onMouseDown: \"boxPressed\"})\n\t\tthis.target = target;\n\t\tthis.eventSpec = eventSpec || this.defaultEventSpec;\n\t},\n\n\thandleMouseEvent: function(evt, originalTarget) {\n\t\tif (evt.type == \"MouseDown\") evt.hand.setMouseFocus(originalTarget);\n\t\tevt.hand.resetMouseFocusChanges();\n\n\t\tvar handler = this.target[this.eventSpec[evt.handlerName()]];\n\t\tif (handler) handler.call(this.target, evt, originalTarget);\n\n\t\tif (evt.type == \"MouseUp\") {\n\t\t\t// cancel focus unless it was set in the handler\n\t\t\tif (evt.hand.resetMouseFocusChanges() == 0) {\n\t\t\t\tevt.hand.setMouseFocus(null);\n\t\t\t}\n\t\t}\n\t\treturn true; \n\t},\n\n handlesMouseDown: Functions.True\n\n});\n\n/**\n * Morph Class \n */\nlively.data.Wrapper.subclass('Morph');\n\nObject.extend(Morph, {\n\t// Functions for change management\n \t// this static function is needed to bind it during the defintion of some Morph methods\n\tonLayoutChange: function(fieldName) { \n\t\treturn function layoutChangeAdvice(/* arguments*/) {\n\t\t\tvar priorExtent = this.innerBounds().extent();\n\t\t\tthis.changed();\n\t\t\tvar args = $A(arguments);\n\t\t\tvar proceed = args.shift();\n\t\t\tvar result = proceed.apply(this, args);\n\t\t\tthis.layoutChanged(priorExtent);\n\t\t\tthis.changed(); \n\t\t\treturn result;\n\t\t}\n\t},\n\n\tfromLiteral: function(literal) {\n\t\tvar morph = new Morph(literal.shape);\n\t\tif (literal.submorphs) {\n\t\t\tif (Object.isArray(literal.submorphs))\n\t\t\t\tmorph.setSubmorphs(literal.submorphs);\n\t\t\telse throw new TypeError();\n\t\t}\n\t\tif (literal.transforms) {\n\t\t\tmorph.setTransforms(literal.transforms);\n\t\t}\n\t\treturn morph;\n\t},\n\n\t// factory methods\n\tmakeLine: function(verts, lineWidth, lineColor) {\n\t\tif (verts.length < 2) return;\n\t\tvar morph = new PathMorph(verts);\n\t\tmorph.applyStyle({fill: null, borderWidth: lineWidth || 1, borderColor: lineColor || Color.black});\n\t\tmorph.enableInsertionPoints()\n\t\treturn morph;\n\n\t\t// make a line with its origin at the first vertex\n\t\t// Note this works for simple lines (2 vertices) and general polylines\n\t\t// verts = verts.invoke('subPt', verts[0]);\n\t\t// var shape = new lively.scene.Polyline(verts);\n\t\t// var morph = new Morph(shape);\n\t\t// morph.setBorderWidth(lineWidth);\n\t\t// morph.setBorderColor(lineColor);\n\t\t// morph.setFill(null);\n\t\t// return morph;\n\t},\n\n\tmakeCircle: function(location, radius, lineWidth, lineColor, fill) {\n\t\t// make a circle of the given radius with its origin at the center\n\t\tvar morph = new Morph(new lively.scene.Ellipse(location, radius));\n\t\tmorph.setBorderWidth(lineWidth);\n\t\tmorph.setBorderColor(lineColor);\n\t\tmorph.setFill(fill || Color.blue);\n\t\treturn morph;\n\t},\n\n\tmakeEllipse: function(bounds, lineWidth, lineColor, fill) {\n\t\t// make a circle first (a bit wasteful)\n\t\tvar morph = this.makeCircle(bounds.center(), 0, lineWidth, lineColor, fill);\n\t\tmorph.setBounds(bounds);\n\t\tmorph.moveOriginBy(morph.innerBounds().center())\n\t\treturn morph;\n\t},\n\n\tmakeRectangle: function(/**/) {\n\t\tvar morph;\n\t\tswitch (arguments.length) {\n\t\t\tcase 1: // rectangle\n\t\t\tif (!(arguments[0] instanceof Rectangle)) throw new TypeError(arguments[0] + ' not a rectangle');\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(arguments[0]));\n\t\t\tbreak;\n\t\t\tcase 2: // location and extent\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(arguments[0].extent(arguments[1])));\n\t\t\tbreak;\n\t\t\tcase 4: // x,y,width, height\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(new Rectangle(arguments[0], arguments[1], arguments[2], arguments[3])));\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\tthrow new Error(\"bad arguments \" + arguments);\n\t\t}\n\t\treturn morph.applyStyle({borderWidth: 1, borderColor: Color.black, fill: Color.blue});\n\t},\n\n\tmakePolygon: function(verts, lineWidth, lineColor, fill) {\n\t\tvar morph = new Morph(new lively.scene.Polygon(verts));\n\t\tmorph.setBorderWidth(lineWidth);\n\t\tmorph.setBorderColor(lineColor);\n\t\tmorph.setFill(fill);\n\t\treturn morph;\n\t\t//return morph.applyStyle({fill: fill, borderWidth: lineWidth, borderColor: lineColor});\n\t},\n\n\tmakeStar: function(position) {\n\t\tvar makeStarVertices = function(r,center,startAngle) {\n\t\t\tvar vertices = [];\n\t\t\tvar nVerts = 10;\n\t\t\tfor (var i=0; i <= nVerts; i++) {\n\t\t\t\tvar a = startAngle + (2*Math.PI/nVerts*i);\n\t\t\t\tvar p = Point.polar(r,a);\n\t\t\t\tif (i%2 == 0) p = p.scaleBy(0.39);\n\t\t\t\tvertices.push(p.addPt(center)); \n\t\t\t}\n\t\t\treturn vertices; \n\t\t}\n\t\tvar morph = Morph.makePolygon(makeStarVertices(50,pt(0,0),0), 1, Color.black, Color.yellow);\n\t\tmorph.setPosition(position);\n\t\treturn morph\n\t},\n\t\n\tmakeCurve: function(verts, ctrls, closed) {\n\t\t// Make up a new quadratic spline from the supplied vertices and control points.\n\t\t// ctrls[i] is the ctrl point for segment from verts[i-1] to verts[i]. (ctrls[0] is never used)\n\t\tif (verts.length < 2) return;\n\t\t// console.log(\"verts = \" + Object.inspect(verts));\n\t\t// console.log(\"ctrls = \" + Object.inspect(ctrls));\n\t\tvar g = lively.scene;\n\t\tvar cmds = [];\n\t\tcmds.push(new g.MoveTo(true, verts[0].x, verts[0].y));\n\t\tfor (var i=1; i 1) console.warn('More than one code node');\n\t\t\t// ChangeSet of World gets evaluated in main\n \t}\n\t},\n\n restoreFromSubnodes: function(importer) {\n // wade through the children\n var children = [];\n var helperNodes = [];\n\n for (var desc = this.rawNode.firstChild; desc != null; desc = desc.nextSibling) {\n if (desc.nodeType == Node.TEXT_NODE || desc.nodeType == Node.COMMENT_NODE) {\n if (desc.textContent == \"\\n\") \n helperNodes.push(desc); // remove newlines, which will be reinserted for formatting\n continue; // ignore whitespace and maybe other things\n }\n var type = lively.data.Wrapper.getEncodedType(desc);\n // depth first traversal\n\n\t\t\t// WebCards...\n\t\t \t// if (type && !type.startsWith(\"anonymous_\")) { //I have no idea what that mean\n\n if (type) {\n var wrapper = importer.importWrapperFromNode(desc);\n if (wrapper instanceof Morph) {\n this.submorphs.push(wrapper); \n wrapper.owner = this;\n } else children.push(desc);\n } else {\n children.push(desc);\n }\n }\n\n for (var i = 0; i < children.length; i++) {\n var node = children[i];\n var shape = lively.scene.Shape.importFromNode(importer, node);\n if (shape) {\n this.shape = shape;\n continue;\n }\n switch (node.localName) {\n // nodes from the Lively namespace\n case \"field\": {\n // console.log(\"found field \" + Exporter.stringify(node));\n helperNodes.push(node);\n this.deserializeFieldFromNode(importer, node); \n break;\n }\n case \"widget\": {\n this.deserializeWidgetFromNode(importer, node);\n break;\n }\n case \"array\": {\n helperNodes.push(node);\n this.deserializeArrayFromNode(importer, node);\n break;\n }\n case \"relay\": {\n this.deserializeRelayFromNode(importer, node);\n break;\n }\n case \"record\": {\n this.deserializeRecordFromNode(importer, node);\n break;\n }\n case \"defs\": { \n\t\t\t\tthis.restoreFromDefsNode(importer, node);\n break;\n }\n default: {\n if (node.nodeType === Node.TEXT_NODE) {\n //console.log('text tag name %s', node.tagName);\n // whitespace, ignore\n } else if (!this.restoreFromSubnode(importer, node)) {\n console.warn('not handling %s, %s', node.tagName || node.nodeType, node.textContent);\n }\n }\n }\n } // end for\n\n for (var i = 0; i < helperNodes.length; i++) {\n var n = helperNodes[i];\n n.parentNode.removeChild(n);\n }\n },\n\n\tresolveUriToObject: function(uri) {\n\t\tif (this.id() == uri)\n\t\t\treturn this;\n\t\tif (this.ownerWidget) {\n\t\t\tvar result = this.ownerWidget.resolveUriToObject(uri)\n\t\t\tif (result)\n\t\t\t\treturn result;\n\t\t};\t\n\t\tfor (var i=0; i < this.submorphs.length; i++) {\n\t\t\tvar result = this.submorphs[i].resolveUriToObject(uri);\n\t\t\tif (result)\n\t\t\t\treturn result;\n\t\t}\n\t\treturn null\n\t},\n\t\t\n\t// Fill Garbage Collection on Serialization...\n\tcollectAllUsedFills: function(/*$super, */result) {\n\t\t// result = $super(result);\n\t\tvar fill = this.getFill();\n\t\tif (fill instanceof lively.paint.Gradient) result.push(fill);\n\t\tvar stroke = this.shape.getStroke(); // fixme\n\t\tif (stroke instanceof lively.paint.Gradient) result.push(stroke);\n\t\tif (this.submorphs) this.submorphs.invoke('collectAllUsedFills', result);\n\t\treturn result\n\t},\n\n\texportLinkedFile: function(filename) {\n\t\tvar url;\n\t\tif (Global[\"WikiNavigator\"] && WikiNavigator.current) {\n\t\t\tvar nav = WikiNavigator.current;\n\t\t\turl = WikiNavigator.fileNameToURL(filename);\n\t\t\tnav.interactiveSaveWorld(url);\n\t\t} else {\n\t\t\turl = WorldMorph.current().saveWorld(filename);\n\t\t}\n\t\tif (url) this.world().reactiveAddMorph(new ExternalLinkMorph(url));\n\t\treturn url;\n\t},\n\n},\n'accessing', {\n\tgetName: function() { return this.name },\n\n\tsetName: function(str) { this.name = str; return name },\n\n\tcanvas: function() {\n\t\treturn locateCanvas(this.rawNode);\n\t},\n\t\n getOwnerWidget: function() {\n\t\treturn this.ownerWidget || this.owner.getOwnerWidget();\n\t},\n\n\townerChain: function() {\n\t\t// Return an array of me and all my owners\n\t\t// First item is, eg, world; last item is me\n\t\tif (!this.owner) return [this];\n\t\tvar owners = this.owner.ownerChain();\n\t\towners.push(this);\n\t\treturn owners;\n\t},\n\n},\n'styling',{\t// tmp copy\n\n\tgetStyleClass: function() { return this.styleClass || [] },\n\n\tsetStyleClass: function(value) {\n\t\tvar attr;\n\t\tif (value instanceof Array) {\n\t\t\tthis.styleClass = value;\n\t\t\tattr = value.join(' ');\n\t\t} else {\n\t\t\tthis.styleClass = [value];\n\t\t\tattr = String(value);\n\t\t}\n\t\tthis.rawNode.setAttribute(\"class\", attr);\n\t\treturn value;\n\t},\n\n\tapplyStyle: function(specs) { // note: use reflection instead?\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar spec = arguments[i];\n\t\t\tif(!spec) return; // dbgOn(!spec);\n\n\t\t\tif (spec.position !== undefined) this.setPosition(spec.position);\n\t\t\tif (spec.extent !== undefined) this.setExtent(spec.extent);\n\t\t\tif (spec.scale !== undefined) this.setScale(spec.scale);\n\t\t\tif (spec.rotation !== undefined) this.setRotation(spec.rotation);\n\n\t\t\tif (spec.borderWidth !== undefined) this.setBorderWidth(spec.borderWidth);\n\t\t\tif (spec.borderColor !== undefined) this.setBorderColor(spec.borderColor);\n\t\t\tif (spec.fill !== undefined) this.setFill(spec.fill);\n\t\t\tif (spec.opacity !== undefined) {\n\t\t\t\tthis.setFillOpacity(spec.opacity);\n\t\t\t\tthis.setStrokeOpacity(spec.opacity); \n\t\t\t}\n\t\t\tif (spec.fillOpacity !== undefined) this.setFillOpacity(spec.fillOpacity);\n\t\t\tif (spec.strokeOpacity !== undefined) this.setStrokeOpacity(spec.strokeOpacity);\n\n\t\t\tif (this.shape.roundEdgesBy && spec.borderRadius !== undefined) { \n\t\t\t\tthis.shape.roundEdgesBy(spec.borderRadius);\n\t\t\t}\n\t\t\tif (spec.suppressGrabbing !== undefined) this.suppressGrabbing = spec.suppressGrabbing;\n\t\t\tif (spec.suppressHandles !== undefined) this.suppressHandles = spec.suppressHandles;\n\n\t\t\tif (spec.focusHaloBorderWidth !== undefined) this.focusHaloBorderWidth = spec.focusHaloBorderWidth;\n\t\t\tif (spec.focusHaloInset !== undefined) this.focusHaloInset = spec.focusHaloInset;\n\t\t\tif (spec.padding !== undefined) this.padding = spec.padding;\n\t\t\tif (spec.margin !== undefined) this.margin = spec.margin;\n\t\t}\n\t\treturn this;\n\t},\n\n\tmakeStyleSpec: function() {\n\t\t// Adjust all visual attributes specified in the style spec\n\t\tvar spec = { };\n\t\tspec.borderWidth = this.getBorderWidth();\n\t\tspec.borderColor = this.getBorderColor();\n\t\tspec.fill = this.getFill();\n\t\tif (this.shape.getBorderRadius) spec.borderRadius = this.shape.getBorderRadius() || 0.0;\n\t\tspec.fillOpacity = typeof this.shape.getFillOpacity() !== undefined ? this.shape.getFillOpacity() : 1.0;\n\t\tspec.strokeOpacity = typeof this.shape.getStrokeOpacity() !== undefined ? this.shape.getStrokeOpacity() : 1.0;\t\t\n\t\treturn spec;\n\t},\n\n\tapplyStyleNamed: function(name) {\n\t\tvar style = this.styleNamed(name);\n\t\tif (style) this.applyStyle(style);\n\t\telse console.warn(\"applyStyleNamed: no style named \" + name)\n\t},\n\n\tstyleNamed: function(name) {\n\t\t// Look the name up in the Morph tree, else in current world\n\t\tif (this.displayTheme) return this.displayTheme[name];\n\t\tif (this.owner) return this.owner.styleNamed(name);\n\t\tvar world = WorldMorph.current();\n\t\tif (world && (this !== world)) return world.styleNamed(name);\n\t\treturn DisplayThemes[Config.defaultDisplayTheme || \"lively\"][name]; // FIXME for onDeserialize, when no world exists yet\n\t},\n\n\tlinkToStyles: function(styleClassList, optSupressApplication) {\n\t\t// Record the links for later updates, and apply them now\n\t\tthis.setStyleClass(styleClassList);\n\t\tif (!optSupressApplication) this.applyLinkedStyles();\n\t\treturn this;\n\t},\n\n\tapplyLinkedStyles: function() {\n\t\t// Apply all the styles to which I am linked, in order\n\t\tvar styleClasses = this.getStyleClass();\n\t\tif (!styleClasses) return;\n\t\tfor (var i = 0; i < styleClasses.length; i++) {\n\t\t\tthis.applyStyleNamed(styleClasses[i]); \n\t\t}\n\t},\n},\n'appearance', { // Functions for manipulating the visual attributes of Morphs\n\t\n\tsetFill: function(fill) {\n\t\tthis.shape.setFill(fill);\n\t\tthis.changed();\n\t\treturn fill;\n\t},\n\n\tgetFill: function() { return this.shape.getFill() },\n\n\tsetBorderColor: function(newColor) {\n\t\tthis.shape.setStroke(newColor);\n\t\t// this.changed();\n\t\treturn newColor\n\t},\n\n\tgetBorderColor: function() {\n\t\treturn new Color(Importer.marker, this.shape.getStroke());\n\t},\n\n\t// FIXME for Chrome border bug\n\tnearlyZeroBorderWidth: 0.00001,\n\n\tsetBorderWidth: function(newWidth) {\n\t\tif (!newWidth) newWidth = 0;\t\t\n\t\tvar oldWidth = this.getBorderWidth();\n\t\tif (newWidth === oldWidth) return;\n\n\t\t// Opt: only notify change with the bigger of two bounds\n\t\tif (oldWidth > newWidth) this.changed();\n\t\tthis.shape.setStrokeWidth(newWidth); \n\t\tif (newWidth > oldWidth) this.changed();\n\t\treturn newWidth\n\t},\n\n\tgetBorderWidth: function() {\n\t\treturn this.shape.getStrokeWidth() || 0; // FIXME: fix defaults logic\n\t},\n\n \tsetBorderRadius: function(r) {//jd\n \tthis.shape.roundEdgesBy(r);\n\t\tthis.changed();\n\t\treturn r\n },\n\n \tgetBorderRadius: function() {\n\t\treturn this.shape.getBorderRadius(); \n\t},\n\n\tshapeRoundEdgesBy: function(r) {\n\t\tthis.setBorderRadius(r);\n\t},\n\n\tgetFillOpacity: function() { return this.shape.getFillOpacity(); },\n\n\tsetFillOpacity: function(op) {\n\t\tthis.shape.setFillOpacity(op);\n\t\tthis.changed(); // FIXME better use specific update\n\t\treturn op;\n\t},\n\n\tsetStrokeOpacity: function(op) { \n\t\tthis.shape.setStrokeOpacity(op);\n\t\tthis.changed(); // FIXME better use specific update\n\t\treturn op;\n\t},\n\n\tgetStrokeOpacity: function() { return this.shape.getStrokeOpacity() },\n\n setLineJoin: function(joinType) { this.shape.setLineJoin(joinType); return joinType },\n\n\tgetLineJoin: function() { return this.shape.getLineJoin() }, \n\n setLineCap: function(capType) { this.shape.setLineCap(capType); return capType },\n\n \tgetLineCap: function() { return this.shape.getLineCap() },\n\n // toggle fisheye effect on/off\n\ttoggleFisheye: function() { \n\t\t// if fisheye is true, we need to scale the morph to original size\n\t\tif (this.fishEye) {\n\t\t\tthis.setScale(this.getScale() / this.fisheyeScale);\n\t\t\tthis.setFisheyeScale(1.0);\n\t\t}\n\t\t// toggle fisheye\n\t\tthis.fishEye = !this.fishEye;\n\t},\n\n\t// sets the scaling factor for the fisheye between 1..fisheyeGrowth\n\tsetFisheyeScale: function (newScale) {\n\t\t// take the original centerpoint\n\t\tvar p = this.bounds().center();\n\n\t\tthis.fisheyeScale = newScale;\n\t\tthis.pvtCachedTransform = null;\n\t\tthis.layoutChanged(); \n\t\tthis.changed();\n\n\t\t// if the fisheye was on move the fisheye'd morph by the difference between \n\t\t// original center point and the new center point divided by 2\n\t\tif (this.fishEye) {\n\t\t\t// (new.center - orig.center)/2\n\t\t\tvar k = this.bounds().center().subPt(p).scaleBy(.5).negated();\n\t\t\tif (!pt(0,0).eqPt(k)) {\n\t\t\t\tthis.setPosition(this.position().addPt(k));\n\t\t\t\tthis.layoutChanged(); \n\t\t\t\tthis.changed();\n\t\t\t}\n\t\t}\n\t},\n\n\tisVisible: function() { // FIXME delegate to sceneNode when conversion finished\n\t\t// Note: this may not be correct in general in SVG due to inheritance,\n\t\t// but should work in LIVELY.\n\t\tvar hidden = this.rawNode.getAttributeNS(null, \"display\") == \"none\";\n\t\treturn hidden == false;\n\t},\n\n\tsetVisible: function(flag) { // FIXME delegate to sceneNode when conversion finished\n\t\tif (flag) this.rawNode.removeAttributeNS(null, \"display\");\n\t\telse this.rawNode.setAttributeNS(null, \"display\", \"none\");\n\t\treturn this;\n\t},\n\t\n\tapplyFilter: function(filterUri) {// FIXME delegate to sceneNode when conversion finished\n\t\tif (filterUri) \n\t\t\tthis.rawNode.setAttributeNS(null, \"filter\", filterUri);\n\t\telse\n\t\t\tthis.rawNode.removeAttributeNS(null, \"filter\");\n\t},\n\t\n},\n'shape related', {\n\n\t// NOTE: The following four methods should all be factored into a single bit of reshaping logic\n\tapplyFunctionToShape: function() { // my kingdom for a Smalltalk block!\n\t\tvar args = $A(arguments);\n\t\tvar func = args.shift();\n\t\tfunc.apply(this.shape, args);\n\t\tthis.adjustForNewBounds();\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tinternalSetShape: function(newShape) {\n\t\tif (!newShape.rawNode) {\n\t\t\tconsole.log('newShape is ' + newShape);\n\t\t\tlively.lang.Execution.showStack();\n\t\t}\n\n\t\tthis.rawNode.replaceChild(newShape.rawNode, this.shape.rawNode);\n\t\tthis.shape = newShape;\n\t\tthis.adjustForNewBounds();\n\t},\n\n\tsetShape: function(newShape) {\n\t\tthis.internalSetShape(newShape);\n\t\treturn newShape;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\treshape: function(partName, newPoint, lastCall) {\n\t\ttry {\n\t\t\treturn this.shape.reshape(partName,newPoint,lastCall);\n\t\t} finally {\n\t\t\t// FIXME: consider converting polyline to polygon when vertices merge.\n\t\t\tif (this.layoutManager && this.layoutManager.onReshape) this.layoutManager.onReshape(this);\n\t\t}\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tsetVertices: function(newVerts) {\n\t\t// particular to polygons\n\t\tthis.shape.setVertices(newVerts);\n\t\tthis.adjustForNewBounds();\n\t\treturn newVerts;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tbeClipMorph: function() {\n\t\t// For simple morphs (rectangles, ellipses, polygons) this will cause all submorphs\n\t\t// to be clipped to the shape of this morph.\n\t\t// Note: the bounds function should probably be copied from ClipMorph as\n\t\t//\t\tpart of this mutation\n\t\tvar defs = this.rawNode.appendChild(NodeFactory.create('defs'));\n\t\tthis.clip = new lively.scene.Clip(this.shape);\n\t\tdefs.appendChild(this.clip.rawNode);\n\t\tthis.clip.applyTo(this);\n\t\tthis.isClipMorph = true;\n\t},\n\n},\n'layouting',{\n\n // FIXME: this doesn't account properly for border width\n // the CSS box model, see http://www.w3.org/TR/REC-CSS2/box.html \n padding: new Rectangle(0, 0, 0, 0), // between morph borders and its content (inwards)\n margin: new Rectangle(0, 0, 0, 0), // between morph border and its siblings\n \n\tlayoutManager: null, // singleton, intialzided later\n\n\t// Simple hack until the layout manager can relayout\n\trelayout: function() {\n\t\tif (this.layoutManager) this.layoutManager.layout(this);\n\t},\n\n\tsetBounds: function(newRect) {\n\t\tif (!newRect) return;\n\t\tthis.layoutManager.setBounds(this, newRect);\n\t\treturn newRect;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tsetExtent: function(newExtent) {\n\t\tthis.layoutManager.setExtent(this, newExtent);\n\t\treturn newExtent;\n\t},\n\n\tgetExtent: function(newRect) { return this.shape.bounds().extent() },\n\n\tposition: function() { // Deprecated -- use getPosition\n\t\treturn this.shape.bounds().topLeft().addPt(this.origin); \n\t},\n\n\tgetPosition: function() {\n\t\treturn this.shape.bounds().topLeft().addPt(this.origin); \n\t},\n\n\tsetPosition: function(newPosition) {\n\t\tthis.layoutManager.setPosition(this, newPosition);\n\t\treturn newPosition;\n\t},\n\n\tcontainsPoint: function(p) { \n\t\t// p is in owner coordinates\n\t\tif (!this.bounds().containsPoint(p)) return false;\n\t\treturn this.shape.containsPoint(this.relativize(p)); \n\t},\n\n\tcontainsWorldPoint: function(p) { // p is in world coordinates\n\t\tif (this.owner == null) return this.containsPoint(p);\n\t\treturn this.containsPoint(this.owner.localize(p)); \n\t},\n\n\tfullContainsPoint: function(p) { // p is in owner coordinates\n\t\treturn this.bounds().containsPoint(p); \n\t},\n\n\tfullContainsWorldPoint: function(p) { // p is in world coordinates\n\t\tif (this.owner == null) return this.fullContainsPoint(p);\n\t\treturn this.fullContainsPoint(this.owner.localize(p)); \n\t},\n\n\t// Morph bounds, coordinates, moving and damage reporting functions\n // bounds returns the full bounding box in owner coordinates of this morph and all its submorphs\n\tbounds: function(ignoreTransients, ignoreTransform) {\n\t\tif (this.fullBounds != null) return this.fullBounds;\n\n\t\tvar tfm = this.getTransform();\n\t\tvar fullBounds = this.localBorderBounds(ignoreTransform ? null : tfm);\n\n\t\tvar subBounds = this.submorphBounds(ignoreTransients);\n\t\tif (subBounds != null) {\n\t\t\t// could be simpler when no rotation...\n\t\t\tfullBounds = fullBounds.union(tfm.transformRectToRect(subBounds));\n\t\t}\n\n\t\tif (fullBounds.width < 3 || fullBounds.height < 3) {\n\t\t\t// Prevent Horiz or vert lines from being ungrabable\n\t\t\tfullBounds = fullBounds.expandBy(3); \n\t\t}\n\t\tthis.fullBounds = fullBounds;\n\t\treturn fullBounds; \n\t},\n \n\tsubmorphBounds: function(ignoreTransients) {\n\t\tvar subBounds = null;\n\t\tfor (var i = 0; i < this.submorphs.length; i++) {\n\t\t\tvar m = this.submorphs[i];\n\t\t\tif ((ignoreTransients && m.isEpimorph))\n\t\t\t\tcontinue;\n\t\t\tif (!m.isVisible()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsubBounds = subBounds == null ? m.bounds(ignoreTransients) : subBounds.union(m.bounds(ignoreTransients));\n\t\t}\n\t\treturn subBounds;\n\t},\n \n // innerBounds returns the bounds of this morph only, and in local coordinates\n innerBounds: function() { \n return this.shape.bounds().insetByRect(this.padding);\n },\n \n\tlocalBorderBounds: function(optTfm) {\n\t\t// defined by the external edge of the border\n\t\t// if optTfm is defined, transform the vertices first, then take the union\n\t\tdbgOn(!this.shape);\n\t\tvar bounds = optTfm ? Rectangle.unionPts(this.shape.vertices().invoke('matrixTransform', optTfm)) : this.shape.bounds();\n\n\t\tvar borderMargin = this.getBorderWidth()/2;\n\t\t// double border margin for polylines to account for elbow protrusions\n\t\tif (this.shape.hasElbowProtrusions) borderMargin = borderMargin*2 + 1;\n\t\tbounds = bounds.expandBy(borderMargin);\n\t\treturn bounds;\n\t},\n\t\n\tchanged: function() {\n\t\t// Note most morphs don't need this in SVG, but text needs the \n\t\t// call on bounds() to trigger layout on new bounds\n\t\tif(this.owner && this.owner.invalidRect) this.owner.invalidRect(this.bounds());\n\t},\n\n\tinvalidRect: function() {\n\t\t// Do nothing (handled by SVG). Overridden in canvas.\n },\n\n layoutOnSubmorphLayout: function(submorph) {\n\t\t// override to return false, in which case layoutChanged() will not be propagated to\n\t\t// the receiver when a submorph's layout changes. \n\t\treturn true;\n },\n\n\ttransformChanged: function() {\n\t\tvar scalePt = this.scalePoint;\n\t\tif (this.fisheyeScale != 1) scalePt = scalePt.scaleBy(this.fisheyeScale);\n\t\tthis.pvtCachedTransform = new lively.scene.Similitude(this.origin, this.rotation, scalePt);\n\t\tthis.pvtCachedTransform.applyTo(this.rawNode);\n\t\tthis.signalGeometryChange();\n\t},\n\n\tlayoutChanged: function Morph$layoutChanged() {\n\t\t// layoutChanged() is called whenever the cached fullBounds may have changed\n\t\t// It invalidates the cache, which will be recomputed when bounds() is called\n\t\t// Naturally it must be propagated up its owner chain.\n\t\t// Note the difference in meaning from adjustForNewBounds()\n\t\t// KP: the following may or may not be necessary:\n\n\t\tthis.transformChanged(); // DI: why is this here?\n\t\tif(! this.fullBounds) return; // already called\n\n\t\tthis.fullBounds = null;\n\t\tif (this.owner && this.owner.layoutOnSubmorphLayout(this) && !this.isEpimorph) { // May affect owner as well...\n\t\t\tthis.owner.layoutChanged();\n\t\t}\n\t\tthis.layoutManager.layoutChanged(this);\n\t},\n\n\tadjustForNewBounds: function() {\n\t\t// adjustForNewBounds() is called whenever the innerBounds may have changed in extent\n\t\t// -- it should really be called adjustForNewExtent --\n\t\t// Depending on the morph and its layoutManager, it may then re-layout its\n\t\t// submorphs and, in the process, propagate the message down to leaf morphs (or not)\n\t\t// Of course a change in innerBounds implies layoutChanged() as well,\n\t\t// but, for now, these are called separately.\n\t\t// NB: Because some morphs may re-lay themselves out in response to adjustForNewBounds()\n\t\t// adjustForNewBounds() *must never be called from* a layout operation;\n\t\t// The layout process should only move and resize submorphs, but never change the innerBounds\n\n\t\t// If this method is overridden by a subclass, it should call super as well\n\t\tif (this.focusHalo) this.adjustFocusHalo();\n\t},\n},\n// Submorph management functions\n'submorphs',{ \n\n addMorph: function(morph) { return this.addMorphFrontOrBack(morph, true) },\n\n\taddMorphAt: function(morph, position) {\n\t\tvar morph = this.addMorphFrontOrBack(morph, true);\n\t\tmorph.setPosition(position);\n\t\treturn morph;\n\t},\n\n addMorphFront: function(morph) { return this.addMorphFrontOrBack(morph, true) },\n\n addMorphBack: function(morph) { return this.addMorphFrontOrBack(morph, false) },\n\n\taddMorphFrontOrBack: function(m, isFront) {\n\t\t// assertion seems to be really expensive?!\n\t\t// console.assert(m instanceof Morph, \"not an instance\");\n\t\tif (m.owner) {\n\t\t\tvar tfm = m.transformForNewOwner(this);\n\t\t\tm.owner.removeMorph(m); // KP: note not m.remove(), we don't want to stop stepping behavior\n\t\t\tm.setTransform(tfm); \n\t\t\t// FIXME transform is out of date\n\t\t\t// morph.setTransform(tfm); \n\t\t\t// m.layoutChanged(); \n\t\t} \n\t\tthis.layoutManager.beforeAddMorph(this, m, isFront);\n\t\tthis.insertMorph(m, isFront);\n\t\tthis.layoutManager.afterAddMorph(this, m, isFront);\n\t\tm.changed();\n\t\tm.layoutChanged();\n\t\tif (Config.ChromeSVGRenderingHotfix)\n\t\t\t(function() { m.transformChanged() }).delay(0);\n\t\tthis.layoutChanged();\n\t\treturn m;\n\t},\n\t\n\taddNonMorph: function(node) {\n\t\tif (node instanceof lively.data.Wrapper) throw new Error(\"add rawNode, not the wrapper itself\");\n\t\treturn this.rawNode.insertBefore(node, this.shape && this.shape.rawNode.nextSibling);\n\t},\n\n\taddWrapper: function(w) {\n\t\tif (w && w.rawNode) {\n\t\t\tthis.addNonMorph(w.rawNode);\n\t\t\treturn w;\n\t\t} else return null;\n\t},\n\n\taddPseudoMorph: function(pseudomorph) {\n\t\tif (pseudomorph instanceof Global.PseudoMorph) {\n\t\t\treturn this.addMorph(pseudomorph);\n\t\t} else \n\t\t\tthrow new Error(pseudomorph + \" is not a PseudoMorph\");\n\t},\n\n\tbringToFront: function() {\n\t\tif (!this.owner) return;\n\t\tif (this.owner.topSubmorph() === this) return;\n\t\tvar owner = this.owner;\n\t\tthis.remove();\n\t\towner.addMorphFront(this);\n\t},\n\n\tsetSubmorphs: function(morphs) {\n\t\tconsole.assert(morphs instanceof Array, \"not an array\");\n\t\tif (morphs != null) {\n\t\t\tthis.submorphs = [].concat(morphs);\n\t\t\tthis.submorphs.forEach(function (m) { \n\t\t\t\tif (m.owner) {\n\t\t\t\t\tvar tfm = m.transformForNewOwner(this);\n\t\t\t\t\tm.owner.removeMorph(m);\n\t\t\t\t\tm.setTransform(tfm); \n\t\t\t\t} \n\t\t\t\tthis.rawNode.appendChild(m.rawNode); \n\t\t\t\tm.owner = this;\n\t\t\t\tm.changed();\n\t\t\t\tm.layoutChanged();\n\t\t\t}, this);\n\t\t}\n\t\tthis.layoutChanged();\n\t},\n\n indexOfSubmorph: function(m) {\n\t\tif (this.submorphs.length == 0) return -1; // no submorphs at all\n\t\tfor (var i=0; i 0\n\t\tvar rot = this.getTransform().getRotation().toRadians(); \n\t\tif (this.scalePoint.x >= 0) return rot;\n\n\t\t// if scale.x is negative, then we have to decode the difference\n\t\tif (rot < 0) return rot + Math.PI;\n\t\treturn rot - Math.PI;\n\t},\n\n\tgetScale: function() {\n\t\treturn this.getTransform().getScale(); \n\t},\n\n\tmoveBy: function(delta) {\n\t\tthis.translateBy(delta);\n\t},\n\n\trotateBy: function(delta) {\n\t\tthis.setRotation(this.getRotation()+delta);\n\t},\n\n\tscaleBy: function(factor) {\n\t\t// Perform a linear scaling (based on x scale) by the given factor\n\t\tthis.setScale(this.getScale()*factor);\n\t},\n\n\tthrob: function() {\n\t\tthis.scaleBy(this.getScale() <= 1 ? 2 : 0.9);\n\t},\n\n\talign: function(p1, p2) {\n\t\treturn this.translateBy(p2.subPt(p1)); \n\t},\n\n centerAt: function(p) {\n\t\treturn this.align(this.bounds().center(), p); \n },\n\n\tgetCenter: function() { return this.bounds().center() },\n\tsetCenter: function(pos) {\n\t\tthis.setPosition(pos.subPt(this.shape.bounds().center()))\n\t},\n\n\n\tmoveOriginBy: function(delta) {\n\t\t// This method changes the origin (and thus center of rotation) without changing any other effect\n\t\t// To center a rectangular morph, use m.moveOriginBy(m.innerBounds().center())\n\t\tthis.origin = this.origin.addPt(delta);\n\t\tthis.shape.translateBy(delta.negated());\n\t\tthis.submorphs.forEach(function (ea) { ea.translateBy(delta.negated()); });\n\t},\n\n moveSubmorphs: function(evt) {\n var world = this.world();\n\t\n // Display height is returned incorrectly by many web browsers.\n // We use an absolute Y-value instead. \n var towardsPoint = pt(world.bounds().center().x, 350);\n\n switch (evt.getKeyCode()) {\n case Event.KEY_LEFT:\n this.submorphs.invoke('moveBy', pt(-10,0));\n evt.stop();\n return true;\n case Event.KEY_RIGHT:\n // forget the existing selection\n this.submorphs.invoke('moveBy', pt(10, 0));\n evt.stop();\n return true;\n case Event.KEY_UP:\n this.submorphs.invoke('moveBy', pt(0, -10));\n evt.stop();\n return true;\n case Event.KEY_DOWN:\n this.submorphs.invoke('moveBy', pt(0, 10));\n evt.stop();\n return true;\n\n // Experimental radial scrolling feature\n // Read the comments near method Morph.moveRadially()\n case Event.KEY_PAGEUP:\n case 65: // The \"A\" key\n\t world.submorphs.invoke('moveRadially', towardsPoint, 10);\n this.moveRadially(towardsPoint, 10); \n evt.stop();\n return true;\n case Event.KEY_PAGEDOWN:\n case 90: // The \"Z\" key\n\t world.submorphs.invoke('moveRadially', towardsPoint, -10);\n this.moveRadially(towardsPoint, -10); \n evt.stop();\n return true;\n }\n \n return false;\n },\n\n transformSubmorphs: function(evt) {\n\t\tvar fun = null;\n\t\tswitch (evt.getKeyChar()) {\n\t\t\tcase '>':\n\t\t\t\tfun = function(m) { m.setScale(m.getScale()*1.1) };\n\t\t\t\tbreak;\n\t\t\tcase '<':\n\t\t\t\tfun = function(m) { m.setScale(m.getScale()/1.1) };\n\t\t\t\tbreak;\n\t\t\tcase ']':\n\t\t\t\tfun = function(m) { m.setRotation(m.getRotation() + 2*Math.PI/16) };\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\tfun = function(m) { m.setRotation(m.getRotation() - 2*Math.PI/16) };\n\t\t\t\tbreak;\n\t\t}\n\t\tif (fun) {\n\t\t\tthis.submorphs.forEach(fun);\n\t\t\tevt.stop();\n\t\t\treturn true;\n\t\t} else return false;\n\t},\n\n\tmoveForwardBy: function(amount) {\n\t\tvar nose = pt(1,0)\n\t\tvar dir = nose.matrixTransformDirection(this.getTransform()).normalized();\n\t\tthis.moveBy(dir.scaleBy(amount))\n\t},\n\n\t// TODO: There is a bug in Safari (the matrix multiplication is the wrong way around)\n\t// that is not taken into account here....\n\trotateAround: function(angle, center) {\n\t\tvar tfm = new lively.scene.Similitude().toMatrix();\n\t\ttfm = tfm.translate(center.x, center.y);\n\t\ttfm = tfm.rotate(angle)\t\t\n\t\ttfm = tfm.translate( -center.x, -center.y);\t\n\t\tvar oldTfm = this.getTransform().toMatrix();\n\t\tvar newTfm = oldTfm.multiply(tfm);\n\t\tthis.setTransform(new lively.scene.Similitude(newTfm));\n\t},\n\n\tturnBy: function(angle) {\n\t\tthis.rotateAround(angle, this.shape.bounds().center())\t\t\n\t},\n\n\t// Experimental radial \"black hole\" scrolling feature: When\n // an object comes close enough to the \"event horizon\" (specified\n // by 'towardsPoint'), the object is zoomed into the black hole.\n // Negative 'howMuch' values are used to \"collapse\" the display, \n // while positive values expand and restore the display back to its \n // original state. For further information, see \n // Sun Labs Technical Report SMLI TR-99-74, March 1999.\n\tmoveRadially: function(towardsPoint, howMuch) {\n\t\tvar position = this.getPosition();\n\t\tvar relativePt = position.subPt(towardsPoint);\n\t\tvar distance = towardsPoint.dist(position);\n\t\tif (!this.inBlackHole) this.inBlackHole = 0;\n\n\t\t// The object disappears entirely when it is less than 5 pixels away\n\t\t// The 'inBlackHole' counter keeps track of how many levels deep\n\t\t// the object is in the black hole, allowing the display to be\n\t\t// restored correctly.\n\t\tif (distance <= 5) {\n\t\t\tif (howMuch < 0) {\n\t\t\t\tthis.inBlackHole++;\n\t\t\t\tthis.setScale(0);\n\t\t\t} else {\n\t\t\t\tthis.inBlackHole--; \n\t\t\t}\n\t\t} \n\n\t\tif (this.inBlackHole == 0) {\n\t\t\t// Start shrinking the object when it is closer than 200 pixels away\n\t\t\tif (distance > 5 && distance < 200) this.setScale(distance/200);\n\t\t\telse if (distance >= 200 && this.getScale() != 1) this.setScale(1);\n\n\t\t\t// Calculate new location for the object\n\t\t\tvar theta = Math.atan2(relativePt.y, relativePt.x);\n\t\t\tvar newDistance = distance + howMuch;\n\t\t\tif (newDistance < 0) newDistance = 1; \n\t\t\tvar newX = newDistance * Math.cos(theta);\n\t\t\tvar newY = newDistance * Math.sin(theta);\n\t\t\tthis.setPosition(towardsPoint.addPt(pt(newX,newY)));\n\t\t}\n\t},\n},\n'animations', {\n\t// Animated moves for, eg, window collapse/expand\n\tanimatedInterpolateTo: function(destination, nSteps, msPer, callBackFn, finalScale) {\n\t\tif (nSteps <= 0) return;\n\t\tvar loc = this.position();\n\t\tvar delta = destination.subPt(loc).scaleBy(1 / nSteps);\n\t\tvar scaleDelta = finalScale ? (this.getScale() - finalScale) / nSteps : 0;\n\t\t// console.log(\"scaleDelta = \" + scaleDelta);\n\t\tvar path = [];\n\t\tfor (var i = 1; i<=nSteps; i++) { loc = loc.addPt(delta); path.unshift(loc); }\n\t\tthis.animatedFollowPath(path, msPer, callBackFn, scaleDelta);\n },\n\n animatedFollowPath: function(path, msPer, callBackFn, scaleDelta) {\n\t\tvar spec = {path: path.clone(), callBack: callBackFn, scaleDelta: scaleDelta};\n\t\tspec.action = this.startStepping(msPer, 'animatedPathStep', spec);\t\n },\n\n\tanimatedPathStep: function(spec, scaleDelta) {\n\t\tif (spec.path.length >= 1){\n\t\t\tthis.setScale(this.getScale()-spec.scaleDelta);\n\t\t\tthis.setPosition(spec.path.pop());\n\t\t}\n\t\tif (spec.path.length >= 1) return\n\t\t//spec.action.stop(this.world()); //JD: out\n\t\t//JD: delte script out of activeScripts, neede for deserialization\n\t\tthis.stopSteppingScriptNamedAndRemoveFromSubmorphs('animatedPathStep');\n\t\tspec.callBack.call(this);\n\t},\n\n},\n'particle behavior',{ \n\n\tbounceInOwnerBounds: function() {\n\t\tthis.bounceInBounds(this.owner.innerBounds());\n\t},\n\t\n\tbounceInBounds: function(ob) {\n\t\t// typcially ob = this.owner.innerBounds()\n\t\t// Bounce by reversing the component of velocity that put us out of bounds\n\t\tif (!this.velocity) return; // Can't bounce without a velocity vector\n\n\t\t// We take care to only reverse the direction if it's wrong,\n\t\t//\tbut we move in any case, since we might be deeply out of bounds\n\t\tvar b = this.bounds();\n\t\tif (b.x < ob.x) {\n\t\t\tif (this.velocity.x < 0) this.velocity = this.velocity.scaleByPt(pt(-1, 1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.maxX() > ob.maxX()) {\n\t\t\tif (this.velocity.x > 0) this.velocity = this.velocity.scaleByPt(pt(-1, 1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.y < ob.y) {\n\t\t\tif (this.velocity.y < 0) this.velocity = this.velocity.scaleByPt(pt(1, -1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.maxY() > ob.maxY()) {\n\t\t\tif (this.velocity.y > 0) this.velocity = this.velocity.scaleByPt(pt(1, -1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t},\n\t\n\tstepByVelocities: function() {\n\t\tif (this.velocity) this.moveBy(this.velocity);\n\t\tif (this.angularVelocity) this.rotateBy(this.angularVelocity);\n\t},\n\t\n\tstepAndBounce: function() { // convenience for tile scripting\n\t\tthis.stepByVelocities();\n\t\tthis.bounceInOwnerBounds();\n\t},\n\t\n},\n'balloon help', {\n\n\tgetHelpText: Functions.Null, // override to supply help text\n\n\tshowHelp: function(evt) {\n\n\t\tif (this.suppressBalloonHelp) return false;\n\t\tif (this.owner instanceof HandMorph) return false;\n\t\tvar helpText = this.getHelpText();\n\t\tif (!helpText) return false;\n\n\t\t// Create only one help balloon at a time\n\t\tif (this.helpBalloonMorph && !this.helpBalloonMorph.getPosition().eqPt(evt.point())) {\n\t\t\tthis.helpBalloonMorph.setPosition(this.window().localize(evt.point()));\n\t\t\treturn false;\n\t\t} else {\n\t\t\tvar width = Math.min(helpText.length * 20, 260); // some estimate of width.\n\t\t\tvar window = this.window();\n\t\t\tvar pos = window.localize(evt.point());\n\t\t\tthis.helpBalloonMorph = new TextMorph(pos.addXY(10, 10).extent(pt(width, 20)), helpText);\n\t\t\twindow.addMorph(this.helpBalloonMorph.beHelpBalloonFor(this));\n\t\t\treturn true;\n\t\t}\n\t},\n\n\thideHelp: function() {\n\t\tif (!this.helpBalloonMorph) \n\t\t\treturn;\n\t\tthis.helpBalloonMorph.remove();\n\t\tdelete this.helpBalloonMorph;\n\t},\n\n},\n'mouse events', {\n\n\t// KP: equivalent of the DOM capture phase\n\t// KP: hasFocus is true if the receiver is the hands's focus (?)\n\tcaptureMouseEvent: function Morph$captureMouseEvent(evt, hasFocus) {\n\t\t// Dispatch this event to the frontmost receptive morph that contains it\n\t\t// Note boolean return for event consumption has not been QA'd\n\t\t// if we're using the fisheye... \n\t\tif (this.fishEye) {\n\t\t\t// get the distance to the middle of the morph and check if we're \n\t\t\t// close enough to start the fisheye\n\t\t\tvar size = Math.max(this.bounds().width, this.bounds().height);\n\n\t\t\tvar dist = evt.mousePoint.dist(this.bounds().center()) / this.fisheyeProximity;\n\t\t\tif (dist <= size) {\n\t\t\t\t// the fisheye factor is between 1..fisheyeGrowth\n\t\t\t\tthis.setFisheyeScale(1 + this.fisheyeGrowth * Math.abs(dist/size - 1));\n\t\t\t} else {\n\t\t\t\t// just a precaution to make sure fisheye scaling isn't \n\t\t\t\t// affecting its surrounding any more\n\t\t\t\tthis.setFisheyeScale(1.0);\n\t\t\t}\n\t\t}\n\t\tif (hasFocus) return this.mouseHandler.handleMouseEvent(evt, this);\n\n\t\tif (!evt.priorPoint || !this.fullContainsWorldPoint(evt.priorPoint)) return false;\n\n\t\tif (this.hasSubmorphs()) {\n\t\t\t// If any submorph handles it (ie returns true), then return\n\t\t\tfor (var i = this.submorphs.length - 1; i >= 0; i--) {\n\t\t\t\tif (this.submorphs[i].captureMouseEvent(evt, false)) return true;\n\t\t\t}\n\t\t}\n\t\tif (this.mouseHandler == null)\n\t\t\treturn false;\n\n\t\tif (!evt.priorPoint || !this.shape.containsPoint(this.localize(evt.priorPoint))) \n\t\t\treturn false;\n\n\n\t\treturn this.mouseHandler.handleMouseEvent(evt, this); \n\t},\n\n\n\tareEventsIgnored: function() {\n\t\treturn this.getTrait(\"pointer-events\") == \"none\";\n\t},\n\n\tignoreEvents: function() { // will not respond nor get focus\n\t\tthis.mouseHandler = null;\n\t\tthis.setTrait(\"pointer-events\", \"none\");\n\t\treturn this;\n\t},\n\n\tenableEvents: function() {\n\t\tthis.mouseHandler = MouseHandlerForDragging.prototype;\n\t\tthis.removeTrait(\"pointer-events\");\n\n\t\treturn this;\n\t},\n\n\trelayMouseEvents: function(target, eventSpec) {\n\t\tthis.mouseHandler = new MouseHandlerForRelay(target, eventSpec); \n\t},\n\n\thandlesMouseDown: function(evt) {\n\t\tif (this.mouseHandler == null || evt.isCommandKey()) return false;\t//default behavior\n\t\treturn this.mouseHandler.handlesMouseDown(); \n\t},\n\n\tonMouseDown: function(evt) { \n\t\tthis.hideHelp();\n\t}, //default behavior\n\n\tonMouseMove: function(evt, hasFocus) { //default behavior\n\t\tif (evt.mouseButtonPressed && this==evt.hand.mouseFocus && this.owner && this.owner.openForDragAndDrop) { \n\t\t\tthis.moveBy(evt.mousePoint.subPt(evt.priorPoint));\n\t\t} // else this.checkForControlPointNear(evt);\n\t\tif (!evt.mouseButtonPressed && !this.hasHandles()) this.checkForControlPointNear(evt);\n\t},\n\n\tonMouseUp: function(evt) { }, //default behavior\n\n\tconsiderShowHelp: function(oldEvt) {\n\t\t// if the mouse has not moved reasonably\n\t\tvar hand = oldEvt.hand;\n\t\tif (!hand) return; // this is not an active world so it doesn't have a hand\n\t\telse if (hand.getPosition().dist(oldEvt.mousePoint) < 10)\n\t\tthis.showHelp(oldEvt);\n\t},\n\n\tdelayShowHelp: function(evt) {\n\t\tvar scheduledHelp = new SchedulableAction(this, \"considerShowHelp\", evt, 0);\n\t\tif (this.world())\n\t\t\tthis.world().scheduleForLater(scheduledHelp, Config.ballonHelpDelay || 1000, false);\n\t},\n\n\tonMouseOver: function(evt) {\n\t\tthis.delayShowHelp(evt);\n\t}, \n\n\tonMouseOut: function(evt) { \n\t\tthis.hideHelp();\n\t}, \n\n\tonMouseWheel: function(evt) {\n\t\tif (!this.world()) return false;\n\t\treturn this.world().onMouseWheel(evt);\n\t},\n\n\ttakesKeyboardFocus: Functions.False,\n\n\tsetHasKeyboardFocus: Functions.False, // no matter what, say no\n\n\trequestKeyboardFocus: function(hand) {\n\t\tif (!hand) return;\n\t\tif (this.takesKeyboardFocus()) {\n\t\t\tif (this.setHasKeyboardFocus(true)) {\n\t\t\t\thand.setKeyboardFocus(this);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\trelinquishKeyboardFocus: function(hand) {\n\t\thand.setKeyboardFocus(null);\n\t\treturn this.setHasKeyboardFocus(false); \n\t},\n\n\tonFocus: function(hand) {\n\t\tthis.addFocusHalo();\n\t},\n\n\tonBlur: function(hand) {\n\t\tthis.removeFocusHalo();\n\t},\n\n\tremoveFocusHalo: function() {\n\t\tif (!this.focusHalo) return false;\n\t\t//this.focusHalo.removeRawNode();\n\t\tthis.focusHalo.remove();\n\t\tthis.focusHalo = null;\n\t\treturn true;\n\t},\n\n\tfocusHaloInset: 1,\n\n\tfocusStyle: {\n\t\tfill: null, \n\t\tborderColor: Color.blue,\n\t\tstrokeOpacity: 0.3\n\t},\n\n\tadjustFocusHalo: function() {\n\t\tthis.focusHalo.setBounds(this.localBorderBounds().expandBy(this.focusHaloInset));\n\t},\n\n\taddFocusHalo: function() {\n\t\tif (this.focusHalo || this.focusHaloBorderWidth <= 0) return false;\n\t\tthis.focusHalo = Morph.makeRectangle(this.localBorderBounds().expandBy(this.focusHaloInset));\n\t\tthis.focusHalo.name = \"FocusHalo\";\n\t\tthis.focusHalo.isEpimorph = true; // Do this before adding the halo\n\t\tthis.addMorph(this.focusHalo);\n\t\t// old\n\t\tthis.focusHalo.applyStyle(this.focusStyle);\n\t\t// new\n\t\tthis.focusHalo.linkToStyles([\"focusHalo\"]);\n\t\tthis.focusHalo.setBorderWidth(this.focusHaloBorderWidth);\n\t\tthis.focusHalo.setLineJoin(lively.scene.LineJoins.Round);\n\t\tthis.focusHalo.ignoreEvents();\n\t\treturn true;\n\t},\n\n},\n'handles', {\n\tcheckForControlPointNear: function(evt) {\n\t\tif (this.suppressHandles) return false; // disabled\n\t\tif (this.owner == null) return false; // cant reshape the world\n\t\tif (this.hasHandles()) return false; // handles already on - no rollovers\n\t\tvar partName = this.shape.partNameNear(this.localize(evt.point()));\n\t\tif (partName == null) return false;\n\n\t\tvar loc = this.shape.partPosition(partName);\n\t\tvar handle = this.makeHandle(loc, partName, evt);\n\t\tif (!handle) return false; // makeHandle variants may return null\n\n\t\tthis.addMorph(handle); \n\t\thandle.showHelp(evt);\n\t\tif (evt.hand.mouseFocus instanceof HandleMorph) evt.hand.mouseFocus.remove();\n\t\tevt.hand.setMouseFocus(handle);\n\t\treturn true; \n\t},\n\t\n\taddAllHandles: function(evt) {\n\t\tif (this.suppressHandles) return false; // disabled\n\t\tif (this.owner == null) return false; // can't reshape the world\n\t\tvar partNames = this.shape.allPartNames(); // Array of name\n\t\tfor (var i=0; i= 0 ? lively.scene.Rectangle : lively.scene.Ellipse;\n\t\treturn new HandleMorph(position, handleShape, evt.hand, this, partName);\n\t},\n},\n'grabbing and dragging', {\n copySubmorphsOnGrab: false, // acts as a palette if true. \n\tsuppressGrabbing: false,\n\n // May be overridden to preempt (by returning null) the default action of grabbing me\n // or to otherwise prepare for being grabbed or find a parent to grab instead\n okToBeGrabbedBy: function(evt) {\n\t\tif (this.suppressGrabbing)\n\t\t\treturn null;\n\t\treturn this; \n },\n\n\tgrid: function() {return Config.SnapGrid || pt(10,10)},\n\n\tisSnappingToGrid: function() { return Config.isSnappingToGrid},\n\n\tsnapToGrid: function(pos) {\n\t\tvar grid = this.grid();\n\t\treturn pt(pos.x - (pos.x % grid.x), pos.y - (pos.y % grid.y))\n\t},\n\n\tdragMe: function(evt) {\n\t\tvar offset = this.getPosition().subPt(this.owner.localize(evt.point()));\n\t\tvar self = this;\n\t\tvar mouseRelay= {\n\t\t\tcaptureMouseEvent: function(e) { \n\t\t\t\tif (e.type == \"MouseMove\") {\n\t\t\t\t\tvar pos = this.owner.localize(e.hand.getPosition()).addPt(offset)\n\t\t\t\t\tif (self.isSnappingToGrid()) {\n\t\t\t\t\t\tthis.setPosition(this.snapToGrid(pos));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.setPosition(pos);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tif (e.type == \"MouseDown\" || e.type == \"MouseUp\") e.hand.setMouseFocus(null); \n\t\t\t}.bind(this),\n\t\t};\n\t\tevt.hand.setMouseFocus(mouseRelay);\n\t},\n\n showAsGrabbed: function(grabbedMorph) {\n\t\t// At this time, there are three separate hand-effects:\n\t\t// 1. applyDropShadowFilter, if it works, will cause the graphics engine to put a nice\n\t\t//\t gaussian blurred drop-shadow on morphs that are grabbed by the hand\n\t\t// 2. showGrabHalo will cause a halo object to be put at the end of the hand's\n\t\t//\t submorph list for every grabbed morph (has property 'morphTrackedByHalo')\n\t\t// 3. useShadowMorphs will cause a shadowCopy of each grabbed morph to be put\n\t\t//\t at the end of the hand's submorph list (has property 'isHandMorphShadow')\n\t\t// So, if everything is working right, the hand's submorph list looks like:\n\t\t//\tfront -> Mc, Mb, Ma, Ha, Sa, Hb, Sb, Hc, Sc <- back [note front is last ;-]\n\t\t// Where M's are grabbed morphs, H's are halos if any, and S's are shadows if any\n\n if (this.applyDropShadowFilter) grabbedMorph.applyFilter(this.dropShadowFilter); \n\n\t\tif (Config.showGrabHalo) {\n\t\t var bounds = grabbedMorph.bounds(true);\n\t\t var halo = this.addMorphBack(Morph.makeRectangle(bounds).applyStyle({fill: null, borderWidth: 0.5 }));\n\t\t halo.morphTrackedByHalo = grabbedMorph;\n\t\t halo.shape.setStrokeDashArray(String([3,2]));\n\t\t halo.setLineJoin(lively.scene.LineJoins.Round);\n\t\t halo.ignoreEvents();\n\n\t\t var idLabel = new TextMorph(pt(20,10).extentAsRectangle(), String(grabbedMorph.id())).beLabel();\n\t\t idLabel.applyStyle(this.grabHaloLabelStyle);\n\t\t halo.addMorph(idLabel);\n\t\t idLabel.align(idLabel.bounds().bottomLeft(), halo.innerBounds().topRight());\n\t \n\t\t var pos = grabbedMorph.getPosition();\n\t\t var posLabel = new TextMorph(pt(20, 10).extentAsRectangle(), \"\").beLabel();\n\t\t posLabel.applyStyle(this.grabHaloLabelStyle);\n\t\t halo.positionLabel = halo.addMorph(posLabel);\n\n\t\t\tthis.updateGrabHalo();\n\t\t}\n if (this.useShadowMorphs) {\n\t\t\tvar shadow = grabbedMorph.shadowCopy();\n\t\t\tshadow.isHandMorphShadow = true;\n\t\t\tthis.addMorphBack(shadow);\n\t\t\tshadow.moveBy(pt(8, 8));\n\t\t}\n },\n\n\tshowAsUngrabbed: function (grabbedMorph) {\n\t\tif (this.applyDropShadowFilter) grabbedMorph.applyFilter(null);\n\t\tgrabbedMorph.withAllSubmorphsDo(function() {\n\t\t\tif (this.shadowConnection) {\n\t\t\t\tthis.shadowConnection.disconnect();\n\t\t\t\tdelete this.shadowConnection;\n\t\t\t}\n\t\t})\n },\n \n alignToGrid: function() {\n if(!Config.showGrabHalo) return;\n var grid = function(a) {\n return a - (a % (Config.alignToGridSpace || 5))\n\t\t};\n\t\tthis.submorphs.forEach(function(halo) {\n\t\t if (halo.morphTrackedByHalo) { // this is a tracking halo\n\t \tif (!halo.orgSubmorphPosition)\n\t\t\t halo.orgSubmorphPosition = halo.morphTrackedByHalo.getPosition();\n\t\t\tvar oldPos = this.worldPoint(halo.orgSubmorphPosition);\n\t\t\tvar gridPos = pt(grid(oldPos.x), grid(oldPos.y));\n\t\t\thalo.morphTrackedByHalo.setPosition(this.localize(gridPos));\n\t\t }\n\t\t}.bind(this));\n },\n\n updateGrabHalo: function Morph$updateGrabHalo() {\n\t\t// Note there may be several grabHalos, and drop shadows as well\n\t\t// See the comment in showAsGrabbed \n\t\tthis.submorphs.forEach(function(halo) {\n\t\t if (halo.morphTrackedByHalo) { // this is a tracking halo\n\t\t\t\thalo.setBounds(halo.morphTrackedByHalo.bounds(true).expandBy(3));\n\t\t\t\tif (halo.positionLabel) {\n\t\t\t\t var pos = this.worldPoint(halo.morphTrackedByHalo.getPosition());\n\t\t\t\t var posLabel = halo.positionLabel;\n\t\t\t\t posLabel.setTextString(pos.x.toFixed(1) + \",\" + pos.y.toFixed(1));\n\t\t\t\t posLabel.align(posLabel.bounds().bottomCenter(), halo.innerBounds().topLeft());\n\t\t\t\t}\n\t\t }\n\t\t}.bind(this));\n },\n\n\tgrabMorph: function(grabbedMorph, evt) { \n\t\tif (evt.isShiftDown() && (evt.isAltDown() || evt.isCommandKey())) {\n\t\t\tgrabbedMorph.dragMe(evt);\n\t\t\treturn;\n\t\t}\n\t\tif (evt.isShiftDown() || (grabbedMorph.owner && grabbedMorph.owner.copySubmorphsOnGrab == true)) {\n\t\t\tif (!grabbedMorph.okToDuplicate()) return;\n\t\t\tgrabbedMorph.copyToHand(this);\n\t\t\treturn;\n\t\t}\n\t\tif (evt.isCommandKey() || evt.isRightMouseButtonDown() || evt.isMiddleMouseButtonDown()) {\n\t\t\tgrabbedMorph.showMorphMenu(evt);\n\t\t\treturn;\n\t\t}\n\t\t// Give grabbed morph a chance to, eg, spawn a copy or other referent\n\t\tgrabbedMorph = grabbedMorph.okToBeGrabbedBy(evt);\n\t\tif (!grabbedMorph) return;\n\n\t\tif (grabbedMorph.owner && !grabbedMorph.owner.openForDragAndDrop) return;\n\n\t\tif (this.keyboardFocus && grabbedMorph !== this.keyboardFocus) {\n\t\t\tthis.keyboardFocus.relinquishKeyboardFocus(this);\n\t\t}\n\t\t// console.log('grabbing %s', grabbedMorph);\n\t\t// Save info for cancelling grab or drop [also need indexInOwner?]\n\t\t// But for now we simply drop on world, so this isn't needed\n\t\tthis.grabInfo = [grabbedMorph.owner, grabbedMorph.position()];\n\t\tif (this.logDnD) console.log('%s grabbing %s', this, grabbedMorph);\n\t\tthis.addMorphAsGrabbed(grabbedMorph);\n\t\t// grabbedMorph.updateOwner(); \n\t\tthis.changed(); //for drop shadow\n\t},\n \n addMorphAsGrabbed: function(grabbedMorph) { \n this.addMorph(grabbedMorph);\n\t\tthis.showAsGrabbed(grabbedMorph);\n },\n \n dropMorphsOn: function(receiver) {\n\t\tif (receiver !== this.world()) \n\t\t\tthis.unbundleCarriedSelection();\n\t\tif (this.logDnD) \n\t\t\tconsole.log(\"%s dropping %s on %s\", this, this.topSubmorph(), receiver);\n\t\tthis.carriedMorphsDo( function(m) {\n\t\t\tm.dropMeOnMorph(receiver);\n\t\t\tthis.showAsUngrabbed(m);\n\t\t});\n\t\tthis.shadowMorphsDo( function(m) { m.stopAllStepping(); });\n\t\tthis.removeAllMorphs() // remove any shadows or halos\n },\n\n carriedMorphsDo: function(func) {\n\t\t// Evaluate func for only those morphs that are being carried,\n\t\t// as opposed to, eg, halos or shadows\n\t\tthis.submorphs.clone().reverse().forEach(function(m) {\n\t\t if (!m.morphTrackedByHalo && !m.isHandMorphShadow) func.call(this, m);\n\t\t}.bind(this));\n },\n\n shadowMorphsDo: function(func) { \n\t\t// Evaluate func for only those morphs that are shadows,\n\t\tthis.submorphs.clone().reverse().forEach(function(m) {\n\t\t if (m.isHandMorphShadow) func.call(this, m);\n\t\t}.bind(this));\n },\n\n unbundleCarriedSelection: function() {\n // Unpack the selected morphs from a selection prior to drop or jump to other world\n if (!this.hasSubmorphs() || !(this.topSubmorph() instanceof SelectionMorph)) return;\n var selection = this.topSubmorph();\n for (var i=0; i>toggleDnD\");\n\t\tthis.openForDragAndDrop = !this.openForDragAndDrop;\n\t},\n\n\topenDnD: function(loc) {\n\t\tthis.openForDragAndDrop = true;\n\t},\n\n\tcloseDnD: function(loc) {\n\t\t// console.log(this + \">>closeDnD\");\n\t\tthis.openForDragAndDrop = false;\n\t},\n\n closeAllToDnD: function(loc) {\n // console.log(this + \">>closeAllDnD\");\n // Close this and all submorphs to drag and drop\n this.closeDnD(); \n // make this recursive to give children a chance to interrupt...\n this.submorphs.forEach( function(ea) { ea.closeAllToDnD(); });\n },\n\n\topenAllToDnD: function() {\n\t\t// Open this and all submorphs to drag and drop\n\t\tthis.withAllSubmorphsDo( function() { this.openDnD(); });\n\t},\n\n\tdropMeOnMorph: function(receiver) {\n\t\treceiver.addMorph(this); // this removes me from hand\n\t},\n\n\tpickMeUp: function(evt) {\n\t\tvar offset = evt.hand.getPosition().subPt(evt.point());\n\t\tthis.moveBy(offset);\n\t\tevt.hand.addMorphAsGrabbed(this);\n\t},\n},\n'morph menu', {\n\n\teditMenuItems: function(evt) { \n\t\treturn []; // Overridden by, eg, TextMorph\n\t},\n\n\tshowMorphMenu: function(evt, optMenu) {\n\t\tif (evt.hand.lastMorphMenu && evt.hand.lastMorphMenu.owner)\n\t\t\tevt.hand.lastMorphMenu.remove(); // cleanup old open menus\n\t\tvar world = this.world(),\n\t\t\tmenu = optMenu || this.morphMenu(evt),\n\t\t\tmenuCaption = this.toString(),\n\t\t\tcaptionClickAction = world.prompt.bind(world).curry(\n\t\t\t\t'edit name',\n\t\t\t\tfunction(newName) {\n\t\t\t\t\tif (!newName) { alert('Invalid name ' + newName); return }\n\t\t\t\t\talertOK(this + ' renamed to ' + newName);\n\t\t\t\t\tthis.setName(newName);\n\t\t\t\t}.bind(this),\n\t\t\t\tthis.getName());\n\t\tmenu.openIn(world, evt.point(), false, menuCaption, captionClickAction); \n\t\tevt.hand.lastMorphMenu = menu;\n\t},\n\n\tmorphMenuBasicItems: function(evt) {\n\t\tvar items = [\n\t\t\t[\"remove\", this.remove],\n\t\t\t[\"drill\", this.showOwnerChain.curry(evt)],\n\t\t\t[\"grab\", this.pickMeUp.curry(evt)],\n\t\t\t[\"drag\", this.dragMe.curry(evt)],\n\t\t\t[\"edit style\", function() { new StylePanel(this).open()}],\n\t\t\t[((this.hasHandles()) ? \"hide\" : \"show\") + \" all handles\", function(evt) {\n\t\t\t\tif (this.hasHandles()) this.removeAllHandlesExcept(null);\n\t\t\t\t\telse this.addAllHandles(evt) }.bind(this) ],\t\t\n\t\t\t[\"inspect\", function(evt) { lively.Tools.inspect(this) }],\n\t\t\t[\"show class in browser\", function(evt) { var browser = new SimpleBrowser(this);\n\t\t\t\t// browser.openIn(this.world(), evt.point());\n\t\t\t\tbrowser.open();\n\t\t\t\tbrowser. selectedClassName = this.getType();\n\t\t\t}]\n\t\t];\n\t\tif (this.okToDuplicate())\n\t\t\titems.unshift([\"duplicate\", this.copyToHand.curry(evt.hand)]);\n\n\t\tif (this.shape instanceof lively.scene.Polyline || this.shape instanceof lively.scene.Polygon)\n\t\t\titems.push( [\"copy to curve\", this.makeCurve]);\n\n\t\tif (this.getModel() instanceof SyntheticModel)\n\t\t\titems.push( [\"show Model dump\", this.addModelInspector.curry(this)]);\n\t\treturn items\n\t},\n\n\tmorphMenu: function(evt) { \n\t\tvar menu = new MenuMorph(this.morphMenuBasicItems(evt), this);\n\t\tmenu.addLine();\n\t\tmenu.addItem([\"world...\", function() {this.world().showMorphMenu(evt)}.bind(this)]);\n\t\tmenu.addLine();\n\t\tmenu.addItems(this.subMenuItems(evt));\n\t\treturn menu;\n\t},\n\tsubMenuLayoutItems: function() {\n\t\tvar morph = this;\n\t\tfunction setLayouter(klass) {\n\t\t\tmorph.layoutManager = new klass();\n\t\t\tmorph.relayout();\n\t\t};\n\t\treturn [\n\t\t\t[\"default layout\", function() { setLayouter(LayoutManager) }],\n\t\t\t[\"horizontal layout\", function() { setLayouter(HorizontalLayout) }],\n\t\t\t[\"vertical layout\", function() { setLayouter(VerticalLayout) }],\n\t\t];\t\n\t},\n\n\n\tsubMenuPropertiesItems: function(evt) {\n\t\treturn [\n\t\t\t[\"edit name...\", function() { this.world().prompt('edit name', function(input) { this.setName(input) }.bind(this), this.getName()) }],\n\t\t\t[\"reset rotation\", this.setRotation.curry(0)],\n\t\t\t[\"reset scaling\", this.setScale.curry(1)],\n\t\t\t[\"toggle fullscreen\", function() { this.isInFullScreen() ? this.leaveFullScreen() : this.enterFullScreen() }.bind(this)],\n\t\t\t[((this.suppressGrabbing) ? \"[] grabbing\" : \"[X] grabbing\"), function(){this.suppressGrabbing = !this.suppressGrabbing}.bind(this)],\n\t\t\t[((this.suppressHandles) ? \"[] handles\" : \"[X] handles\"), function(){this.suppressHandles = !this.suppressHandles}.bind(this)],\n\t\t\t[((this.openForDragAndDrop) ? \"[X] accepts Drops\" : \"[] accepts Drops\"), function(){this.openForDragAndDrop = !this.openForDragAndDrop}.bind(this)],\n\t\t\t[\"ignore events\", this.ignoreEvents.bind(this)],\n\t\t\t[\"color chooser (gray)\", function() { \n\t\t\t\tvar colorChooser = new ColorChooserWidget(this), window = colorChooser.buildView();\n\t\t\t\tthis.world().addFramedMorph(pane, \"gray\", this.world().positionForNewMorph(pane))}]\n\t\t]\n\t},\n\t\n\tsubMenuWindowItems: function(evt) {\n\t\treturn [\n\t\t\t[\"put me in a window\", this.putMeInAWindow.curry(this.position())], \n\t\t\t[\"put me in a tab\", this.putMeInATab.curry(this.position())],\n\t\t\t[\"put me in the open\", this.putMeInTheWorld.curry(this.position())],\n\t\t\t[\"show Lively markup\", this.addSvgInspector.curry(this)],\n\t\t\t[\"package\", function(evt) { // FIXME insert package morph in exactly the same position?\n\t\t\t\tnew PackageMorph(this).openIn(this.world(), evt.point()); this.remove(); } ],\n\t\t\t[\"publish packaged ...\", function() { this.world().prompt('publish as (.xhtml)', this.exportLinkedFile.bind(this)); }] \n\t\t]\n\t},\n\n\tsubMenuStyleItems: function(evt) {\n\t\treturn new StyleEditor().styleEditorMenuItems(this, evt);\n\t},\n\n\tsubMenuItems: function(evt) {\n\t\treturn [\n\t\t\t['Style', this.subMenuStyleItems(evt)],\n\t\t\t['Layout', this.subMenuLayoutItems(evt)],\n\t\t\t['Properties', this.subMenuPropertiesItems(evt)],\n\t\t\t['Window and World', this.subMenuWindowItems(evt)]\n\t\t]\n\t},\n\n showPieMenu: function(evt) {\n \tvar menu, targetMorph = this;\n\t\tvar items = [\n\t\t\t['undo (~)', function(evt) { PieMenuMorph.doUndo(); }],\n\t\t\t['duplicate (o-->o)', function(evt) {\n\t\t\t\tevt.hand.setPosition(menu.mouseDownPoint);\n\t\t\t\tmenu.targetMorph.copyToHand(evt.hand);\n\t\t\t\tvar theCopy = evt.hand.submorphs[0];\n\t\t\t\tPieMenuMorph.setUndo(function() { theCopy.remove(); }); // Why doesn't this work??\n\t\t\t\t}],\n\t\t\t['move (o-->)', function(evt) {\n\t\t\t\tvar oldPos = targetMorph.getPosition();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setPosition(oldPos); });\n\t\t\t\tevt.hand.setPosition(menu.mouseDownPoint);\n\t\t\t\tevt.hand.addMorph(menu.targetMorph);\n\t\t\t\tif (menu.targetMorph instanceof SelectionMorph) // Fixme: This should be in SelectionMorph\n\t\t\t\t\tmenu.targetMorph.selectedMorphs.forEach( function(m) { evt.hand.addMorph(m); });\n\t\t\t\t}],\n\t\t\t['scale (o < O)', function(evt) {\n\t\t\t\tvar oldScale = targetMorph.getScale();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setScale(oldScale); });\n\t\t\t\tmenu.addHandleTo(targetMorph, evt, 'scale');\n\t\t\t\t}],\n\t\t\t[((targetMorph.hasHandles()) ? \"hide\" : \"show\") + \" all handles ([])\", function(evt) {\n\t\t\t\tif (targetMorph.hasHandles()) targetMorph.removeAllHandlesExcept(null);\n\t\t\t\t\telse targetMorph.addAllHandles(evt) }],\n\t\t\t['delete (X)', function(evt) {\n\t\t\t\tvar oldOwner = targetMorph.owner;\n\t\t\t\tPieMenuMorph.setUndo(function() { oldOwner.addMorph(targetMorph); });\n\t\t\t\ttargetMorph.remove();\n\t\t\t\t}],\n\t\t\t['edit style (<>)', function() { new StylePanel(this).open()}],\n\t\t\t['rotate (G)', function(evt) {\n\t\t\t\tvar oldRotation = targetMorph.getRotation();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setRotation(oldRotation); });\n\t\t\t\tmenu.addHandleTo(targetMorph, evt, 'rotate');\n\t\t\t\t}]\n\t\t];\n\t\tmenu = new PieMenuMorph(items, this, 0.5);\n\t\tmenu.open(evt);\n },\n\n},\n'window related', {\n\n\tputMeInAWindow: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar w = this.world();\n\t\tvar wm = new WindowMorph(this.windowContent(), this.windowTitle());\n\t\t// Position it so the content stays in place\n\t\tw.addMorphAt(wm, loc.subPt(wm.contentOffset));\n\t\tif (c) c.remove();\n\t},\n\n\tputMeInATab: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar w = this.world();\n\t\tvar wm = new TabbedPanelMorph(this.windowContent(), this.windowTitle());\n\t\tw.addMorphAt(wm, wm.getPosition());\n\t\tif (c) c.remove();\n\t},\n\n\tputMeInTheWorld: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar loc = c ? c.position().addPt(c.contentOffset) : this.position();\n\t\tthis.world().addMorphAt(this, loc);\n\t\tif (c) c.remove();\n\t},\n\n\timmediateContainer: function() { // Containers override to return themselves\n\t\tif (this.owner) return this.owner.immediateContainer();\n\t\telse return null;\n\t},\n\n\twindowContent: function() {\n\t\treturn this; // Default response, overridden by containers\n\t},\n\n\twindowTitle: function() {\n\t\treturn Object.inspect(this).truncate(); // Default response, overridden by containers\n\t},\n\n\n\n\tcopyToHand: function(hand, evt, optCopier) {\n\t\t// Function.prototype.shouldTrace = true;\n\t\tif (optCopier)\n\t\t\tvar copier = optCopier;\n\t\telse\n\t\t\tvar copier = new Copier();\n\t\tvar copy = this.copy(copier);\n\t\tif (!optCopier)\n\t\t\tcopier.finish(); // if copier comes from outside it should call finish\n\n\t\t// when copying submorphs, make sure that the submorph that becomes a top-level morph \n\t\t// reappears in the same location as its original.\n\t\tconsole.log('copied %s', copy);\n\t\tcopy.owner = null; // so following addMorph will just leave the tfm alone\n\t\tthis.owner.addMorph(copy); // set up owner as the original parent so that... \n\t\thand.addMorph(copy); // ... it will be properly transformed by this addMorph()\n\t\t// copy.setPosition(pt(0,0))\n\t\thand.showAsGrabbed(copy);\n\t\t// copy.withAllSubmorphsDo(function() { this.startStepping(null); }, null);\n\t\treturn copy\n\t},\n\nshadowCopy: function(hand) {\n\t\t// copied and adapted from asLogo\n\t\tvar shapes = [], copier = new Copier(), root = this;\n\t\t\n\t\tthis.shadowCopyIntoShapes(root, shapes, copier);\n\t\t\n\t\tvar shadow = new Morph(new lively.scene.Group())\n\t\tshadow.shape.setContent(shapes)\n\t\tshadow.setTransform(root.getTransform());\n\n\t\troot.shadowConnection = connect(this, 'transformChanged', shadow, 'setTransform', {\n\t\t\tconverter: function($upd) {\n\t\t\t\treturn new lively.scene.Similitude(\n\t\t\t\t\tthis.targetObj.getTransform().getTranslation(),\n\t\t\t\t\tthis.sourceObj.getRotation(),\n\t\t\t\t\tpt(this.sourceObj.getScale(), this.sourceObj.getScale()));\n\t\t\t}\n\t\t})\n\n\t\tif (!this.isClipMorph)\n\t\t\tthis.submorphs.forEach(function(ea) {\n\t\t\t\tshadow.addMorph(ea.shadowCopy(hand));\n\t\t\t})\n\n\t\treturn shadow;\n\t},\n\tshadowCopyIntoShapes: function(root, shapes, copier) {\n\t\tif (this.isEpimorph) return;\n\n\t\tvar s = this.shape.copy(copier)\n\n\t\tif (s.getFill()) s.setFill(Color.black);\n\t\tif (s.getStroke()) s.setStroke(Color.black);\n\t\ts.setFillOpacity(0.3);\n\t\ts.setStrokeOpacity(0.3);\n\n\t\tthis.transformForNewOwner(root).applyTo(s.rawNode)\n\t\tshapes.push(s);\n\t},\n\n\n\tmorphToGrabOrReceiveDroppingMorph: function(evt, droppingMorph) {\n\t\treturn this.morphToGrabOrReceive(evt, droppingMorph, true);\n\t},\n\n\tmorphToGrabOrReceive: function(evt, droppingMorph, checkForDnD) {\n\t\t// If checkForDnD is false, return the morph to receive this mouse event (or null)\n\t\t// If checkForDnD is true, return the morph to grab from a mouse down event (or null)\n\t\t// If droppingMorph is not null, then check that this is a willing recipient (else null)\n\n\t\tif (this.isEpimorph)\n\t\t\treturn null;\n\n\t\tif (!this.fullContainsWorldPoint(evt.mousePoint)) return null; // not contained anywhere\n\t\t// First check all the submorphs, front first\n\t\tfor (var i = this.submorphs.length - 1; i >= 0; i--) {\n\t\t\tvar hit = this.submorphs[i].morphToGrabOrReceive(evt, droppingMorph, checkForDnD); \n\t\t\tif (hit != null) { \n\t\t\t\treturn hit; // hit a submorph\n\t\t\t}\n\t\t};\n\n\t\t// Check if it's really in this morph (not just fullBounds)\n\t\tif (!this.containsWorldPoint(evt.mousePoint)) return null;\n\n\t\t// If no DnD check, then we have a hit (unless no handler in which case a miss)\n\t\tif (!checkForDnD) return this.mouseHandler ? this : null;\n\n\t\t// On drops, check that this is a willing recipient\n\t\tif (droppingMorph != null) {\n\t\t\treturn this.acceptsDropping(droppingMorph) ? this : null;\n\t\t} else {\n\t\t\t// On grabs, can't pick up the world or morphs that handle mousedown\n\t\t\t// DI: I think the world is adequately checked for now elsewhere\n\t\t\t// else return (!evt.isCommandKey() && this === this.world()) ? null : this; \n\t\t\treturn this;\n\t\t}\n\n\t},\n\n\tmorphToReceiveEvent: function(evt) {\n\t\t// This should replace morphToGrabOrReceive... in Hand where events\n\t\t// must be displatched to morphs that are closed to DnD\n\t\treturn this.morphToGrabOrReceive(evt, null, false);\n\t},\n\n\n\tacceptsDropping: function(morph) { \n\t\treturn !this.suppressDropping && this.openForDragAndDrop && !(morph instanceof WindowMorph);\n\t},\n\n},\n'fullscreen', {\n\tenterFullScreen: function() {\n\t\tvar world = this.world();\n\t\tif (this._isInFullScreen || !world) return;\n\t\tthis._isInFullScreen = true;\n\t\tthis.oldPosition = this.getPosition();\n\t\tthis.oldWorldScale = world.getScale();\n\t\tthis.oldWorldExtent = world.getExtent();\n\t\tvar windowExtent = world.windowBounds().extent(),\n\t\t\tratioY = (windowExtent.y / this.getExtent().y) * world.getScale(),\n\t\t\tratioX = (windowExtent.x / this.getExtent().x) * world.getScale(),\n\t\t\tratio = Math.min(ratioX, ratioY);\n\t\tif (ratio > 0 && ratio < 100) {\n\t\t\tworld.setScale(ratio);\t\t\t\n\t\t\tvar pos = this.getTransform().transformPoint(this.shape.bounds().topLeft());\n\t\t\tthis.setPosition(pt(0,0))\n\t\t\tGlobal.scrollTo(0, 0)\n\t\t\tworld.setExtent(windowExtent);\n\t\t\tworld.resizeCanvasToFitWorld();\n\t\t\t// rk actually the following three lines should be unnecessary because of resizeCanvasToFitWorld\n\t\t\tvar canvas = world.canvas();\n\t\t\tcanvas.setAttribute(\"width\", windowExtent.x);\t\n\t\t\tcanvas.setAttribute(\"height\", windowExtent.y);\n\t\t\tthis.clipWorld();\n\t\t};\n\t},\n\n\tleaveFullScreen: function() {\n\t\tif (!this._isInFullScreen) return;\n\t\tthis._isInFullScreen = false;\n\t\tthis.setPosition(this.oldPosition)\n\t\tthis.unclipWorld();\n\t\tthis.world().setScale(this.oldWorldScale);\n\t\tthis.world().setExtent(this.oldWorldExtent);\n\t\tthis.world().resizeCanvasToFitWorld();\n\t\tGlobal.scrollTo(this.oldPosition.x, this.oldPosition.y)\n\t\tdelete this.oldWorldExtent;\n\t\tdelete this.oldWorldScale;\n\t\tdelete this.oldPosition;\n\t},\n\tisInFullScreen: function() { return this._isInFullScreen },\n\n\n\tclipWorld: function() {\n\t\tthis.unclipWorld();\n\t\tthis.owner.addMorphFront(this);\n\t\tvar clipBounds = this.getPosition().extent(this.shape.bounds().extent()),\n\t\t\tclip = new lively.scene.Clip(new lively.scene.Rectangle(clipBounds)),\n\t\t\tworld = this.world();\n\t\tclip.reference();\n\t\tclip.applyTo(world);\t\t\n\t\tworld.worldClip = clip;\n\t},\n\n\tunclipWorld: function() {\n\t\tvar world = this.world();\n\t\tif (world.worldClip) {\n\t\t\tworld.worldClip.dereference();\n\t\t\tdelete world.worldClip;\n\t\t};\n\t\tworld.setTrait(\"clip-path\", \"\");\n\t},\n},\n'stepping', { // Morph stepping/timer functions\n\n startSteppingScripts: function() { }, // May be overridden to start stepping scripts\n\n\tstopStepping: function() {\n\t\tif (!this.activeScripts) return;\n\t\t// ignore null values\n\t\tvar scripts = this.activeScripts.select(function (ea) { return ea });\n\t\tscripts.invoke('stop', this.world());\n\t\tscripts.forEach(function(ea) { this.removeMorph(ea) }, this)\n\t\tthis.activeScripts = null;\n\t},\n\t\n\tstopSteppingScriptNamed: function(sName) {\n\t\tif (!this.activeScripts) return;\n\t\tthis.activeScripts.select(function (ea) { return ea.scriptName == sName }).invoke('stop', this.world());\n\t\tthis.activeScripts = this.activeScripts.select(function (ea) { return ea.scriptName !== sName });\t\n\t\tif (this.activeScripts.length == 0) this.activeScripts = null;\n\t},\n \tstopSteppingScriptNamedAndRemoveFromSubmorphs: function(sName) {\n\t\tif (!this.activeScripts) return;\n\t\tvar all = this.activeScripts.select(function (ea) { return ea.scriptName == sName });\n\t\tif (this.world()) all.invoke('stop', this.world());\n\t\tall.each(function(ea) {this.removeMorph(ea);}.bind(this));//remove\n\t\tthis.activeScripts = this.activeScripts.select(function (ea) { return ea.scriptName !== sName });\t\n\t\tif (this.activeScripts.length == 0) this.activeScripts = null;\n },\n\n\n\tstartStepping: function(stepTime, scriptName, argIfAny) {\n\t\tif (!scriptName) throw Error(\"Old code\");\n\t\tvar action = new SchedulableAction(this, scriptName, argIfAny, stepTime);\n\t\tthis.addActiveScript(action);\n\t\taction.start(this.world());\n\t\treturn action;\n\t},\n\n\taddActiveScript: function(action) {\n\t\t// Every morph carries a list of currently active actions (alarms and repetitive scripts)\n\t\tif (!this.activeScripts) this.activeScripts = [action];\n\t\telse this.activeScripts.push(action);\n\t\tif (!action.rawNode.parentNode) \n\t\t\tthis.addMorph(action);\n\t\treturn this;\n\t\t// if we're deserializing the rawNode may already be in the markup\n\t},\n\n stopAllStepping: function() { // For me and all my submorphs \n\t\tthis.withAllSubmorphsDo( function() { this.stopStepping(); });\n },\n\n suspendAllActiveScripts: function() { // For me and all my submorphs\n\t\tthis.withAllSubmorphsDo(function() { this.suspendActiveScripts(); });\n },\n\n\tsuspendActiveScripts: function() {\n\t\tif (this.activeScripts) { \n\t\t\tthis.suspendedScripts = this.activeScripts.clone();\n\t\t\tthis.stopStepping();\n\t\t}\n\t},\n\n\tresumeAllSuspendedScripts: function() {\n\t\tvar world = WorldMorph.current();\n\t\tthis.withAllSubmorphsDo( function() {\n\t\t\tif (this.suspendedScripts) {\n\t\t\t\t// ignore null values\n\t\t\t\tthis.suspendedScripts.select(function (ea) { return ea }).invoke('start', world);\n\t\t\t\tthis.activeScripts = this.suspendedScripts;\n\t\t\t\tthis.suspendedScripts = null;\n\t\t\t}\n\t\t});\n\t},\n\tforceRestartAllActiveScripts: function() {\n\t\tvar world = WorldMorph.current();\n\t\tthis.withAllSubmorphsDo( function() {\n\t\t\tif (this.activeScripts) {\n\t\t\t\tthis.activeScripts.select(function (ea) { return ea }).invoke('start', world);\n\t\t\t}\n\t\t});\n\t},\n\n\n},\n'scripts', {\n\taddScript: function(funcOrString, optName) {\n\t\tvar func = Function.fromString(funcOrString);\n\t\treturn func.asScriptOf(this, optName);\n\t},\n\n\taddScriptNamed: function(name, funcOrString) {\n\t\t// DEPRECATED!!!\n\t\treturn this.addScript(funcOrString, name);\n\t},\n},\n'debugging', {\n\tnotify: function(msg, loc) {\n\t\tif (!loc) loc = this.world().positionForNewMorph();\n\t\tnew MenuMorph([[\"OK\", 0, \"toString\"]], this).openIn(this.world(), loc, false, msg); \n\t},\n\n\tshowOwnerChain: function(evt) {\n\t\tvar items = this.ownerChain().reverse().map(\n\t\t\tfunction(each) { \n\t\t\t\treturn [Object.inspect(each).truncate(), function(evt2) { each.showMorphMenu(evt) }]; \n\t\t\t});\n\t\tnew MenuMorph(items, this).openIn(this.world(), evt.point(), false, \"Top item is topmost\");\n\t},\n\n\ttoString: function() {\n\t\ttry {\n\t\t\tvar name = this.getName();\n\t\t\tif (name && name != '') name += '(' + this.constructor.name + ')';\n\t\t\telse name = (this.rawNode && this.id()) || 'morph without rawNode';\n\t\t\treturn name;\n\t\t} catch (e) {\n\t\t\t//console.log(\"toString failed on %s\", [this.id(), this.getType()]);\n\t\t\treturn \"#\";\n\t\t}\n\t},\n\n\tinspect: function() {\n\t\ttry {\n\t\t\treturn this.toString();\n\t\t} catch (err) {\n\t\t\treturn \"#\";\n\t\t}\n\t},\n\t\n\taddSvgInspector: function() {\n\t\tvar xml = Exporter.stringify(new Exporter(this).serialize(Global.document));\n\t\tvar txt = this.world().addTextWindow({\n\t\t\tcontent: xml,\n\t\t\ttitle: \"XML dump\", \n\t\t\tposition: this.world().positionForNewMorph(null, this)\n\t\t});\n\t\ttxt.innerMorph().xml = xml; // FIXME a sneaky way of passing original text.\n\t},\n\n\taddModelInspector: function() {\n\t\tvar model = this.getModel();\n\t\tif (model instanceof SyntheticModel) {\n\t\t\tvar variables = model.variables();\n\t\t\tvar list = [];\n\t\t\tfor (var i = 0; i < variables.length; i++) {\n\t\t\t\tvar varName = variables[i];\n\t\t\t\tlist.push(varName + \" = \" + model.get(varName));\n\t\t\t}\n\t\t\tthis.world().addTextListWindow({\n\t\t\t\tcontent: list,\n\t\t\t\ttitle: \"Simple Model dump\",\n\t\t\t\tposition: this.world().positionForNewMorph(null, this)\n\t\t\t});\n\t\t}\n\t},\n\n},\n'Fabrik',{\n\tisContainedIn: function(morph) {\n\t\tif (!this.owner) return false;\n\t\tif (this.owner === morph) return true;\n\t\treturn this.owner.isContainedIn(morph)\n\t},\n},\n'signals',{\n\tsignalGeometryChange: function() {\n\t\tsignal(this, 'geometryChanged')\n\t\tvar morphs = this.submorphs;\n\t\tfor(var i=0; i < morphs.length; i++) {\n\t\t\tmorphs[i].signalGeometryChange()\n\t\t}\n\t},\n\n});\n\nMorph.addMethods(ViewTrait);\n\n// ===========================================================================\n// World-related widgets\n// ===========================================================================\n\n// A unique characteristics of the Morphic graphics system is that\n// all the objects (morphs) live in a \"world\" that is shared between \n// different objects and even between different users. A world can\n// contain a large number of different applications/widgets, much like\n// in an operating system a folder can contain a lot of files. Worlds\n// can be linked to each other using LinkMorphs. As a consequence,\n// the entire system can contain a large number of worlds, each of\n// which contains a large number of simultaneously running applications\n// and widgets. \n\nMorph.subclass(\"PasteUpMorph\", {\n\n documentation: \"used for layout, most notably the world and, e.g., palettes\",\n\n initialize: function($super, bounds, shapeType) {\n return $super(bounds, shapeType);\n },\n \n\tcaptureMouseEvent: function PasteUpMorph$captureMouseEvent($super, evt, hasFocus) {\n\t\tif (evt.type == \"MouseDown\" && this.onMouseDown(evt)) return;\n\t\tif (evt.type == \"MouseWheel\" && this.onMouseWheel(evt)) return;\n\t\t$super(evt, hasFocus); \n\t},\n\n\tonMouseDown: function PasteUpMorph$onMouseDown($super, evt) { //default behavior is to grab a submorph\n\t\t$super(evt);\n\t\tvar m = this.morphToReceiveEvent(evt);\n\t\tif (false && m instanceof HandleMorph) { // Verify handles work with pie menus, then delete\n\t\t\tm.onMouseDown(evt); // fixme\n\t\t\treturn true;\n\t\t}\n\t\tif (Config.usePieMenus) {\n\t\t\tif (m.handlesMouseDown(evt)) return false;\n\t\t\tm.showPieMenu(evt, m);\n\t\t\treturn true;\n\t\t}\n\t\tif (m == null) { \n\t\t\tthis.makeSelection(evt); \n\t\t\treturn true; \n\t\t} else if (!evt.isCommandKey() && evt.isLeftMouseButtonDown()) {\n\t\t\tif (m === this.world()) { \n\t\t\t\tthis.makeSelection(evt); \n\t\t\t\treturn true; \n\t\t\t} else if (m.handlesMouseDown(evt)) \n\t\t\t\treturn false;\n\t\t}\n\t\tevt.hand.grabMorph(m, evt);\n\t\treturn true; \n\t},\n\n\n\tbounds: function($super, ignoreTransients, ignoreTransform) {\n\t\treturn $super(ignoreTransients, true);\n\t},\n\t\n\tonMouseWheel: function(evt) {\t\t\n\t\tif (!evt.isCommandKey()) return false;\n\t\tevt.preventDefault();\n\n\t\tvar wheelDelta = evt.wheelDelta(),\n\t\t\toldScale = this.getScale();\n\n\t\tvar minScale = 0.1, maxScale = 10;\n\t\tif (oldScale < minScale && wheelDelta < 0) return false;\n\t\tif (oldScale > maxScale && wheelDelta > 0) return false;\n\t\tvar scaleDelta = 1 + evt.wheelDelta() / 500;\n\t\n\t\t// this.scaleBy(scaleDelta);\n\t\tvar newScale = oldScale * scaleDelta,\n\t\t\tnewScale = Math.max(Math.min(newScale, maxScale), minScale);\n\t\tthis.setScale(newScale)\n\t\tif (this.hands && this.hands[0]) this.hands[0].setScale(1/newScale)\n\n\t\t// actually this should be a layoutChanged but implementing\n\t\t// layoutChanged in WorldMorph is expensive since it is always called when a\n\t\t// submorph's layout is changed (owner chain propagation)\n\t\tthis.resizeCanvasToFitWorld();\n\t\t\n\t\t// Zoom into/out of the current mouse position:\n\t\t// p is the current mouse position. If we wouldn't move the window the new mouse pos would be scaledP.\n\t\t// We calculate the vector from scaledP to p and scale that by the current scale factor\n\t\t// We end up with a vector that can be used to scroll the screen to zoom in/out\n\t\tvar p = evt.point(),\n\t\t\tscaledP = p.scaleBy(1/scaleDelta),\n\t\t\ttranslatedP = p.subPt(scaledP).scaleBy(this.getScale());\n\t\twindow.scrollBy(translatedP.x, translatedP.y)\n\n\t\treturn true\n\t},\n\t\n okToBeGrabbedBy: function(evt) {\n // Paste-ups, especially the world, cannot be grabbed normally\n return null; \n },\n\n\tmakeSelection: function(evt) {\t//default behavior is to grab a submorph\n\t\tif (this.world().currentSelection != null) this.world().currentSelection.removeOnlyIt();\n\t\t\n\t\tvar m = new SelectionMorph(evt.point().asRectangle());\n\t\tthis.world().currentSelection = m;\n\t\t\n\t\tthis.world().addMorph(m);\n\t\tvar handle = new HandleMorph(pt(0,0), lively.scene.Rectangle, evt.hand, m, \"bottomRight\");\n\t\thandle.setExtent(pt(0, 0));\n\t\thandle.mode = 'reshape';\n\t\tm.addMorph(handle);\n\t\tevt.hand.setMouseFocus(handle);\n\t\tevt.hand.setKeyboardFocus(handle);\n\t}, \n});\n\nPasteUpMorph.subclass(\"WorldMorph\", \n'defaults', {\n documentation: \"A Morphic world (a visual container of other morphs)\",\n fill: Color.primary.blue,\n defaultExtent: pt(1280, 1024),\n\tstyleClass: ['world'],\n\t\n // Default theme for the theme manager \n},\n'initialization', {\n\tinitialize: function($super, canvas, backgroundImageId) {\n\t\tvar bounds = Rectangle.fromElement(canvas);\n\t\t// sometimes bounds has zero dimensions (when reloading thes same page, timing issues?\n\t\t// in Firefox bounds may be 1x1 size?? maybe everything should be run from onload or sth?\n\t\tif (bounds.width < 2) {\n\t\t\tbounds.width = this.defaultExtent.x;\n\t\t}\n\n\t\tif (bounds.height < 2) {\n\t\t\tbounds.height = this.defaultExtent.y;\n\t\t}\n\n\t\tif (backgroundImageId) {\n\t\t\tvar background = NodeFactory.create(\"use\");\n\t\t\tXLinkNS.setHref(background, backgroundImageId);\n\t\t\tthis.addNonMorph(background);\n\t\t}\n\t\t$super(new lively.scene.Rectangle(bounds));\n\n\t\tthis.setDisplayTheme(this.displayTheme); // apply display theme\n\n\t\t//gradient.rawNode.setAttributeNS(null, \"gradientTransform\", \"translate(0, -0.1) skewY(10)\");\t\t \n\t\tthis.enterCount = 0;\n\t},\n\n\tdoNotSerialize: ['hands', 'scheduledActions', 'lastStepTime', 'mainLoop', 'worldId', 'secondTick', 'currentScript', 'currentSelection', '_statusMessageContainer'],\n\n initializeTransientState: function($super) {\n $super();\n\n this.hands = [];\n\n\t\t\t\t\n\t\tvar theme = DisplayThemes[Config.defaultDisplayTheme];\n\t\tif (!theme)\n\t\t\tconsole.log('ERROR: could not find Theme ' + Config.defaultDisplayTheme)\n\t\tthis.displayTheme = theme; // set display them without applying it\n\t\tconsole.log('WorldMorph: updated display theme ')\n\n\n\t\tthis.withAllSubmorphsDo( function() { this.layoutChanged(); }); // Force installation of transforms\n\n this.scheduledActions = []; // an array of schedulableActions to be evaluated\n this.lastStepTime = (new Date()).getTime();\n this.mainLoopFunc = this.doOneCycle.bind(this).logErrors('Main Loop');\n this.mainLoop = Global.setTimeout(this.mainLoopFunc, 30);\n this.worldId = ++WorldMorph.worldCount;\n\t\tvar self = this;\n\t\twindow.onscroll = function() {signal(self, 'scrollChange')}\n\n return this;\n },\n\n\tcollectAllUsedFills: function($super, usedFills) {\n\t\tusedFills = $super(usedFills);\n\t\tProperties.forEachOwn(this.displayTheme, function(ea) {\n\t\t\tvar style = this[ea]\n\t\t\tif (style && (style.fill instanceof lively.paint.Gradient)) {\n\t\t\t\tusedFills.push(style.fill);\n\t\t\t} \n\t\t}.bind(this.displayTheme))\n\t\treturn usedFills\n\t},\n \n\tremove: function() {\n\t\tif (!this.rawNode.parentNode) return null; // already removed\n\t\tthis.hands.clone().forEach(function(hand) { this.removeHand(hand) }, this);\n\t\tthis.stopStepping();\n\t\tthis.removeRawNode();\n\t\treturn this;\n\t},\n},\n'private', {\n\n\t// called by insertMorph to determine the rawNode after the new inserted morph\n\tgetInsertPositionFor: function(m, isFront) {\n\t\tif (this.submorphs.length == 0) return this.hands.length > 0 ? this.hands.last().rawNode : null;\n\t\treturn isFront ? this.submorphs.last().rawNode.nextSibling : this.submorphs.first().rawNode;\n\t},\n\t\n\ttoggleNativeCursor: function(flag) {\n\t\tthis.canvas().setAttributeNS(null, \"cursor\", flag ? \"auto\" : \"none\");\n\t},\n\n\tresizeCanvasToFitWorld: function () {\n\t\tvar canvas = this.canvas();\n\t\tif (!canvas) return;\n\t\tthis.transformChanged();\n\t\tthis.fullBounds = null;\n\n\t\tvar w = this.getExtent().x * this.getScale() , h = this.getExtent().y * this.getScale();\n\n\t\tif (canvas.clientWidth != w && canvas.clientHeight != h) {\n\t\t\tif (canvas.offsetLeft) w += canvas.offsetLeft * this.getScale();\n\t\t\tif (canvas.offsetTop) h += canvas.offsetTop * this.getScale();\n\t\t\tcanvas.setAttribute(\"width\", w);\n\t\t\tcanvas.setAttribute(\"height\", h);\n\t\t}\n\t},\n\n\tdisplayOnCanvas: function(canvas) {\n\t\t// this.remove();\n\t\tif (this.rawNode.parentNode !== canvas) canvas.appendChild(this.rawNode);\n\t\tthis.hands.forEach(function(ea) { this.removeHand(ea) }, this);\n\t\tthis.addHand(new HandMorph(true));\n\t\tWorldMorph.currentWorld = this; // this conflicts with mutliple worlds\n\t\tif (Config.resizeScreenToWorldBounds)\n\t\t\tthis.resizeCanvasToFitWorld(this);\n\t\tthis.onEnter(); \n\t\tthis.enterCount ++;\n\t},\n \n\taddHand: function(hand) {\n\t\tif (this.hands.length > 0 && !this.hands.first())\n\t\t\tthis.hands.shift(); // FIXME: Quick bugfix. When deserializing the world the hands.first() is sometimes undefined\n\t\tthis.hands.push(hand);\n\t\thand.owner = this;\n\t\t// FIXME mouse events are correctly dispatched when using canvas or world\n\t\t// keyboard events only work when using documentElement --> problem with multiple worlds\n\t\thand.registerForKeyboardEvents(document.documentElement); // FIXME!!!\n\t\thand.registerForEvents(this.canvas());\n\t\thand.layoutChanged();\n\n\t\tthis.rawNode.appendChild(hand.rawNode);\n\t\treturn hand;\n\t},\n \n\tremoveHand: function(hand) {\n\t\thand.setMouseFocus(null); // cleanup, just in case\n\t\thand.setKeyboardFocus(null); // cleanup (calls blur(), which will remove the focus halo)\n\t\thand.removeRawNode();\n\t\thand.unregisterForKeyboardEvents(document.documentElement); // FIXME!!!\n\t\thand.unregisterForEvents(this.canvas());\n\n\t\tthis.hands.splice(this.hands.indexOf(hand), 1);\n\t},\n\n\n toggleBalloonHelp: function() {\n Morph.prototype.suppressBalloonHelp = !Morph.prototype.suppressBalloonHelp;\n },\n\n\n\n chooseDisplayTheme: function(evt) { \n var themes = DisplayThemes;\n var target = this; // trouble with function scope\n var themeNames = Properties.own(themes);\n var items = themeNames.map(\n function(each) { return [each, target, \"setDisplayTheme\", themes[each]]; });\n var menu = new MenuMorph(items, this);\n menu.openIn(this.world(), evt.point());\n },\n \n setDisplayTheme: function(styleDict) { \n this.displayTheme = styleDict;\n this.withAllSubmorphsDo( function() { this.applyLinkedStyles(); });\n },\n \n restart: function() {\n window.location && window.location.reload();\n },\n\n},\n'accessing', {\n\tgetMorphNamed: function($super, name) {\n\t\treturn $super(name) || (this.hands[0] && this.hands[0].getMorphNamed(name));\n\t},\n},\n'geometry', {\n \n layoutChanged: function() {\n\t// do nothing\n },\n\n layoutOnSubmorphLayout: function() {\n\treturn false;\n },\n \n\n moveBy: function(delta) { // don't try to move the world\n },\n},\n'world', {\n\n world: function() { \n return this; \n },\n\t\n validatedWorld: function() { \n return this; \n },\n \n firstHand: function() {\n\t\tif (!this.hands || this.hands.length === 0) return undefined;\n return this.hands[0];\n },\n\n onEnter: function() {},\n onExit: function() {},\n\n /**\n * override b/c of parent treatement\n */\n relativize: function(pt) { \n return pt;\n //return pt.matrixTransform(this.rawNode.parentNode.getTransformToElement(this.rawNode)); \n },\n\thideHostMouseCursor: function() {\n\t\tif (!Config.hideSystemCursor) return;\n\t\tif (UserAgent.isChrome && UserAgent.isWindows)\n\t\t\t// chrome on windows cannot display cur files\n\t\t\tvar\tpath = URL.codeBase.withFilename('media/nocursor.gif').pathname;\n\t\telse\n\t\t\tvar\tpath = URL.codeBase.withFilename('media/nocursor.cur').pathname;\n\t\tdocument.body.style.cursor = 'url(\"' + path + '\"), none';\n\t},\n\tshowHostMouseCursor: function() {\n\t\tdocument.body.style.cursor = 'default'\n\t},\n\n\n\n},\n'stepping', {\n \n // *** The new truth about ticking scripts ***\n // A morph may have any number of active scripts\n // Each is activated by a call such as\n // this.startStepping(50, \"rotateBy\", 0.1);\n // Note that stepTime is in milliseconds, as are all lower-level methods\n // The arguments are: stepTime, scriptName, argIfAny\n // This in turn will create a SchedulableAction of the form\n // { actor: aMorph, scriptName: \"rotateBy\", argIfAny: 0.1, stepTime: 50, ticks: 0 }\n // and this action will be both added to an array, activeScripts in the morph,\n // and it will be added to the world's scheduledActions list, which is an array of\n // tuples of the form [msTimeToRun, action]\n // The ticks field is used to tally ticks spent in each schedulableAction --\n // It is incremented on every execution, and it is multiplied by 0.9 every second\n // Thus giving a crude 10-second average of milliseconds spent in this script\n // every 10 seconds. The result is divided by 10 in the printouts.\n //\n // The message startSteppingScripts can be sent to morphs when they are placed in the world.\n // It is intended that this may be overridden to start any required stepping.\n // The message stopStepping will be sent when morphs are removed from the world.\n // In this case the activeScripts array of the morph is used to determine exactly what\n // scripts need to be unscheduled. Note that startSteppingScripts is not sent\n // automatically, whereas stopStepping is. We know you won't forget to \n // turn your gadgets on, but we're more concerned to turn them off when you're done.\n\n\tgetScheduledActions: function() {\n\t\treturn this.scheduledActions.collect(function(ea) { return ea[1] });\n\t},\n\n scheduleForLater: function(action, delayInMs, removePrior) {\n if (removePrior) this.stopSteppingFor(action, true); // unschedule earlier\n this.scheduleAction(new Date().getTime() + delayInMs, action);\n },\n \n startSteppingFor: function(action) {\n\t\tif (!action.scriptName) {\n\t\t\t// throw new Error(\"old code\");\n\t\t\tconsole.log(\"faild to startSteppingFor with no scriptName \")\n\t\t\treturn \n\t\t}\t\t\n\t\tthis.stopSteppingFor(action, true); // maybe replacing arg or stepTime\n\t\tthis.scheduleAction(new Date().getTime(), action);\n\t},\n \n stopSteppingFor: function(action, fromStart) { // should be renamed to unschedule()\n // fromStart means it is just getting rid of a previous one if there,\n\t // so not an error if not found\n\n if (this.currentScript === action) {\n\t\t // Not in queue; just prevent it from being rescheduled\n\t\t this.currentScript = null;\n\t\t return;\n\t\t};\n\n\t\tif (!this.scheduledActions) return;\n\t\tthis.scheduledActions = this.scheduledActions.reject(function(ea) {\n\t\t\tvar eaAction = ea[1]\n\t\t\treturn action.equalActorAndName(eaAction)\n\t\t})\n },\n\tstopSteppingForActionsMatching: function(func) {\n\t\tthis.getScheduledActions()\n\t\t\t.select(func)\n\t\t\t.forEach(function(action) { this.stopSteppingFor(action) }, this);\n\t},\n\n\n\n \n\tvalidateScheduler: function() {\n\t\tthis.getScheduledActions().forEach(function(action) {\n\t\t\tif (action.actor instanceof Morph && action.actor.validatedWorld() !== this)\n\t\t\t\tthis.stopSteppingFor(action)\n\t\t}, this);\n\t},\n\n inspectScheduledActions: function() {\n // inspect an array of all the actions in the scheduler. Note this\n // is not the same as scheduledActions which is an array of tuples with times\n\t\t// doit: [WorldMorph.current().inspectScheduledActions()]\n lively.Tools.inspect(this.getScheduledActions());\n },\n\n\tdoOneCycle: function WorldMorph$doOneCycle(world) {\n // Process scheduled scripts\n\n // Run through the scheduledActions queue, executing those whose time has come\n // and rescheduling those that have a repeatRate\n // Note that actions with error will not get rescheduled\n // (and, unless we take the time to catch here, will cause all later \n // ones in the queue to miss this tick. Better less overhead, I say\n // DI: **NOTE** this needs to be reviewed for msClock rollover\n // -- also note we need more time info for multi-day alarm range\n // When we do this, I suggest that actions carry a date and msTime\n // and until their day is come, they carry a msTime > a day\n // That way they won't interfere with daily scheduling, but they can\n // still be dealt with on world changes, day changes, save and load.\n\t\tvar msTime = new Date().getTime(),\n\t\t\ttimeOfNextStep = Infinity,\n\t\t\tlist = this.scheduledActions, // shorthand\n\t\t\ttimeStarted = msTime; // for tallying script overheads\n\t\twhile (list.length > 0 && list[list.length - 1][0] <= msTime) {\n\t\t\tvar schedNode = list.pop(), // [time, action] -- now removed\n\t\t\t\taction = schedNode[1];\n\t\t\tthis.currentScript = action; // so visible from stopStepping\n\t\t\tlively.lang.Execution.resetDebuggingStack(); // Reset at each tick event\n\t\t\ttry {\n\t\t\t\taction.exec();\n\t\t\t} catch (er) {\n\t\t\t\tvar msg = \"error on actor ' + action.actor + ': \" + (er.stack || er);\n\t\t\t\tconsole.warn(msg);\n\t\t\t\talert(msg)\n\t\t\t\tdbgOn(true);\n\t\t\t\tlively.lang.Execution.showStack();\n\t\t\t\ttimeStarted = new Date().getTime();\n\t\t\t\tcontinue; // Note: if error in script above, it won't get rescheduled below (this is good)\n\t\t\t}\n \n\t\t\t// Note: stopStepping may set currentScript to null so it won't get rescheduled\n\t\t\tif (this.currentScript && action.stepTime > 0) {\n\t\t\t\tvar nextTime = msTime + action.stepTime;\n\t\t\t\tthis.scheduleAction(nextTime, action)\n\t\t\t}\n\t\t\tthis.currentScript = null;\n\n\t\t\tvar timeNow = new Date().getTime(),\n\t\t\t\tticks = timeNow - timeStarted;\n\t\t\tif (ticks > 0) action.ticks += ticks; // tally time spent in that script\n\t\t\ttimeStarted = timeNow;\n\t\t}\n\n\t\t// Generate a mouseMove if any ticking scripts have run so that\n\t\t// simulations can respond where, eg, a morph moves under the mouse\n\t\t// DI: This is *only* needed for the slide-keyboard-under-mouse demo (very cool)\n\t\t//\tUses extra cycles, though, and currently fails in Opera\n\t\tif (Config.nullMoveAfterTicks) { // set this true in localConfig for the demo\n\t\t\tvar myHand = this.firstHand();\n\t\t\tif (myHand) myHand.makeANullMove();\n\t\t}\n\t\tif (list.length > 0) timeOfNextStep = Math.min(list[list.length-1][0], timeOfNextStep);\n\n\t\t// Each second, run through the tick tallies and mult by 0.9 to 10-sec \"average\"\n\t\tif (!this.secondTick) this.secondTick = 0;\n\t\tvar secondsNow = Math.floor(msTime / 1000);\n\t\tif (this.secondTick != secondsNow) {\n\t\t\tthis.secondTick = secondsNow;\n\t\t\tvar tallies = {};\n\t\t\tfor (var i=0; i=0; i--) {\n\t\t\tvar schedNode = list[i];\n\t\t\tif (schedNode[0] > msTime) {\n\t\t\t\tlist.splice(i+1, 0, [msTime, action]);\n\t\t\t\tif (!this.mainLoop) this.kickstartMainLoop();\n\t\t\t\treturn; \n\t\t\t}\n\t\t}\n\t\tlist.splice(0, 0, [msTime, action]);\n\t\tif (!this.mainLoop) this.kickstartMainLoop();\n\t},\n},\n'dialogs', {\n \n\topenURLasText: function(url, title) {\n\t\t// FIXME: This should be moved with other handy services like confirm, notify, etc\t\t\n\t\tvar pane = this.addTextWindow({content: \"fetching ... \", title: title});\n\t\tvar r = new WebResource(url);\n\t\tlively.bindings.connect(r, 'content', pane.innerMorph(), 'setTextString');\n\t\tr.beAsync().get();\n\t\t\n\t},\n\n\tviewport: function() {\n\t\ttry {\n\t\t\treturn Rectangle.ensure(this.canvas().viewport);\n\t\t\t} catch (er) { // FF doesn't implement viewport ?\n\t\t\treturn this.shape.bounds();\n\t\t}\n\t},\n\n\talert: function(varargs) {\n\t\tvar message = Strings.formatFromArray($A(arguments)),\n\t\t\topenDialog = function() { alert(message) };\n\t\tthis.setStatusMessage(message, Color.red, undefined, openDialog, undefined, \"alert: \")\n\t}.logErrors('alert'),\n\n\tprompt: function(message, callback, defaultInput) {\n\t\t// this.world().prompt(\"your name\", function(v) { alert(\"your name is: \" + v)}, \"joe\")\n\t\tvar model = Record.newPlainInstance({Message: message, Input: defaultInput || \"\", Result: null});\n\t\tmodel.addObserver({ \n\t\t\tonResultUpdate: function(value) { \n\t\t\t\tif (value == true && callback) callback.call(Global, model.getInput());\n\t\t\t}\n\t\t});\n\t\tvar dialog = new PromptDialog(model.newRelay({Message: \"-Message\", Result: \"+Result\", Input: \"Input\"}));\n\t\tvar window = dialog.openIn(this, pt(0,0));\n\t\twindow.setPosition(this.positionForNewMorph(window));\n\t\treturn dialog;\n\t},\n\n editPrompt: function(message, callback, defaultInput, optContext) {\n\t\tvar dialog = new PromptDialogMorph();\n\t\tdialog.title = message;\n\t\tdialog.setText(defaultInput);\n\t\tdialog.callback = callback;\n\t\tif (optContext) {\n\t\t\tdialog.textPane.innerMorph().evalContext = optContext; \n\t\t\tdialog.textPane.innerMorph().addScript(function getDoitContext() {\n\t\t\t\treturn this.evalContext;\n\t\t\t})\n\t\t}\n\t\tdialog.openIn(this, this.positionForNewMorph(dialog));\n\t\treturn dialog\n },\n\n\tconfirm: function(message, callback) {\n\t\tvar model = Record.newPlainInstance({Message: message, Result: null});\n\t\tmodel.addObserver({ \n\t\t\tonResultUpdate: function(value) { callback && callback.call(Global, value) }});\n\t\tvar dialog = new ConfirmDialog(model.newRelay({Message: \"-Message\", Result: \"+Result\"})),\n\t\t\twindow = dialog.openIn(this, pt(0,0));\n\t\twindow.setPosition(this.positionForNewMorph(window));\n\t\treturn dialog;\n\t},\n\tshowErrorDialog: function(error) {\n\t\t// Chrome\n\t\tif (error.stack) {\n\t\t\tvar pane = new lively.ide.ErrorStackViewer();\n\t\t\tpane.setError(error);\n\t\t\tpane.open();\n\t\t\treturn\n\t\t};\n\n\t\tvar pane = this.addTextWindow({\n\t\t\tcontent: \"\",\n\t\t\ttitle: \"Error\", \n\t\t});\n\t\tpane.owner.setPosition(this.positionForNewMorph(pane))\n\t\tLastPane = pane\n\n\t\t// Safari\n\t\tif (error.expressionEndOffset && error.expressionBeginOffset && error.sourceURL) {\n\t\t\t// works under Safari 5\n\t\t\tvar urlString = error.sourceURL;\n\t\t\tvar source = new WebResource(new URL(urlString)).get().content\n\t\t\tthis.showErrorDiaglogInWorkspace(source, error.expressionBeginOffset, error.expressionEndOffset, pane)\n\t\t\tpane.owner.setTitle('Error:' + urlString)\n\t\t\treturn pane\n\t\t}\n\n\t\tif (error.expressionEndOffset && error.expressionBeginOffset && error.sourceId) {\n\t\t\tvar sourceReference = EvalSourceRegistry.current().sourceReference(error.sourceId);\n\t\t\tif (sourceReference !== undefined) {\n\t\t\t\tconsole.log('error ' + printObject(error))\n\t\t\t\tvar expressionBeginOffset = error.expressionBeginOffset - sourceReference.evalCodePrefixLength;\n\t\t\t\tvar expressionEndOffset = error.expressionEndOffset - sourceReference.evalCodePrefixLength;\n\t\t\t\tthis.showErrorDiaglogInWorkspace(sourceReference.sourceString, expressionBeginOffset, expressionEndOffset, pane)\n\t\t\t\tif (sourceReference.morph) {\n\t\t\t\t\tsourceReference.morph.showError(error, (sourceReference.offset || 0) - sourceReference.evalCodePrefixLength)\n\t\t\t\t}\n\n\t\t\t\treturn pane\n\t\t\t}\n\t\t} \n\n\t\t// Fallback...\n\t\tpane.innerMorph().setTextString(printObject(error))\t\n\t\treturn pane\n\t},\nlogError: function(er) {\n\tLastError = er;\n\tvar msg = \"\" + er\n\tvar world = this;\n\tthis.setStatusMessage(msg, Color.red, 15, \n\t\tfunction() {\n\t\t\tworld.showErrorDialog(er)\n\t\t},\n\t\t{fontSize: 12, fillOpacity: 1});\n},\n\n\tshowErrorDiaglogInWorkspace: function(source, expressionBeginOffset, expressionEndOffset, pane) {\n\t\t// PRIVATE HELPER\n\t\tconsole.log(\"begin \" + expressionBeginOffset + \" end \" + expressionEndOffset)\n\t\tvar start = source.lastIndexOf(\"\\n\\n\", expressionBeginOffset)\n\t\tif (start == -1) start = 0;\n\t\tvar startOffset = expressionBeginOffset - start;\n\t\tvar stop = source.indexOf(\"\\n\", expressionEndOffset + 1);\n\t\tif (stop != -1)\tstop = source.indexOf(\"\\n\", stop + 1);\n\t\tif (stop != -1)\tstop = source.indexOf(\"\\n\", stop + 1);\n\n\t\tif (stop == -1) stop = source.length;\n\n\t\tconsole.log(\"source: \" + source + \"| \" + source.length+\" expressionEndOffset: \" + expressionEndOffset)\n\t\tvar excerpt = source.slice(start, stop)\n\t\tpane.innerMorph().setTextString(excerpt)\n\n\t\tpane.innerMorph().emphasizeFromTo({color: Color.red}, \n\t\t\tstartOffset, startOffset + expressionEndOffset - expressionBeginOffset);\n\t\tpane.innerMorph().replaceSelectionWith\n\t\tconsole.log(\"found excerpt: \" + excerpt + \" start: \" + start + \" stop:\" + stop)\n\t},\n},\n'new content', {\n \n\taddFramedMorph: function(morph, title, optLoc, optSuppressControls) {\n\t\tvar displ = pt(5, 5);\n\t\tvar w = this.addMorphAt(\n\t\t\tnew WindowMorph(morph, title, optSuppressControls), \n\t\t\toptLoc || this.positionForNewMorph(morph).subPt(displ));\n\t\tw.adjustForNewBounds(); // hack\n\t\treturn w\n\t},\n\n\taddTextWindow: function(spec) {\n\t\t// FIXME: typecheck the spec \n\t\tif (Object.isString(spec.valueOf())) spec = {content: spec}; // convenience\n\t\tvar extent = spec.extent || pt(500, 200);\n\t\tvar pane = this.internalAddWindow(\n\t\t\t\tnewTextPane(extent.extentAsRectangle(), spec.content || \"\"),\n\t\t\t\tspec.title, spec.position);\n\t\tif (spec.acceptInput !== undefined) pane.innerMorph().acceptInput = spec.acceptInput;\n\t\tif (spec.plug) pane.connectModel(spec.plug, true);\n\t\treturn pane;\n\t},\n\n\taddTextListWindow: function(spec) {\n\t\t// FIXME: typecheck the spec \n\t\tif (spec instanceof Array) spec = {content: spec }; // convenience\n\t\tvar content = spec.content;\n\t\tif (!content) content = \"\";\n\t\tif (!(content instanceof Array)) content = [content];\n\t\tvar extent = spec.extent || pt(500, Math.min(300, content.length * TextMorph.prototype.fontSize * 1.5));\n\t\tvar rec = extent.extentAsRectangle();\n\t\tvar pane = this.internalAddWindow(newTextListPane(rec, content), spec.title, spec.position);\n\t\tif (spec.plug) pane.connectModel(spec.plug, true);\n\t\treturn pane;\n\t},\n\n\tinternalAddWindow: function(pane, titleSpec, posSpec) {\n\t\tvar pos = (posSpec instanceof Point) ? posSpec : undefined;\n\t\tpane.setBorderWidth(2); pane.setBorderColor(Color.black);\n\t\tvar win = this.addFramedMorph(pane, String(titleSpec || \"\"), pos || this.firstHand().position().subPt(pt(5, 5)));\n\t\tif (posSpec == \"center\") {\n\t\t\twin.align(win.bounds().center(), this.viewport().center());\n\t\t}\n\t\treturn pane;\n\t},\n\n\n\taddMorphFrontOrBack: function($super, m, front) {\n\t\tvar oldTop = this.topWindow();\n\t\tvar result = $super(m, front);\n\t\tif (!front || !(m instanceof WindowMorph)) return result;\n\t\t// if adding a new window on top, then make it active\n\t\tif (oldTop) oldTop.titleBar.highlight(false);\n\t\tm.takeHighlight();\n\t\treturn result;\n\t},\n\n\ttopWindow: function() {\n\t\tfor (var i= this.submorphs.length - 1; i >= 0; i--) {\n\t\t\tvar sub = this.submorphs[i];\n\t\t\tif (sub instanceof WindowMorph) return sub;\n\t\t}\n\t\treturn null;\n\t},\n\n\tpositionForNewMorph: function(newMorph, relatedMorph) {\n\t\t// this should be much smarter than the following:\n\t\tif (relatedMorph)\n\t\t\treturn relatedMorph.bounds().topLeft().addPt(pt(5, 0));\n\t\tvar pos = this.firstHand().getPosition();\n\t\tif (!newMorph) return pos;\n\t\tvar viewRect = this.windowBounds();\n\t\tvar newMorphBounds = pos.extent(newMorph.getExtent());\n\t\tif (viewRect.containsRect(newMorphBounds)) return pos;\n\t\treturn viewRect.center().subPt(newMorphBounds.extent().scaleBy(0.5));\n\t},\n\n\treactiveAddMorph: function(morph, relatedMorph) { \t// add morph in response to a user action, make it prominent\n\t\treturn this.addMorphAt(morph, this.positionForNewMorph(morph, relatedMorph));\n\t},\n \n resizeByUser: function() {\n var world = this;\n var cb = function(newSizePtLiteral) {\n \t try {\n \t var newPoint = eval(newSizePtLiteral);\n \t basicResize(world, world.canvas(), newPoint.x, newPoint.y);\n } catch(e) {\n \t world.alert('Wrong input ' + newSizePtLiteral);\n \t\t }\n \t};\n \tworld.prompt('Enter extent', cb, world.bounds().bottomRight().toString());\n },\n\n\taddProgressBar: function(optPt) {\n\t\tvar center = optPt || this.windowBounds().center()\n\t\tvar progressBar = new ProgressBarMorph(new Rectangle(0,0, 450, 30))\n\t\tthis.addMorph(progressBar);\n\t\tprogressBar.align(progressBar.bounds().center(), center);\n\t\tprogressBar.ignoreEvents();\n\t\treturn progressBar\n\t},\n}, \n'Requirements', {\n\t// this.world().showAddWorldRequirementsMenu(pt(100,100))\n\tshowAddWorldRequirementsMenu: function(pos) {\n\t\t\tvar ignoreModules = \"lively.Widgets lively.WikiWidget lively.Data lively.Base lively.defaultconfig lively.CanvasExpt lively.obsolete lively.Helper lively.miniprototype lively.demofx lively.Text lively.EmuDom lively.Core lively.bindings lively.rhino-compat lively.Tools lively.localconfig lively.Main lively.Network lively.scene lively.simpleMain lively.ChangeSet lively.ide\".split(\" \")\n\n\t\t\tvar items = ['apps', 'lively', 'Tests', 'draft']\n\t\t\t\t.select(function(ea){\n\t\t\t\t\treturn new WebResource(new URL(Config.codeBase).withFilename(ea)).exists()})\n\t\t\t\t.collect(function(eaDir) {\n\t\t\treturn [eaDir, ChangeSet.current()\n\t\t\t\t.moduleNamesInNamespace(eaDir)\n\t\t\t\t.sort()\n\t\t\t\t.reject(function(ea) { return ignoreModules.include(ea) })\n\t\t\t\t.collect(function(ea){ \n\t\t\t\t\treturn [ea, function(){\n\t\t\t\t\t\tmodule(ea).load();\n\t\t\t\t\t\tChangeSet.current().addWorldRequirement(ea);\n\t\t\t\t\t\tthis.alert(\"load \" + ea + \" module\")}\n\t\t\t\t]}\n\t\t\t)]\n\t\t});\n\n\t\tvar menu = new MenuMorph(items, this.world());\n\t\tmenu.openIn(this.world(), pos, false, \n\t\t\t\"require module for this page\");\n\n\t},\n\t// this.world().showRemoveWorldRequirementsMenu(pt(100,100))\n\tshowRemoveWorldRequirementsMenu: function(pos) {\n\t\tvar pageModules = ChangeSet.current().getWorldRequirementsList().evaluate() \n\t\tvar items = pageModules\n\t\t\t.sort()\n\t\t\t.collect(function(ea){ \n\t\t\treturn [ea, function(){\n\t\t\t\tChangeSet.current().removeWorldRequirement(ea);\n\t\t\t\tthis.alert(\"remove \" + ea + \" module requirement\")}]\n\t\t})\n\t\tvar menu = new MenuMorph(items, this.world())\n\t\tmenu.openIn(this.world(), pos, false, \n\t\t\t\"remove module requirement for this page\");\n\t}\n},\n'Feedback and Saving', {\n\n\tpromptAndSaveWorld: function(asJson) {\n\t\tthis.prompt(\"world file (.xhtml)\", function(filename) {\n\t\t\tif (!filename.endsWith('.xhtml')) filename += '.xhtml'\n\t\t\tvar start = new Date().getTime();\t\n\t\t\tvar onFinish = function(url) {\n\t\t\t\tWorldMorph.current().setStatusMessage('goto ' + url, Color.green, undefined, \n\t\t\t\t\tfunction(){ window.open(url)});\n\n\t\t\t\tif (Config.changeLocationOnSaveWorldAs)\n\t\t\t\t\twindow.location = url;\n\t\t\t};\n\t\t\tif (asJson) this.saveWorldWithJSON(filename, onFinish);\n\t\t\telse this.exportLinkedFile(filename);\n\t\t\tvar time = new Date().getTime() - start;\n\t\t\tthis.setStatusMessage(\"world save as \" + filename + \" in \" + time + \"ms\", Color.green, 3)\t\n\n\n\t\t}.bind(this)); \n\t},\n\n\tsaveWorldWithJSON: function(optURLOrPath, optOnFinish) {\n\t\tvar world = this,\n\t\t\turl = optURLOrPath || URL.source,\n\t\t\tstart = new Date().getTime(),\n\t\t\tonFinished = function(status) {\n\t\t\t\tif (!status.isDone() || !status.isSuccess()) return;\n\t\t\t\tvar time = new Date().getTime() - start;\n\t\t\t\tworld.setStatusMessage(\"world saved to \" + url + \" in \" + time +\n\t\t\t\t\t\"ms \\n(\" + time + \"ms serialization)\", Color.green, 3)\n\t\t\t\toptOnFinish && optOnFinish.call(this, url);\n\t\t\t};\n\t\t\t\n\t\t// make relative to absolute URL\n\t\ttry { url = new URL(url) } catch(e) { url = URL.source.withFilename(url) };\n\t\tvar warnIfOverriden = url.toString() === URL.source.toString();\n\t\trequire(\"lively.persistence.Serializer\").toRun(function() {\n\t\t\tif (world._statusMessageContainer) world._statusMessageContainer.remove();\n\t\t\tvar doc = lively.persistence.Serializer.serializeWorld(world),\n\t\t\t\ttitleTag = doc.getElementsByTagName('title')[0];\n\t\t\tif (titleTag) titleTag.textContent = url.filename().replace('.xhtml', '');\n\t\t\tnew DocLinkConverter(URL.codeBase, url.getDirectory()).convert(doc);\n\t\t\tExporter.saveDocumentToFile(doc, url, onFinished, warnIfOverriden);\n\t\t});\n\n\t\treturn url;\n\t},\n\t\n\tsaveWorld: function(optURLOrPath) {\n\t\tvar url = optURLOrPath || URL.source;\n\t\t// make relative to absolute URL\n\t\ttry { url = new URL(url) } catch(e) { url = URL.source.withFilename(url) };\n\t\tvar start = new Date().getTime(),\n\t\t\tself = this,\n\t\t\tserializeTime,\n\t\t\tonFinished = function() {\n\t\t\t\tvar time = new Date().getTime() - start;\n\t\t\t\tself.setStatusMessage(\"world saved to \" + url +\n\t\t\t\t\t\" in \" + time + \"ms \\n(\" + serializeTime + \"ms serialization)\", Color.green, 3);\n\t\t\t\t},\n\t\t\tstatusMessage = WorldMorph.current().setStatusMessage(\"serializing....\");\n\t\t(function() {\n\t\t\tvar doc, world = this, oldHand = this.firstHand(),\n\t\t\t\toldKeyboardFocus = oldHand.keyboardFocus;\n\t\t\tthis.removeHand(oldHand);\n\t\t\ttry {\n\t\t\t\tdoc = Exporter.shrinkWrapMorph(this.world());\n\t\t\t} catch(e) {\n\t\t\t\tthis.setStatusMessage(\"Save failed due to:\\n\" + e, Color.red, 10, function() {\n\t\t\t\t\tworld.showErrorDialog(e)\n\t\t\t\t})\n\t\t\t} finally {\n\t\t\t\tthis.addHand(oldHand);\n\t\t\t\tconsole.log(\"setting back keyboard focus to\" + oldKeyboardFocus)\n\t\t\t\tif (oldKeyboardFocus)\n\t\t\t\t\toldKeyboardFocus.requestKeyboardFocus(oldHand);\n\t\t\t}\n\t\t\tnew DocLinkConverter(URL.codeBase, url.getDirectory()).convert(doc);\n\t\t\tstatusMessage.remove();\n\t\t\t(function removeJSONIfPresent() {\n\t\t\t\tvar jsonEl = doc.getElementById('LivelyJSONWorld');\n\t\t\t\tif (jsonEl) jsonEl.parentNode.removeChild(jsonEl);\n\t\t\t})()\n\t\t\tserializeTime = new Date().getTime() - start;\n\t\t\t(function() {\n\t\t\t\tExporter.saveDocumentToFile(doc, url, onFinished);\n\t\t\t}).bind(this).delay(0);\n\t\t}).bind(this).delay(0);\n\t\treturn url;\n\t},\n\n\twindowBounds: function () {\n\t\tvar canvas = this.canvas();\n\t\tvar scale = 1/this.world().getScale();\n\t\tvar topLeft = pt(Global.pageXOffset - (canvas.offsetLeft || 0), Global.pageYOffset - (canvas.offsetTop || 0));\n\t\tvar width = Math.min(\n\t\t\tGlobal.document.documentElement.clientWidth * scale,\n\t\t\tWorldMorph.current().getExtent().x);\n\t\tvar height = Math.min(\n\t\t\tGlobal.document.documentElement.clientHeight * scale,\n\t\t\tWorldMorph.current().getExtent().y)\n\t\treturn topLeft.scaleBy(scale).extent(pt(width, height));\n\t},\n\t\n\tvisibleBounds: function() {\n\t\tvar windowBounds = this.windowBounds();\n\t\tvar worldBounds = this.shape.bounds(); // use shape so no stick-outs are included\n\t\tvar upperLeft = pt(Math.max(windowBounds.x, worldBounds.x), Math.max(windowBounds.y, worldBounds.y));\n\t\tvar lowerRight = pt(Math.min(windowBounds.width, worldBounds.width), Math.min(windowBounds.height, worldBounds.height));\n\t\treturn upperLeft.extent(lowerRight);\n\t},\n\n\tensureStatusMessageContainer: function() {\n\t\tif (!this._statusMessageContainer || ! this._statusMessageContainer.owner) {\n\t\t\tthis._statusMessageContainer = new StatusMessageContainer();\n\t\t\tthis._statusMessageContainer.setName(\"statusMorphContainer\");\n\t\t\tthis.addMorph(this._statusMessageContainer);\n\t\t\tthis._statusMessageContainer.startUpdate();\n\t\t};\n\t\treturn this._statusMessageContainer\n\t},\n\n\tsetStatusMessage: function(msg, color, delay, callback, optStyle, messageKind) {\n\t\tvar container = this.ensureStatusMessageContainer();\n\t\treturn container.addStatusMessage(msg, color, delay, callback, optStyle, messageKind);\n\t},\t\n\n\tshowStatusProgress: function(msg) {\n\t\tvar container = this.ensureStatusMessageContainer();\n\t\tvar progressBar = container.addProgressBar(msg);\t\t\n\t\treturn progressBar\n\t},\n\t\n\taskForWorldTitle: function() {\n\t\tvar self = this;\n\t\tthis.prompt('new world title', function(input) {\n\t\t\tdocument.title = input;\n\t\t\tvar titleTag = document.getElementsByTagName('title')[0];\n\t\t\ttitleTag.textContent = input;\n\t\t}, document.title);\n\t},\n\taskForUserName: function() {\n\t\tvar world = this;\n\t\tthis.prompt(\"Please, give your username\", function(name) {\n\t\t\tif (name) {\n\t\t\t\talertOK(\"setting username to: \" + name)\n\t\t\t\tworld.setCurrentUser(name);\n\t\t\t} else {\n\t\t\t\talertOK(\"removing username\")\n\t\t\t\tworld.setCurrentUser(undefined);\n\t\t\t}\n\t\t})\n\t},\n\tsetCurrentUser: function(username) {\n\t\tthis.currentUser = username;\n\t\tif (Global.localStorage)\n\t\t\tlocalStorage.livelyUserName = username;\n\t},\n\n},\n/**\n *\tWorldMorph Menu \n *\n * Question: Should features register itself in the menu, \n * or should the menu give an overview of available features \n * and load the modules on demand?\n */\n'Menus ', {\n\tisProtectedWorld: function() {\n\t\treturn Global.URL && (URL.source.filename() == \"index.xhtml\")\n\t},\n\t\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.keepOnlyItemsNamed([\"inspect\", \"edit style\"]);\n\t\tmenu.addItems([['reset scale', function(evt) {\n\t\t\tvar h = evt.hand, w = h.world();\n\t\t\th.setScale(1); w.setScale(1); w.resizeCanvasToFitWorld();\n\t\t}]]);\n\t\tmenu.addLine();\n\t\tmenu.addItems(this.subMenuItems(evt, menu));\n\t\tmenu.addLine();\n\t\tmenu.addItem([\"save world as ... \", function() { this.promptAndSaveWorld(true/*asJson*/) }]);\n\n\t\tif (!this.isProtectedWorld())\n\t\t\tmenu.addItem([\"save world (s)\", function() { menu.remove(); this.saveWorldWithJSON() }]);\n\n\t\tmenu.addItem([\"download world\", function() {\n\t\t\trequire('lively.persistence.StandAlonePackaging').toRun(function() {\n\t\t\t\tlively.persistence.StandAlonePackaging.packageCurrentWorld();\n\t\t\t});\n\t\t}]);\n\n\t\treturn menu;\n\t},\n\t\n\tsimpleMorphsSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"Line\", function(evt) { \n\t\t\t\tvar p = evt.point(); \n\t\t\t\tvar m = Morph.makeLine([p, p.addXY(60, 30)], 2, Color.black);\n\t\t\t\tworld.addMorph(m);\n\t\t\t\tm.setPosition(evt.point())}],\n\t\t\t[\"Connector\", function(evt) { \n\t\t\t\trequire('lively.Connector').toRun(function() {\n\t\t\t\t\tvar m = Morph.makeConnector(evt.point())\n\t\t\t\t\tworld.addMorph(m);\n\t\t\t\t\tm.setGlobalEndPos(evt.point().addXY(60, 30))\n\t\t\t\t})}],\n\t\t\t[\"Rectangle\", function(evt) { world.addMorph(Morph.makeRectangle(evt.point(), pt(60, 30)));}],\n\t\t\t[\"Ellipse\", function(evt) { world.addMorph(Morph.makeCircle(evt.point(), 25)); }],\n\t\t\t[\"TextMorph\", function(evt) { \n\t\t\t\tvar text = new TextMorph(evt.point().extent(pt(120, 10)), \"This is a TextMorph\");\n\t\t\t\tworld.addMorph(text);}],\n\t\t\t[\"Star\",function(evt) { world.addMorph(Morph.makeStar(evt.point()))}],\n\t\t\t[\"Heart\", function(evt) { world.addMorph(Morph.makeHeart(evt.point()))}],\n\t\t\t[\"Marker\", function(evt) {world.addMorph(new MarkerMorph(evt.point().extent(pt(100, 100))))}]\n\t\t];\n\t},\n\n\tcomplexMorphsSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"ButtonMorph\", function(evt) { world.addMorph(new ScriptableButtonMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t[\"SliderMorph\", function(evt) { world.addMorph(Widget.makeSlider(evt.point().extent(pt(120, 40))))}],\n\t\t\t[\"List pane\", function(evt) {\n\t\t\t\tvar m = world.addMorph(newRealListPane(evt.point().extent(pt(300, 400))));\n\t\t\t\tm.applyStyle({fill: Color.gray, padding: Rectangle.inset(3), suppressHandles: false});\n\t\t\t\tm.adjustForNewBounds(); // for padding\n\t\t\t}],\n \t\t\t[\"Text pane\", function(evt) { \n\t\t\t\tvar m = world.addMorph(newTextPane(evt.point().extent(pt(300, 400)), 'empty'));\n\t\t\t\tm.applyStyle({fill: Color.gray, padding: Rectangle.inset(3), suppressHandles: false});\n\t\t\t\tm.adjustForNewBounds(); // for padding\n\t\t\t}],\n\n\t\t\t// [\"ProgressBarMorph\", function(evt) { world.addMorph(new ProgressBarMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t// [\"ScaleMorph\", function(evt) { world.addMorph(new ScaleMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t[\"Clock\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar m = world.addMorph(new ClockMorph(evt.point(), 50));\n\t\t\t\t\tm.startSteppingScripts();\n\t\t\t\t\tChangeSet.current().addWorldRequirement('lively.Examples')\n\t\t\t\t})}],\n\t\t\t// [\"FabrikClock\", function(evt) {\n\t\t\t\t// require('lively.Fabrik').toRun(function() {\n\t\t\t\t\t// var clock = new FabrikClockWidget();\n\t\t\t\t\t// var morph = clock.buildView();\n\t\t\t\t\t// world.addMorph(morph);\n\t\t\t\t\t// morph.setPosition(evt.point());\n\t\t\t\t\t// morph.startSteppingScripts(); }); }],\n\t\t\t[\"Piano Keyboard\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar m = new PianoKeyboard(evt.point());\n\t\t\t\t\tm.scaleBy(1.5);\t m.rotateBy(-Math.PI*2/12);\n\t\t\t\t\tworld.addMorph(m); }); }],\n\t\t\t[\"Kaleidoscope\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar kal = WorldMorph.current().addMorph(new SymmetryMorph(300, 7)); \n\t\t\t\t\tkal.startUp(); }) } ],\n\t\t\t[\"Image Morph\", function(evt) {\n\t\t\t\tworld.prompt('Enter image URL', function(urlString) {\n\t\t\t\t\tvar img = new ImageMorph(evt.point().extent(pt(100,100)), urlString);\n\t\t\t\t\timg.openInWorld() }) }],\n\t\t\t[\"Video Morph\", function(evt) {\n\t\t\t\tVideoMorph.openAndInteractivelyEmbed(evt.point()) }],\n\n\t\t\t// [\"Duplicator Panel\", function(evt) { \n\t\t\t// \trequire('lively.Graffle').toRun(function(){\n\t\t\t// \t\tworld.addMorph(Morph.makeDefaultDuplicatorPanel(evt.point()))\n\t\t\t// \t}); \n\t\t\t// }], \n\t\t\t[\"FileUpload Morph\", function(evt) { \n\t\t\t\trequire('lively.FileUploadWidget').toRun(function(){\n\t\t\t\t\tvar morph = new FileUploadMorph();\n\t\t\t\t\tworld.addMorph(morph)\n\t\t\t\t\tmorph.setPosition(evt.point());\n\t\t\t\t}); \n\t\t\t}],\n\t\t];\n\t},\n\t\n\ttoolSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\tvar toolMenuItems = [\n\t\t\t[\"System code browser (b)\", function(evt) { require('lively.ide').toRun(function(unused, ide) {new ide.SystemBrowser().openIn(world)})}],\n\t\t\t[\"Local code Browser (l)\", function(evt) { require('lively.ide').toRun(function(unused, ide) {new ide.LocalCodeBrowser().openIn(world)})}],\n\t\t\t// [\"Wiki code Browser\", function(evt) { require('lively.ide', 'lively.LKWiki').toRun(function(unused, ide) {\n\t\t\t\t// var cb = function(input) {\n\t\t\t\t\t// var repo = new URL(input);\n\t\t\t\t\t// new ide.WikiCodeBrowser(repo).open()\n\t\t\t\t// };\n\t\t\t\t// world.prompt('Wiki base URL?', cb, URL.source.getDirectory().toString());\n\t\t\t\t// })}],\n\t\t\t// [\"Switch System browser directory...\", function(evt) { require('lively.ide').toRun(function(unused, ide) {\n\t\t\t\t// var cb = function(input) {\n\t\t\t\t\t// if (!input.endsWith('/')) input += '/';\n\t\t\t\t\t// ide.startSourceControl().switchCodeBase(new URL(input));\n\t\t\t\t// };\n\t\t\t\t// world.prompt('Enter System browser directory (URL)', cb, URL.source.getDirectory().toString());\n\t\t\t\t// })}],\t\t\t\t\n\t\t\t[\"TestRunner\", function(evt) { require('lively.TestFramework').toRun(function() { new TestRunner().openIn(world) }) }],\n\t\t\t// [\"OMetaWorkspace\", function(evt) { require('lively.Ometa').toRun(function() { new OmetaWorkspace().open() }) }],\n\t\t\t[\"Viewer for latest file changes\", function(evt) {\n\t\t\t\tvar cb = function(input) {\n\t\t\t\t\trequire('lively.LKWiki').toRun(function(u,m) {\n\t\t\t\t\t\tvar url = new URL(input);\n\t\t\t\t\t\tconsole.log(url);\n\t\t\t\t\t\tnew LatestWikiChangesList(url).openIn(world);\n\t\t\t\t}); }\n\t\t\t\tworld.prompt('Url to observe', cb, URL.source.getDirectory().toString()); \n\t\t\t}],\n\t\t\t[\"Version Viewer\", function(evt) {\n\t\t\t\trequire('lively.ide').toRun(function() {\n\t\t\t\t\tChangeSet.current().addWorldRequirement('lively.ide');\n\t\t\t\t\tnew lively.ide.FileVersionViewer().openForURL(URL.source);\n\t\t\t\t});\n\t\t\t}],\n\t\t\t[\"MiniMap\", function(evt) {\n\t\t\t\tvar map = new MiniMapMorph();\n\t\t\t\tmap.name = 'MiniMap';\n\t\t\t\tmap.openInWorld();\n\t\t\t\tmap.setTargetWorld(world);\n\t\t\t\tmap.startSteppingScripts()\n\t\t\t}],\t\t\t\n\t\t\t[\"load Scripting\", function(evt) {\n\t\t\t\tmodule('lively.Scripting').load()\n\t\t\t}],\t\t\t\n\t\t];\n\n\t\treturn toolMenuItems\n\t},\n\n\tscriptingSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"TileScriptingBox\", function(evt) { require('lively.TileScripting').toRun(function() {new lively.TileScripting.TileBox().openIn(world); }) }],\n\t\t\t[\"Fabrik Component Box\", function(evt) { require('lively.Fabrik').toRun(function() { Fabrik.openComponentBox(world); }) }],\n\t\t\t[\"Webcards with name\", function(evt) { require('apps.Webcards').toRun(function(){\n\t\t\t\t\tvar sds = new SimpleDataStore(pt(600, 300));\n\t\t\t\t\tworld.prompt(\"Name of stack:\", sds.openStackWithName.bind(sds));\n\t\t\t\t\tworld.addFramedMorph(sds, 'WebCards', pt(333, 222));\n\t\t\t\t}); \n\t\t\t}],\n \n\t\t];\n\t},\n\n\tpreferencesSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[(Config.usePieMenus ? \"don't \" : \"\") + \"use pie menus\",\n\t\t\t\tfunction() { Config.usePieMenus = !Config.usePieMenus; }],\n\t\t\t[(Morph.prototype.suppressBalloonHelp ? \"enable balloon help\" : \"disable balloon help\"),\n\t\t\t\tthis.toggleBalloonHelp],\n\t\t\t[(HandMorph.prototype.useShadowMorphs ? \"don't \" : \"\") + \"show drop shadows\",\n\t\t\t\tfunction () { HandMorph.prototype.useShadowMorphs = !HandMorph.prototype.useShadowMorphs}],\n\t\t\t[(Config.showGrabHalo ? \"don't \" : \"\") + \"show bounds halos\",\n\t\t\t\tfunction () { Config.showGrabHalo = !Config.showGrabHalo}],\n\t\t\t[HandMorph.prototype.applyDropShadowFilter ? \n\t\t\t\t\"don't use filter shadows\" : \"use filter shadows (if supported)\",\n\t\t\t\tfunction () { \n\t\t\t\t\tHandMorph.prototype.applyDropShadowFilter = !HandMorph.prototype.applyDropShadowFilter}],\n\t\t\t[(Config.isSnappingToGrid ? \"[X]\": \"[]\") + \" snap to grid\",\n\t\t\t\tfunction(){Config.isSnappingToGrid = !Config.isSnappingToGrid}],\n\t\t\t[(Config.changeLocationOnSaveWorldAs ? \"[X]\": \"[]\") + \" change location on save world as\",\n\t\t\t\tfunction(){Config.changeLocationOnSaveWorldAs = !Config.changeLocationOnSaveWorldAs}],\n\t\t\t[\"set username\", this.askForUserName],\n\t\t];\n\t},\n\tpropertiesSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"choose display theme...\", this.chooseDisplayTheme],\n\t\t\t// is now set automatically...\n\t\t\t// [\"change title\", this, 'askForWorldTitle'],\n\t\t\t[\"add module requirements...\",\n\t\t\t\t function(){this.showAddWorldRequirementsMenu(evt.mousePoint)}],\n\t\t\t[\"remove module requirements...\",\n\t\t\t\t function(){this.showRemoveWorldRequirementsMenu(evt.mousePoint)}],\n\t\t\t[\"resize world\", this.resizeByUser],\n\t\t];\n\t},\n\n\tdeprecatedSubMenuItems: function(evt, menu) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"Tools\", [\n\t\t\t\t[\"Class Browser\", function(evt) { new SimpleBrowser().openIn(world, evt.point()); }],\n\t\t\t\t[\"File Browser\", function(evt) { new FileBrowser().openIn(world) }],\n\t\t\t\t[\"Object Hierarchy Browser\", function(evt) { new ObjectBrowser().openIn(world); }],\n\t\t\t\t[\"Console\", function(evt) {world.addFramedMorph(new ConsoleWidget(50).buildView(pt(800, 100)), \"Console\"); }],\n\t\t\t\t[\"XHTML Browser\", function(evt) { \n\t\t\t\t\tvar xeno = new XenoBrowserWidget('sample.xhtml');\n\t\t\t\t\txeno.openIn(world); }],\n\n\t\t\t]],\n\t\t\t[\"Scripting\", this.scriptingSubMenuItems()],\n\t\t\t[\"New subworld (LinkMorph)\", function(evt) { evt.hand.world().addMorph(new LinkMorph(null, evt.point()));}], \n\t\t\t[\"External link\", function(evt) { evt.hand.world().addMorph(new ExternalLinkMorph(URL.source, evt.point()));}],\n\t\t\t[\"authenticate for write access\", function() {\n\t\t\t\tnew WebResource(URL.source.withFilename('auth')).put();\n\t\t\t\t// sometimes the wikiBtn seems to break after an authenticate\n\t\t\t\tif (Config.showWikiNavigator) WikiNavigator.enableWikiNavigator(true); }],\n\n\t\t\t[\"save world as ... (XML)\", function() { this.promptAndSaveWorld() }],\n\t\t\t[\"save world (XML)\", function() { \n\t\t\t\tmenu.remove(); \n\t\t\t\tthis.saveWorld();\n\t\t\t}],\n\n\t\t];\n\t},\n\n\t\n\thelpSubMenuItems: function(evt) {\n\t\treturn\t[\n\t\t\t[\"Connect documentation\", function(evt) {\n\t\t\t\trequire('lively.bindings').toRun(function() {\n\t\t\t\t\tworld.openURLasText(new URL(\"http://lively-kernel.org/trac/wiki/ConnectHelp?format=txt\"), \"Connect documentation\");\n\t\t\t\t})}],\n\t\t\t[\"Command key help\", function(evt) {\n\t\t\t\tthis.openURLasText(new URL(\"http://lively-kernel.org/trac/wiki/CommandKeyHelp?format=txt\"), \"Command key help\"); }],\n\t\t];\n\t},\n\t\n\tdebuggingSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\tvar items = [\n\t\t\t[\"FrameRateMorph\", function(evt) {\n\t\t\t\tvar m = world.addMorph(new FrameRateMorph(evt.point().extent(pt(160, 10)), \"FrameRateMorph\"));\n\t\t\t\tm.startSteppingScripts(); }],\n\t\t\t[\"EllipseMaker\", function(evt) {\n\t\t\t\tvar m = world.addMorph(new EllipseMakerMorph(evt.point()));\n\t\t\t\tm.startSteppingScripts(); }],\n\t\t\t['World serialization info', function() {\n\t\t\t\trequire('lively.persistence.Debugging').toRun(function() {\n\t\t\t\t\tvar json = lively.persistence.Serializer.serialize(world),\n\t\t\t\t\t\tprinter = lively.persistence.Debugging.Helper.listObjects(json);\n\t\t\t\t\tworld.addTextWindow(printer.toString());\n\t\t\t\t});\n\t\t\t}],\n\t\t\t['inspect ticking scripts', function() {\n\t\t\t\tworld.inspectScheduledActions();\n\t\t\t}],\n\t\t\t[\"Enable profiling\", function() {\n\t\t\t\tConfig.debugExtras = true;\n\t\t\t\tlively.lang.Execution.installStackTracers(); }],\n\t\t\t[\"Call Stack Viewer\", function(evt) { \n\t\t\t\tif (Config.debugExtras) lively.lang.Execution.showStack(\"use viewer\");\n\t\t\t\telse new StackViewer(this).openIn(world); }],\n\t\t\t[\"restart system\", this.restart],\n\t\t];\n\n\n\t\tif (!Config.debugExtras) return items;\n\n\t\tvar index = -1;\n\t\tfor (var i=0; i> pasteComponentFromXMLStringIntoFabrik\n\t// TODO refactor\n\tpasteFromSource: function(source){\n\t\tvar copier = new ClipboardCopier();\n\t\tcopier.pastePosition = this.pastePosition();\n\t\tcopier.pasteMorphsFromSource(source, this.pasteDestinationMorph());\n\t},\n\t\n\tcopySelectionAsXMLString: function() {\n\t\tif (!this.currentSelection) {\n\t\t\tconsole.log(\"WorldMorph: don't know what to copy\")\n\t\t\treturn\n\t\t}\n\t\tvar selectedMorphs = this.currentSelection.selectedMorphs\n\t\tif (selectedMorphs.length == 0) {\n\t\t\tconsole.log(\"WorldMorph: selection is empty\")\n\t\t\treturn \n\t\t};\n\t\treturn new ClipboardCopier().copyMorphsAsXMLString(selectedMorphs)\n\t},\n\n\tpasteDestinationMorph: function() {\n\t\treturn this;\n\t},\n\t\n\t\n},\n'Keyboard Events',{\n\n\ttakesKeyboardFocus: Functions.True,\n\t\n\tonKeyDown: function(evt) {\n\t\t// alert(\"WorldMorph onKeyDown \" + this + \" --- \" + evt + \" char: \" + evt.getKeyChar() )\n\t\tvar key = evt.getKeyChar();\n\t\tif (! key.toLowerCase)\n\t\t\treturn;\n\n\t\tkey = key.toLowerCase();\n\n\t\tif ( evt.isAltDown()) {\n\t\t\tif (key == 'c') {\n\t\t\t\tthis.doCopyStyle()\n\t\t\t\tevt.stop()\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (key == 'v') {\n\t\t\t\tthis.doPasteStyle()\n\t\t\t\tevt.stop()\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif ( evt.isCommandKey() && evt.isShiftDown()) {\n\t\t\tif (key == 'f') {\n\t\t\t\tvar world = this;\n\t\t\t\trequire('lively.ide').toRun(function(unused, ide) {\n\t\t\t\t\tworld.prompt(\"browse references in source\", function(whatToSearch) {\n\t\t\t\t\t\tide.startSourceControl().browseReferencesTo(whatToSearch);\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (key == 'b') {\n\t\t\t\t// for safari where without shift is blocked\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.SystemBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (evt.isCommandKey() && !evt.isShiftDown()) {\n\t\t\tif (key == 'b') {\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.SystemBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 'l') { // (L)ocal code browser\n\t\t\t\t// new ConsoleWidget().open();\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.LocalCodeBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 'k') { // Workspace\n\t\t\t\tthis.addTextWindow(\"Workspace\");\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 's') { // save\n\t\t\t\tif (!this.isProtectedWorld()) {\n\t\t\t\t\tthis.saveWorldWithJSON();\n\t\t\t\t} else {\n\t\t\t\t\tthis.setStatusMessage(\"Warning: Did not save world, because it is protected!\", Color.red, 3)\n\t\t\t\t}\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\n\t\t\t}\n\t\t}\n\t\treturn ClipboardHack.tryClipboardAction(evt, this);\n\t},\n\t\n\tonKeyPress: function(evt) {\n\t\t// do nothing\n\t\t// console.log(\"World onKeyPress \" + evt + \" char: \" + evt.getKeyChar())\n\t\treturn false;\n\t},\n\n\tonKeyUp: function(evt) {\n\t\t// do nothing\n\t\t// console.log(\"World onKeyUp \" + evt + \" char: \" + evt.getKeyChar())\n\t\treturn false\n\t},\n},\n'Commands',{\n\n\tdoCopy: function() {\n\t\tvar source = this.copySelectionAsXMLString();\n\t\tTextMorph.clipboardString = source;\n\t},\n\t\n\tdoPaste: function() {\n\t\tif (TextMorph.clipboardString) {\n\t\t\t// console.log(\"paste morphs...\")\n\t\t\tthis.pasteFromSource(TextMorph.clipboardString);\n\t\t}\n\t},\n\tdoCopyStyle: function() {\n\t\tvar target = this.firstHand().keyboardFocus;\n\t\tif (this.currentSelection && this.currentSelection.selectedMorphs.length > 0) {\n\t\t\ttarget = this.currentSelection.selectedMorphs[0]\n\t\t};\n\n\t\talert('copy style: ' + target)\n\t\tif (target)\n\t\t\tnew StyleCopier().copyFromMorph(target)\n\t\telse\n\t\t\talert(\"no target\")\n\t},\n\tdoPasteStyle: function() {\n\t\tvar targets\n\t\tif (this.currentSelection && this.currentSelection.selectedMorphs.length > 0) {\n\t\t\ttargets = this.currentSelection.selectedMorphs\n\t\t} else {\n\t\t\ttargets = [this.firstHand().keyboardFocus];\n\t\t}\n\t\ttargets.forEach(function(ea){\n\t\t\tnew StyleCopier().pasteToMorph(ea)\n\t\t})\t\n\t},\n\n\n\t\n\tdoCut: function() {\n\t\tconsole.log(\"cut selection\")\n\t\tthis.doCopy();\n \t\tif (this.currentSelection) \n\t\t\tthis.currentSelection.remove();\n\t},\n},\n'local code', {\n\tgetChangeSet: function() {\n\t\treturn ChangeSet.fromWorld(this);\n\t},\n\tsetChangeSet: function(cs) {\n\t\tcs.addHookTo(cs.findOrCreateDefNodeOfWorld(this.rawNode));\n\t},\n\n\tgetCodeNode: function() {\n\t\tvar codeElement = Query.find('./svg:defs/*[local-name()=\"code\"]', this.rawNode);\n\t\treturn codeElement;\n\t},\n\treplaceCodeNode: function(newCodeNode) {\n\t\tthis.getDefsNode().replaceChild(this.getCodeNode(), newCodeNode);\n\t\treturn newCodeNode;\n\t},\n\n\n\n},'signals',{\n\tsignalGeometryChange: function() {\n\t\tsignal(this, 'geometryChanged')\n\t\t// don't go to the submorphs\n\t},\n\n})\n\n\nObject.extend(WorldMorph, { \n worldCount: 0,\n \n currentWorld: null,\n \n current: function() {\n return WorldMorph.currentWorld;\n }\n});\n\n\n\n/**\n * @class HandMorph\n * Since there may be multiple users manipulating a Morphic world\n * simultaneously, we do not want to use the default system cursor. \n */ \n\nMorph.subclass(\"HandMorph\", \n'default properties', { \n documentation: \"Defines a visual representation for the user's cursor.\",\n applyDropShadowFilter: !!Config.useDropShadow,\n dropShadowFilter: \"url(#DropShadowFilter)\",\n useShadowMorphs: Config.useShadowMorphs,\n\n shadowOffset: pt(8,8),\n handleOnCapture: false,\n logDnD: Config.logDnD,\n grabHaloLabelStyle: {fontSize: Math.floor((Config.defaultFontSize || 12) *0.85), padding: Rectangle.inset(0)},\n\n},\n'Basic',{\n initialize: function($super, local) {\n $super(new lively.scene.Polygon([pt(0,0), pt(10, 8), pt(4,9), pt(8,16), pt(4,9), pt(0, 12)]));\n\t\tthis.applyStyle({fill: local ? Color.primary.blue : Color.primary.red, borderColor: Color.black, borderWidth: 1});\n\t\n this.isLocal = local;\n\n this.keyboardFocus = null;\n this.mouseFocus = null;\n\t\tthis.mouseFocusChanges_ = 0; // count mouse focus changes until reset\n this.mouseOverMorph = null;\n this.lastMouseEvent = null;\n this.lastMouseDownPoint = pt(0,0);\n this.lastMouseDownEvent = null;\n this.hasMovedSignificantly = false;\n this.grabInfo = null;\n \n this.mouseButtonPressed = false;\n\n this.keyboardFocus = null; \n\n this.priorPoint = null;\n this.owner = null;\n\t\tthis.boundMorph = null; // surrounds bounds\n\t\tthis.layoutChangedCount = 0; // to prevent recursion on layoutChanged\n return this;\n },\n\n\tid: function() {\n\t\tif (!this.rawNode) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn this.rawNode.getAttribute(\"id\");\n\t},\n\n world: function() {\n return this.owner;\n },\n},\n'Looks',{\n\n lookNormal: function(morph) {\n this.shape.setVertices([pt(0,0), pt(10, 8), pt(4,9), pt(8,16), pt(4,9), pt(0, 12)]);\n },\n\t\n\tlookTouchy: function(morph) {\n\t\t// Make the cursor look polygonal to indicate touch events go to pan/zoom\n\t\tvar n = 5, r = 10, theta = 2*Math.PI/n;\n\t\tvar verts = [0, 1, 2, 3, 4, 0].map(function(i) { return Point.polar(r, i*theta).addXY(20,0) });\n\t\tthis.shape.setVertices(verts);\n },\n\n\n lookLinky: function(morph) {\n this.shape.setVertices([pt(0,0), pt(18,10), pt(10,18), pt(0,0)]);\n },\n\n\tlookLikeAnUpDownArrow: function() {\n\t\t// /\\\n\t\t// /_ _\\\n\t\t// _||_\n\t\t// \\ /\n\t\t// \\/\n\t\tvar verts = [\n\t\t\tpt(8.0,0.0), pt(16.0,8.0), pt(12.0,8.0), pt(12.0,16.0), pt(16.0,16.0),\n\t\t\tpt(8.0,24.0), pt(0.0,16.0), pt(4.0,16.0), pt(4.0,8.0), pt(0.0,8.0)\n\t\t];\n\t\tthis.shape.setVertices(verts);\n\t},\n},\n'Event Registering',{\n\taddOrRemoveEvents: function(morphOrNode, eventNames, isRemove) {\n\t\tvar node = morphOrNode.rawNode || morphOrNode;\n\t\tvar selector = isRemove ? 'removeEventListener' : 'addEventListener';\n\t\teventNames.forEach(function(name) { \n node[selector](name, (!UserAgent.isIE ? this : this.handleEvent.bind(this)), this.handleOnCapture);\n\t\t}, this);\n\t},\n\t\n registerForEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.basicInputEvents);\n },\n\n unregisterForEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.basicInputEvents, true);\n },\n \n registerForKeyboardEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.keyboardEvents);\n },\n\n unregisterForKeyboardEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.keyboardEvents, true);\n },\n\n},\n'Focus',{\n resetMouseFocusChanges: function() {\n\t\tvar result = this.mouseFocusChanges_;\n\t\tthis.mouseFocusChanges_ = 0;\n\t\treturn result;\n },\n\n setMouseFocus: function(morphOrNull) {\n //console.log('setMouseFocus: ' + morphOrNull);\n\t\tthis.mouseFocus = morphOrNull;\n\t\t// this.setFill(this.mouseFocus ? Color.primary.blue.lighter(2) : Color.primary.blue);\n\t\tthis.mouseFocusChanges_ ++;\n },\n \n setKeyboardFocus: function(morphOrNull) {\n if (this.keyboardFocus === morphOrNull) return;\n\n if (this.keyboardFocus != null) {\n // console.log('blur %s', this.keyboardFocus);\n this.keyboardFocus.onBlur(this);\n this.keyboardFocus.setHasKeyboardFocus(false);\n }\n \n this.keyboardFocus = morphOrNull; \n \n if (this.keyboardFocus) {\n this.keyboardFocus.onFocus(this);\n }\n },\n \n},\n'Event Handling',{\n\t// this is the DOM Event callback\n\thandleEvent: function HandMorph$handleEvent(rawEvt) {\n\t\tvar evt = new Event(rawEvt);\n\t\t// for mutliple worlds since keyboard events can only be registered for entire documentElement\n\t\tif (rawEvt.world && rawEvt.world != this.world())\n\t\t\treturn evt;\n\t\trawEvt.world = this.world();\n\t\tevt.setCanvas(this.canvas());\n\t\tevt.hand = this;\n\t\t//if(Config.showLivelyConsole) console.log(\"event type = \" + rawEvt.type + \", platform = \" + window.navigator.platform);\n\n\t\tlively.lang.Execution.resetDebuggingStack();\n\t\tswitch (evt.type) {\n\t\t\tcase \"MouseWheel\":\n\t\t\tcase \"MouseMove\":\n\t\t\tcase \"MouseDown\":\n\t\t\tcase \"MouseUp\":\n\t\t\t\tthis.handleMouseEvent(evt);\n\t\t\t\tbreak;\n\t\t\tcase \"KeyDown\":\n\t\t\tcase \"KeyPress\": \n\t\t\tcase \"KeyUp\":\n\t\t\t\tthis.handleKeyboardEvent(evt);\n\t\t\t\tbreak;\n\t\t\tcase \"touchstart\":\n\t\t\tcase \"touchmove\":\n\t\t\tcase \"touchend\": \n\t\t\tcase \"touchcancel\":\n\t\t\t\tthis.handleTouchEvent(evt);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"unknown event type \" + evt.type);\n\t\t}\n\t\tevt.stopPropagation();\n\t\treturn evt; // for touch development FIXME remove\n\t}.logErrors('Event Handler'),\n\n armProfileFor: function(evtType) { \n\t\tthis.profileArmed = evtType; // either \"MouseDown\" or \"MouseUp\"\n },\n\n\tmakeANullMove: function() {\n\t\t// Process a null mouseMove event -- no change in x, y\n\t\t// Allows simulations to respond where, eg, a morph moves under the mouse\n\t\t// Note: Fabrik generates also Mouse events with newFakeMouseEvent; to be merged\n\t\tvar last = this.lastMouseEvent;\n\t\tif (!last) return;\n\t\tvar nullMove = new Event(last.rawEvent);\n\t\tnullMove.type = \"MouseMove\";\n\t\tnullMove.hand = this;\n\t\t// console.log(\"last = \" + Object.inspect(this.lastMouseEvent));\n\t\t// console.log(\"null = \" + Object.inspect(nullMove));\n\t\tthis.reallyHandleMouseEvent(nullMove);\n\t\tthis.lastMouseEvent = last; // Restore -- necess??\n\t},\n\n\thandleMouseEvent: function HandMorph$handleMouseEvent(evt) {\n\t\tif(!Config.debugExtras || !this.profileArmed || this.profileArmed != evt.type) {\n\t\t\t// Profile not armed or event doesnt match\n\t\t\treturn this.reallyHandleMouseEvent(evt);\n\t\t}\n\t\t// Run profile during handling of this event\n\t\tthis.profileArmed = null; // Only this once\n\t\tvar result;\n\t\tlively.lang.Execution.trace(function() { result = this.reallyHandleMouseEvent(evt) }.bind(this), this.profilingOptions );\n\t\treturn result;\n\t},\n\thandleTouchEvent: function(evt) {\n\t\t// to be implemented \n\t\t// console.log('handle touch event ')\n\t},\n\n\n\treallyHandleMouseEvent: function HandMorph$reallyHandleMouseEvent(evt) { \n\t\t// console.log(\"reallyHandleMouseEvent \" + evt + \" focus \" + this.mouseFocus);\n\t\t// var rawPosition = evt.mousePoint;\n\t\tvar world = this.owner;\n\t\tevt.mousePoint = evt.mousePoint.matrixTransform(world.getTransform().createInverse()); // for scaling\n\t\tevt.setButtonPressedAndPriorPoint(this.mouseButtonPressed, \n\t\t\t\t\t this.lastMouseEvent ? this.lastMouseEvent.mousePoint : null);\n\t\t//-------------\n\t\t// mouse move\n\t\t//-------------\n\t\tif (evt.type == \"MouseMove\" || evt.type == \"MouseWheel\") { // it is just a move\n\t\t\tthis.setPosition(evt.mousePoint);\n\t\t\t\n\t\t\tif(evt.isShiftDown())\n\t\t\t\tthis.alignToGrid();\n\t\t\t\n\t\t\tthis.updateGrabHalo();\n\t\t\t\n\t\t\tif (evt.mousePoint.dist(this.lastMouseDownPoint) > 10) { \n\t\t\t\tthis.hasMovedSignificantly = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.mouseFocus) { // if mouseFocus is set, events go to that morph\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t} else if (world) {\n\t\t\t\tvar receiver = world.morphToReceiveEvent(evt);\n\t\t\t\t// console.log(\"found receiver: \" + receiver)\n\t\t\t\tif (this.checkMouseOverAndOut(receiver, evt)) {\t // mouseOverMorph has changed...\n\t\t\t\t\tif (!receiver || !receiver.canvas()) return false;\t// prevent errors after world-switch\n\t\t\t\t\t// Note if onMouseOver sets focus, it will get onMouseMove\n\t\t\t\t\tif (this.mouseFocus) this.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t\t\telse if (!evt.hand.hasSubmorphs()) world.captureMouseEvent(evt, false); \n\t\t\t\t} else if (receiver) receiver.captureMouseEvent(evt, false);\n\t\t\t}\n\t\t\tthis.lastMouseEvent = evt;\n\t\t\treturn true;\n\t\t} \n\n\t\n\t\t//-------------------\n\t\t// mouse up or down\n\t\t//-------------------\n\t\tif (!evt.mousePoint.eqPt(this.position())) { // Only happens in some OSes\n\t\t\t// and when window wake-up click hits a morph\n\t\t\tthis.moveBy(evt.mousePoint.subPt(this.position())); \n\t\t}\n\n\t\tthis.mouseButtonPressed = (evt.type == \"MouseDown\"); \n\t\tthis.setBorderWidth(this.mouseButtonPressed ? 2 : 1);\n\t\tevt.setButtonPressedAndPriorPoint(this.mouseButtonPressed, this.lastMouseEvent ? this.lastMouseEvent.mousePoint : null);\n\t\n\t\tif (this.mouseFocus != null) {\n\t\t\tif (this.mouseButtonPressed) {\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t\tthis.lastMouseDownPoint = evt.mousePoint; \n\t\t\t} else {\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.hasSubmorphs() && (evt.type == \"MouseDown\" || this.hasMovedSignificantly)) {\n\t\t\t\t// If laden, then drop on mouse up or down\n\t\t\t\tvar m = this.topSubmorph();\n\t\t\t\tvar receiver = world.morphToGrabOrReceiveDroppingMorph(evt, m);\n\t\t\t\t// For now, failed drops go to world; later maybe put them back?\n\t\t\t\tthis.dropMorphsOn(receiver || world);\n\t\t\t} else {\n\t\t\t\t// console.log(\"hand dispatching event %s to owner %s\", evt, this.owner);\n\t\t\t\t// This will tell the world to send the event to the right morph\n\t\t\t\t// We do not dispatch mouseup the same way -- only if focus gets set on mousedown\n\t\t\t\tif (evt.type == \"MouseDown\") world.captureMouseEvent(evt, false);\n\t\t\t}\n\t\t\tif (evt.type == \"MouseDown\") {\n\t\t\t\tthis.lastMouseDownPoint = evt.mousePoint;\n\t\t\t\tthis.lastMouseDownEvent = evt;\n\t\t\t\tthis.hasMovedSignificantly = false; \n\t\t\t}\n\t\t}\n\t\tthis.lastMouseEvent = evt; \n\t\treturn true;\n\t},\n},\n'Misc',{\t\n checkMouseUpIsInClickTimeSpan: function(mouseUpEvent) {\n\t\t// console.log(\"checkMouseUpIsInClickTimeSpan \" + this.lastMouseDownEvent.timeStamp )\n\t\tif (!this.lastMouseDownEvent || !mouseUpEvent)\n\t\t\treturn false;\n\t\treturn (mouseUpEvent.timeStamp - this.lastMouseDownEvent.timeStamp) < (400)\n\t},\n\n checkMouseOverAndOut: function(newMouseOverMorph, evt) {\n\t\tif (newMouseOverMorph === this.mouseOverMorph) return false;\n\n\t\t// if over a new morph, send onMouseOut, onMouseOver\n\t\tif (this.mouseOverMorph) this.mouseOverMorph.onMouseOut(evt);\n\t\tthis.mouseOverMorph = newMouseOverMorph;\n\t\t// console.log('msOverMorph set to: ' + Object.inspect(this.mouseOverMorph));\n\t\tif (this.mouseOverMorph) this.mouseOverMorph.onMouseOver(evt);\n\t\treturn true;\n\t},\n\n layoutChanged: function($super) {\n\t\tthis.layoutChangedCount ++;\n\t\ttry {\n\t\t\t$super();\n\t\t\tif (this.layoutChangedCount == 1) {\n\t\t\t\tConfig.showGrabHalo && this.updateGrabHalo();\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.layoutChangedCount --;\n\t\t}\n },\n},\n'Keyboard Events',{\n\tisKeyDown: function(character) {\n\t\tif (!this.keysDown)\n\t\t\treturn false;\n\t\treturn this.keysDown[character]\n\t},\n\t\n\tforgetKeyDown: function(evt) {\n\t\tif (!this.keysDown)\n\t\t\treturn;\n\t\tthis.keysDown[evt.getKeyChar()] = false;\n\t\t// hack, around weired events when command is pressed\n\t\tif (evt.getKeyCode() == 91) {\n\t\t\t// console.log(\"clear keydown list...\")\n\t\t\tthis.keysDown = {};\n\t\t\n\t\t};\n\t},\n\n\trememberKeyDown: function(evt) {\n\t\tif (!this.keysDown) {\n\t\t\tthis.keysDown = {};\n\t\t};\n \t\t//console.log(\"remember KeyDown \" + evt.getKeyChar())\n\t\tthis.keysDown[evt.getKeyChar().toUpperCase()] = true;\n\t},\n\n handleKeyboardEvent: function(evt) { \n\t\t// console.log(\"event: \" + evt )\n\t\tif(evt.type == \"KeyUp\") {\n \t\t\tthis.forgetKeyDown(evt);\t\t\t\n\t\t};\n if (this.hasSubmorphs()) {\n if (evt.type == \"KeyDown\" && this.moveSubmorphs(evt)) return;\n else if (evt.type == \"KeyPress\" && this.transformSubmorphs(evt)) return;\n }\n\t\tvar consumed = false;\n // manual bubbling up b/c the event won't bubble by itself\n\t\tvar world = this.world();\n for (var responder = this.keyboardFocus || world; responder != null; responder = responder.owner || world) {\n\t\t\tif (responder.takesKeyboardFocus()) {\n var handler = responder[evt.handlerName()];\n if (handler) {\n if (handler.call(responder, evt)) {\n\t\t\t\t\t\tconsumed = true;\n break; // event consumed?\t\t\n\t\t\t\t\t}\n }\n }\n\t\t\tif (responder == world) break;\n }\n\n\t\tif (!consumed) {\n\t\t\t// console.log(\"not consumed \" + evt)\n\t\t\t// the single command key evt \n\t\t\tif (evt.isCommandKey()) // rk: what is that supposed to do?\n\t\t\t\tClipboardHack.selectPasteBuffer();\t\t\t\n\t\t\t\t\n\t\t\t// remember key down for mouse events\n\t\t\tif(evt.type == \"KeyPress\") {\n\t\t\t\tthis.rememberKeyDown(evt);\n\t\t\t};\n\t\t};\n\t\tthis.blockBrowserKeyBindings(evt);\n },\n\t\n blockBrowserKeyBindings: function(evt) {\n\t\tswitch (evt.getKeyCode()) {\n\t\t\tcase Event.KEY_SPACEBAR: // [don't] scroll\n\t\t \t// stop keypress but don't try to stop preceeding keydown,\n\t\t \t// which would prevent keypress from firing and being handled by Text etc\n\t\t \tif (evt.type == \"KeyPress\") evt.stop();\n\t\t \tbreak;\n\t\t case Event.KEY_BACKSPACE: // [don't] go to the previous page \n\t\t \tevt.stop();\n\t\t \tbreak;\n\t\t\tcase 22:\n\t\t\tcase 3:\n\t\t\tcase 24:\n\t\t\t\tif (evt.isCtrlDown() && evt.type == \"KeyPress\") \n\t\t\t\t\tevt.preventDefault(); // ctrl+x, ctrl+c, or ctrl+v pressed\n\t\t\t\tbreak;\n\t\t\t}\n\t\tswitch (evt.getKeyChar()) {\n\t\t\tcase \"[\":\n\t\t\tcase \"]\":\n\t\t \tif (evt.isMetaDown() && evt.type == \"KeyPress\") {\n\t\t\t\t\t// Safari would want to navigate the history\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tbreak;\n\t\t }\n\t\t}\t\n },\n},\n'Geometry',{\n\tbounds: function($super) {\n\t\t// account for the extra extent of the drop shadow\n\t\t// FIXME drop shadow ...\n\t\treturn this.shadowMorph ? $super().expandBy(this.shadowOffset.x) : $super();\n\t},\n\n\tgetInsertPositionFor: function(m, isFront) {\n\t\tif (this.submorphs.length == 0) return this.shape.rawNode;\n\t\treturn isFront ? this.submorphs.last().rawNode : this.submorphs.first().rawNode;\n\t},\n\n toString: function($super) { \n var superString = $super();\n var extraString = Strings.format(\", local=%s,id=%s\", this.isLocal, this.id());\n if (!this.hasSubmorphs()) \n\t\t\treturn superString + \", an empty hand\" + extraString;\n return Strings.format(\"%s, a hand carrying %s%s\", superString, this.topSubmorph(), extraString);\n },\n\n\tsetPosition: function($super, pos) {\n\t\t$super(pos);\n\t\tif (this.hasSubmorphs())\n\t\t\tthis.scrollDuringDrag()\n\t\treturn pos;\n\t},\n},\n'Indicator',{\n\tremoveIndicatorMorph: function() {\n\t\tif (!this.indicatorMorph)\n\t\t\treturn;\n\t\tthis.indicatorMorph.remove();\n\t\tthis.indicatorMorph = undefined;\n\t},\n\n\tensureIndicatorMorph: function() {\n\t\tif (this.indicatorMorph)\n\t\t\treturn this.indicatorMorph;\n\t\tvar morph = new TextMorph(new Rectangle(0,0,100,20));\n\t\tmorph.setPosition(this.shape.bounds().bottomRight().addPt(pt(-5,-5)))\n\t\tmorph.ignoreEvents();\n\t\tmorph.isEpimorph = true;\n\t\tmorph.setBorderWidth(0);\n\t\tmorph.setStrokeOpacity(0);\n\t\tmorph.setFill(null);\n\t\tthis.indicatorMorph = morph;\n\t\tthis.addMorph(morph);\n\t\treturn morph\n\t},\n\n\thasSubmorphs: function() {\n\t\tif (this.submorphs.length == 0)\n\t\t\treturn false;\n\t\telse\n\t\t\treturn this.submorphs.reject(function(ea) {return ea.isEpimorph}).length != 0;\n\t},\n},\n'Scrolling',{\n\tscrollDuringDrag: function(counter) {\n\t\tvar scrollSpeed = 0.3; // should go into config options?\n\t\tvar maxSteps = 30;\n\t\t\n\t\tvar world = this.world();\n\t\tvar wb = world.windowBounds();\n\t\tvar pos = this.getPosition();\n\t\tcounter = counter || 1;\n\t\t\n\t\tvar worldScale = world.getScale();\n\t\tvar steps = counter * scrollSpeed * worldScale;\n\t\tsteps = Math.min(steps, maxSteps);\n\t\tvar animate = false;\n\t\tvar self = this;\n\t\t\n\t\tvar scroll = function(delta) {\n\t\t\tvar oldPos = pt(Global.scrollX, Global.scrollY)\n\t\t\tGlobal.scrollBy(delta.x, delta.y);\t\t\tvar newPos = pt(Global.scrollX, Global.scrollY)\n\t\t\tvar scrollDelta = newPos.subPt(oldPos).scaleBy(1 / worldScale);\n\t\t\tself.moveBy(scrollDelta.scaleBy(1))\n\t\t\tanimate = true;\n\t\t};\n\t\tvar offset = 50\n\t\tif (pos.x + offset > wb.right()) scroll(pt(steps,0));\n\t\tif (pos.x - offset < wb.left()) scroll(pt(-steps,0));\n\t\tif (pos.y - offset < wb.top()) scroll(pt(0, - steps));\n\t\tif (pos.y + offset > wb.bottom()) scroll(pt(0, steps))\n\t\tif (animate) {\n\t\t\t(function(){self.scrollDuringDrag( counter + 1)}).delay()\t\n\t\t}\n\t}\n},\n'Fabrik Extension (DEPRECATED)',{\n changed: function($super, morph) {\n $super();\n this.globalPosition = this.getPosition();\n this.submorphs.forEach(function(ea){\n // console.log(\"changed \"+ ea);\n ea.changed(\"globalPosition\", this.getPosition());\n }, this);\n },\n});\n\nMorph.subclass('LinkMorph', {\n\n documentation: \"two-way hyperlink between two Lively worlds\",\n helpText: \"Click here to enter or leave a subworld.\\n\" +\n \"Use menu 'grab' to move me. Drag objects\\n\" +\n \"onto me to transport objects between worlds.\",\n openForDragAndDrop: false,\n suppressHandles: true,\n\tstyle: {\n\t\tborderColor: Color.black, \n\t\tfill: lively.lang.let(lively.paint, function(g) { \n\t\t\treturn new g.RadialGradient([new g.Stop(0, Color.blue.lighter()) , new g.Stop(0.5, Color.blue), \n\t\t\tnew g.Stop(1, Color.blue.darker())], pt(0.4, 0.2))})\n\t},\n \n\tinitialize: function($super, otherWorld, initialPosition) {\n\t\t// In a scripter, type: world.addMorph(new LinkMorph(null))\n\n\t\t// Note: Initial position can be specified either as a rectangle or point.\n\t\t// If no position is specified, place the icon in the lower left corner\n\t\t// of the screen.\n\t\tinitialPosition = initialPosition || WorldMorph.current().bounds().bottomLeft().addXY(50, -50);\n\t\t$super(new lively.scene.Ellipse(initialPosition, 25));\n\t\tvar bounds = this.shape.bounds();\n\n\t\t// Make me look a bit like a world\n\t\t[new Rectangle(0.15,0,0.7,1), new Rectangle(0.35,0,0.3,1), new Rectangle(0,0.3,1,0.4)].forEach(function(each) {\n\t\t\t// Make longitude / latitude lines\n\t\t\tvar lineMorph = new Morph(new lively.scene.Ellipse(bounds.scaleByRect(each)));\n\t\t\tlineMorph.applyStyle({fill: null, borderWidth: 1, borderColor: Color.black}).ignoreEvents();\n\t\t\tthis.addMorph(lineMorph);\n\t\t}, this);\n\n\t\tif (!otherWorld) {\n\t\t\tthis.myWorld = this.makeNewWorld(this.canvas());\n\t\t\tthis.addPathBack();\n\t\t} else {\n\t\t\tthis.myWorld = otherWorld;\n\t\t}\n\t\treturn this;\n\t},\n \n\tmakeNewWorld: function(canvas) {\n\t\treturn new WorldMorph(canvas);\n\t},\n \n\taddPathBack: function() {\n\t\tvar pathBack = new LinkMorph(WorldMorph.current(), this.bounds().center());\n\n\t\tpathBack.setFill(lively.lang.let(lively.paint, function(gfx) {\n\t\t\treturn new gfx.RadialGradient([new gfx.Stop(0, Color.orange), \n\t\t\tnew gfx.Stop(0.5, Color.red), \n\t\t\tnew gfx.Stop(1, Color.red.darker(2))],\n\t\t\tpt(0.4, 0.2));\n\t\t}));\n\n\t\tthis.myWorld.addMorph(pathBack);\n\t\treturn pathBack;\n\t},\n \n\tonDeserialize: function() {\n\t\t//if (!this.myWorld) \n\t\tthis.myWorld = WorldMorph.current(); // a link to the current world: a reasonable default?\n\t},\n\n\thandlesMouseDown: function(evt) {\n\t\treturn true; \n\t},\n\n\tonMouseDown: function(evt) {\n\t\tthis.enterMyWorld(evt); \n\t\treturn true; \n\t},\n\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.addItem([\"publish linked world as ... \", function() { \n\t\tthis.world().prompt(\"world file (.xhtml)\", this.exportLinkedFile.bind(this)); }]);\n\t\tmenu.replaceItemNamed(\"package\", [\"package linked world\", function(evt) {\n\t\t\tnew PackageMorph(this.myWorld).openIn(this.world(), this.bounds().topLeft()); this.remove()} ]);\n\t\treturn menu;\n\t},\n\n\tenterMyWorld: function(evt) { // needs vars for oldWorld, newWorld\n\t\tcarriedMorphs = [];\n\n\t\t// Save, and suspend stepping of, any carried morphs\n\t\tevt.hand.unbundleCarriedSelection();\n\t\tevt.hand.carriedMorphsDo( function (m) {\n\t\t\tm.suspendAllActiveScripts();\n\t\t\tcarriedMorphs.splice(0, 0, m);\n\t\t\tevt.hand.shadowMorphsDo( function(m) { m.stopAllStepping(); });\n\t\t\tevt.hand.showAsUngrabbed(m);\n\t\t});\n\t\tevt.hand.removeAllMorphs();\n\t\tthis.hideHelp();\n\t\tthis.myWorld.changed();\n\t\tvar oldWorld = WorldMorph.current();\n\t\toldWorld.onExit(); \n\n\t\tif (Config.suspendScriptsOnWorldExit)\n\t\t\toldWorld.suspendAllActiveScripts();\n\n\t\tvar canvas = oldWorld.canvas();\n\t\toldWorld.remove(); // some SVG calls may stop working after this point in the old world.\n\n\t\tconsole.log('left world %s through %s', oldWorld, this);\n\n\t\t// display world first, then add hand, order is important!\n\t\tvar newWorld = this.myWorld;\n\t\tif (newWorld.owner) {\n\t\t\tconsole.log(\"new world had an owner, removing\");\n\t\t\tnewWorld.remove();\n\t\t}\n\n\t\tnewWorld.displayOnCanvas(canvas); // Becomes current at this point\n\n\t\tif (Config.suspendScriptsOnWorldExit) { \n\t\t\tnewWorld.resumeAllSuspendedScripts();\n\t\t}\n\n\t\tcarriedMorphs.forEach(function(m) {\n\t\t\tvar hand = newWorld.firstHand();\n\t\t\tm.resumeAllSuspendedScripts();\n\t\t\thand.addMorphAsGrabbed(m);\n\t\t});\n\n\t\tif (Config.showThumbnail) {\n\t\t\tvar scale = 0.1;\n\t\t\tif (newWorld.thumbnail) {\n\t\t\t\tconsole.log(\"disposing of a thumbnail\");\n\t\t\t\tnewWorld.thumbnail.remove();\n\t\t\t}\n\t\t\tnewWorld.thumbnail = Morph.makeRectangle(Rectangle.fromElement(canvas));\n\t\t\tnewWorld.thumbnail.setPosition(this.bounds().bottomRight());\n\t\t\tnewWorld.addMorph(newWorld.thumbnail);\n\t\t\tnewWorld.thumbnail.setScale(scale);\n\t\t\tnewWorld.thumbnail.addMorph(oldWorld);\n\t\t}\n\n\t\tif (carriedMorphs.length > 0) newWorld.firstHand().emergingFromWormHole = true; // prevent re-entering\n\t},\n \n\tonMouseOver: function($super, evt) {\n\t\tif (evt.hand.hasSubmorphs()) { // if hand is laden enter world bearing gifts\n\t\t\tif (!evt.hand.emergingFromWormHole) this.enterMyWorld(evt);\n\t\t} else {\n\t\t\t$super(evt);\n\t\t}\n\t},\n\n\tonMouseOut: function($super, evt) {\n\t\tevt.hand.emergingFromWormHole = false;\n\t\t$super(evt);\n\t},\n\n\tgetHelpText: function() {\n\t\treturn this.helpText;\n\t},\n\t\n\taddLabel: function(text) {\n\t\tvar label = new TextMorph(pt(110, 25).extentAsRectangle(), text).applyStyle({borderRadius: 10, borderWidth: 2});\n\t\tthis.addMorph(label);\n\t\tlabel.align(label.bounds().leftCenter(), this.shape.bounds().rightCenter().addXY(5, 0));\n\t\tlabel.linkToStyles(['raisedBorder']);\n\t\treturn label;\n\t},\n \n});\n\nLinkMorph.subclass('ExternalLinkMorph', {\n\n documentation: \"A link to a different web page, presumably containing another LK\",\n\n style: { borderColor: Color.black, fill: new lively.paint.RadialGradient([new lively.paint.Stop(0, Color.green), \n\t\t\t\t\t\t\t\t\t new lively.paint.Stop(1, Color.yellow)])},\n \n initialize: function($super, url, position) {\n\t\t$super(null, position || pt(0, 0));\n\t\tthis.url = url;\n\t\tthis.win = null; // browser window\n },\n\n makeNewWorld: Functions.Null, \n \n addPathBack: Functions.Null,\n\n\tenterMyWorld: function(evt) {\n\t\tif (evt.isCommandKey()) {\n\t\t\tthis.world().confirm(\"Leave current runtime to enter another page?\", function (answer) {\n\t\t\t\tif (answer) Global.location = this.url.toString();\n\t\t\t\telse console.log(\"cancelled loading \" + this.url);\n\t\t\t});\n\t\t} else {\n\t\t\tif (this.win && !this.win.closed) this.win.focus();\n\t\t\telse this.win = Global.window.open(this.url);\n\t\t}\n\t},\n \n getHelpText: function() {\n\t\treturn \"Click to enter \" + this.url;\n },\n\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.addItem([\"set link target...\", function() {\n\t\t\tthis.world().prompt(\"Set new target file\", function(answer) {\n\t\t\t\tthis.url = URL.source.withFilename(answer);\n\t\t\t}.bind(this), URL.source.toString());\n\t\t}]);\n\t\treturn menu;\n\t}\n \n});\n\n\n/**\n * Morpsh for Structuring and Layouting \n */\n\nMorph.subclass('BoxMorph', {\n\n documentation: \"Occupies a rectangular area of the screen, can be laid out\",\n\n initialize: function($super, initialBounds) {\n\t\t$super(new lively.scene.Rectangle(initialBounds));\n },\n\n});\n\nBoxMorph.subclass('ContainerMorph', {\n documentation: \"Box morph whose shape grows to contain all its submrphs\",\n\n\tinitialize: function($super,rect) {\n\t\t$super(rect);//new Rectangle(0,0,0,0));\n\t},\n\n initializeTransientState: function($super) {\n $super();\n this.priorExtent = this.innerBounds().extent();\n },\n\n\taddMorph: function($super, m, isFront) {\n\t\tvar ret = $super(m, isFront);\n\t\tvar submorphBounds = this.submorphBounds(true);\n\t\tif (submorphBounds)\n\t\t\tthis.shape.setBounds(submorphBounds.outsetByRect(this.padding));\n\t\treturn ret;\n\t},\n\n\tadjustForNewBounds: function ($super) {\n\t\t// borrowed from PanelMorph\n\t\t// Compute scales of old submorph extents in priorExtent, then scale up to new extent\n\t\t$super();\n\t\tvar newExtent = this.innerBounds().extent();\n\t\tvar scalePt = newExtent.scaleByPt(this.priorExtent.invertedSafely());\n\t\tthis.submorphs.forEach(function(sub) {\n\t\t\tsub.setPosition(sub.getPosition().scaleByPt(scalePt));\n\t\t\tsub.setExtent(sub.getExtent().scaleByPt(scalePt));\n\t\t});\n\t\tthis.priorExtent = newExtent;\n\t}, \n});\nMorph.subclass('PathMorph',\n'documentation', {\n\tdocumentation: 'Morph that has a path shape. Either a line or a curve. Editable. Hmmmm',\n},\n'settings', {\n\tsuppressGrabbing: false,\n\topenForDragAndDrop: false,\n\tstyle: {borderWidth: 1, borderColor: Color.black, fill: null},\n\tisCurve: false,\n},\n'initializing', {\n\tinitialize: function($super, verts) {\n\t\t$super(this.createPathShape(verts));\n\t},\n\tcreatePathShape: function(verts) {\n\t\tvar g = lively.scene,\n\t\t\tcmds = [new g.MoveTo(true, verts[0].x, verts[0].y)];\n\t\tfor (var i = 1; i < verts.length; i++)\n\t\t\tcmds.push(new g.LineTo(true, verts[i].x, verts[i].y));\n\t\treturn new g.Path(cmds);\n\t},\n},\n'accessing', {\n\tgetLength: function() { return this.shape.rawNode.getTotalLength() },\n\tgetPointAtLength: function(length) { return Point.ensure(this.shape.rawNode.getPointAtLength(length)) },\n\tgetRelativePoint: function(relativeLength) {\n\t\tvar pos = this.getPointAtLength(this.getLength() * relativeLength);\n\t\t// return this.world() ? this.worldPoint(pos).subPt(this.shape.bounds().topLeft()) : pos;\n\t\treturn pos.matrixTransform(this.getGlobalTransform())\n\t},\n\n\tenableInsertionPoints: function() { this.shape.showInsertionPoints = true },\n\tdisableInsertionPoints: function() { this.shape.showInsertionPoints = false },\n},\n'geometry computing', {\n\tpathBetweenRects: function(rect1, rect2) {\n\t\t// copied and adpated from graffle Raphael 1.2.1 - JavaScript Vector Library\n\t\tvar p = [{x: rect1.x + rect1.width / 2, y: rect1.y - 1},\n\t {x: rect1.x + rect1.width / 2, y: rect1.y + rect1.height + 1},\n\t {x: rect1.x - 1, y: rect1.y + rect1.height / 2},\n\t {x: rect1.x + rect1.width + 1, y: rect1.y + rect1.height / 2},\n\t {x: rect2.x + rect2.width / 2, y: rect2.y - 1},\n\t {x: rect2.x + rect2.width / 2, y: rect2.y + rect2.height + 1},\n\t {x: rect2.x - 1, y: rect2.y + rect2.height / 2},\n\t {x: rect2.x + rect2.width + 1, y: rect2.y + rect2.height / 2}];\n\t\tvar d = {}, dis = [];\n\t\tfor (var i = 0; i < 4; i++) {\n\t\t\tfor (var j = 4; j < 8; j++) {\n\t\t\t\tvar dx = Math.abs(p[i].x - p[j].x),\n\t\t\t\t\tdy = Math.abs(p[i].y - p[j].y);\n\t\t\t\tif ((i == j - 4) || (((i != 3 && j != 6) || \n\t\t\t\t\tp[i].x < p[j].x) && ((i != 2 && j != 7) || p[i].x > p[j].x) && ((i != 0 && j != 5) || \n\t\t\t\t\tp[i].y > p[j].y) && ((i != 1 && j != 4) || p[i].y < p[j].y))) {\n\t\t\t\t\t\tdis.push(dx + dy);\n\t\t\t\t\t\td[dis[dis.length - 1]] = [i, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t res = dis.length == 0 ? [0, 4] : d[Math.min.apply(Math, dis)];\n\n\t\tvar x1 = p[res[0]].x,\n\t\t\ty1 = p[res[0]].y,\n\t\t\tx4 = p[res[1]].x,\n\t\t\ty4 = p[res[1]].y,\n\t\t\tdx = Math.max(Math.abs(x1 - x4) / 2, 10),\n\t\t\tdy = Math.max(Math.abs(y1 - y4) / 2, 10),\n\t\t\tx2 = [x1, x1, x1 - dx, x1 + dx][res[0]].toFixed(3),\n\t\t\ty2 = [y1 - dy, y1 + dy, y1, y1][res[0]].toFixed(3),\n\t\t\tx3 = [0, 0, 0, 0, x4, x4, x4 - dx, x4 + dx][res[1]].toFixed(3),\n\t\t\ty3 = [0, 0, 0, 0, y1 + dy, y1 - dy, y4, y4][res[1]].toFixed(3);\n\n\t\tvar p1 = this.localize(pt(x1, y1)),\n\t\t\tc1 = this.localize(pt(x2, y2)),\n\t\t\tc2 = this.localize(pt(x3, y3)),\n\t\t\tp2 = this.localize(pt(x4, y4));\n\n\t\treturn [p1, c1, c2, p2];\n\t},\n},\n'converting', {\n\tconvertToLine: function() {\n\t\tthis.shape.setElements(this.shape.getElements().collect(function(e) {\n\t\t\treturn (e.charCode == 'M' || e.charCode == 'L') ? e : new lively.scene.LineTo(true, e.x, e.y);\n\t\t}));\n\t},\n\tconvertToCurve: function() {\n\t\tvar g = lively.scene, elements = this.shape.getElements().clone();\n\t\tfor (var i = 1; i < elements.length; i++) {\n\t\t\tvar e = elements[i], prev = elements[i-1];\n\t\t\t// do nothing if it is already a curve\n\t\t\tif (e.charCode == 'Q' || e.charCode == 'C' || e.charCode == 'S') continue;\n\t\t\tvar ptArr = this.pathBetweenRects(new Rectangle(prev.x,prev.y,0,0), new Rectangle(e.x,e.y,0,0)),\n\t\t\t\tc1 = ptArr[1],\n\t\t\t\tc2 = ptArr[2],\n\t\t\t\tp = ptArr[3];\n\t\t\telements[i] = new g.BezierCurve2CtlTo(true, p.x, p.y, c1.x, c1.y, c2.x, c2.y);\n\t\t}\n\t\tthis.shape.setElements(elements);\n\t},\n},\n'menu', {\n\ttoggleLineStyle: function() {\n\t\tthis.isCurve ? this.convertToLine() : this.convertToCurve();\n\t\tthis.isCurve = !this.isCurve;\n\t},\n\tsubMenuItems: function($super, evt) {\n\t\tvar items = $super(evt);\n\t\titems.unshift(['Convert to ' + (this.isCurve ? 'line' : 'curve'), this.toggleLineStyle.bind(this)]);\n\t\treturn items;\n\t},\n});\n\nMorph.subclass('PseudoMorph', {\n description: \"This hack to make various objects serializable, despite not being morphs\",\n \n\tinitialize: function($super) {\n\t\t$super(new lively.scene.Group());\n\t\tthis.setVisible(false);\n\t}\n\n});\n\n\nPseudoMorph.subclass('Invocation', {\n\n\tinitialize: function($super, actor, scriptName, argIfAny) {\n\t\t$super();\n\t\tthis.actor = actor;\n\t\tthis.scriptName = scriptName;\n\t\tthis.argIfAny = argIfAny; // better be primitive\n\t},\n\n\texec: function Invocation$exec() {\n\t\tif (!this.actor) {\n\t\t\tconsole.warn(\"no actor on script %s\", this);\n\t\t\treturn null;\n\t\t}\n\t\tvar func = this.actor[this.scriptName];\n\t\tif (func) {\n\t\t\treturn func.call(this.actor, this.argIfAny);\n\t\t} else {\n\t\t\t//console.warn(\"no callback on actor %s\", this.actor);\n\t\t\treturn null;\n\t\t}\n\t},\n\n});\n\nInvocation.subclass('SchedulableAction', {\n\n\tdocumentation: \"Description of a periodic action\",\n\tbeVerbose: false,\n\n\tinitialize: function($super, actor, scriptName, argIfAny, stepTime) {\n\t\t$super(actor, scriptName, argIfAny);\n\t\tthis.stepTime = stepTime;\n\t\tthis.ticks = 0;\n\t},\n\n\ttoString: function() {\n\t\treturn Strings.format(\"#\", \n\t\tthis.actor, this.scriptName, this.argIfAny, this.stepTime);\n\t},\n\n\tstop: function(world) {\n\t\tif (this.beVerbose) console.log(\"stopped stepping task %s\", this);\n\t\tworld.stopSteppingFor(this);\n\t},\n\n\tstart: function(world) {\n\t\tif (this.beVerbose) console.log(\"started stepping task %s\", this);\n\t\tworld.startSteppingFor(this);\n\t},\n\n\tequalActorAndName: function(other) {\n\t\tif (!other) \n\t\t\treturn false;\n\t\tif (this === other) \n\t\t\treturn true;\n\t\treturn (this.actor === other.actor) && (this.scriptName == other.scriptName)\n\t}\n});\n\nMorph.addMethods(\n'plugs', {\n\tplugTo: function(model, connectSpec) {\n\t\t// experimental protocol\n\t\t// This message preserves the model-view \"plug\" API of MVC's pluggable views,\n\t\t// while using the \"direct connect\" form of change notification\n\t\t// {dir: String, name: String, options: Object}\n\t\tvar view = this;\n\n\t\tfunction parseStringSpec(stringSpec) {\n\t\t\tvar parsed = stringSpec.match(/(->?)(.*)/);\n\t\t\treturn {dir: parsed[1], name: parsed[2]};\n\t\t};\n\n\t\tProperties.forEachOwn(connectSpec, function (viewProp, spec) {\n\t\t\tif (Object.isString(spec)) spec = parseStringSpec(spec);\n\t\t\tvar dir = spec.dir || '->',\n\t\t\t\toptions = spec.options || {};\n\t\t\tif (dir == \"->\" || dir == \"<->\")\n\t\t\t\tlively.bindings.connect(view, viewProp, model, spec.name, options)\n\t\t\tif (dir == \"<-\" || dir == \"<->\")\n\t\t\t\tlively.bindings.connect(model, spec.name, view, viewProp, options)\n\t\t});\n\t\treturn this;\n\t},\n\n});\n\n}) // end of module\n","sourceString":"module('lively.oldCore.Morphs').requires('lively.OldModel', 'lively.oldCore.Misc', 'lively.oldCore.Hacks').toRun(function() {\n\n// ===========================================================================\n// Morph functionality\n// ===========================================================================\n\nObject.subclass('MouseHandlerForDragging', {\n\n\thandleMouseEvent: function(evt, targetMorph) {\n\t\tif (evt.type == \"MouseDown\") evt.hand.setMouseFocus(targetMorph);\n\t\tevt.hand.resetMouseFocusChanges();\n\n\t\tvar handler = targetMorph[evt.handlerName()];\n\t\tif (handler) handler.call(targetMorph, evt, targetMorph);\n\n\t\tif (evt.type == \"MouseUp\") {\n\t\t\t// cancel focus unless it was set in the handler\n\t\t\tif (evt.hand.resetMouseFocusChanges() == 0) {\n\t\t\t\tevt.hand.setMouseFocus(null);\n\t\t\t}\n\t\t}\n\t\treturn true; \n\t},\n\n handlesMouseDown: Functions.False\n});\n\nObject.subclass('MouseHandlerForRelay', {\n\n\tdefaultEventSpec: {onMouseDown: \"onMouseDown\", onMouseMove: \"onMouseMove\", onMouseUp: \"onMouseUp\"},\n\t\n\tinitialize: function (target, eventSpec) {\n\t\t// Send events to a different target, with different methods\n\t\t// Ex: box.relayMouseEvents(box.owner, {onMouseUp: \"boxReleased\", onMouseDown: \"boxPressed\"})\n\t\tthis.target = target;\n\t\tthis.eventSpec = eventSpec || this.defaultEventSpec;\n\t},\n\n\thandleMouseEvent: function(evt, originalTarget) {\n\t\tif (evt.type == \"MouseDown\") evt.hand.setMouseFocus(originalTarget);\n\t\tevt.hand.resetMouseFocusChanges();\n\n\t\tvar handler = this.target[this.eventSpec[evt.handlerName()]];\n\t\tif (handler) handler.call(this.target, evt, originalTarget);\n\n\t\tif (evt.type == \"MouseUp\") {\n\t\t\t// cancel focus unless it was set in the handler\n\t\t\tif (evt.hand.resetMouseFocusChanges() == 0) {\n\t\t\t\tevt.hand.setMouseFocus(null);\n\t\t\t}\n\t\t}\n\t\treturn true; \n\t},\n\n handlesMouseDown: Functions.True\n\n});\n\n/**\n * Morph Class \n */\nlively.data.Wrapper.subclass('Morph');\n\nObject.extend(Morph, {\n\t// Functions for change management\n \t// this static function is needed to bind it during the defintion of some Morph methods\n\tonLayoutChange: function(fieldName) { \n\t\treturn function layoutChangeAdvice(/* arguments*/) {\n\t\t\tvar priorExtent = this.innerBounds().extent();\n\t\t\tthis.changed();\n\t\t\tvar args = $A(arguments);\n\t\t\tvar proceed = args.shift();\n\t\t\tvar result = proceed.apply(this, args);\n\t\t\tthis.layoutChanged(priorExtent);\n\t\t\tthis.changed(); \n\t\t\treturn result;\n\t\t}\n\t},\n\n\tfromLiteral: function(literal) {\n\t\tvar morph = new Morph(literal.shape);\n\t\tif (literal.submorphs) {\n\t\t\tif (Object.isArray(literal.submorphs))\n\t\t\t\tmorph.setSubmorphs(literal.submorphs);\n\t\t\telse throw new TypeError();\n\t\t}\n\t\tif (literal.transforms) {\n\t\t\tmorph.setTransforms(literal.transforms);\n\t\t}\n\t\treturn morph;\n\t},\n\n\t// factory methods\n\tmakeLine: function(verts, lineWidth, lineColor) {\n\t\tif (verts.length < 2) return;\n\t\tvar morph = new PathMorph(verts);\n\t\tmorph.applyStyle({fill: null, borderWidth: lineWidth || 1, borderColor: lineColor || Color.black});\n\t\tmorph.enableInsertionPoints()\n\t\treturn morph;\n\n\t\t// make a line with its origin at the first vertex\n\t\t// Note this works for simple lines (2 vertices) and general polylines\n\t\t// verts = verts.invoke('subPt', verts[0]);\n\t\t// var shape = new lively.scene.Polyline(verts);\n\t\t// var morph = new Morph(shape);\n\t\t// morph.setBorderWidth(lineWidth);\n\t\t// morph.setBorderColor(lineColor);\n\t\t// morph.setFill(null);\n\t\t// return morph;\n\t},\n\n\tmakeCircle: function(location, radius, lineWidth, lineColor, fill) {\n\t\t// make a circle of the given radius with its origin at the center\n\t\tvar morph = new Morph(new lively.scene.Ellipse(location, radius));\n\t\tmorph.setBorderWidth(lineWidth);\n\t\tmorph.setBorderColor(lineColor);\n\t\tmorph.setFill(fill || Color.blue);\n\t\treturn morph;\n\t},\n\n\tmakeEllipse: function(bounds, lineWidth, lineColor, fill) {\n\t\t// make a circle first (a bit wasteful)\n\t\tvar morph = this.makeCircle(bounds.center(), 0, lineWidth, lineColor, fill);\n\t\tmorph.setBounds(bounds);\n\t\tmorph.moveOriginBy(morph.innerBounds().center())\n\t\treturn morph;\n\t},\n\n\tmakeRectangle: function(/**/) {\n\t\tvar morph;\n\t\tswitch (arguments.length) {\n\t\t\tcase 1: // rectangle\n\t\t\tif (!(arguments[0] instanceof Rectangle)) throw new TypeError(arguments[0] + ' not a rectangle');\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(arguments[0]));\n\t\t\tbreak;\n\t\t\tcase 2: // location and extent\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(arguments[0].extent(arguments[1])));\n\t\t\tbreak;\n\t\t\tcase 4: // x,y,width, height\n\t\t\tmorph = new Morph(new lively.scene.Rectangle(new Rectangle(arguments[0], arguments[1], arguments[2], arguments[3])));\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\tthrow new Error(\"bad arguments \" + arguments);\n\t\t}\n\t\treturn morph.applyStyle({borderWidth: 1, borderColor: Color.black, fill: Color.blue});\n\t},\n\n\tmakePolygon: function(verts, lineWidth, lineColor, fill) {\n\t\tvar morph = new Morph(new lively.scene.Polygon(verts));\n\t\tmorph.setBorderWidth(lineWidth);\n\t\tmorph.setBorderColor(lineColor);\n\t\tmorph.setFill(fill);\n\t\treturn morph;\n\t\t//return morph.applyStyle({fill: fill, borderWidth: lineWidth, borderColor: lineColor});\n\t},\n\n\tmakeStar: function(position) {\n\t\tvar makeStarVertices = function(r,center,startAngle) {\n\t\t\tvar vertices = [];\n\t\t\tvar nVerts = 10;\n\t\t\tfor (var i=0; i <= nVerts; i++) {\n\t\t\t\tvar a = startAngle + (2*Math.PI/nVerts*i);\n\t\t\t\tvar p = Point.polar(r,a);\n\t\t\t\tif (i%2 == 0) p = p.scaleBy(0.39);\n\t\t\t\tvertices.push(p.addPt(center)); \n\t\t\t}\n\t\t\treturn vertices; \n\t\t}\n\t\tvar morph = Morph.makePolygon(makeStarVertices(50,pt(0,0),0), 1, Color.black, Color.yellow);\n\t\tmorph.setPosition(position);\n\t\treturn morph\n\t},\n\t\n\tmakeCurve: function(verts, ctrls, closed) {\n\t\t// Make up a new quadratic spline from the supplied vertices and control points.\n\t\t// ctrls[i] is the ctrl point for segment from verts[i-1] to verts[i]. (ctrls[0] is never used)\n\t\tif (verts.length < 2) return;\n\t\t// console.log(\"verts = \" + Object.inspect(verts));\n\t\t// console.log(\"ctrls = \" + Object.inspect(ctrls));\n\t\tvar g = lively.scene;\n\t\tvar cmds = [];\n\t\tcmds.push(new g.MoveTo(true, verts[0].x, verts[0].y));\n\t\tfor (var i=1; i 1) console.warn('More than one code node');\n\t\t\t// ChangeSet of World gets evaluated in main\n \t}\n\t},\n\n restoreFromSubnodes: function(importer) {\n // wade through the children\n var children = [];\n var helperNodes = [];\n\n for (var desc = this.rawNode.firstChild; desc != null; desc = desc.nextSibling) {\n if (desc.nodeType == Node.TEXT_NODE || desc.nodeType == Node.COMMENT_NODE) {\n if (desc.textContent == \"\\n\") \n helperNodes.push(desc); // remove newlines, which will be reinserted for formatting\n continue; // ignore whitespace and maybe other things\n }\n var type = lively.data.Wrapper.getEncodedType(desc);\n // depth first traversal\n\n\t\t\t// WebCards...\n\t\t \t// if (type && !type.startsWith(\"anonymous_\")) { //I have no idea what that mean\n\n if (type) {\n var wrapper = importer.importWrapperFromNode(desc);\n if (wrapper instanceof Morph) {\n this.submorphs.push(wrapper); \n wrapper.owner = this;\n } else children.push(desc);\n } else {\n children.push(desc);\n }\n }\n\n for (var i = 0; i < children.length; i++) {\n var node = children[i];\n var shape = lively.scene.Shape.importFromNode(importer, node);\n if (shape) {\n this.shape = shape;\n continue;\n }\n switch (node.localName) {\n // nodes from the Lively namespace\n case \"field\": {\n // console.log(\"found field \" + Exporter.stringify(node));\n helperNodes.push(node);\n this.deserializeFieldFromNode(importer, node); \n break;\n }\n case \"widget\": {\n this.deserializeWidgetFromNode(importer, node);\n break;\n }\n case \"array\": {\n helperNodes.push(node);\n this.deserializeArrayFromNode(importer, node);\n break;\n }\n case \"relay\": {\n this.deserializeRelayFromNode(importer, node);\n break;\n }\n case \"record\": {\n this.deserializeRecordFromNode(importer, node);\n break;\n }\n case \"defs\": { \n\t\t\t\tthis.restoreFromDefsNode(importer, node);\n break;\n }\n default: {\n if (node.nodeType === Node.TEXT_NODE) {\n //console.log('text tag name %s', node.tagName);\n // whitespace, ignore\n } else if (!this.restoreFromSubnode(importer, node)) {\n console.warn('not handling %s, %s', node.tagName || node.nodeType, node.textContent);\n }\n }\n }\n } // end for\n\n for (var i = 0; i < helperNodes.length; i++) {\n var n = helperNodes[i];\n n.parentNode.removeChild(n);\n }\n },\n\n\tresolveUriToObject: function(uri) {\n\t\tif (this.id() == uri)\n\t\t\treturn this;\n\t\tif (this.ownerWidget) {\n\t\t\tvar result = this.ownerWidget.resolveUriToObject(uri)\n\t\t\tif (result)\n\t\t\t\treturn result;\n\t\t};\t\n\t\tfor (var i=0; i < this.submorphs.length; i++) {\n\t\t\tvar result = this.submorphs[i].resolveUriToObject(uri);\n\t\t\tif (result)\n\t\t\t\treturn result;\n\t\t}\n\t\treturn null\n\t},\n\t\t\n\t// Fill Garbage Collection on Serialization...\n\tcollectAllUsedFills: function(/*$super, */result) {\n\t\t// result = $super(result);\n\t\tvar fill = this.getFill();\n\t\tif (fill instanceof lively.paint.Gradient) result.push(fill);\n\t\tvar stroke = this.shape.getStroke(); // fixme\n\t\tif (stroke instanceof lively.paint.Gradient) result.push(stroke);\n\t\tif (this.submorphs) this.submorphs.invoke('collectAllUsedFills', result);\n\t\treturn result\n\t},\n\n\texportLinkedFile: function(filename) {\n\t\tvar url;\n\t\tif (Global[\"WikiNavigator\"] && WikiNavigator.current) {\n\t\t\tvar nav = WikiNavigator.current;\n\t\t\turl = WikiNavigator.fileNameToURL(filename);\n\t\t\tnav.interactiveSaveWorld(url);\n\t\t} else {\n\t\t\turl = WorldMorph.current().saveWorld(filename);\n\t\t}\n\t\tif (url) this.world().reactiveAddMorph(new ExternalLinkMorph(url));\n\t\treturn url;\n\t},\n\n},\n'accessing', {\n\tgetName: function() { return this.name },\n\n\tsetName: function(str) { this.name = str; return name },\n\n\tcanvas: function() {\n\t\treturn locateCanvas(this.rawNode);\n\t},\n\t\n getOwnerWidget: function() {\n\t\treturn this.ownerWidget || this.owner.getOwnerWidget();\n\t},\n\n\townerChain: function() {\n\t\t// Return an array of me and all my owners\n\t\t// First item is, eg, world; last item is me\n\t\tif (!this.owner) return [this];\n\t\tvar owners = this.owner.ownerChain();\n\t\towners.push(this);\n\t\treturn owners;\n\t},\n\n},\n'styling',{\t// tmp copy\n\n\tgetStyleClass: function() { return this.styleClass || [] },\n\n\tsetStyleClass: function(value) {\n\t\tvar attr;\n\t\tif (value instanceof Array) {\n\t\t\tthis.styleClass = value;\n\t\t\tattr = value.join(' ');\n\t\t} else {\n\t\t\tthis.styleClass = [value];\n\t\t\tattr = String(value);\n\t\t}\n\t\tthis.rawNode.setAttribute(\"class\", attr);\n\t\treturn value;\n\t},\n\n\tapplyStyle: function(specs) { // note: use reflection instead?\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar spec = arguments[i];\n\t\t\tif(!spec) return; // dbgOn(!spec);\n\n\t\t\tif (spec.position !== undefined) this.setPosition(spec.position);\n\t\t\tif (spec.extent !== undefined) this.setExtent(spec.extent);\n\t\t\tif (spec.scale !== undefined) this.setScale(spec.scale);\n\t\t\tif (spec.rotation !== undefined) this.setRotation(spec.rotation);\n\n\t\t\tif (spec.borderWidth !== undefined) this.setBorderWidth(spec.borderWidth);\n\t\t\tif (spec.borderColor !== undefined) this.setBorderColor(spec.borderColor);\n\t\t\tif (spec.fill !== undefined) this.setFill(spec.fill);\n\t\t\tif (spec.opacity !== undefined) {\n\t\t\t\tthis.setFillOpacity(spec.opacity);\n\t\t\t\tthis.setStrokeOpacity(spec.opacity); \n\t\t\t}\n\t\t\tif (spec.fillOpacity !== undefined) this.setFillOpacity(spec.fillOpacity);\n\t\t\tif (spec.strokeOpacity !== undefined) this.setStrokeOpacity(spec.strokeOpacity);\n\n\t\t\tif (this.shape.roundEdgesBy && spec.borderRadius !== undefined) { \n\t\t\t\tthis.shape.roundEdgesBy(spec.borderRadius);\n\t\t\t}\n\t\t\tif (spec.suppressGrabbing !== undefined) this.suppressGrabbing = spec.suppressGrabbing;\n\t\t\tif (spec.suppressHandles !== undefined) this.suppressHandles = spec.suppressHandles;\n\n\t\t\tif (spec.focusHaloBorderWidth !== undefined) this.focusHaloBorderWidth = spec.focusHaloBorderWidth;\n\t\t\tif (spec.focusHaloInset !== undefined) this.focusHaloInset = spec.focusHaloInset;\n\t\t\tif (spec.padding !== undefined) this.padding = spec.padding;\n\t\t\tif (spec.margin !== undefined) this.margin = spec.margin;\n\t\t}\n\t\treturn this;\n\t},\n\n\tmakeStyleSpec: function() {\n\t\t// Adjust all visual attributes specified in the style spec\n\t\tvar spec = { };\n\t\tspec.borderWidth = this.getBorderWidth();\n\t\tspec.borderColor = this.getBorderColor();\n\t\tspec.fill = this.getFill();\n\t\tif (this.shape.getBorderRadius) spec.borderRadius = this.shape.getBorderRadius() || 0.0;\n\t\tspec.fillOpacity = typeof this.shape.getFillOpacity() !== undefined ? this.shape.getFillOpacity() : 1.0;\n\t\tspec.strokeOpacity = typeof this.shape.getStrokeOpacity() !== undefined ? this.shape.getStrokeOpacity() : 1.0;\t\t\n\t\treturn spec;\n\t},\n\n\tapplyStyleNamed: function(name) {\n\t\tvar style = this.styleNamed(name);\n\t\tif (style) this.applyStyle(style);\n\t\telse console.warn(\"applyStyleNamed: no style named \" + name)\n\t},\n\n\tstyleNamed: function(name) {\n\t\t// Look the name up in the Morph tree, else in current world\n\t\tif (this.displayTheme) return this.displayTheme[name];\n\t\tif (this.owner) return this.owner.styleNamed(name);\n\t\tvar world = WorldMorph.current();\n\t\tif (world && (this !== world)) return world.styleNamed(name);\n\t\treturn DisplayThemes[Config.defaultDisplayTheme || \"lively\"][name]; // FIXME for onDeserialize, when no world exists yet\n\t},\n\n\tlinkToStyles: function(styleClassList, optSupressApplication) {\n\t\t// Record the links for later updates, and apply them now\n\t\tthis.setStyleClass(styleClassList);\n\t\tif (!optSupressApplication) this.applyLinkedStyles();\n\t\treturn this;\n\t},\n\n\tapplyLinkedStyles: function() {\n\t\t// Apply all the styles to which I am linked, in order\n\t\tvar styleClasses = this.getStyleClass();\n\t\tif (!styleClasses) return;\n\t\tfor (var i = 0; i < styleClasses.length; i++) {\n\t\t\tthis.applyStyleNamed(styleClasses[i]); \n\t\t}\n\t},\n},\n'appearance', { // Functions for manipulating the visual attributes of Morphs\n\t\n\tsetFill: function(fill) {\n\t\tthis.shape.setFill(fill);\n\t\tthis.changed();\n\t\treturn fill;\n\t},\n\n\tgetFill: function() { return this.shape.getFill() },\n\n\tsetBorderColor: function(newColor) {\n\t\tthis.shape.setStroke(newColor);\n\t\t// this.changed();\n\t\treturn newColor\n\t},\n\n\tgetBorderColor: function() {\n\t\treturn new Color(Importer.marker, this.shape.getStroke());\n\t},\n\n\t// FIXME for Chrome border bug\n\tnearlyZeroBorderWidth: 0.00001,\n\n\tsetBorderWidth: function(newWidth) {\n\t\tif (!newWidth) newWidth = 0;\t\t\n\t\tvar oldWidth = this.getBorderWidth();\n\t\tif (newWidth === oldWidth) return;\n\n\t\t// Opt: only notify change with the bigger of two bounds\n\t\tif (oldWidth > newWidth) this.changed();\n\t\tthis.shape.setStrokeWidth(newWidth); \n\t\tif (newWidth > oldWidth) this.changed();\n\t\treturn newWidth\n\t},\n\n\tgetBorderWidth: function() {\n\t\treturn this.shape.getStrokeWidth() || 0; // FIXME: fix defaults logic\n\t},\n\n \tsetBorderRadius: function(r) {//jd\n \tthis.shape.roundEdgesBy(r);\n\t\tthis.changed();\n\t\treturn r\n },\n\n \tgetBorderRadius: function() {\n\t\treturn this.shape.getBorderRadius(); \n\t},\n\n\tshapeRoundEdgesBy: function(r) {\n\t\tthis.setBorderRadius(r);\n\t},\n\n\tgetFillOpacity: function() { return this.shape.getFillOpacity(); },\n\n\tsetFillOpacity: function(op) {\n\t\tthis.shape.setFillOpacity(op);\n\t\tthis.changed(); // FIXME better use specific update\n\t\treturn op;\n\t},\n\n\tsetStrokeOpacity: function(op) { \n\t\tthis.shape.setStrokeOpacity(op);\n\t\tthis.changed(); // FIXME better use specific update\n\t\treturn op;\n\t},\n\n\tgetStrokeOpacity: function() { return this.shape.getStrokeOpacity() },\n\n setLineJoin: function(joinType) { this.shape.setLineJoin(joinType); return joinType },\n\n\tgetLineJoin: function() { return this.shape.getLineJoin() }, \n\n setLineCap: function(capType) { this.shape.setLineCap(capType); return capType },\n\n \tgetLineCap: function() { return this.shape.getLineCap() },\n\n // toggle fisheye effect on/off\n\ttoggleFisheye: function() { \n\t\t// if fisheye is true, we need to scale the morph to original size\n\t\tif (this.fishEye) {\n\t\t\tthis.setScale(this.getScale() / this.fisheyeScale);\n\t\t\tthis.setFisheyeScale(1.0);\n\t\t}\n\t\t// toggle fisheye\n\t\tthis.fishEye = !this.fishEye;\n\t},\n\n\t// sets the scaling factor for the fisheye between 1..fisheyeGrowth\n\tsetFisheyeScale: function (newScale) {\n\t\t// take the original centerpoint\n\t\tvar p = this.bounds().center();\n\n\t\tthis.fisheyeScale = newScale;\n\t\tthis.pvtCachedTransform = null;\n\t\tthis.layoutChanged(); \n\t\tthis.changed();\n\n\t\t// if the fisheye was on move the fisheye'd morph by the difference between \n\t\t// original center point and the new center point divided by 2\n\t\tif (this.fishEye) {\n\t\t\t// (new.center - orig.center)/2\n\t\t\tvar k = this.bounds().center().subPt(p).scaleBy(.5).negated();\n\t\t\tif (!pt(0,0).eqPt(k)) {\n\t\t\t\tthis.setPosition(this.position().addPt(k));\n\t\t\t\tthis.layoutChanged(); \n\t\t\t\tthis.changed();\n\t\t\t}\n\t\t}\n\t},\n\n\tisVisible: function() { // FIXME delegate to sceneNode when conversion finished\n\t\t// Note: this may not be correct in general in SVG due to inheritance,\n\t\t// but should work in LIVELY.\n\t\tvar hidden = this.rawNode.getAttributeNS(null, \"display\") == \"none\";\n\t\treturn hidden == false;\n\t},\n\n\tsetVisible: function(flag) { // FIXME delegate to sceneNode when conversion finished\n\t\tif (flag) this.rawNode.removeAttributeNS(null, \"display\");\n\t\telse this.rawNode.setAttributeNS(null, \"display\", \"none\");\n\t\treturn this;\n\t},\n\t\n\tapplyFilter: function(filterUri) {// FIXME delegate to sceneNode when conversion finished\n\t\tif (filterUri) \n\t\t\tthis.rawNode.setAttributeNS(null, \"filter\", filterUri);\n\t\telse\n\t\t\tthis.rawNode.removeAttributeNS(null, \"filter\");\n\t},\n\t\n},\n'shape related', {\n\n\t// NOTE: The following four methods should all be factored into a single bit of reshaping logic\n\tapplyFunctionToShape: function() { // my kingdom for a Smalltalk block!\n\t\tvar args = $A(arguments);\n\t\tvar func = args.shift();\n\t\tfunc.apply(this.shape, args);\n\t\tthis.adjustForNewBounds();\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tinternalSetShape: function(newShape) {\n\t\tif (!newShape.rawNode) {\n\t\t\tconsole.log('newShape is ' + newShape);\n\t\t\tlively.lang.Execution.showStack();\n\t\t}\n\n\t\tthis.rawNode.replaceChild(newShape.rawNode, this.shape.rawNode);\n\t\tthis.shape = newShape;\n\t\tthis.adjustForNewBounds();\n\t},\n\n\tsetShape: function(newShape) {\n\t\tthis.internalSetShape(newShape);\n\t\treturn newShape;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\treshape: function(partName, newPoint, lastCall) {\n\t\ttry {\n\t\t\treturn this.shape.reshape(partName,newPoint,lastCall);\n\t\t} finally {\n\t\t\t// FIXME: consider converting polyline to polygon when vertices merge.\n\t\t\tif (this.layoutManager && this.layoutManager.onReshape) this.layoutManager.onReshape(this);\n\t\t}\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tsetVertices: function(newVerts) {\n\t\t// particular to polygons\n\t\tthis.shape.setVertices(newVerts);\n\t\tthis.adjustForNewBounds();\n\t\treturn newVerts;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tbeClipMorph: function() {\n\t\t// For simple morphs (rectangles, ellipses, polygons) this will cause all submorphs\n\t\t// to be clipped to the shape of this morph.\n\t\t// Note: the bounds function should probably be copied from ClipMorph as\n\t\t//\t\tpart of this mutation\n\t\tvar defs = this.rawNode.appendChild(NodeFactory.create('defs'));\n\t\tthis.clip = new lively.scene.Clip(this.shape);\n\t\tdefs.appendChild(this.clip.rawNode);\n\t\tthis.clip.applyTo(this);\n\t\tthis.isClipMorph = true;\n\t},\n\n},\n'layouting',{\n\n // FIXME: this doesn't account properly for border width\n // the CSS box model, see http://www.w3.org/TR/REC-CSS2/box.html \n padding: new Rectangle(0, 0, 0, 0), // between morph borders and its content (inwards)\n margin: new Rectangle(0, 0, 0, 0), // between morph border and its siblings\n \n\tlayoutManager: null, // singleton, intialzided later\n\n\t// Simple hack until the layout manager can relayout\n\trelayout: function() {\n\t\tif (this.layoutManager) this.layoutManager.layout(this);\n\t},\n\n\tsetBounds: function(newRect) {\n\t\tif (!newRect) return;\n\t\tthis.layoutManager.setBounds(this, newRect);\n\t\treturn newRect;\n\t}.wrap(Morph.onLayoutChange('shape')),\n\n\tsetExtent: function(newExtent) {\n\t\tthis.layoutManager.setExtent(this, newExtent);\n\t\treturn newExtent;\n\t},\n\n\tgetExtent: function(newRect) { return this.shape.bounds().extent() },\n\n\tposition: function() { // Deprecated -- use getPosition\n\t\treturn this.shape.bounds().topLeft().addPt(this.origin); \n\t},\n\n\tgetPosition: function() {\n\t\treturn this.shape.bounds().topLeft().addPt(this.origin); \n\t},\n\n\tsetPosition: function(newPosition) {\n\t\tthis.layoutManager.setPosition(this, newPosition);\n\t\treturn newPosition;\n\t},\n\n\tcontainsPoint: function(p) { \n\t\t// p is in owner coordinates\n\t\tif (!this.bounds().containsPoint(p)) return false;\n\t\treturn this.shape.containsPoint(this.relativize(p)); \n\t},\n\n\tcontainsWorldPoint: function(p) { // p is in world coordinates\n\t\tif (this.owner == null) return this.containsPoint(p);\n\t\treturn this.containsPoint(this.owner.localize(p)); \n\t},\n\n\tfullContainsPoint: function(p) { // p is in owner coordinates\n\t\treturn this.bounds().containsPoint(p); \n\t},\n\n\tfullContainsWorldPoint: function(p) { // p is in world coordinates\n\t\tif (this.owner == null) return this.fullContainsPoint(p);\n\t\treturn this.fullContainsPoint(this.owner.localize(p)); \n\t},\n\n\t// Morph bounds, coordinates, moving and damage reporting functions\n // bounds returns the full bounding box in owner coordinates of this morph and all its submorphs\n\tbounds: function(ignoreTransients, ignoreTransform) {\n\t\tif (this.fullBounds != null) return this.fullBounds;\n\n\t\tvar tfm = this.getTransform();\n\t\tvar fullBounds = this.localBorderBounds(ignoreTransform ? null : tfm);\n\n\t\tvar subBounds = this.submorphBounds(ignoreTransients);\n\t\tif (subBounds != null) {\n\t\t\t// could be simpler when no rotation...\n\t\t\tfullBounds = fullBounds.union(tfm.transformRectToRect(subBounds));\n\t\t}\n\n\t\tif (fullBounds.width < 3 || fullBounds.height < 3) {\n\t\t\t// Prevent Horiz or vert lines from being ungrabable\n\t\t\tfullBounds = fullBounds.expandBy(3); \n\t\t}\n\t\tthis.fullBounds = fullBounds;\n\t\treturn fullBounds; \n\t},\n \n\tsubmorphBounds: function(ignoreTransients) {\n\t\tvar subBounds = null;\n\t\tfor (var i = 0; i < this.submorphs.length; i++) {\n\t\t\tvar m = this.submorphs[i];\n\t\t\tif ((ignoreTransients && m.isEpimorph))\n\t\t\t\tcontinue;\n\t\t\tif (!m.isVisible()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsubBounds = subBounds == null ? m.bounds(ignoreTransients) : subBounds.union(m.bounds(ignoreTransients));\n\t\t}\n\t\treturn subBounds;\n\t},\n \n // innerBounds returns the bounds of this morph only, and in local coordinates\n innerBounds: function() { \n return this.shape.bounds().insetByRect(this.padding);\n },\n \n\tlocalBorderBounds: function(optTfm) {\n\t\t// defined by the external edge of the border\n\t\t// if optTfm is defined, transform the vertices first, then take the union\n\t\tdbgOn(!this.shape);\n\t\tvar bounds = optTfm ? Rectangle.unionPts(this.shape.vertices().invoke('matrixTransform', optTfm)) : this.shape.bounds();\n\n\t\tvar borderMargin = this.getBorderWidth()/2;\n\t\t// double border margin for polylines to account for elbow protrusions\n\t\tif (this.shape.hasElbowProtrusions) borderMargin = borderMargin*2 + 1;\n\t\tbounds = bounds.expandBy(borderMargin);\n\t\treturn bounds;\n\t},\n\t\n\tchanged: function() {\n\t\t// Note most morphs don't need this in SVG, but text needs the \n\t\t// call on bounds() to trigger layout on new bounds\n\t\tif(this.owner && this.owner.invalidRect) this.owner.invalidRect(this.bounds());\n\t},\n\n\tinvalidRect: function() {\n\t\t// Do nothing (handled by SVG). Overridden in canvas.\n },\n\n layoutOnSubmorphLayout: function(submorph) {\n\t\t// override to return false, in which case layoutChanged() will not be propagated to\n\t\t// the receiver when a submorph's layout changes. \n\t\treturn true;\n },\n\n\ttransformChanged: function() {\n\t\tvar scalePt = this.scalePoint;\n\t\tif (this.fisheyeScale != 1) scalePt = scalePt.scaleBy(this.fisheyeScale);\n\t\tthis.pvtCachedTransform = new lively.scene.Similitude(this.origin, this.rotation, scalePt);\n\t\tthis.pvtCachedTransform.applyTo(this.rawNode);\n\t\tthis.signalGeometryChange();\n\t},\n\n\tlayoutChanged: function Morph$layoutChanged() {\n\t\t// layoutChanged() is called whenever the cached fullBounds may have changed\n\t\t// It invalidates the cache, which will be recomputed when bounds() is called\n\t\t// Naturally it must be propagated up its owner chain.\n\t\t// Note the difference in meaning from adjustForNewBounds()\n\t\t// KP: the following may or may not be necessary:\n\n\t\tthis.transformChanged(); // DI: why is this here?\n\t\tif(! this.fullBounds) return; // already called\n\n\t\tthis.fullBounds = null;\n\t\tif (this.owner && this.owner.layoutOnSubmorphLayout(this) && !this.isEpimorph) { // May affect owner as well...\n\t\t\tthis.owner.layoutChanged();\n\t\t}\n\t\tthis.layoutManager.layoutChanged(this);\n\t},\n\n\tadjustForNewBounds: function() {\n\t\t// adjustForNewBounds() is called whenever the innerBounds may have changed in extent\n\t\t// -- it should really be called adjustForNewExtent --\n\t\t// Depending on the morph and its layoutManager, it may then re-layout its\n\t\t// submorphs and, in the process, propagate the message down to leaf morphs (or not)\n\t\t// Of course a change in innerBounds implies layoutChanged() as well,\n\t\t// but, for now, these are called separately.\n\t\t// NB: Because some morphs may re-lay themselves out in response to adjustForNewBounds()\n\t\t// adjustForNewBounds() *must never be called from* a layout operation;\n\t\t// The layout process should only move and resize submorphs, but never change the innerBounds\n\n\t\t// If this method is overridden by a subclass, it should call super as well\n\t\tif (this.focusHalo) this.adjustFocusHalo();\n\t},\n},\n// Submorph management functions\n'submorphs',{ \n\n addMorph: function(morph) { return this.addMorphFrontOrBack(morph, true) },\n\n\taddMorphAt: function(morph, position) {\n\t\tvar morph = this.addMorphFrontOrBack(morph, true);\n\t\tmorph.setPosition(position);\n\t\treturn morph;\n\t},\n\n addMorphFront: function(morph) { return this.addMorphFrontOrBack(morph, true) },\n\n addMorphBack: function(morph) { return this.addMorphFrontOrBack(morph, false) },\n\n\taddMorphFrontOrBack: function(m, isFront) {\n\t\t// assertion seems to be really expensive?!\n\t\t// console.assert(m instanceof Morph, \"not an instance\");\n\t\tif (m.owner) {\n\t\t\tvar tfm = m.transformForNewOwner(this);\n\t\t\tm.owner.removeMorph(m); // KP: note not m.remove(), we don't want to stop stepping behavior\n\t\t\tm.setTransform(tfm); \n\t\t\t// FIXME transform is out of date\n\t\t\t// morph.setTransform(tfm); \n\t\t\t// m.layoutChanged(); \n\t\t} \n\t\tthis.layoutManager.beforeAddMorph(this, m, isFront);\n\t\tthis.insertMorph(m, isFront);\n\t\tthis.layoutManager.afterAddMorph(this, m, isFront);\n\t\tm.changed();\n\t\tm.layoutChanged();\n\t\tif (Config.ChromeSVGRenderingHotfix)\n\t\t\t(function() { m.transformChanged() }).delay(0);\n\t\tthis.layoutChanged();\n\t\treturn m;\n\t},\n\t\n\taddNonMorph: function(node) {\n\t\tif (node instanceof lively.data.Wrapper) throw new Error(\"add rawNode, not the wrapper itself\");\n\t\treturn this.rawNode.insertBefore(node, this.shape && this.shape.rawNode.nextSibling);\n\t},\n\n\taddWrapper: function(w) {\n\t\tif (w && w.rawNode) {\n\t\t\tthis.addNonMorph(w.rawNode);\n\t\t\treturn w;\n\t\t} else return null;\n\t},\n\n\taddPseudoMorph: function(pseudomorph) {\n\t\tif (pseudomorph instanceof Global.PseudoMorph) {\n\t\t\treturn this.addMorph(pseudomorph);\n\t\t} else \n\t\t\tthrow new Error(pseudomorph + \" is not a PseudoMorph\");\n\t},\n\n\tbringToFront: function() {\n\t\tif (!this.owner) return;\n\t\tif (this.owner.topSubmorph() === this) return;\n\t\tvar owner = this.owner;\n\t\tthis.remove();\n\t\towner.addMorphFront(this);\n\t},\n\n\tsetSubmorphs: function(morphs) {\n\t\tconsole.assert(morphs instanceof Array, \"not an array\");\n\t\tif (morphs != null) {\n\t\t\tthis.submorphs = [].concat(morphs);\n\t\t\tthis.submorphs.forEach(function (m) { \n\t\t\t\tif (m.owner) {\n\t\t\t\t\tvar tfm = m.transformForNewOwner(this);\n\t\t\t\t\tm.owner.removeMorph(m);\n\t\t\t\t\tm.setTransform(tfm); \n\t\t\t\t} \n\t\t\t\tthis.rawNode.appendChild(m.rawNode); \n\t\t\t\tm.owner = this;\n\t\t\t\tm.changed();\n\t\t\t\tm.layoutChanged();\n\t\t\t}, this);\n\t\t}\n\t\tthis.layoutChanged();\n\t},\n\n indexOfSubmorph: function(m) {\n\t\tif (this.submorphs.length == 0) return -1; // no submorphs at all\n\t\tfor (var i=0; i 0\n\t\tvar rot = this.getTransform().getRotation().toRadians(); \n\t\tif (this.scalePoint.x >= 0) return rot;\n\n\t\t// if scale.x is negative, then we have to decode the difference\n\t\tif (rot < 0) return rot + Math.PI;\n\t\treturn rot - Math.PI;\n\t},\n\n\tgetScale: function() {\n\t\treturn this.getTransform().getScale(); \n\t},\n\n\tmoveBy: function(delta) {\n\t\tthis.translateBy(delta);\n\t},\n\n\trotateBy: function(delta) {\n\t\tthis.setRotation(this.getRotation()+delta);\n\t},\n\n\tscaleBy: function(factor) {\n\t\t// Perform a linear scaling (based on x scale) by the given factor\n\t\tthis.setScale(this.getScale()*factor);\n\t},\n\n\tthrob: function() {\n\t\tthis.scaleBy(this.getScale() <= 1 ? 2 : 0.9);\n\t},\n\n\talign: function(p1, p2) {\n\t\treturn this.translateBy(p2.subPt(p1)); \n\t},\n\n centerAt: function(p) {\n\t\treturn this.align(this.bounds().center(), p); \n },\n\n\tgetCenter: function() { return this.bounds().center() },\n\tsetCenter: function(pos) {\n\t\tthis.setPosition(pos.subPt(this.shape.bounds().center()))\n\t},\n\n\n\tmoveOriginBy: function(delta) {\n\t\t// This method changes the origin (and thus center of rotation) without changing any other effect\n\t\t// To center a rectangular morph, use m.moveOriginBy(m.innerBounds().center())\n\t\tthis.origin = this.origin.addPt(delta);\n\t\tthis.shape.translateBy(delta.negated());\n\t\tthis.submorphs.forEach(function (ea) { ea.translateBy(delta.negated()); });\n\t},\n\n moveSubmorphs: function(evt) {\n var world = this.world();\n\t\n // Display height is returned incorrectly by many web browsers.\n // We use an absolute Y-value instead. \n var towardsPoint = pt(world.bounds().center().x, 350);\n\n switch (evt.getKeyCode()) {\n case Event.KEY_LEFT:\n this.submorphs.invoke('moveBy', pt(-10,0));\n evt.stop();\n return true;\n case Event.KEY_RIGHT:\n // forget the existing selection\n this.submorphs.invoke('moveBy', pt(10, 0));\n evt.stop();\n return true;\n case Event.KEY_UP:\n this.submorphs.invoke('moveBy', pt(0, -10));\n evt.stop();\n return true;\n case Event.KEY_DOWN:\n this.submorphs.invoke('moveBy', pt(0, 10));\n evt.stop();\n return true;\n\n // Experimental radial scrolling feature\n // Read the comments near method Morph.moveRadially()\n case Event.KEY_PAGEUP:\n case 65: // The \"A\" key\n\t world.submorphs.invoke('moveRadially', towardsPoint, 10);\n this.moveRadially(towardsPoint, 10); \n evt.stop();\n return true;\n case Event.KEY_PAGEDOWN:\n case 90: // The \"Z\" key\n\t world.submorphs.invoke('moveRadially', towardsPoint, -10);\n this.moveRadially(towardsPoint, -10); \n evt.stop();\n return true;\n }\n \n return false;\n },\n\n transformSubmorphs: function(evt) {\n\t\tvar fun = null;\n\t\tswitch (evt.getKeyChar()) {\n\t\t\tcase '>':\n\t\t\t\tfun = function(m) { m.setScale(m.getScale()*1.1) };\n\t\t\t\tbreak;\n\t\t\tcase '<':\n\t\t\t\tfun = function(m) { m.setScale(m.getScale()/1.1) };\n\t\t\t\tbreak;\n\t\t\tcase ']':\n\t\t\t\tfun = function(m) { m.setRotation(m.getRotation() + 2*Math.PI/16) };\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\tfun = function(m) { m.setRotation(m.getRotation() - 2*Math.PI/16) };\n\t\t\t\tbreak;\n\t\t}\n\t\tif (fun) {\n\t\t\tthis.submorphs.forEach(fun);\n\t\t\tevt.stop();\n\t\t\treturn true;\n\t\t} else return false;\n\t},\n\n\tmoveForwardBy: function(amount) {\n\t\tvar nose = pt(1,0)\n\t\tvar dir = nose.matrixTransformDirection(this.getTransform()).normalized();\n\t\tthis.moveBy(dir.scaleBy(amount))\n\t},\n\n\t// TODO: There is a bug in Safari (the matrix multiplication is the wrong way around)\n\t// that is not taken into account here....\n\trotateAround: function(angle, center) {\n\t\tvar tfm = new lively.scene.Similitude().toMatrix();\n\t\ttfm = tfm.translate(center.x, center.y);\n\t\ttfm = tfm.rotate(angle)\t\t\n\t\ttfm = tfm.translate( -center.x, -center.y);\t\n\t\tvar oldTfm = this.getTransform().toMatrix();\n\t\tvar newTfm = oldTfm.multiply(tfm);\n\t\tthis.setTransform(new lively.scene.Similitude(newTfm));\n\t},\n\n\tturnBy: function(angle) {\n\t\tthis.rotateAround(angle, this.shape.bounds().center())\t\t\n\t},\n\n\t// Experimental radial \"black hole\" scrolling feature: When\n // an object comes close enough to the \"event horizon\" (specified\n // by 'towardsPoint'), the object is zoomed into the black hole.\n // Negative 'howMuch' values are used to \"collapse\" the display, \n // while positive values expand and restore the display back to its \n // original state. For further information, see \n // Sun Labs Technical Report SMLI TR-99-74, March 1999.\n\tmoveRadially: function(towardsPoint, howMuch) {\n\t\tvar position = this.getPosition();\n\t\tvar relativePt = position.subPt(towardsPoint);\n\t\tvar distance = towardsPoint.dist(position);\n\t\tif (!this.inBlackHole) this.inBlackHole = 0;\n\n\t\t// The object disappears entirely when it is less than 5 pixels away\n\t\t// The 'inBlackHole' counter keeps track of how many levels deep\n\t\t// the object is in the black hole, allowing the display to be\n\t\t// restored correctly.\n\t\tif (distance <= 5) {\n\t\t\tif (howMuch < 0) {\n\t\t\t\tthis.inBlackHole++;\n\t\t\t\tthis.setScale(0);\n\t\t\t} else {\n\t\t\t\tthis.inBlackHole--; \n\t\t\t}\n\t\t} \n\n\t\tif (this.inBlackHole == 0) {\n\t\t\t// Start shrinking the object when it is closer than 200 pixels away\n\t\t\tif (distance > 5 && distance < 200) this.setScale(distance/200);\n\t\t\telse if (distance >= 200 && this.getScale() != 1) this.setScale(1);\n\n\t\t\t// Calculate new location for the object\n\t\t\tvar theta = Math.atan2(relativePt.y, relativePt.x);\n\t\t\tvar newDistance = distance + howMuch;\n\t\t\tif (newDistance < 0) newDistance = 1; \n\t\t\tvar newX = newDistance * Math.cos(theta);\n\t\t\tvar newY = newDistance * Math.sin(theta);\n\t\t\tthis.setPosition(towardsPoint.addPt(pt(newX,newY)));\n\t\t}\n\t},\n},\n'animations', {\n\t// Animated moves for, eg, window collapse/expand\n\tanimatedInterpolateTo: function(destination, nSteps, msPer, callBackFn, finalScale) {\n\t\tif (nSteps <= 0) return;\n\t\tvar loc = this.position();\n\t\tvar delta = destination.subPt(loc).scaleBy(1 / nSteps);\n\t\tvar scaleDelta = finalScale ? (this.getScale() - finalScale) / nSteps : 0;\n\t\t// console.log(\"scaleDelta = \" + scaleDelta);\n\t\tvar path = [];\n\t\tfor (var i = 1; i<=nSteps; i++) { loc = loc.addPt(delta); path.unshift(loc); }\n\t\tthis.animatedFollowPath(path, msPer, callBackFn, scaleDelta);\n },\n\n animatedFollowPath: function(path, msPer, callBackFn, scaleDelta) {\n\t\tvar spec = {path: path.clone(), callBack: callBackFn, scaleDelta: scaleDelta};\n\t\tspec.action = this.startStepping(msPer, 'animatedPathStep', spec);\t\n },\n\n\tanimatedPathStep: function(spec, scaleDelta) {\n\t\tif (spec.path.length >= 1){\n\t\t\tthis.setScale(this.getScale()-spec.scaleDelta);\n\t\t\tthis.setPosition(spec.path.pop());\n\t\t}\n\t\tif (spec.path.length >= 1) return\n\t\t//spec.action.stop(this.world()); //JD: out\n\t\t//JD: delte script out of activeScripts, neede for deserialization\n\t\tthis.stopSteppingScriptNamedAndRemoveFromSubmorphs('animatedPathStep');\n\t\tspec.callBack.call(this);\n\t},\n\n},\n'particle behavior',{ \n\n\tbounceInOwnerBounds: function() {\n\t\tthis.bounceInBounds(this.owner.innerBounds());\n\t},\n\t\n\tbounceInBounds: function(ob) {\n\t\t// typcially ob = this.owner.innerBounds()\n\t\t// Bounce by reversing the component of velocity that put us out of bounds\n\t\tif (!this.velocity) return; // Can't bounce without a velocity vector\n\n\t\t// We take care to only reverse the direction if it's wrong,\n\t\t//\tbut we move in any case, since we might be deeply out of bounds\n\t\tvar b = this.bounds();\n\t\tif (b.x < ob.x) {\n\t\t\tif (this.velocity.x < 0) this.velocity = this.velocity.scaleByPt(pt(-1, 1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.maxX() > ob.maxX()) {\n\t\t\tif (this.velocity.x > 0) this.velocity = this.velocity.scaleByPt(pt(-1, 1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.y < ob.y) {\n\t\t\tif (this.velocity.y < 0) this.velocity = this.velocity.scaleByPt(pt(1, -1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t\tif (b.maxY() > ob.maxY()) {\n\t\t\tif (this.velocity.y > 0) this.velocity = this.velocity.scaleByPt(pt(1, -1));\n\t\t\tthis.moveBy(this.velocity);\n\t\t}\n\t},\n\t\n\tstepByVelocities: function() {\n\t\tif (this.velocity) this.moveBy(this.velocity);\n\t\tif (this.angularVelocity) this.rotateBy(this.angularVelocity);\n\t},\n\t\n\tstepAndBounce: function() { // convenience for tile scripting\n\t\tthis.stepByVelocities();\n\t\tthis.bounceInOwnerBounds();\n\t},\n\t\n},\n'balloon help', {\n\n\tgetHelpText: Functions.Null, // override to supply help text\n\n\tshowHelp: function(evt) {\n\n\t\tif (this.suppressBalloonHelp) return false;\n\t\tif (this.owner instanceof HandMorph) return false;\n\t\tvar helpText = this.getHelpText();\n\t\tif (!helpText) return false;\n\n\t\t// Create only one help balloon at a time\n\t\tif (this.helpBalloonMorph && !this.helpBalloonMorph.getPosition().eqPt(evt.point())) {\n\t\t\tthis.helpBalloonMorph.setPosition(this.window().localize(evt.point()));\n\t\t\treturn false;\n\t\t} else {\n\t\t\tvar width = Math.min(helpText.length * 20, 260); // some estimate of width.\n\t\t\tvar window = this.window();\n\t\t\tvar pos = window.localize(evt.point());\n\t\t\tthis.helpBalloonMorph = new TextMorph(pos.addXY(10, 10).extent(pt(width, 20)), helpText);\n\t\t\twindow.addMorph(this.helpBalloonMorph.beHelpBalloonFor(this));\n\t\t\treturn true;\n\t\t}\n\t},\n\n\thideHelp: function() {\n\t\tif (!this.helpBalloonMorph) \n\t\t\treturn;\n\t\tthis.helpBalloonMorph.remove();\n\t\tdelete this.helpBalloonMorph;\n\t},\n\n},\n'mouse events', {\n\n\t// KP: equivalent of the DOM capture phase\n\t// KP: hasFocus is true if the receiver is the hands's focus (?)\n\tcaptureMouseEvent: function Morph$captureMouseEvent(evt, hasFocus) {\n\t\t// Dispatch this event to the frontmost receptive morph that contains it\n\t\t// Note boolean return for event consumption has not been QA'd\n\t\t// if we're using the fisheye... \n\t\tif (this.fishEye) {\n\t\t\t// get the distance to the middle of the morph and check if we're \n\t\t\t// close enough to start the fisheye\n\t\t\tvar size = Math.max(this.bounds().width, this.bounds().height);\n\n\t\t\tvar dist = evt.mousePoint.dist(this.bounds().center()) / this.fisheyeProximity;\n\t\t\tif (dist <= size) {\n\t\t\t\t// the fisheye factor is between 1..fisheyeGrowth\n\t\t\t\tthis.setFisheyeScale(1 + this.fisheyeGrowth * Math.abs(dist/size - 1));\n\t\t\t} else {\n\t\t\t\t// just a precaution to make sure fisheye scaling isn't \n\t\t\t\t// affecting its surrounding any more\n\t\t\t\tthis.setFisheyeScale(1.0);\n\t\t\t}\n\t\t}\n\t\tif (hasFocus) return this.mouseHandler.handleMouseEvent(evt, this);\n\n\t\tif (!evt.priorPoint || !this.fullContainsWorldPoint(evt.priorPoint)) return false;\n\n\t\tif (this.hasSubmorphs()) {\n\t\t\t// If any submorph handles it (ie returns true), then return\n\t\t\tfor (var i = this.submorphs.length - 1; i >= 0; i--) {\n\t\t\t\tif (this.submorphs[i].captureMouseEvent(evt, false)) return true;\n\t\t\t}\n\t\t}\n\t\tif (this.mouseHandler == null)\n\t\t\treturn false;\n\n\t\tif (!evt.priorPoint || !this.shape.containsPoint(this.localize(evt.priorPoint))) \n\t\t\treturn false;\n\n\n\t\treturn this.mouseHandler.handleMouseEvent(evt, this); \n\t},\n\n\n\tareEventsIgnored: function() {\n\t\treturn this.getTrait(\"pointer-events\") == \"none\";\n\t},\n\n\tignoreEvents: function() { // will not respond nor get focus\n\t\tthis.mouseHandler = null;\n\t\tthis.setTrait(\"pointer-events\", \"none\");\n\t\treturn this;\n\t},\n\n\tenableEvents: function() {\n\t\tthis.mouseHandler = MouseHandlerForDragging.prototype;\n\t\tthis.removeTrait(\"pointer-events\");\n\n\t\treturn this;\n\t},\n\n\trelayMouseEvents: function(target, eventSpec) {\n\t\tthis.mouseHandler = new MouseHandlerForRelay(target, eventSpec); \n\t},\n\n\thandlesMouseDown: function(evt) {\n\t\tif (this.mouseHandler == null || evt.isCommandKey()) return false;\t//default behavior\n\t\treturn this.mouseHandler.handlesMouseDown(); \n\t},\n\n\tonMouseDown: function(evt) { \n\t\tthis.hideHelp();\n\t}, //default behavior\n\n\tonMouseMove: function(evt, hasFocus) { //default behavior\n\t\tif (evt.mouseButtonPressed && this==evt.hand.mouseFocus && this.owner && this.owner.openForDragAndDrop) { \n\t\t\tthis.moveBy(evt.mousePoint.subPt(evt.priorPoint));\n\t\t} // else this.checkForControlPointNear(evt);\n\t\tif (!evt.mouseButtonPressed && !this.hasHandles()) this.checkForControlPointNear(evt);\n\t},\n\n\tonMouseUp: function(evt) { }, //default behavior\n\n\tconsiderShowHelp: function(oldEvt) {\n\t\t// if the mouse has not moved reasonably\n\t\tvar hand = oldEvt.hand;\n\t\tif (!hand) return; // this is not an active world so it doesn't have a hand\n\t\telse if (hand.getPosition().dist(oldEvt.mousePoint) < 10)\n\t\tthis.showHelp(oldEvt);\n\t},\n\n\tdelayShowHelp: function(evt) {\n\t\tvar scheduledHelp = new SchedulableAction(this, \"considerShowHelp\", evt, 0);\n\t\tif (this.world())\n\t\t\tthis.world().scheduleForLater(scheduledHelp, Config.ballonHelpDelay || 1000, false);\n\t},\n\n\tonMouseOver: function(evt) {\n\t\tthis.delayShowHelp(evt);\n\t}, \n\n\tonMouseOut: function(evt) { \n\t\tthis.hideHelp();\n\t}, \n\n\tonMouseWheel: function(evt) {\n\t\tif (!this.world()) return false;\n\t\treturn this.world().onMouseWheel(evt);\n\t},\n\n\ttakesKeyboardFocus: Functions.False,\n\n\tsetHasKeyboardFocus: Functions.False, // no matter what, say no\n\n\trequestKeyboardFocus: function(hand) {\n\t\tif (!hand) return;\n\t\tif (this.takesKeyboardFocus()) {\n\t\t\tif (this.setHasKeyboardFocus(true)) {\n\t\t\t\thand.setKeyboardFocus(this);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\trelinquishKeyboardFocus: function(hand) {\n\t\thand.setKeyboardFocus(null);\n\t\treturn this.setHasKeyboardFocus(false); \n\t},\n\n\tonFocus: function(hand) {\n\t\tthis.addFocusHalo();\n\t},\n\n\tonBlur: function(hand) {\n\t\tthis.removeFocusHalo();\n\t},\n\n\tremoveFocusHalo: function() {\n\t\tif (!this.focusHalo) return false;\n\t\t//this.focusHalo.removeRawNode();\n\t\tthis.focusHalo.remove();\n\t\tthis.focusHalo = null;\n\t\treturn true;\n\t},\n\n\tfocusHaloInset: 1,\n\n\tfocusStyle: {\n\t\tfill: null, \n\t\tborderColor: Color.blue,\n\t\tstrokeOpacity: 0.3\n\t},\n\n\tadjustFocusHalo: function() {\n\t\tthis.focusHalo.setBounds(this.localBorderBounds().expandBy(this.focusHaloInset));\n\t},\n\n\taddFocusHalo: function() {\n\t\tif (this.focusHalo || this.focusHaloBorderWidth <= 0) return false;\n\t\tthis.focusHalo = Morph.makeRectangle(this.localBorderBounds().expandBy(this.focusHaloInset));\n\t\tthis.focusHalo.name = \"FocusHalo\";\n\t\tthis.focusHalo.isEpimorph = true; // Do this before adding the halo\n\t\tthis.addMorph(this.focusHalo);\n\t\t// old\n\t\tthis.focusHalo.applyStyle(this.focusStyle);\n\t\t// new\n\t\tthis.focusHalo.linkToStyles([\"focusHalo\"]);\n\t\tthis.focusHalo.setBorderWidth(this.focusHaloBorderWidth);\n\t\tthis.focusHalo.setLineJoin(lively.scene.LineJoins.Round);\n\t\tthis.focusHalo.ignoreEvents();\n\t\treturn true;\n\t},\n\n},\n'handles', {\n\tcheckForControlPointNear: function(evt) {\n\t\tif (this.suppressHandles) return false; // disabled\n\t\tif (this.owner == null) return false; // cant reshape the world\n\t\tif (this.hasHandles()) return false; // handles already on - no rollovers\n\t\tvar partName = this.shape.partNameNear(this.localize(evt.point()));\n\t\tif (partName == null) return false;\n\n\t\tvar loc = this.shape.partPosition(partName);\n\t\tvar handle = this.makeHandle(loc, partName, evt);\n\t\tif (!handle) return false; // makeHandle variants may return null\n\n\t\tthis.addMorph(handle); \n\t\thandle.showHelp(evt);\n\t\tif (evt.hand.mouseFocus instanceof HandleMorph) evt.hand.mouseFocus.remove();\n\t\tevt.hand.setMouseFocus(handle);\n\t\treturn true; \n\t},\n\t\n\taddAllHandles: function(evt) {\n\t\tif (this.suppressHandles) return false; // disabled\n\t\tif (this.owner == null) return false; // can't reshape the world\n\t\tvar partNames = this.shape.allPartNames(); // Array of name\n\t\tfor (var i=0; i= 0 ? lively.scene.Rectangle : lively.scene.Ellipse;\n\t\treturn new HandleMorph(position, handleShape, evt.hand, this, partName);\n\t},\n},\n'grabbing and dragging', {\n copySubmorphsOnGrab: false, // acts as a palette if true. \n\tsuppressGrabbing: false,\n\n // May be overridden to preempt (by returning null) the default action of grabbing me\n // or to otherwise prepare for being grabbed or find a parent to grab instead\n okToBeGrabbedBy: function(evt) {\n\t\tif (this.suppressGrabbing)\n\t\t\treturn null;\n\t\treturn this; \n },\n\n\tgrid: function() {return Config.SnapGrid || pt(10,10)},\n\n\tisSnappingToGrid: function() { return Config.isSnappingToGrid},\n\n\tsnapToGrid: function(pos) {\n\t\tvar grid = this.grid();\n\t\treturn pt(pos.x - (pos.x % grid.x), pos.y - (pos.y % grid.y))\n\t},\n\n\tdragMe: function(evt) {\n\t\tvar offset = this.getPosition().subPt(this.owner.localize(evt.point()));\n\t\tvar self = this;\n\t\tvar mouseRelay= {\n\t\t\tcaptureMouseEvent: function(e) { \n\t\t\t\tif (e.type == \"MouseMove\") {\n\t\t\t\t\tvar pos = this.owner.localize(e.hand.getPosition()).addPt(offset)\n\t\t\t\t\tif (self.isSnappingToGrid()) {\n\t\t\t\t\t\tthis.setPosition(this.snapToGrid(pos));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.setPosition(pos);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tif (e.type == \"MouseDown\" || e.type == \"MouseUp\") e.hand.setMouseFocus(null); \n\t\t\t}.bind(this),\n\t\t};\n\t\tevt.hand.setMouseFocus(mouseRelay);\n\t},\n\n showAsGrabbed: function(grabbedMorph) {\n\t\t// At this time, there are three separate hand-effects:\n\t\t// 1. applyDropShadowFilter, if it works, will cause the graphics engine to put a nice\n\t\t//\t gaussian blurred drop-shadow on morphs that are grabbed by the hand\n\t\t// 2. showGrabHalo will cause a halo object to be put at the end of the hand's\n\t\t//\t submorph list for every grabbed morph (has property 'morphTrackedByHalo')\n\t\t// 3. useShadowMorphs will cause a shadowCopy of each grabbed morph to be put\n\t\t//\t at the end of the hand's submorph list (has property 'isHandMorphShadow')\n\t\t// So, if everything is working right, the hand's submorph list looks like:\n\t\t//\tfront -> Mc, Mb, Ma, Ha, Sa, Hb, Sb, Hc, Sc <- back [note front is last ;-]\n\t\t// Where M's are grabbed morphs, H's are halos if any, and S's are shadows if any\n\n if (this.applyDropShadowFilter) grabbedMorph.applyFilter(this.dropShadowFilter); \n\n\t\tif (Config.showGrabHalo) {\n\t\t var bounds = grabbedMorph.bounds(true);\n\t\t var halo = this.addMorphBack(Morph.makeRectangle(bounds).applyStyle({fill: null, borderWidth: 0.5 }));\n\t\t halo.morphTrackedByHalo = grabbedMorph;\n\t\t halo.shape.setStrokeDashArray(String([3,2]));\n\t\t halo.setLineJoin(lively.scene.LineJoins.Round);\n\t\t halo.ignoreEvents();\n\n\t\t var idLabel = new TextMorph(pt(20,10).extentAsRectangle(), String(grabbedMorph.id())).beLabel();\n\t\t idLabel.applyStyle(this.grabHaloLabelStyle);\n\t\t halo.addMorph(idLabel);\n\t\t idLabel.align(idLabel.bounds().bottomLeft(), halo.innerBounds().topRight());\n\t \n\t\t var pos = grabbedMorph.getPosition();\n\t\t var posLabel = new TextMorph(pt(20, 10).extentAsRectangle(), \"\").beLabel();\n\t\t posLabel.applyStyle(this.grabHaloLabelStyle);\n\t\t halo.positionLabel = halo.addMorph(posLabel);\n\n\t\t\tthis.updateGrabHalo();\n\t\t}\n if (this.useShadowMorphs) {\n\t\t\tvar shadow = grabbedMorph.shadowCopy();\n\t\t\tshadow.isHandMorphShadow = true;\n\t\t\tthis.addMorphBack(shadow);\n\t\t\tshadow.moveBy(pt(8, 8));\n\t\t}\n },\n\n\tshowAsUngrabbed: function (grabbedMorph) {\n\t\tif (this.applyDropShadowFilter) grabbedMorph.applyFilter(null);\n\t\tgrabbedMorph.withAllSubmorphsDo(function() {\n\t\t\tif (this.shadowConnection) {\n\t\t\t\tthis.shadowConnection.disconnect();\n\t\t\t\tdelete this.shadowConnection;\n\t\t\t}\n\t\t})\n },\n \n alignToGrid: function() {\n if(!Config.showGrabHalo) return;\n var grid = function(a) {\n return a - (a % (Config.alignToGridSpace || 5))\n\t\t};\n\t\tthis.submorphs.forEach(function(halo) {\n\t\t if (halo.morphTrackedByHalo) { // this is a tracking halo\n\t \tif (!halo.orgSubmorphPosition)\n\t\t\t halo.orgSubmorphPosition = halo.morphTrackedByHalo.getPosition();\n\t\t\tvar oldPos = this.worldPoint(halo.orgSubmorphPosition);\n\t\t\tvar gridPos = pt(grid(oldPos.x), grid(oldPos.y));\n\t\t\thalo.morphTrackedByHalo.setPosition(this.localize(gridPos));\n\t\t }\n\t\t}.bind(this));\n },\n\n updateGrabHalo: function Morph$updateGrabHalo() {\n\t\t// Note there may be several grabHalos, and drop shadows as well\n\t\t// See the comment in showAsGrabbed \n\t\tthis.submorphs.forEach(function(halo) {\n\t\t if (halo.morphTrackedByHalo) { // this is a tracking halo\n\t\t\t\thalo.setBounds(halo.morphTrackedByHalo.bounds(true).expandBy(3));\n\t\t\t\tif (halo.positionLabel) {\n\t\t\t\t var pos = this.worldPoint(halo.morphTrackedByHalo.getPosition());\n\t\t\t\t var posLabel = halo.positionLabel;\n\t\t\t\t posLabel.setTextString(pos.x.toFixed(1) + \",\" + pos.y.toFixed(1));\n\t\t\t\t posLabel.align(posLabel.bounds().bottomCenter(), halo.innerBounds().topLeft());\n\t\t\t\t}\n\t\t }\n\t\t}.bind(this));\n },\n\n\tgrabMorph: function(grabbedMorph, evt) { \n\t\tif (evt.isShiftDown() && (evt.isAltDown() || evt.isCommandKey())) {\n\t\t\tgrabbedMorph.dragMe(evt);\n\t\t\treturn;\n\t\t}\n\t\tif (evt.isShiftDown() || (grabbedMorph.owner && grabbedMorph.owner.copySubmorphsOnGrab == true)) {\n\t\t\tif (!grabbedMorph.okToDuplicate()) return;\n\t\t\tgrabbedMorph.copyToHand(this);\n\t\t\treturn;\n\t\t}\n\t\tif (evt.isCommandKey() || evt.isRightMouseButtonDown() || evt.isMiddleMouseButtonDown()) {\n\t\t\tgrabbedMorph.showMorphMenu(evt);\n\t\t\treturn;\n\t\t}\n\t\t// Give grabbed morph a chance to, eg, spawn a copy or other referent\n\t\tgrabbedMorph = grabbedMorph.okToBeGrabbedBy(evt);\n\t\tif (!grabbedMorph) return;\n\n\t\tif (grabbedMorph.owner && !grabbedMorph.owner.openForDragAndDrop) return;\n\n\t\tif (this.keyboardFocus && grabbedMorph !== this.keyboardFocus) {\n\t\t\tthis.keyboardFocus.relinquishKeyboardFocus(this);\n\t\t}\n\t\t// console.log('grabbing %s', grabbedMorph);\n\t\t// Save info for cancelling grab or drop [also need indexInOwner?]\n\t\t// But for now we simply drop on world, so this isn't needed\n\t\tthis.grabInfo = [grabbedMorph.owner, grabbedMorph.position()];\n\t\tif (this.logDnD) console.log('%s grabbing %s', this, grabbedMorph);\n\t\tthis.addMorphAsGrabbed(grabbedMorph);\n\t\t// grabbedMorph.updateOwner(); \n\t\tthis.changed(); //for drop shadow\n\t},\n \n addMorphAsGrabbed: function(grabbedMorph) { \n this.addMorph(grabbedMorph);\n\t\tthis.showAsGrabbed(grabbedMorph);\n },\n \n dropMorphsOn: function(receiver) {\n\t\tif (receiver !== this.world()) \n\t\t\tthis.unbundleCarriedSelection();\n\t\tif (this.logDnD) \n\t\t\tconsole.log(\"%s dropping %s on %s\", this, this.topSubmorph(), receiver);\n\t\tthis.carriedMorphsDo( function(m) {\n\t\t\tm.dropMeOnMorph(receiver);\n\t\t\tthis.showAsUngrabbed(m);\n\t\t});\n\t\tthis.shadowMorphsDo( function(m) { m.stopAllStepping(); });\n\t\tthis.removeAllMorphs() // remove any shadows or halos\n },\n\n carriedMorphsDo: function(func) {\n\t\t// Evaluate func for only those morphs that are being carried,\n\t\t// as opposed to, eg, halos or shadows\n\t\tthis.submorphs.clone().reverse().forEach(function(m) {\n\t\t if (!m.morphTrackedByHalo && !m.isHandMorphShadow) func.call(this, m);\n\t\t}.bind(this));\n },\n\n shadowMorphsDo: function(func) { \n\t\t// Evaluate func for only those morphs that are shadows,\n\t\tthis.submorphs.clone().reverse().forEach(function(m) {\n\t\t if (m.isHandMorphShadow) func.call(this, m);\n\t\t}.bind(this));\n },\n\n unbundleCarriedSelection: function() {\n // Unpack the selected morphs from a selection prior to drop or jump to other world\n if (!this.hasSubmorphs() || !(this.topSubmorph() instanceof SelectionMorph)) return;\n var selection = this.topSubmorph();\n for (var i=0; i>toggleDnD\");\n\t\tthis.openForDragAndDrop = !this.openForDragAndDrop;\n\t},\n\n\topenDnD: function(loc) {\n\t\tthis.openForDragAndDrop = true;\n\t},\n\n\tcloseDnD: function(loc) {\n\t\t// console.log(this + \">>closeDnD\");\n\t\tthis.openForDragAndDrop = false;\n\t},\n\n closeAllToDnD: function(loc) {\n // console.log(this + \">>closeAllDnD\");\n // Close this and all submorphs to drag and drop\n this.closeDnD(); \n // make this recursive to give children a chance to interrupt...\n this.submorphs.forEach( function(ea) { ea.closeAllToDnD(); });\n },\n\n\topenAllToDnD: function() {\n\t\t// Open this and all submorphs to drag and drop\n\t\tthis.withAllSubmorphsDo( function() { this.openDnD(); });\n\t},\n\n\tdropMeOnMorph: function(receiver) {\n\t\treceiver.addMorph(this); // this removes me from hand\n\t},\n\n\tpickMeUp: function(evt) {\n\t\tvar offset = evt.hand.getPosition().subPt(evt.point());\n\t\tthis.moveBy(offset);\n\t\tevt.hand.addMorphAsGrabbed(this);\n\t},\n},\n'morph menu', {\n\n\teditMenuItems: function(evt) { \n\t\treturn []; // Overridden by, eg, TextMorph\n\t},\n\n\tshowMorphMenu: function(evt, optMenu) {\n\t\tif (evt.hand.lastMorphMenu && evt.hand.lastMorphMenu.owner)\n\t\t\tevt.hand.lastMorphMenu.remove(); // cleanup old open menus\n\t\tvar world = this.world(),\n\t\t\tmenu = optMenu || this.morphMenu(evt),\n\t\t\tmenuCaption = this.toString(),\n\t\t\tcaptionClickAction = world.prompt.bind(world).curry(\n\t\t\t\t'edit name',\n\t\t\t\tfunction(newName) {\n\t\t\t\t\tif (!newName) { alert('Invalid name ' + newName); return }\n\t\t\t\t\talertOK(this + ' renamed to ' + newName);\n\t\t\t\t\tthis.setName(newName);\n\t\t\t\t}.bind(this),\n\t\t\t\tthis.getName());\n\t\tmenu.openIn(world, evt.point(), false, menuCaption, captionClickAction); \n\t\tevt.hand.lastMorphMenu = menu;\n\t},\n\n\tmorphMenuBasicItems: function(evt) {\n\t\tvar items = [\n\t\t\t[\"remove\", this.remove],\n\t\t\t[\"drill\", this.showOwnerChain.curry(evt)],\n\t\t\t[\"grab\", this.pickMeUp.curry(evt)],\n\t\t\t[\"drag\", this.dragMe.curry(evt)],\n\t\t\t[\"edit style\", function() { new StylePanel(this).open()}],\n\t\t\t[((this.hasHandles()) ? \"hide\" : \"show\") + \" all handles\", function(evt) {\n\t\t\t\tif (this.hasHandles()) this.removeAllHandlesExcept(null);\n\t\t\t\t\telse this.addAllHandles(evt) }.bind(this) ],\t\t\n\t\t\t[\"inspect\", function(evt) { lively.Tools.inspect(this) }],\n\t\t\t[\"show class in browser\", function(evt) { var browser = new SimpleBrowser(this);\n\t\t\t\t// browser.openIn(this.world(), evt.point());\n\t\t\t\tbrowser.open();\n\t\t\t\tbrowser. selectedClassName = this.getType();\n\t\t\t}]\n\t\t];\n\t\tif (this.okToDuplicate())\n\t\t\titems.unshift([\"duplicate\", this.copyToHand.curry(evt.hand)]);\n\n\t\tif (this.shape instanceof lively.scene.Polyline || this.shape instanceof lively.scene.Polygon)\n\t\t\titems.push( [\"copy to curve\", this.makeCurve]);\n\n\t\tif (this.getModel() instanceof SyntheticModel)\n\t\t\titems.push( [\"show Model dump\", this.addModelInspector.curry(this)]);\n\t\treturn items\n\t},\n\n\tmorphMenu: function(evt) { \n\t\tvar menu = new MenuMorph(this.morphMenuBasicItems(evt), this);\n\t\tmenu.addLine();\n\t\tmenu.addItem([\"world...\", function() {this.world().showMorphMenu(evt)}.bind(this)]);\n\t\tmenu.addLine();\n\t\tmenu.addItems(this.subMenuItems(evt));\n\t\treturn menu;\n\t},\n\tsubMenuLayoutItems: function() {\n\t\tvar morph = this;\n\t\tfunction setLayouter(klass) {\n\t\t\tmorph.layoutManager = new klass();\n\t\t\tmorph.relayout();\n\t\t};\n\t\treturn [\n\t\t\t[\"default layout\", function() { setLayouter(LayoutManager) }],\n\t\t\t[\"horizontal layout\", function() { setLayouter(HorizontalLayout) }],\n\t\t\t[\"vertical layout\", function() { setLayouter(VerticalLayout) }],\n\t\t];\t\n\t},\n\n\n\tsubMenuPropertiesItems: function(evt) {\n\t\treturn [\n\t\t\t[\"edit name...\", function() { this.world().prompt('edit name', function(input) { this.setName(input) }.bind(this), this.getName()) }],\n\t\t\t[\"reset rotation\", this.setRotation.curry(0)],\n\t\t\t[\"reset scaling\", this.setScale.curry(1)],\n\t\t\t[\"toggle fullscreen\", function() { this.isInFullScreen() ? this.leaveFullScreen() : this.enterFullScreen() }.bind(this)],\n\t\t\t[((this.suppressGrabbing) ? \"[] grabbing\" : \"[X] grabbing\"), function(){this.suppressGrabbing = !this.suppressGrabbing}.bind(this)],\n\t\t\t[((this.suppressHandles) ? \"[] handles\" : \"[X] handles\"), function(){this.suppressHandles = !this.suppressHandles}.bind(this)],\n\t\t\t[((this.openForDragAndDrop) ? \"[X] accepts Drops\" : \"[] accepts Drops\"), function(){this.openForDragAndDrop = !this.openForDragAndDrop}.bind(this)],\n\t\t\t[\"ignore events\", this.ignoreEvents.bind(this)],\n\t\t\t[\"color chooser (gray)\", function() { \n\t\t\t\tvar colorChooser = new ColorChooserWidget(this), window = colorChooser.buildView();\n\t\t\t\tthis.world().addFramedMorph(pane, \"gray\", this.world().positionForNewMorph(pane))}]\n\t\t]\n\t},\n\t\n\tsubMenuWindowItems: function(evt) {\n\t\treturn [\n\t\t\t[\"put me in a window\", this.putMeInAWindow.curry(this.position())], \n\t\t\t[\"put me in a tab\", this.putMeInATab.curry(this.position())],\n\t\t\t[\"put me in the open\", this.putMeInTheWorld.curry(this.position())],\n\t\t\t[\"show Lively markup\", this.addSvgInspector.curry(this)],\n\t\t\t[\"package\", function(evt) { // FIXME insert package morph in exactly the same position?\n\t\t\t\tnew PackageMorph(this).openIn(this.world(), evt.point()); this.remove(); } ],\n\t\t\t[\"publish packaged ...\", function() { this.world().prompt('publish as (.xhtml)', this.exportLinkedFile.bind(this)); }] \n\t\t]\n\t},\n\n\tsubMenuStyleItems: function(evt) {\n\t\treturn new StyleEditor().styleEditorMenuItems(this, evt);\n\t},\n\n\tsubMenuItems: function(evt) {\n\t\treturn [\n\t\t\t['Style', this.subMenuStyleItems(evt)],\n\t\t\t['Layout', this.subMenuLayoutItems(evt)],\n\t\t\t['Properties', this.subMenuPropertiesItems(evt)],\n\t\t\t['Window and World', this.subMenuWindowItems(evt)]\n\t\t]\n\t},\n\n showPieMenu: function(evt) {\n \tvar menu, targetMorph = this;\n\t\tvar items = [\n\t\t\t['undo (~)', function(evt) { PieMenuMorph.doUndo(); }],\n\t\t\t['duplicate (o-->o)', function(evt) {\n\t\t\t\tevt.hand.setPosition(menu.mouseDownPoint);\n\t\t\t\tmenu.targetMorph.copyToHand(evt.hand);\n\t\t\t\tvar theCopy = evt.hand.submorphs[0];\n\t\t\t\tPieMenuMorph.setUndo(function() { theCopy.remove(); }); // Why doesn't this work??\n\t\t\t\t}],\n\t\t\t['move (o-->)', function(evt) {\n\t\t\t\tvar oldPos = targetMorph.getPosition();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setPosition(oldPos); });\n\t\t\t\tevt.hand.setPosition(menu.mouseDownPoint);\n\t\t\t\tevt.hand.addMorph(menu.targetMorph);\n\t\t\t\tif (menu.targetMorph instanceof SelectionMorph) // Fixme: This should be in SelectionMorph\n\t\t\t\t\tmenu.targetMorph.selectedMorphs.forEach( function(m) { evt.hand.addMorph(m); });\n\t\t\t\t}],\n\t\t\t['scale (o < O)', function(evt) {\n\t\t\t\tvar oldScale = targetMorph.getScale();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setScale(oldScale); });\n\t\t\t\tmenu.addHandleTo(targetMorph, evt, 'scale');\n\t\t\t\t}],\n\t\t\t[((targetMorph.hasHandles()) ? \"hide\" : \"show\") + \" all handles ([])\", function(evt) {\n\t\t\t\tif (targetMorph.hasHandles()) targetMorph.removeAllHandlesExcept(null);\n\t\t\t\t\telse targetMorph.addAllHandles(evt) }],\n\t\t\t['delete (X)', function(evt) {\n\t\t\t\tvar oldOwner = targetMorph.owner;\n\t\t\t\tPieMenuMorph.setUndo(function() { oldOwner.addMorph(targetMorph); });\n\t\t\t\ttargetMorph.remove();\n\t\t\t\t}],\n\t\t\t['edit style (<>)', function() { new StylePanel(this).open()}],\n\t\t\t['rotate (G)', function(evt) {\n\t\t\t\tvar oldRotation = targetMorph.getRotation();\n\t\t\t\tPieMenuMorph.setUndo(function() { targetMorph.setRotation(oldRotation); });\n\t\t\t\tmenu.addHandleTo(targetMorph, evt, 'rotate');\n\t\t\t\t}]\n\t\t];\n\t\tmenu = new PieMenuMorph(items, this, 0.5);\n\t\tmenu.open(evt);\n },\n\n},\n'window related', {\n\n\tputMeInAWindow: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar w = this.world();\n\t\tvar wm = new WindowMorph(this.windowContent(), this.windowTitle());\n\t\t// Position it so the content stays in place\n\t\tw.addMorphAt(wm, loc.subPt(wm.contentOffset));\n\t\tif (c) c.remove();\n\t},\n\n\tputMeInATab: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar w = this.world();\n\t\tvar wm = new TabbedPanelMorph(this.windowContent(), this.windowTitle());\n\t\tw.addMorphAt(wm, wm.getPosition());\n\t\tif (c) c.remove();\n\t},\n\n\tputMeInTheWorld: function(loc) {\n\t\tvar c = this.immediateContainer();\n\t\tvar loc = c ? c.position().addPt(c.contentOffset) : this.position();\n\t\tthis.world().addMorphAt(this, loc);\n\t\tif (c) c.remove();\n\t},\n\n\timmediateContainer: function() { // Containers override to return themselves\n\t\tif (this.owner) return this.owner.immediateContainer();\n\t\telse return null;\n\t},\n\n\twindowContent: function() {\n\t\treturn this; // Default response, overridden by containers\n\t},\n\n\twindowTitle: function() {\n\t\treturn Object.inspect(this).truncate(); // Default response, overridden by containers\n\t},\n\n\n\n\tcopyToHand: function(hand, evt, optCopier) {\n\t\t// Function.prototype.shouldTrace = true;\n\t\tif (optCopier)\n\t\t\tvar copier = optCopier;\n\t\telse\n\t\t\tvar copier = new Copier();\n\t\tvar copy = this.copy(copier);\n\t\tif (!optCopier)\n\t\t\tcopier.finish(); // if copier comes from outside it should call finish\n\n\t\t// when copying submorphs, make sure that the submorph that becomes a top-level morph \n\t\t// reappears in the same location as its original.\n\t\tconsole.log('copied %s', copy);\n\t\tcopy.owner = null; // so following addMorph will just leave the tfm alone\n\t\tthis.owner.addMorph(copy); // set up owner as the original parent so that... \n\t\thand.addMorph(copy); // ... it will be properly transformed by this addMorph()\n\t\t// copy.setPosition(pt(0,0))\n\t\thand.showAsGrabbed(copy);\n\t\t// copy.withAllSubmorphsDo(function() { this.startStepping(null); }, null);\n\t\treturn copy\n\t},\n\nshadowCopy: function(hand) {\n\t\t// copied and adapted from asLogo\n\t\tvar shapes = [], copier = new Copier(), root = this;\n\t\t\n\t\tthis.shadowCopyIntoShapes(root, shapes, copier);\n\t\t\n\t\tvar shadow = new Morph(new lively.scene.Group())\n\t\tshadow.shape.setContent(shapes)\n\t\tshadow.setTransform(root.getTransform());\n\n\t\troot.shadowConnection = connect(this, 'transformChanged', shadow, 'setTransform', {\n\t\t\tconverter: function($upd) {\n\t\t\t\treturn new lively.scene.Similitude(\n\t\t\t\t\tthis.targetObj.getTransform().getTranslation(),\n\t\t\t\t\tthis.sourceObj.getRotation(),\n\t\t\t\t\tpt(this.sourceObj.getScale(), this.sourceObj.getScale()));\n\t\t\t}\n\t\t})\n\n\t\tif (!this.isClipMorph)\n\t\t\tthis.submorphs.forEach(function(ea) {\n\t\t\t\tshadow.addMorph(ea.shadowCopy(hand));\n\t\t\t})\n\n\t\treturn shadow;\n\t},\n\tshadowCopyIntoShapes: function(root, shapes, copier) {\n\t\tif (this.isEpimorph) return;\n\n\t\tvar s = this.shape.copy(copier)\n\n\t\tif (s.getFill()) s.setFill(Color.black);\n\t\tif (s.getStroke()) s.setStroke(Color.black);\n\t\ts.setFillOpacity(0.3);\n\t\ts.setStrokeOpacity(0.3);\n\n\t\tthis.transformForNewOwner(root).applyTo(s.rawNode)\n\t\tshapes.push(s);\n\t},\n\n\n\tmorphToGrabOrReceiveDroppingMorph: function(evt, droppingMorph) {\n\t\treturn this.morphToGrabOrReceive(evt, droppingMorph, true);\n\t},\n\n\tmorphToGrabOrReceive: function(evt, droppingMorph, checkForDnD) {\n\t\t// If checkForDnD is false, return the morph to receive this mouse event (or null)\n\t\t// If checkForDnD is true, return the morph to grab from a mouse down event (or null)\n\t\t// If droppingMorph is not null, then check that this is a willing recipient (else null)\n\n\t\tif (this.isEpimorph)\n\t\t\treturn null;\n\n\t\tif (!this.fullContainsWorldPoint(evt.mousePoint)) return null; // not contained anywhere\n\t\t// First check all the submorphs, front first\n\t\tfor (var i = this.submorphs.length - 1; i >= 0; i--) {\n\t\t\tvar hit = this.submorphs[i].morphToGrabOrReceive(evt, droppingMorph, checkForDnD); \n\t\t\tif (hit != null) { \n\t\t\t\treturn hit; // hit a submorph\n\t\t\t}\n\t\t};\n\n\t\t// Check if it's really in this morph (not just fullBounds)\n\t\tif (!this.containsWorldPoint(evt.mousePoint)) return null;\n\n\t\t// If no DnD check, then we have a hit (unless no handler in which case a miss)\n\t\tif (!checkForDnD) return this.mouseHandler ? this : null;\n\n\t\t// On drops, check that this is a willing recipient\n\t\tif (droppingMorph != null) {\n\t\t\treturn this.acceptsDropping(droppingMorph) ? this : null;\n\t\t} else {\n\t\t\t// On grabs, can't pick up the world or morphs that handle mousedown\n\t\t\t// DI: I think the world is adequately checked for now elsewhere\n\t\t\t// else return (!evt.isCommandKey() && this === this.world()) ? null : this; \n\t\t\treturn this;\n\t\t}\n\n\t},\n\n\tmorphToReceiveEvent: function(evt) {\n\t\t// This should replace morphToGrabOrReceive... in Hand where events\n\t\t// must be displatched to morphs that are closed to DnD\n\t\treturn this.morphToGrabOrReceive(evt, null, false);\n\t},\n\n\n\tacceptsDropping: function(morph) { \n\t\treturn !this.suppressDropping && this.openForDragAndDrop && !(morph instanceof WindowMorph);\n\t},\n\n},\n'fullscreen', {\n\tenterFullScreen: function() {\n\t\tvar world = this.world();\n\t\tif (this._isInFullScreen || !world) return;\n\t\tthis._isInFullScreen = true;\n\t\tthis.oldPosition = this.getPosition();\n\t\tthis.oldWorldScale = world.getScale();\n\t\tthis.oldWorldExtent = world.getExtent();\n\t\tvar windowExtent = world.windowBounds().extent(),\n\t\t\tratioY = (windowExtent.y / this.getExtent().y) * world.getScale(),\n\t\t\tratioX = (windowExtent.x / this.getExtent().x) * world.getScale(),\n\t\t\tratio = Math.min(ratioX, ratioY);\n\t\tif (ratio > 0 && ratio < 100) {\n\t\t\tworld.setScale(ratio);\t\t\t\n\t\t\tvar pos = this.getTransform().transformPoint(this.shape.bounds().topLeft());\n\t\t\tthis.setPosition(pt(0,0))\n\t\t\tGlobal.scrollTo(0, 0)\n\t\t\tworld.setExtent(windowExtent);\n\t\t\tworld.resizeCanvasToFitWorld();\n\t\t\t// rk actually the following three lines should be unnecessary because of resizeCanvasToFitWorld\n\t\t\tvar canvas = world.canvas();\n\t\t\tcanvas.setAttribute(\"width\", windowExtent.x);\t\n\t\t\tcanvas.setAttribute(\"height\", windowExtent.y);\n\t\t\tthis.clipWorld();\n\t\t};\n\t},\n\n\tleaveFullScreen: function() {\n\t\tif (!this._isInFullScreen) return;\n\t\tthis._isInFullScreen = false;\n\t\tthis.setPosition(this.oldPosition)\n\t\tthis.unclipWorld();\n\t\tthis.world().setScale(this.oldWorldScale);\n\t\tthis.world().setExtent(this.oldWorldExtent);\n\t\tthis.world().resizeCanvasToFitWorld();\n\t\tGlobal.scrollTo(this.oldPosition.x, this.oldPosition.y)\n\t\tdelete this.oldWorldExtent;\n\t\tdelete this.oldWorldScale;\n\t\tdelete this.oldPosition;\n\t},\n\tisInFullScreen: function() { return this._isInFullScreen },\n\n\n\tclipWorld: function() {\n\t\tthis.unclipWorld();\n\t\tthis.owner.addMorphFront(this);\n\t\tvar clipBounds = this.getPosition().extent(this.shape.bounds().extent()),\n\t\t\tclip = new lively.scene.Clip(new lively.scene.Rectangle(clipBounds)),\n\t\t\tworld = this.world();\n\t\tclip.reference();\n\t\tclip.applyTo(world);\t\t\n\t\tworld.worldClip = clip;\n\t},\n\n\tunclipWorld: function() {\n\t\tvar world = this.world();\n\t\tif (world.worldClip) {\n\t\t\tworld.worldClip.dereference();\n\t\t\tdelete world.worldClip;\n\t\t};\n\t\tworld.setTrait(\"clip-path\", \"\");\n\t},\n},\n'stepping', { // Morph stepping/timer functions\n\n startSteppingScripts: function() { }, // May be overridden to start stepping scripts\n\n\tstopStepping: function() {\n\t\tif (!this.activeScripts) return;\n\t\t// ignore null values\n\t\tvar scripts = this.activeScripts.select(function (ea) { return ea });\n\t\tscripts.invoke('stop', this.world());\n\t\tscripts.forEach(function(ea) { this.removeMorph(ea) }, this)\n\t\tthis.activeScripts = null;\n\t},\n\t\n\tstopSteppingScriptNamed: function(sName) {\n\t\tif (!this.activeScripts) return;\n\t\tthis.activeScripts.select(function (ea) { return ea.scriptName == sName }).invoke('stop', this.world());\n\t\tthis.activeScripts = this.activeScripts.select(function (ea) { return ea.scriptName !== sName });\t\n\t\tif (this.activeScripts.length == 0) this.activeScripts = null;\n\t},\n \tstopSteppingScriptNamedAndRemoveFromSubmorphs: function(sName) {\n\t\tif (!this.activeScripts) return;\n\t\tvar all = this.activeScripts.select(function (ea) { return ea.scriptName == sName });\n\t\tif (this.world()) all.invoke('stop', this.world());\n\t\tall.each(function(ea) {this.removeMorph(ea);}.bind(this));//remove\n\t\tthis.activeScripts = this.activeScripts.select(function (ea) { return ea.scriptName !== sName });\t\n\t\tif (this.activeScripts.length == 0) this.activeScripts = null;\n },\n\n\n\tstartStepping: function(stepTime, scriptName, argIfAny) {\n\t\tif (!scriptName) throw Error(\"Old code\");\n\t\tvar action = new SchedulableAction(this, scriptName, argIfAny, stepTime);\n\t\tthis.addActiveScript(action);\n\t\taction.start(this.world());\n\t\treturn action;\n\t},\n\n\taddActiveScript: function(action) {\n\t\t// Every morph carries a list of currently active actions (alarms and repetitive scripts)\n\t\tif (!this.activeScripts) this.activeScripts = [action];\n\t\telse this.activeScripts.push(action);\n\t\tif (!action.rawNode.parentNode) \n\t\t\tthis.addMorph(action);\n\t\treturn this;\n\t\t// if we're deserializing the rawNode may already be in the markup\n\t},\n\n stopAllStepping: function() { // For me and all my submorphs \n\t\tthis.withAllSubmorphsDo( function() { this.stopStepping(); });\n },\n\n suspendAllActiveScripts: function() { // For me and all my submorphs\n\t\tthis.withAllSubmorphsDo(function() { this.suspendActiveScripts(); });\n },\n\n\tsuspendActiveScripts: function() {\n\t\tif (this.activeScripts) { \n\t\t\tthis.suspendedScripts = this.activeScripts.clone();\n\t\t\tthis.stopStepping();\n\t\t}\n\t},\n\n\tresumeAllSuspendedScripts: function() {\n\t\tvar world = WorldMorph.current();\n\t\tthis.withAllSubmorphsDo( function() {\n\t\t\tif (this.suspendedScripts) {\n\t\t\t\t// ignore null values\n\t\t\t\tthis.suspendedScripts.select(function (ea) { return ea }).invoke('start', world);\n\t\t\t\tthis.activeScripts = this.suspendedScripts;\n\t\t\t\tthis.suspendedScripts = null;\n\t\t\t}\n\t\t});\n\t},\n\tforceRestartAllActiveScripts: function() {\n\t\tvar world = WorldMorph.current();\n\t\tthis.withAllSubmorphsDo( function() {\n\t\t\tif (this.activeScripts) {\n\t\t\t\tthis.activeScripts.select(function (ea) { return ea }).invoke('start', world);\n\t\t\t}\n\t\t});\n\t},\n\n\n},\n'scripts', {\n\taddScript: function(funcOrString, optName) {\n\t\tvar func = Function.fromString(funcOrString);\n\t\treturn func.asScriptOf(this, optName);\n\t},\n\n\taddScriptNamed: function(name, funcOrString) {\n\t\t// DEPRECATED!!!\n\t\treturn this.addScript(funcOrString, name);\n\t},\n},\n'debugging', {\n\tnotify: function(msg, loc) {\n\t\tif (!loc) loc = this.world().positionForNewMorph();\n\t\tnew MenuMorph([[\"OK\", 0, \"toString\"]], this).openIn(this.world(), loc, false, msg); \n\t},\n\n\tshowOwnerChain: function(evt) {\n\t\tvar items = this.ownerChain().reverse().map(\n\t\t\tfunction(each) { \n\t\t\t\treturn [Object.inspect(each).truncate(), function(evt2) { each.showMorphMenu(evt) }]; \n\t\t\t});\n\t\tnew MenuMorph(items, this).openIn(this.world(), evt.point(), false, \"Top item is topmost\");\n\t},\n\n\ttoString: function() {\n\t\ttry {\n\t\t\tvar name = this.getName();\n\t\t\tif (name && name != '') name += '(' + this.constructor.name + ')';\n\t\t\telse name = (this.rawNode && this.id()) || 'morph without rawNode';\n\t\t\treturn name;\n\t\t} catch (e) {\n\t\t\t//console.log(\"toString failed on %s\", [this.id(), this.getType()]);\n\t\t\treturn \"#\";\n\t\t}\n\t},\n\n\tinspect: function() {\n\t\ttry {\n\t\t\treturn this.toString();\n\t\t} catch (err) {\n\t\t\treturn \"#\";\n\t\t}\n\t},\n\t\n\taddSvgInspector: function() {\n\t\tvar xml = Exporter.stringify(new Exporter(this).serialize(Global.document));\n\t\tvar txt = this.world().addTextWindow({\n\t\t\tcontent: xml,\n\t\t\ttitle: \"XML dump\", \n\t\t\tposition: this.world().positionForNewMorph(null, this)\n\t\t});\n\t\ttxt.innerMorph().xml = xml; // FIXME a sneaky way of passing original text.\n\t},\n\n\taddModelInspector: function() {\n\t\tvar model = this.getModel();\n\t\tif (model instanceof SyntheticModel) {\n\t\t\tvar variables = model.variables();\n\t\t\tvar list = [];\n\t\t\tfor (var i = 0; i < variables.length; i++) {\n\t\t\t\tvar varName = variables[i];\n\t\t\t\tlist.push(varName + \" = \" + model.get(varName));\n\t\t\t}\n\t\t\tthis.world().addTextListWindow({\n\t\t\t\tcontent: list,\n\t\t\t\ttitle: \"Simple Model dump\",\n\t\t\t\tposition: this.world().positionForNewMorph(null, this)\n\t\t\t});\n\t\t}\n\t},\n\n},\n'Fabrik',{\n\tisContainedIn: function(morph) {\n\t\tif (!this.owner) return false;\n\t\tif (this.owner === morph) return true;\n\t\treturn this.owner.isContainedIn(morph)\n\t},\n},\n'signals',{\n\tsignalGeometryChange: function() {\n\t\tsignal(this, 'geometryChanged')\n\t\tvar morphs = this.submorphs;\n\t\tfor(var i=0; i < morphs.length; i++) {\n\t\t\tmorphs[i].signalGeometryChange()\n\t\t}\n\t},\n\n});\n\nMorph.addMethods(ViewTrait);\n\n// ===========================================================================\n// World-related widgets\n// ===========================================================================\n\n// A unique characteristics of the Morphic graphics system is that\n// all the objects (morphs) live in a \"world\" that is shared between \n// different objects and even between different users. A world can\n// contain a large number of different applications/widgets, much like\n// in an operating system a folder can contain a lot of files. Worlds\n// can be linked to each other using LinkMorphs. As a consequence,\n// the entire system can contain a large number of worlds, each of\n// which contains a large number of simultaneously running applications\n// and widgets. \n\nMorph.subclass(\"PasteUpMorph\", {\n\n documentation: \"used for layout, most notably the world and, e.g., palettes\",\n\n initialize: function($super, bounds, shapeType) {\n return $super(bounds, shapeType);\n },\n \n\tcaptureMouseEvent: function PasteUpMorph$captureMouseEvent($super, evt, hasFocus) {\n\t\tif (evt.type == \"MouseDown\" && this.onMouseDown(evt)) return;\n\t\tif (evt.type == \"MouseWheel\" && this.onMouseWheel(evt)) return;\n\t\t$super(evt, hasFocus); \n\t},\n\n\tonMouseDown: function PasteUpMorph$onMouseDown($super, evt) { //default behavior is to grab a submorph\n\t\t$super(evt);\n\t\tvar m = this.morphToReceiveEvent(evt);\n\t\tif (false && m instanceof HandleMorph) { // Verify handles work with pie menus, then delete\n\t\t\tm.onMouseDown(evt); // fixme\n\t\t\treturn true;\n\t\t}\n\t\tif (Config.usePieMenus) {\n\t\t\tif (m.handlesMouseDown(evt)) return false;\n\t\t\tm.showPieMenu(evt, m);\n\t\t\treturn true;\n\t\t}\n\t\tif (m == null) { \n\t\t\tthis.makeSelection(evt); \n\t\t\treturn true; \n\t\t} else if (!evt.isCommandKey() && evt.isLeftMouseButtonDown()) {\n\t\t\tif (m === this.world()) { \n\t\t\t\tthis.makeSelection(evt); \n\t\t\t\treturn true; \n\t\t\t} else if (m.handlesMouseDown(evt)) \n\t\t\t\treturn false;\n\t\t}\n\t\tevt.hand.grabMorph(m, evt);\n\t\treturn true; \n\t},\n\n\n\tbounds: function($super, ignoreTransients, ignoreTransform) {\n\t\treturn $super(ignoreTransients, true);\n\t},\n\t\n\tonMouseWheel: function(evt) {\t\t\n\t\tif (!evt.isCommandKey()) return false;\n\t\tevt.preventDefault();\n\n\t\tvar wheelDelta = evt.wheelDelta(),\n\t\t\toldScale = this.getScale();\n\n\t\tvar minScale = 0.1, maxScale = 10;\n\t\tif (oldScale < minScale && wheelDelta < 0) return false;\n\t\tif (oldScale > maxScale && wheelDelta > 0) return false;\n\t\tvar scaleDelta = 1 + evt.wheelDelta() / 500;\n\t\n\t\t// this.scaleBy(scaleDelta);\n\t\tvar newScale = oldScale * scaleDelta,\n\t\t\tnewScale = Math.max(Math.min(newScale, maxScale), minScale);\n\t\tthis.setScale(newScale)\n\t\tif (this.hands && this.hands[0]) this.hands[0].setScale(1/newScale)\n\n\t\t// actually this should be a layoutChanged but implementing\n\t\t// layoutChanged in WorldMorph is expensive since it is always called when a\n\t\t// submorph's layout is changed (owner chain propagation)\n\t\tthis.resizeCanvasToFitWorld();\n\t\t\n\t\t// Zoom into/out of the current mouse position:\n\t\t// p is the current mouse position. If we wouldn't move the window the new mouse pos would be scaledP.\n\t\t// We calculate the vector from scaledP to p and scale that by the current scale factor\n\t\t// We end up with a vector that can be used to scroll the screen to zoom in/out\n\t\tvar p = evt.point(),\n\t\t\tscaledP = p.scaleBy(1/scaleDelta),\n\t\t\ttranslatedP = p.subPt(scaledP).scaleBy(this.getScale());\n\t\twindow.scrollBy(translatedP.x, translatedP.y)\n\n\t\treturn true\n\t},\n\t\n okToBeGrabbedBy: function(evt) {\n // Paste-ups, especially the world, cannot be grabbed normally\n return null; \n },\n\n\tmakeSelection: function(evt) {\t//default behavior is to grab a submorph\n\t\tif (this.world().currentSelection != null) this.world().currentSelection.removeOnlyIt();\n\t\t\n\t\tvar m = new SelectionMorph(evt.point().asRectangle());\n\t\tthis.world().currentSelection = m;\n\t\t\n\t\tthis.world().addMorph(m);\n\t\tvar handle = new HandleMorph(pt(0,0), lively.scene.Rectangle, evt.hand, m, \"bottomRight\");\n\t\thandle.setExtent(pt(0, 0));\n\t\thandle.mode = 'reshape';\n\t\tm.addMorph(handle);\n\t\tevt.hand.setMouseFocus(handle);\n\t\tevt.hand.setKeyboardFocus(handle);\n\t}, \n});\n\nPasteUpMorph.subclass(\"WorldMorph\", \n'defaults', {\n documentation: \"A Morphic world (a visual container of other morphs)\",\n fill: Color.primary.blue,\n defaultExtent: pt(1280, 1024),\n\tstyleClass: ['world'],\n\t\n // Default theme for the theme manager \n},\n'initialization', {\n\tinitialize: function($super, canvas, backgroundImageId) {\n\t\tvar bounds = Rectangle.fromElement(canvas);\n\t\t// sometimes bounds has zero dimensions (when reloading thes same page, timing issues?\n\t\t// in Firefox bounds may be 1x1 size?? maybe everything should be run from onload or sth?\n\t\tif (bounds.width < 2) {\n\t\t\tbounds.width = this.defaultExtent.x;\n\t\t}\n\n\t\tif (bounds.height < 2) {\n\t\t\tbounds.height = this.defaultExtent.y;\n\t\t}\n\n\t\tif (backgroundImageId) {\n\t\t\tvar background = NodeFactory.create(\"use\");\n\t\t\tXLinkNS.setHref(background, backgroundImageId);\n\t\t\tthis.addNonMorph(background);\n\t\t}\n\t\t$super(new lively.scene.Rectangle(bounds));\n\n\t\tthis.setDisplayTheme(this.displayTheme); // apply display theme\n\n\t\t//gradient.rawNode.setAttributeNS(null, \"gradientTransform\", \"translate(0, -0.1) skewY(10)\");\t\t \n\t\tthis.enterCount = 0;\n\t},\n\n\tdoNotSerialize: ['hands', 'scheduledActions', 'lastStepTime', 'mainLoop', 'worldId', 'secondTick', 'currentScript', 'currentSelection', '_statusMessageContainer'],\n\n initializeTransientState: function($super) {\n $super();\n\n this.hands = [];\n\n\t\t\t\t\n\t\tvar theme = DisplayThemes[Config.defaultDisplayTheme];\n\t\tif (!theme)\n\t\t\tconsole.log('ERROR: could not find Theme ' + Config.defaultDisplayTheme)\n\t\tthis.displayTheme = theme; // set display them without applying it\n\t\tconsole.log('WorldMorph: updated display theme ')\n\n\n\t\tthis.withAllSubmorphsDo( function() { this.layoutChanged(); }); // Force installation of transforms\n\n this.scheduledActions = []; // an array of schedulableActions to be evaluated\n this.lastStepTime = (new Date()).getTime();\n this.mainLoopFunc = this.doOneCycle.bind(this).logErrors('Main Loop');\n this.mainLoop = Global.setTimeout(this.mainLoopFunc, 30);\n this.worldId = ++WorldMorph.worldCount;\n\t\tvar self = this;\n\t\twindow.onscroll = function() {signal(self, 'scrollChange')}\n\n return this;\n },\n\n\tcollectAllUsedFills: function($super, usedFills) {\n\t\tusedFills = $super(usedFills);\n\t\tProperties.forEachOwn(this.displayTheme, function(ea) {\n\t\t\tvar style = this[ea]\n\t\t\tif (style && (style.fill instanceof lively.paint.Gradient)) {\n\t\t\t\tusedFills.push(style.fill);\n\t\t\t} \n\t\t}.bind(this.displayTheme))\n\t\treturn usedFills\n\t},\n \n\tremove: function() {\n\t\tif (!this.rawNode.parentNode) return null; // already removed\n\t\tthis.hands.clone().forEach(function(hand) { this.removeHand(hand) }, this);\n\t\tthis.stopStepping();\n\t\tthis.removeRawNode();\n\t\treturn this;\n\t},\n},\n'private', {\n\n\t// called by insertMorph to determine the rawNode after the new inserted morph\n\tgetInsertPositionFor: function(m, isFront) {\n\t\tif (this.submorphs.length == 0) return this.hands.length > 0 ? this.hands.last().rawNode : null;\n\t\treturn isFront ? this.submorphs.last().rawNode.nextSibling : this.submorphs.first().rawNode;\n\t},\n\t\n\ttoggleNativeCursor: function(flag) {\n\t\tthis.canvas().setAttributeNS(null, \"cursor\", flag ? \"auto\" : \"none\");\n\t},\n\n\tresizeCanvasToFitWorld: function () {\n\t\tvar canvas = this.canvas();\n\t\tif (!canvas) return;\n\t\tthis.transformChanged();\n\t\tthis.fullBounds = null;\n\n\t\tvar w = this.getExtent().x * this.getScale() , h = this.getExtent().y * this.getScale();\n\n\t\tif (canvas.clientWidth != w && canvas.clientHeight != h) {\n\t\t\tif (canvas.offsetLeft) w += canvas.offsetLeft * this.getScale();\n\t\t\tif (canvas.offsetTop) h += canvas.offsetTop * this.getScale();\n\t\t\tcanvas.setAttribute(\"width\", w);\n\t\t\tcanvas.setAttribute(\"height\", h);\n\t\t}\n\t},\n\n\tdisplayOnCanvas: function(canvas) {\n\t\t// this.remove();\n\t\tif (this.rawNode.parentNode !== canvas) canvas.appendChild(this.rawNode);\n\t\tthis.hands.forEach(function(ea) { this.removeHand(ea) }, this);\n\t\tthis.addHand(new HandMorph(true));\n\t\tWorldMorph.currentWorld = this; // this conflicts with mutliple worlds\n\t\tif (Config.resizeScreenToWorldBounds)\n\t\t\tthis.resizeCanvasToFitWorld(this);\n\t\tthis.onEnter(); \n\t\tthis.enterCount ++;\n\t},\n \n\taddHand: function(hand) {\n\t\tif (this.hands.length > 0 && !this.hands.first())\n\t\t\tthis.hands.shift(); // FIXME: Quick bugfix. When deserializing the world the hands.first() is sometimes undefined\n\t\tthis.hands.push(hand);\n\t\thand.owner = this;\n\t\t// FIXME mouse events are correctly dispatched when using canvas or world\n\t\t// keyboard events only work when using documentElement --> problem with multiple worlds\n\t\thand.registerForKeyboardEvents(document.documentElement); // FIXME!!!\n\t\thand.registerForEvents(this.canvas());\n\t\thand.layoutChanged();\n\n\t\tthis.rawNode.appendChild(hand.rawNode);\n\t\treturn hand;\n\t},\n \n\tremoveHand: function(hand) {\n\t\thand.setMouseFocus(null); // cleanup, just in case\n\t\thand.setKeyboardFocus(null); // cleanup (calls blur(), which will remove the focus halo)\n\t\thand.removeRawNode();\n\t\thand.unregisterForKeyboardEvents(document.documentElement); // FIXME!!!\n\t\thand.unregisterForEvents(this.canvas());\n\n\t\tthis.hands.splice(this.hands.indexOf(hand), 1);\n\t},\n\n\n toggleBalloonHelp: function() {\n Morph.prototype.suppressBalloonHelp = !Morph.prototype.suppressBalloonHelp;\n },\n\n\n\n chooseDisplayTheme: function(evt) { \n var themes = DisplayThemes;\n var target = this; // trouble with function scope\n var themeNames = Properties.own(themes);\n var items = themeNames.map(\n function(each) { return [each, target, \"setDisplayTheme\", themes[each]]; });\n var menu = new MenuMorph(items, this);\n menu.openIn(this.world(), evt.point());\n },\n \n setDisplayTheme: function(styleDict) { \n this.displayTheme = styleDict;\n this.withAllSubmorphsDo( function() { this.applyLinkedStyles(); });\n },\n \n restart: function() {\n window.location && window.location.reload();\n },\n\n},\n'accessing', {\n\tgetMorphNamed: function($super, name) {\n\t\treturn $super(name) || (this.hands[0] && this.hands[0].getMorphNamed(name));\n\t},\n},\n'geometry', {\n \n layoutChanged: function() {\n\t// do nothing\n },\n\n layoutOnSubmorphLayout: function() {\n\treturn false;\n },\n \n\n moveBy: function(delta) { // don't try to move the world\n },\n},\n'world', {\n\n world: function() { \n return this; \n },\n\t\n validatedWorld: function() { \n return this; \n },\n \n firstHand: function() {\n\t\tif (!this.hands || this.hands.length === 0) return undefined;\n return this.hands[0];\n },\n\n onEnter: function() {},\n onExit: function() {},\n\n /**\n * override b/c of parent treatement\n */\n relativize: function(pt) { \n return pt;\n //return pt.matrixTransform(this.rawNode.parentNode.getTransformToElement(this.rawNode)); \n },\n\thideHostMouseCursor: function() {\n\t\tif (!Config.hideSystemCursor) return;\n\t\tif (UserAgent.isChrome && UserAgent.isWindows)\n\t\t\t// chrome on windows cannot display cur files\n\t\t\tvar\tpath = URL.codeBase.withFilename('media/nocursor.gif').pathname;\n\t\telse\n\t\t\tvar\tpath = URL.codeBase.withFilename('media/nocursor.cur').pathname;\n\t\tdocument.body.style.cursor = 'url(\"' + path + '\"), none';\n\t},\n\tshowHostMouseCursor: function() {\n\t\tdocument.body.style.cursor = 'default'\n\t},\n\n\n\n},\n'stepping', {\n \n // *** The new truth about ticking scripts ***\n // A morph may have any number of active scripts\n // Each is activated by a call such as\n // this.startStepping(50, \"rotateBy\", 0.1);\n // Note that stepTime is in milliseconds, as are all lower-level methods\n // The arguments are: stepTime, scriptName, argIfAny\n // This in turn will create a SchedulableAction of the form\n // { actor: aMorph, scriptName: \"rotateBy\", argIfAny: 0.1, stepTime: 50, ticks: 0 }\n // and this action will be both added to an array, activeScripts in the morph,\n // and it will be added to the world's scheduledActions list, which is an array of\n // tuples of the form [msTimeToRun, action]\n // The ticks field is used to tally ticks spent in each schedulableAction --\n // It is incremented on every execution, and it is multiplied by 0.9 every second\n // Thus giving a crude 10-second average of milliseconds spent in this script\n // every 10 seconds. The result is divided by 10 in the printouts.\n //\n // The message startSteppingScripts can be sent to morphs when they are placed in the world.\n // It is intended that this may be overridden to start any required stepping.\n // The message stopStepping will be sent when morphs are removed from the world.\n // In this case the activeScripts array of the morph is used to determine exactly what\n // scripts need to be unscheduled. Note that startSteppingScripts is not sent\n // automatically, whereas stopStepping is. We know you won't forget to \n // turn your gadgets on, but we're more concerned to turn them off when you're done.\n\n\tgetScheduledActions: function() {\n\t\treturn this.scheduledActions.collect(function(ea) { return ea[1] });\n\t},\n\n scheduleForLater: function(action, delayInMs, removePrior) {\n if (removePrior) this.stopSteppingFor(action, true); // unschedule earlier\n this.scheduleAction(new Date().getTime() + delayInMs, action);\n },\n \n startSteppingFor: function(action) {\n\t\tif (!action.scriptName) {\n\t\t\t// throw new Error(\"old code\");\n\t\t\tconsole.log(\"faild to startSteppingFor with no scriptName \")\n\t\t\treturn \n\t\t}\t\t\n\t\tthis.stopSteppingFor(action, true); // maybe replacing arg or stepTime\n\t\tthis.scheduleAction(new Date().getTime(), action);\n\t},\n \n stopSteppingFor: function(action, fromStart) { // should be renamed to unschedule()\n // fromStart means it is just getting rid of a previous one if there,\n\t // so not an error if not found\n\n if (this.currentScript === action) {\n\t\t // Not in queue; just prevent it from being rescheduled\n\t\t this.currentScript = null;\n\t\t return;\n\t\t};\n\n\t\tif (!this.scheduledActions) return;\n\t\tthis.scheduledActions = this.scheduledActions.reject(function(ea) {\n\t\t\tvar eaAction = ea[1]\n\t\t\treturn action.equalActorAndName(eaAction)\n\t\t})\n },\n\tstopSteppingForActionsMatching: function(func) {\n\t\tthis.getScheduledActions()\n\t\t\t.select(func)\n\t\t\t.forEach(function(action) { this.stopSteppingFor(action) }, this);\n\t},\n\n\n\n \n\tvalidateScheduler: function() {\n\t\tthis.getScheduledActions().forEach(function(action) {\n\t\t\tif (action.actor instanceof Morph && action.actor.validatedWorld() !== this)\n\t\t\t\tthis.stopSteppingFor(action)\n\t\t}, this);\n\t},\n\n inspectScheduledActions: function() {\n // inspect an array of all the actions in the scheduler. Note this\n // is not the same as scheduledActions which is an array of tuples with times\n\t\t// doit: [WorldMorph.current().inspectScheduledActions()]\n lively.Tools.inspect(this.getScheduledActions());\n },\n\n\tdoOneCycle: function WorldMorph$doOneCycle(world) {\n // Process scheduled scripts\n\n // Run through the scheduledActions queue, executing those whose time has come\n // and rescheduling those that have a repeatRate\n // Note that actions with error will not get rescheduled\n // (and, unless we take the time to catch here, will cause all later \n // ones in the queue to miss this tick. Better less overhead, I say\n // DI: **NOTE** this needs to be reviewed for msClock rollover\n // -- also note we need more time info for multi-day alarm range\n // When we do this, I suggest that actions carry a date and msTime\n // and until their day is come, they carry a msTime > a day\n // That way they won't interfere with daily scheduling, but they can\n // still be dealt with on world changes, day changes, save and load.\n\t\tvar msTime = new Date().getTime(),\n\t\t\ttimeOfNextStep = Infinity,\n\t\t\tlist = this.scheduledActions, // shorthand\n\t\t\ttimeStarted = msTime; // for tallying script overheads\n\t\twhile (list.length > 0 && list[list.length - 1][0] <= msTime) {\n\t\t\tvar schedNode = list.pop(), // [time, action] -- now removed\n\t\t\t\taction = schedNode[1];\n\t\t\tthis.currentScript = action; // so visible from stopStepping\n\t\t\tlively.lang.Execution.resetDebuggingStack(); // Reset at each tick event\n\t\t\ttry {\n\t\t\t\taction.exec();\n\t\t\t} catch (er) {\n\t\t\t\tvar msg = \"error on actor ' + action.actor + ': \" + (er.stack || er);\n\t\t\t\tconsole.warn(msg);\n\t\t\t\talert(msg)\n\t\t\t\tdbgOn(true);\n\t\t\t\tlively.lang.Execution.showStack();\n\t\t\t\ttimeStarted = new Date().getTime();\n\t\t\t\tcontinue; // Note: if error in script above, it won't get rescheduled below (this is good)\n\t\t\t}\n \n\t\t\t// Note: stopStepping may set currentScript to null so it won't get rescheduled\n\t\t\tif (this.currentScript && action.stepTime > 0) {\n\t\t\t\tvar nextTime = msTime + action.stepTime;\n\t\t\t\tthis.scheduleAction(nextTime, action)\n\t\t\t}\n\t\t\tthis.currentScript = null;\n\n\t\t\tvar timeNow = new Date().getTime(),\n\t\t\t\tticks = timeNow - timeStarted;\n\t\t\tif (ticks > 0) action.ticks += ticks; // tally time spent in that script\n\t\t\ttimeStarted = timeNow;\n\t\t}\n\n\t\t// Generate a mouseMove if any ticking scripts have run so that\n\t\t// simulations can respond where, eg, a morph moves under the mouse\n\t\t// DI: This is *only* needed for the slide-keyboard-under-mouse demo (very cool)\n\t\t//\tUses extra cycles, though, and currently fails in Opera\n\t\tif (Config.nullMoveAfterTicks) { // set this true in localConfig for the demo\n\t\t\tvar myHand = this.firstHand();\n\t\t\tif (myHand) myHand.makeANullMove();\n\t\t}\n\t\tif (list.length > 0) timeOfNextStep = Math.min(list[list.length-1][0], timeOfNextStep);\n\n\t\t// Each second, run through the tick tallies and mult by 0.9 to 10-sec \"average\"\n\t\tif (!this.secondTick) this.secondTick = 0;\n\t\tvar secondsNow = Math.floor(msTime / 1000);\n\t\tif (this.secondTick != secondsNow) {\n\t\t\tthis.secondTick = secondsNow;\n\t\t\tvar tallies = {};\n\t\t\tfor (var i=0; i=0; i--) {\n\t\t\tvar schedNode = list[i];\n\t\t\tif (schedNode[0] > msTime) {\n\t\t\t\tlist.splice(i+1, 0, [msTime, action]);\n\t\t\t\tif (!this.mainLoop) this.kickstartMainLoop();\n\t\t\t\treturn; \n\t\t\t}\n\t\t}\n\t\tlist.splice(0, 0, [msTime, action]);\n\t\tif (!this.mainLoop) this.kickstartMainLoop();\n\t},\n},\n'dialogs', {\n \n\topenURLasText: function(url, title) {\n\t\t// FIXME: This should be moved with other handy services like confirm, notify, etc\t\t\n\t\tvar pane = this.addTextWindow({content: \"fetching ... \", title: title});\n\t\tvar r = new WebResource(url);\n\t\tlively.bindings.connect(r, 'content', pane.innerMorph(), 'setTextString');\n\t\tr.beAsync().get();\n\t\t\n\t},\n\n\tviewport: function() {\n\t\ttry {\n\t\t\treturn Rectangle.ensure(this.canvas().viewport);\n\t\t\t} catch (er) { // FF doesn't implement viewport ?\n\t\t\treturn this.shape.bounds();\n\t\t}\n\t},\n\n\talert: function(varargs) {\n\t\tvar message = Strings.formatFromArray($A(arguments)),\n\t\t\topenDialog = function() { alert(message) };\n\t\tthis.setStatusMessage(message, Color.red, undefined, openDialog, undefined, \"alert: \")\n\t}.logErrors('alert'),\n\n\tprompt: function(message, callback, defaultInput) {\n\t\t// this.world().prompt(\"your name\", function(v) { alert(\"your name is: \" + v)}, \"joe\")\n\t\tvar model = Record.newPlainInstance({Message: message, Input: defaultInput || \"\", Result: null});\n\t\tmodel.addObserver({ \n\t\t\tonResultUpdate: function(value) { \n\t\t\t\tif (value == true && callback) callback.call(Global, model.getInput());\n\t\t\t}\n\t\t});\n\t\tvar dialog = new PromptDialog(model.newRelay({Message: \"-Message\", Result: \"+Result\", Input: \"Input\"}));\n\t\tvar window = dialog.openIn(this, pt(0,0));\n\t\twindow.setPosition(this.positionForNewMorph(window));\n\t\treturn dialog;\n\t},\n\n editPrompt: function(message, callback, defaultInput, optContext) {\n\t\tvar dialog = new PromptDialogMorph();\n\t\tdialog.title = message;\n\t\tdialog.setText(defaultInput);\n\t\tdialog.callback = callback;\n\t\tif (optContext) {\n\t\t\tdialog.textPane.innerMorph().evalContext = optContext; \n\t\t\tdialog.textPane.innerMorph().addScript(function getDoitContext() {\n\t\t\t\treturn this.evalContext;\n\t\t\t})\n\t\t}\n\t\tdialog.openIn(this, this.positionForNewMorph(dialog));\n\t\treturn dialog\n },\n\n\tconfirm: function(message, callback) {\n\t\tvar model = Record.newPlainInstance({Message: message, Result: null});\n\t\tmodel.addObserver({ \n\t\t\tonResultUpdate: function(value) { callback && callback.call(Global, value) }});\n\t\tvar dialog = new ConfirmDialog(model.newRelay({Message: \"-Message\", Result: \"+Result\"})),\n\t\t\twindow = dialog.openIn(this, pt(0,0));\n\t\twindow.setPosition(this.positionForNewMorph(window));\n\t\treturn dialog;\n\t},\n\tshowErrorDialog: function(error) {\n\t\t// Chrome\n\t\tif (error.stack) {\n\t\t\tvar pane = new lively.ide.ErrorStackViewer();\n\t\t\tpane.setError(error);\n\t\t\tpane.open();\n\t\t\treturn\n\t\t};\n\n\t\tvar pane = this.addTextWindow({\n\t\t\tcontent: \"\",\n\t\t\ttitle: \"Error\", \n\t\t});\n\t\tpane.owner.setPosition(this.positionForNewMorph(pane))\n\t\tLastPane = pane\n\n\t\t// Safari\n\t\tif (error.expressionEndOffset && error.expressionBeginOffset && error.sourceURL) {\n\t\t\t// works under Safari 5\n\t\t\tvar urlString = error.sourceURL;\n\t\t\tvar source = new WebResource(new URL(urlString)).get().content\n\t\t\tthis.showErrorDiaglogInWorkspace(source, error.expressionBeginOffset, error.expressionEndOffset, pane)\n\t\t\tpane.owner.setTitle('Error:' + urlString)\n\t\t\treturn pane\n\t\t}\n\n\t\tif (error.expressionEndOffset && error.expressionBeginOffset && error.sourceId) {\n\t\t\tvar sourceReference = EvalSourceRegistry.current().sourceReference(error.sourceId);\n\t\t\tif (sourceReference !== undefined) {\n\t\t\t\tconsole.log('error ' + printObject(error))\n\t\t\t\tvar expressionBeginOffset = error.expressionBeginOffset - sourceReference.evalCodePrefixLength;\n\t\t\t\tvar expressionEndOffset = error.expressionEndOffset - sourceReference.evalCodePrefixLength;\n\t\t\t\tthis.showErrorDiaglogInWorkspace(sourceReference.sourceString, expressionBeginOffset, expressionEndOffset, pane)\n\t\t\t\tif (sourceReference.morph) {\n\t\t\t\t\tsourceReference.morph.showError(error, (sourceReference.offset || 0) - sourceReference.evalCodePrefixLength)\n\t\t\t\t}\n\n\t\t\t\treturn pane\n\t\t\t}\n\t\t} \n\n\t\t// Fallback...\n\t\tpane.innerMorph().setTextString(printObject(error))\t\n\t\treturn pane\n\t},\nlogError: function(er) {\n\tLastError = er;\n\tvar msg = \"\" + er\n\tvar world = this;\n\tthis.setStatusMessage(msg, Color.red, 15, \n\t\tfunction() {\n\t\t\tworld.showErrorDialog(er)\n\t\t},\n\t\t{fontSize: 12, fillOpacity: 1});\n},\n\n\tshowErrorDiaglogInWorkspace: function(source, expressionBeginOffset, expressionEndOffset, pane) {\n\t\t// PRIVATE HELPER\n\t\tconsole.log(\"begin \" + expressionBeginOffset + \" end \" + expressionEndOffset)\n\t\tvar start = source.lastIndexOf(\"\\n\\n\", expressionBeginOffset)\n\t\tif (start == -1) start = 0;\n\t\tvar startOffset = expressionBeginOffset - start;\n\t\tvar stop = source.indexOf(\"\\n\", expressionEndOffset + 1);\n\t\tif (stop != -1)\tstop = source.indexOf(\"\\n\", stop + 1);\n\t\tif (stop != -1)\tstop = source.indexOf(\"\\n\", stop + 1);\n\n\t\tif (stop == -1) stop = source.length;\n\n\t\tconsole.log(\"source: \" + source + \"| \" + source.length+\" expressionEndOffset: \" + expressionEndOffset)\n\t\tvar excerpt = source.slice(start, stop)\n\t\tpane.innerMorph().setTextString(excerpt)\n\n\t\tpane.innerMorph().emphasizeFromTo({color: Color.red}, \n\t\t\tstartOffset, startOffset + expressionEndOffset - expressionBeginOffset);\n\t\tpane.innerMorph().replaceSelectionWith\n\t\tconsole.log(\"found excerpt: \" + excerpt + \" start: \" + start + \" stop:\" + stop)\n\t},\n},\n'new content', {\n \n\taddFramedMorph: function(morph, title, optLoc, optSuppressControls) {\n\t\tvar displ = pt(5, 5);\n\t\tvar w = this.addMorphAt(\n\t\t\tnew WindowMorph(morph, title, optSuppressControls), \n\t\t\toptLoc || this.positionForNewMorph(morph).subPt(displ));\n\t\tw.adjustForNewBounds(); // hack\n\t\treturn w\n\t},\n\n\taddTextWindow: function(spec) {\n\t\t// FIXME: typecheck the spec \n\t\tif (Object.isString(spec.valueOf())) spec = {content: spec}; // convenience\n\t\tvar extent = spec.extent || pt(500, 200);\n\t\tvar pane = this.internalAddWindow(\n\t\t\t\tnewTextPane(extent.extentAsRectangle(), spec.content || \"\"),\n\t\t\t\tspec.title, spec.position);\n\t\tif (spec.acceptInput !== undefined) pane.innerMorph().acceptInput = spec.acceptInput;\n\t\tif (spec.plug) pane.connectModel(spec.plug, true);\n\t\treturn pane;\n\t},\n\n\taddTextListWindow: function(spec) {\n\t\t// FIXME: typecheck the spec \n\t\tif (spec instanceof Array) spec = {content: spec }; // convenience\n\t\tvar content = spec.content;\n\t\tif (!content) content = \"\";\n\t\tif (!(content instanceof Array)) content = [content];\n\t\tvar extent = spec.extent || pt(500, Math.min(300, content.length * TextMorph.prototype.fontSize * 1.5));\n\t\tvar rec = extent.extentAsRectangle();\n\t\tvar pane = this.internalAddWindow(newTextListPane(rec, content), spec.title, spec.position);\n\t\tif (spec.plug) pane.connectModel(spec.plug, true);\n\t\treturn pane;\n\t},\n\n\tinternalAddWindow: function(pane, titleSpec, posSpec) {\n\t\tvar pos = (posSpec instanceof Point) ? posSpec : undefined;\n\t\tpane.setBorderWidth(2); pane.setBorderColor(Color.black);\n\t\tvar win = this.addFramedMorph(pane, String(titleSpec || \"\"), pos || this.firstHand().position().subPt(pt(5, 5)));\n\t\tif (posSpec == \"center\") {\n\t\t\twin.align(win.bounds().center(), this.viewport().center());\n\t\t}\n\t\treturn pane;\n\t},\n\n\n\taddMorphFrontOrBack: function($super, m, front) {\n\t\tvar oldTop = this.topWindow();\n\t\tvar result = $super(m, front);\n\t\tif (!front || !(m instanceof WindowMorph)) return result;\n\t\t// if adding a new window on top, then make it active\n\t\tif (oldTop) oldTop.titleBar.highlight(false);\n\t\tm.takeHighlight();\n\t\treturn result;\n\t},\n\n\ttopWindow: function() {\n\t\tfor (var i= this.submorphs.length - 1; i >= 0; i--) {\n\t\t\tvar sub = this.submorphs[i];\n\t\t\tif (sub instanceof WindowMorph) return sub;\n\t\t}\n\t\treturn null;\n\t},\n\n\tpositionForNewMorph: function(newMorph, relatedMorph) {\n\t\t// this should be much smarter than the following:\n\t\tif (relatedMorph)\n\t\t\treturn relatedMorph.bounds().topLeft().addPt(pt(5, 0));\n\t\tvar pos = this.firstHand().getPosition();\n\t\tif (!newMorph) return pos;\n\t\tvar viewRect = this.windowBounds();\n\t\tvar newMorphBounds = pos.extent(newMorph.getExtent());\n\t\tif (viewRect.containsRect(newMorphBounds)) return pos;\n\t\treturn viewRect.center().subPt(newMorphBounds.extent().scaleBy(0.5));\n\t},\n\n\treactiveAddMorph: function(morph, relatedMorph) { \t// add morph in response to a user action, make it prominent\n\t\treturn this.addMorphAt(morph, this.positionForNewMorph(morph, relatedMorph));\n\t},\n \n resizeByUser: function() {\n var world = this;\n var cb = function(newSizePtLiteral) {\n \t try {\n \t var newPoint = eval(newSizePtLiteral);\n \t basicResize(world, world.canvas(), newPoint.x, newPoint.y);\n } catch(e) {\n \t world.alert('Wrong input ' + newSizePtLiteral);\n \t\t }\n \t};\n \tworld.prompt('Enter extent', cb, world.bounds().bottomRight().toString());\n },\n\n\taddProgressBar: function(optPt) {\n\t\tvar center = optPt || this.windowBounds().center()\n\t\tvar progressBar = new ProgressBarMorph(new Rectangle(0,0, 450, 30))\n\t\tthis.addMorph(progressBar);\n\t\tprogressBar.align(progressBar.bounds().center(), center);\n\t\tprogressBar.ignoreEvents();\n\t\treturn progressBar\n\t},\n}, \n'Requirements', {\n\t// this.world().showAddWorldRequirementsMenu(pt(100,100))\n\tshowAddWorldRequirementsMenu: function(pos) {\n\t\t\tvar ignoreModules = \"lively.Widgets lively.WikiWidget lively.Data lively.Base lively.defaultconfig lively.CanvasExpt lively.obsolete lively.Helper lively.miniprototype lively.demofx lively.Text lively.EmuDom lively.Core lively.bindings lively.rhino-compat lively.Tools lively.localconfig lively.Main lively.Network lively.scene lively.simpleMain lively.ChangeSet lively.ide\".split(\" \")\n\n\t\t\tvar items = ['apps', 'lively', 'Tests', 'draft']\n\t\t\t\t.select(function(ea){\n\t\t\t\t\treturn new WebResource(new URL(Config.codeBase).withFilename(ea)).exists()})\n\t\t\t\t.collect(function(eaDir) {\n\t\t\treturn [eaDir, ChangeSet.current()\n\t\t\t\t.moduleNamesInNamespace(eaDir)\n\t\t\t\t.sort()\n\t\t\t\t.reject(function(ea) { return ignoreModules.include(ea) })\n\t\t\t\t.collect(function(ea){ \n\t\t\t\t\treturn [ea, function(){\n\t\t\t\t\t\tmodule(ea).load();\n\t\t\t\t\t\tChangeSet.current().addWorldRequirement(ea);\n\t\t\t\t\t\tthis.alert(\"load \" + ea + \" module\")}\n\t\t\t\t]}\n\t\t\t)]\n\t\t});\n\n\t\tvar menu = new MenuMorph(items, this.world());\n\t\tmenu.openIn(this.world(), pos, false, \n\t\t\t\"require module for this page\");\n\n\t},\n\t// this.world().showRemoveWorldRequirementsMenu(pt(100,100))\n\tshowRemoveWorldRequirementsMenu: function(pos) {\n\t\tvar pageModules = ChangeSet.current().getWorldRequirementsList().evaluate() \n\t\tvar items = pageModules\n\t\t\t.sort()\n\t\t\t.collect(function(ea){ \n\t\t\treturn [ea, function(){\n\t\t\t\tChangeSet.current().removeWorldRequirement(ea);\n\t\t\t\tthis.alert(\"remove \" + ea + \" module requirement\")}]\n\t\t})\n\t\tvar menu = new MenuMorph(items, this.world())\n\t\tmenu.openIn(this.world(), pos, false, \n\t\t\t\"remove module requirement for this page\");\n\t}\n},\n'Feedback and Saving', {\n\n\tpromptAndSaveWorld: function(asJson) {\n\t\tthis.prompt(\"world file (.xhtml)\", function(filename) {\n\t\t\tif (!filename.endsWith('.xhtml')) filename += '.xhtml'\n\t\t\tvar start = new Date().getTime();\t\n\t\t\tvar onFinish = function(url) {\n\t\t\t\tWorldMorph.current().setStatusMessage('goto ' + url, Color.green, undefined, \n\t\t\t\t\tfunction(){ window.open(url)});\n\n\t\t\t\tif (Config.changeLocationOnSaveWorldAs)\n\t\t\t\t\twindow.location = url;\n\t\t\t};\n\t\t\tif (asJson) this.saveWorldWithJSON(filename, onFinish);\n\t\t\telse this.exportLinkedFile(filename);\n\t\t\tvar time = new Date().getTime() - start;\n\t\t\tthis.setStatusMessage(\"world save as \" + filename + \" in \" + time + \"ms\", Color.green, 3)\t\n\n\n\t\t}.bind(this)); \n\t},\n\n\tsaveWorldWithJSON: function(optURLOrPath, optOnFinish) {\n\t\tvar world = this,\n\t\t\turl = optURLOrPath || URL.source,\n\t\t\tstart = new Date().getTime(),\n\t\t\tonFinished = function(status) {\n\t\t\t\tif (!status.isDone() || !status.isSuccess()) return;\n\t\t\t\tvar time = new Date().getTime() - start;\n\t\t\t\tworld.setStatusMessage(\"world saved to \" + url + \" in \" + time +\n\t\t\t\t\t\"ms \\n(\" + time + \"ms serialization)\", Color.green, 3)\n\t\t\t\toptOnFinish && optOnFinish.call(this, url);\n\t\t\t};\n\t\t\t\n\t\t// make relative to absolute URL\n\t\ttry { url = new URL(url) } catch(e) { url = URL.source.withFilename(url) };\n\t\tvar warnIfOverriden = url.toString() === URL.source.toString();\n\t\trequire(\"lively.persistence.Serializer\").toRun(function() {\n\t\t\tif (world._statusMessageContainer) world._statusMessageContainer.remove();\n\t\t\tvar doc = lively.persistence.Serializer.serializeWorld(world),\n\t\t\t\ttitleTag = doc.getElementsByTagName('title')[0];\n\t\t\tif (titleTag) titleTag.textContent = url.filename().replace('.xhtml', '');\n\t\t\tnew DocLinkConverter(URL.codeBase, url.getDirectory()).convert(doc);\n\t\t\tExporter.saveDocumentToFile(doc, url, onFinished, warnIfOverriden);\n\t\t});\n\n\t\treturn url;\n\t},\n\t\n\tsaveWorld: function(optURLOrPath) {\n\t\tvar url = optURLOrPath || URL.source;\n\t\t// make relative to absolute URL\n\t\ttry { url = new URL(url) } catch(e) { url = URL.source.withFilename(url) };\n\t\tvar start = new Date().getTime(),\n\t\t\tself = this,\n\t\t\tserializeTime,\n\t\t\tonFinished = function() {\n\t\t\t\tvar time = new Date().getTime() - start;\n\t\t\t\tself.setStatusMessage(\"world saved to \" + url +\n\t\t\t\t\t\" in \" + time + \"ms \\n(\" + serializeTime + \"ms serialization)\", Color.green, 3);\n\t\t\t\t},\n\t\t\tstatusMessage = WorldMorph.current().setStatusMessage(\"serializing....\");\n\t\t(function() {\n\t\t\tvar doc, world = this, oldHand = this.firstHand(),\n\t\t\t\toldKeyboardFocus = oldHand.keyboardFocus;\n\t\t\tthis.removeHand(oldHand);\n\t\t\ttry {\n\t\t\t\tdoc = Exporter.shrinkWrapMorph(this.world());\n\t\t\t} catch(e) {\n\t\t\t\tthis.setStatusMessage(\"Save failed due to:\\n\" + e, Color.red, 10, function() {\n\t\t\t\t\tworld.showErrorDialog(e)\n\t\t\t\t})\n\t\t\t} finally {\n\t\t\t\tthis.addHand(oldHand);\n\t\t\t\tconsole.log(\"setting back keyboard focus to\" + oldKeyboardFocus)\n\t\t\t\tif (oldKeyboardFocus)\n\t\t\t\t\toldKeyboardFocus.requestKeyboardFocus(oldHand);\n\t\t\t}\n\t\t\tnew DocLinkConverter(URL.codeBase, url.getDirectory()).convert(doc);\n\t\t\tstatusMessage.remove();\n\t\t\t(function removeJSONIfPresent() {\n\t\t\t\tvar jsonEl = doc.getElementById('LivelyJSONWorld');\n\t\t\t\tif (jsonEl) jsonEl.parentNode.removeChild(jsonEl);\n\t\t\t})()\n\t\t\tserializeTime = new Date().getTime() - start;\n\t\t\t(function() {\n\t\t\t\tExporter.saveDocumentToFile(doc, url, onFinished);\n\t\t\t}).bind(this).delay(0);\n\t\t}).bind(this).delay(0);\n\t\treturn url;\n\t},\n\n\twindowBounds: function () {\n\t\tvar canvas = this.canvas();\n\t\tvar scale = 1/this.world().getScale();\n\t\tvar topLeft = pt(Global.pageXOffset - (canvas.offsetLeft || 0), Global.pageYOffset - (canvas.offsetTop || 0));\n\t\tvar width = Math.min(\n\t\t\tGlobal.document.documentElement.clientWidth * scale,\n\t\t\tWorldMorph.current().getExtent().x);\n\t\tvar height = Math.min(\n\t\t\tGlobal.document.documentElement.clientHeight * scale,\n\t\t\tWorldMorph.current().getExtent().y)\n\t\treturn topLeft.scaleBy(scale).extent(pt(width, height));\n\t},\n\t\n\tvisibleBounds: function() {\n\t\tvar windowBounds = this.windowBounds();\n\t\tvar worldBounds = this.shape.bounds(); // use shape so no stick-outs are included\n\t\tvar upperLeft = pt(Math.max(windowBounds.x, worldBounds.x), Math.max(windowBounds.y, worldBounds.y));\n\t\tvar lowerRight = pt(Math.min(windowBounds.width, worldBounds.width), Math.min(windowBounds.height, worldBounds.height));\n\t\treturn upperLeft.extent(lowerRight);\n\t},\n\n\tensureStatusMessageContainer: function() {\n\t\tif (!this._statusMessageContainer || ! this._statusMessageContainer.owner) {\n\t\t\tthis._statusMessageContainer = new StatusMessageContainer();\n\t\t\tthis._statusMessageContainer.setName(\"statusMorphContainer\");\n\t\t\tthis.addMorph(this._statusMessageContainer);\n\t\t\tthis._statusMessageContainer.startUpdate();\n\t\t};\n\t\treturn this._statusMessageContainer\n\t},\n\n\tsetStatusMessage: function(msg, color, delay, callback, optStyle, messageKind) {\n\t\tvar container = this.ensureStatusMessageContainer();\n\t\treturn container.addStatusMessage(msg, color, delay, callback, optStyle, messageKind);\n\t},\t\n\n\tshowStatusProgress: function(msg) {\n\t\tvar container = this.ensureStatusMessageContainer();\n\t\tvar progressBar = container.addProgressBar(msg);\t\t\n\t\treturn progressBar\n\t},\n\t\n\taskForWorldTitle: function() {\n\t\tvar self = this;\n\t\tthis.prompt('new world title', function(input) {\n\t\t\tdocument.title = input;\n\t\t\tvar titleTag = document.getElementsByTagName('title')[0];\n\t\t\ttitleTag.textContent = input;\n\t\t}, document.title);\n\t},\n\taskForUserName: function() {\n\t\tvar world = this;\n\t\tthis.prompt(\"Please, give your username\", function(name) {\n\t\t\tif (name) {\n\t\t\t\talertOK(\"setting username to: \" + name)\n\t\t\t\tworld.setCurrentUser(name);\n\t\t\t} else {\n\t\t\t\talertOK(\"removing username\")\n\t\t\t\tworld.setCurrentUser(undefined);\n\t\t\t}\n\t\t})\n\t},\n\tsetCurrentUser: function(username) {\n\t\tthis.currentUser = username;\n\t\tif (Global.localStorage)\n\t\t\tlocalStorage.livelyUserName = username;\n\t},\n\n},\n/**\n *\tWorldMorph Menu \n *\n * Question: Should features register itself in the menu, \n * or should the menu give an overview of available features \n * and load the modules on demand?\n */\n'Menus ', {\n\tisProtectedWorld: function() {\n\t\treturn Global.URL && (URL.source.filename() == \"index.xhtml\")\n\t},\n\t\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.keepOnlyItemsNamed([\"inspect\", \"edit style\"]);\n\t\tmenu.addItems([['reset scale', function(evt) {\n\t\t\tvar h = evt.hand, w = h.world();\n\t\t\th.setScale(1); w.setScale(1); w.resizeCanvasToFitWorld();\n\t\t}]]);\n\t\tmenu.addLine();\n\t\tmenu.addItems(this.subMenuItems(evt, menu));\n\t\tmenu.addLine();\n\t\tmenu.addItem([\"save world as ... \", function() { this.promptAndSaveWorld(true/*asJson*/) }]);\n\n\t\tif (!this.isProtectedWorld())\n\t\t\tmenu.addItem([\"save world (s)\", function() { menu.remove(); this.saveWorldWithJSON() }]);\n\n\t\tmenu.addItem([\"download world\", function() {\n\t\t\trequire('lively.persistence.StandAlonePackaging').toRun(function() {\n\t\t\t\tlively.persistence.StandAlonePackaging.packageCurrentWorld();\n\t\t\t});\n\t\t}]);\n\n\t\treturn menu;\n\t},\n\t\n\tsimpleMorphsSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"Line\", function(evt) { \n\t\t\t\tvar p = evt.point(); \n\t\t\t\tvar m = Morph.makeLine([p, p.addXY(60, 30)], 2, Color.black);\n\t\t\t\tworld.addMorph(m);\n\t\t\t\tm.setPosition(evt.point())}],\n\t\t\t[\"Connector\", function(evt) { \n\t\t\t\trequire('lively.Connector').toRun(function() {\n\t\t\t\t\tvar m = Morph.makeConnector(evt.point())\n\t\t\t\t\tworld.addMorph(m);\n\t\t\t\t\tm.setGlobalEndPos(evt.point().addXY(60, 30))\n\t\t\t\t})}],\n\t\t\t[\"Rectangle\", function(evt) { world.addMorph(Morph.makeRectangle(evt.point(), pt(60, 30)));}],\n\t\t\t[\"Ellipse\", function(evt) { world.addMorph(Morph.makeCircle(evt.point(), 25)); }],\n\t\t\t[\"TextMorph\", function(evt) { \n\t\t\t\tvar text = new TextMorph(evt.point().extent(pt(120, 10)), \"This is a TextMorph\");\n\t\t\t\tworld.addMorph(text);}],\n\t\t\t[\"Star\",function(evt) { world.addMorph(Morph.makeStar(evt.point()))}],\n\t\t\t[\"Heart\", function(evt) { world.addMorph(Morph.makeHeart(evt.point()))}],\n\t\t\t[\"Marker\", function(evt) {world.addMorph(new MarkerMorph(evt.point().extent(pt(100, 100))))}]\n\t\t];\n\t},\n\n\tcomplexMorphsSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"ButtonMorph\", function(evt) { world.addMorph(new ScriptableButtonMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t[\"SliderMorph\", function(evt) { world.addMorph(Widget.makeSlider(evt.point().extent(pt(120, 40))))}],\n\t\t\t[\"List pane\", function(evt) {\n\t\t\t\tvar m = world.addMorph(newRealListPane(evt.point().extent(pt(300, 400))));\n\t\t\t\tm.applyStyle({fill: Color.gray, padding: Rectangle.inset(3), suppressHandles: false});\n\t\t\t\tm.adjustForNewBounds(); // for padding\n\t\t\t}],\n \t\t\t[\"Text pane\", function(evt) { \n\t\t\t\tvar m = world.addMorph(newTextPane(evt.point().extent(pt(300, 400)), 'empty'));\n\t\t\t\tm.applyStyle({fill: Color.gray, padding: Rectangle.inset(3), suppressHandles: false});\n\t\t\t\tm.adjustForNewBounds(); // for padding\n\t\t\t}],\n\n\t\t\t// [\"ProgressBarMorph\", function(evt) { world.addMorph(new ProgressBarMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t// [\"ScaleMorph\", function(evt) { world.addMorph(new ScaleMorph(evt.point().extent(pt(70, 30))))}],\n\t\t\t[\"Clock\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar m = world.addMorph(new ClockMorph(evt.point(), 50));\n\t\t\t\t\tm.startSteppingScripts();\n\t\t\t\t\tChangeSet.current().addWorldRequirement('lively.Examples')\n\t\t\t\t})}],\n\t\t\t// [\"FabrikClock\", function(evt) {\n\t\t\t\t// require('lively.Fabrik').toRun(function() {\n\t\t\t\t\t// var clock = new FabrikClockWidget();\n\t\t\t\t\t// var morph = clock.buildView();\n\t\t\t\t\t// world.addMorph(morph);\n\t\t\t\t\t// morph.setPosition(evt.point());\n\t\t\t\t\t// morph.startSteppingScripts(); }); }],\n\t\t\t[\"Piano Keyboard\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar m = new PianoKeyboard(evt.point());\n\t\t\t\t\tm.scaleBy(1.5);\t m.rotateBy(-Math.PI*2/12);\n\t\t\t\t\tworld.addMorph(m); }); }],\n\t\t\t[\"Kaleidoscope\", function(evt) {\n\t\t\t\trequire('lively.Examples').toRun(function() {\n\t\t\t\t\tvar kal = WorldMorph.current().addMorph(new SymmetryMorph(300, 7)); \n\t\t\t\t\tkal.startUp(); }) } ],\n\t\t\t[\"Image Morph\", function(evt) {\n\t\t\t\tworld.prompt('Enter image URL', function(urlString) {\n\t\t\t\t\tvar img = new ImageMorph(evt.point().extent(pt(100,100)), urlString);\n\t\t\t\t\timg.openInWorld() }) }],\n\t\t\t[\"Video Morph\", function(evt) {\n\t\t\t\tVideoMorph.openAndInteractivelyEmbed(evt.point()) }],\n\n\t\t\t// [\"Duplicator Panel\", function(evt) { \n\t\t\t// \trequire('lively.Graffle').toRun(function(){\n\t\t\t// \t\tworld.addMorph(Morph.makeDefaultDuplicatorPanel(evt.point()))\n\t\t\t// \t}); \n\t\t\t// }], \n\t\t\t[\"FileUpload Morph\", function(evt) { \n\t\t\t\trequire('lively.FileUploadWidget').toRun(function(){\n\t\t\t\t\tvar morph = new FileUploadMorph();\n\t\t\t\t\tworld.addMorph(morph)\n\t\t\t\t\tmorph.setPosition(evt.point());\n\t\t\t\t}); \n\t\t\t}],\n\t\t];\n\t},\n\t\n\ttoolSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\tvar toolMenuItems = [\n\t\t\t[\"System code browser (b)\", function(evt) { require('lively.ide').toRun(function(unused, ide) {new ide.SystemBrowser().openIn(world)})}],\n\t\t\t[\"Local code Browser (l)\", function(evt) { require('lively.ide').toRun(function(unused, ide) {new ide.LocalCodeBrowser().openIn(world)})}],\n\t\t\t// [\"Wiki code Browser\", function(evt) { require('lively.ide', 'lively.LKWiki').toRun(function(unused, ide) {\n\t\t\t\t// var cb = function(input) {\n\t\t\t\t\t// var repo = new URL(input);\n\t\t\t\t\t// new ide.WikiCodeBrowser(repo).open()\n\t\t\t\t// };\n\t\t\t\t// world.prompt('Wiki base URL?', cb, URL.source.getDirectory().toString());\n\t\t\t\t// })}],\n\t\t\t// [\"Switch System browser directory...\", function(evt) { require('lively.ide').toRun(function(unused, ide) {\n\t\t\t\t// var cb = function(input) {\n\t\t\t\t\t// if (!input.endsWith('/')) input += '/';\n\t\t\t\t\t// ide.startSourceControl().switchCodeBase(new URL(input));\n\t\t\t\t// };\n\t\t\t\t// world.prompt('Enter System browser directory (URL)', cb, URL.source.getDirectory().toString());\n\t\t\t\t// })}],\t\t\t\t\n\t\t\t[\"TestRunner\", function(evt) { require('lively.TestFramework').toRun(function() { new TestRunner().openIn(world) }) }],\n\t\t\t// [\"OMetaWorkspace\", function(evt) { require('lively.Ometa').toRun(function() { new OmetaWorkspace().open() }) }],\n\t\t\t[\"Viewer for latest file changes\", function(evt) {\n\t\t\t\tvar cb = function(input) {\n\t\t\t\t\trequire('lively.LKWiki').toRun(function(u,m) {\n\t\t\t\t\t\tvar url = new URL(input);\n\t\t\t\t\t\tconsole.log(url);\n\t\t\t\t\t\tnew LatestWikiChangesList(url).openIn(world);\n\t\t\t\t}); }\n\t\t\t\tworld.prompt('Url to observe', cb, URL.source.getDirectory().toString()); \n\t\t\t}],\n\t\t\t[\"Version Viewer\", function(evt) {\n\t\t\t\trequire('lively.ide').toRun(function() {\n\t\t\t\t\tChangeSet.current().addWorldRequirement('lively.ide');\n\t\t\t\t\tnew lively.ide.FileVersionViewer().openForURL(URL.source);\n\t\t\t\t});\n\t\t\t}],\n\t\t\t[\"MiniMap\", function(evt) {\n\t\t\t\tvar map = new MiniMapMorph();\n\t\t\t\tmap.name = 'MiniMap';\n\t\t\t\tmap.openInWorld();\n\t\t\t\tmap.setTargetWorld(world);\n\t\t\t\tmap.startSteppingScripts()\n\t\t\t}],\t\t\t\n\t\t\t[\"load Scripting\", function(evt) {\n\t\t\t\tmodule('lively.Scripting').load()\n\t\t\t}],\t\t\t\n\t\t];\n\n\t\treturn toolMenuItems\n\t},\n\n\tscriptingSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"TileScriptingBox\", function(evt) { require('lively.TileScripting').toRun(function() {new lively.TileScripting.TileBox().openIn(world); }) }],\n\t\t\t[\"Fabrik Component Box\", function(evt) { require('lively.Fabrik').toRun(function() { Fabrik.openComponentBox(world); }) }],\n\t\t\t[\"Webcards with name\", function(evt) { require('apps.Webcards').toRun(function(){\n\t\t\t\t\tvar sds = new SimpleDataStore(pt(600, 300));\n\t\t\t\t\tworld.prompt(\"Name of stack:\", sds.openStackWithName.bind(sds));\n\t\t\t\t\tworld.addFramedMorph(sds, 'WebCards', pt(333, 222));\n\t\t\t\t}); \n\t\t\t}],\n \n\t\t];\n\t},\n\n\tpreferencesSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[(Config.usePieMenus ? \"don't \" : \"\") + \"use pie menus\",\n\t\t\t\tfunction() { Config.usePieMenus = !Config.usePieMenus; }],\n\t\t\t[(Morph.prototype.suppressBalloonHelp ? \"enable balloon help\" : \"disable balloon help\"),\n\t\t\t\tthis.toggleBalloonHelp],\n\t\t\t[(HandMorph.prototype.useShadowMorphs ? \"don't \" : \"\") + \"show drop shadows\",\n\t\t\t\tfunction () { HandMorph.prototype.useShadowMorphs = !HandMorph.prototype.useShadowMorphs}],\n\t\t\t[(Config.showGrabHalo ? \"don't \" : \"\") + \"show bounds halos\",\n\t\t\t\tfunction () { Config.showGrabHalo = !Config.showGrabHalo}],\n\t\t\t[HandMorph.prototype.applyDropShadowFilter ? \n\t\t\t\t\"don't use filter shadows\" : \"use filter shadows (if supported)\",\n\t\t\t\tfunction () { \n\t\t\t\t\tHandMorph.prototype.applyDropShadowFilter = !HandMorph.prototype.applyDropShadowFilter}],\n\t\t\t[(Config.isSnappingToGrid ? \"[X]\": \"[]\") + \" snap to grid\",\n\t\t\t\tfunction(){Config.isSnappingToGrid = !Config.isSnappingToGrid}],\n\t\t\t[(Config.changeLocationOnSaveWorldAs ? \"[X]\": \"[]\") + \" change location on save world as\",\n\t\t\t\tfunction(){Config.changeLocationOnSaveWorldAs = !Config.changeLocationOnSaveWorldAs}],\n\t\t\t[\"set username\", this.askForUserName],\n\t\t];\n\t},\n\tpropertiesSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"choose display theme...\", this.chooseDisplayTheme],\n\t\t\t// is now set automatically...\n\t\t\t// [\"change title\", this, 'askForWorldTitle'],\n\t\t\t[\"add module requirements...\",\n\t\t\t\t function(){this.showAddWorldRequirementsMenu(evt.mousePoint)}],\n\t\t\t[\"remove module requirements...\",\n\t\t\t\t function(){this.showRemoveWorldRequirementsMenu(evt.mousePoint)}],\n\t\t\t[\"resize world\", this.resizeByUser],\n\t\t];\n\t},\n\n\tdeprecatedSubMenuItems: function(evt, menu) {\n\t\tvar world = this.world();\n\t\treturn [\n\t\t\t[\"Tools\", [\n\t\t\t\t[\"Class Browser\", function(evt) { new SimpleBrowser().openIn(world, evt.point()); }],\n\t\t\t\t[\"File Browser\", function(evt) { new FileBrowser().openIn(world) }],\n\t\t\t\t[\"Object Hierarchy Browser\", function(evt) { new ObjectBrowser().openIn(world); }],\n\t\t\t\t[\"Console\", function(evt) {world.addFramedMorph(new ConsoleWidget(50).buildView(pt(800, 100)), \"Console\"); }],\n\t\t\t\t[\"XHTML Browser\", function(evt) { \n\t\t\t\t\tvar xeno = new XenoBrowserWidget('sample.xhtml');\n\t\t\t\t\txeno.openIn(world); }],\n\n\t\t\t]],\n\t\t\t[\"Scripting\", this.scriptingSubMenuItems()],\n\t\t\t[\"New subworld (LinkMorph)\", function(evt) { evt.hand.world().addMorph(new LinkMorph(null, evt.point()));}], \n\t\t\t[\"External link\", function(evt) { evt.hand.world().addMorph(new ExternalLinkMorph(URL.source, evt.point()));}],\n\t\t\t[\"authenticate for write access\", function() {\n\t\t\t\tnew WebResource(URL.source.withFilename('auth')).put();\n\t\t\t\t// sometimes the wikiBtn seems to break after an authenticate\n\t\t\t\tif (Config.showWikiNavigator) WikiNavigator.enableWikiNavigator(true); }],\n\n\t\t\t[\"save world as ... (XML)\", function() { this.promptAndSaveWorld() }],\n\t\t\t[\"save world (XML)\", function() { \n\t\t\t\tmenu.remove(); \n\t\t\t\tthis.saveWorld();\n\t\t\t}],\n\n\t\t];\n\t},\n\n\t\n\thelpSubMenuItems: function(evt) {\n\t\treturn\t[\n\t\t\t[\"Connect documentation\", function(evt) {\n\t\t\t\trequire('lively.bindings').toRun(function() {\n\t\t\t\t\tworld.openURLasText(new URL(\"http://lively-kernel.org/trac/wiki/ConnectHelp?format=txt\"), \"Connect documentation\");\n\t\t\t\t})}],\n\t\t\t[\"Command key help\", function(evt) {\n\t\t\t\tthis.openURLasText(new URL(\"http://lively-kernel.org/trac/wiki/CommandKeyHelp?format=txt\"), \"Command key help\"); }],\n\t\t];\n\t},\n\t\n\tdebuggingSubMenuItems: function(evt) {\n\t\tvar world = this.world();\n\t\tvar items = [\n\t\t\t[\"FrameRateMorph\", function(evt) {\n\t\t\t\tvar m = world.addMorph(new FrameRateMorph(evt.point().extent(pt(160, 10)), \"FrameRateMorph\"));\n\t\t\t\tm.startSteppingScripts(); }],\n\t\t\t[\"EllipseMaker\", function(evt) {\n\t\t\t\tvar m = world.addMorph(new EllipseMakerMorph(evt.point()));\n\t\t\t\tm.startSteppingScripts(); }],\n\t\t\t['World serialization info', function() {\n\t\t\t\trequire('lively.persistence.Debugging').toRun(function() {\n\t\t\t\t\tvar json = lively.persistence.Serializer.serialize(world),\n\t\t\t\t\t\tprinter = lively.persistence.Debugging.Helper.listObjects(json);\n\t\t\t\t\tworld.addTextWindow(printer.toString());\n\t\t\t\t});\n\t\t\t}],\n\t\t\t['inspect ticking scripts', function() {\n\t\t\t\tworld.inspectScheduledActions();\n\t\t\t}],\n\t\t\t[\"Enable profiling\", function() {\n\t\t\t\tConfig.debugExtras = true;\n\t\t\t\tlively.lang.Execution.installStackTracers(); }],\n\t\t\t[\"Call Stack Viewer\", function(evt) { \n\t\t\t\tif (Config.debugExtras) lively.lang.Execution.showStack(\"use viewer\");\n\t\t\t\telse new StackViewer(this).openIn(world); }],\n\t\t\t[\"restart system\", this.restart],\n\t\t];\n\n\n\t\tif (!Config.debugExtras) return items;\n\n\t\tvar index = -1;\n\t\tfor (var i=0; i> pasteComponentFromXMLStringIntoFabrik\n\t// TODO refactor\n\tpasteFromSource: function(source){\n\t\tvar copier = new ClipboardCopier();\n\t\tcopier.pastePosition = this.pastePosition();\n\t\tcopier.pasteMorphsFromSource(source, this.pasteDestinationMorph());\n\t},\n\t\n\tcopySelectionAsXMLString: function() {\n\t\tif (!this.currentSelection) {\n\t\t\tconsole.log(\"WorldMorph: don't know what to copy\")\n\t\t\treturn\n\t\t}\n\t\tvar selectedMorphs = this.currentSelection.selectedMorphs\n\t\tif (selectedMorphs.length == 0) {\n\t\t\tconsole.log(\"WorldMorph: selection is empty\")\n\t\t\treturn \n\t\t};\n\t\treturn new ClipboardCopier().copyMorphsAsXMLString(selectedMorphs)\n\t},\n\n\tpasteDestinationMorph: function() {\n\t\treturn this;\n\t},\n\t\n\t\n},\n'Keyboard Events',{\n\n\ttakesKeyboardFocus: Functions.True,\n\t\n\tonKeyDown: function(evt) {\n\t\t// alert(\"WorldMorph onKeyDown \" + this + \" --- \" + evt + \" char: \" + evt.getKeyChar() )\n\t\tvar key = evt.getKeyChar();\n\t\tif (! key.toLowerCase)\n\t\t\treturn;\n\n\t\tkey = key.toLowerCase();\n\n\t\tif ( evt.isAltDown()) {\n\t\t\tif (key == 'c') {\n\t\t\t\tthis.doCopyStyle()\n\t\t\t\tevt.stop()\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (key == 'v') {\n\t\t\t\tthis.doPasteStyle()\n\t\t\t\tevt.stop()\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif ( evt.isCommandKey() && evt.isShiftDown()) {\n\t\t\tif (key == 'f') {\n\t\t\t\tvar world = this;\n\t\t\t\trequire('lively.ide').toRun(function(unused, ide) {\n\t\t\t\t\tworld.prompt(\"browse references in source\", function(whatToSearch) {\n\t\t\t\t\t\tide.startSourceControl().browseReferencesTo(whatToSearch);\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (key == 'b') {\n\t\t\t\t// for safari where without shift is blocked\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.SystemBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (evt.isCommandKey() && !evt.isShiftDown()) {\n\t\t\tif (key == 'b') {\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.SystemBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 'l') { // (L)ocal code browser\n\t\t\t\t// new ConsoleWidget().open();\n\t\t\t\trequire('lively.ide').toRun(function() { new lively.ide.LocalCodeBrowser().open() });\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 'k') { // Workspace\n\t\t\t\tthis.addTextWindow(\"Workspace\");\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (key == 's') { // save\n\t\t\t\tif (!this.isProtectedWorld()) {\n\t\t\t\t\tthis.saveWorldWithJSON();\n\t\t\t\t} else {\n\t\t\t\t\tthis.setStatusMessage(\"Warning: Did not save world, because it is protected!\", Color.red, 3)\n\t\t\t\t}\n\t\t\t\tevt.stop();\n\t\t\t\treturn true;\n\n\t\t\t}\n\t\t}\n\t\treturn ClipboardHack.tryClipboardAction(evt, this);\n\t},\n\t\n\tonKeyPress: function(evt) {\n\t\t// do nothing\n\t\t// console.log(\"World onKeyPress \" + evt + \" char: \" + evt.getKeyChar())\n\t\treturn false;\n\t},\n\n\tonKeyUp: function(evt) {\n\t\t// do nothing\n\t\t// console.log(\"World onKeyUp \" + evt + \" char: \" + evt.getKeyChar())\n\t\treturn false\n\t},\n},\n'Commands',{\n\n\tdoCopy: function() {\n\t\tvar source = this.copySelectionAsXMLString();\n\t\tTextMorph.clipboardString = source;\n\t},\n\t\n\tdoPaste: function() {\n\t\tif (TextMorph.clipboardString) {\n\t\t\t// console.log(\"paste morphs...\")\n\t\t\tthis.pasteFromSource(TextMorph.clipboardString);\n\t\t}\n\t},\n\tdoCopyStyle: function() {\n\t\tvar target = this.firstHand().keyboardFocus;\n\t\tif (this.currentSelection && this.currentSelection.selectedMorphs.length > 0) {\n\t\t\ttarget = this.currentSelection.selectedMorphs[0]\n\t\t};\n\n\t\talert('copy style: ' + target)\n\t\tif (target)\n\t\t\tnew StyleCopier().copyFromMorph(target)\n\t\telse\n\t\t\talert(\"no target\")\n\t},\n\tdoPasteStyle: function() {\n\t\tvar targets\n\t\tif (this.currentSelection && this.currentSelection.selectedMorphs.length > 0) {\n\t\t\ttargets = this.currentSelection.selectedMorphs\n\t\t} else {\n\t\t\ttargets = [this.firstHand().keyboardFocus];\n\t\t}\n\t\ttargets.forEach(function(ea){\n\t\t\tnew StyleCopier().pasteToMorph(ea)\n\t\t})\t\n\t},\n\n\n\t\n\tdoCut: function() {\n\t\tconsole.log(\"cut selection\")\n\t\tthis.doCopy();\n \t\tif (this.currentSelection) \n\t\t\tthis.currentSelection.remove();\n\t},\n},\n'local code', {\n\tgetChangeSet: function() {\n\t\treturn ChangeSet.fromWorld(this);\n\t},\n\tsetChangeSet: function(cs) {\n\t\tcs.addHookTo(cs.findOrCreateDefNodeOfWorld(this.rawNode));\n\t},\n\n\tgetCodeNode: function() {\n\t\tvar codeElement = Query.find('./svg:defs/*[local-name()=\"code\"]', this.rawNode);\n\t\treturn codeElement;\n\t},\n\treplaceCodeNode: function(newCodeNode) {\n\t\tthis.getDefsNode().replaceChild(this.getCodeNode(), newCodeNode);\n\t\treturn newCodeNode;\n\t},\n\n\n\n},'signals',{\n\tsignalGeometryChange: function() {\n\t\tsignal(this, 'geometryChanged')\n\t\t// don't go to the submorphs\n\t},\n\n})\n\n\nObject.extend(WorldMorph, { \n worldCount: 0,\n \n currentWorld: null,\n \n current: function() {\n return WorldMorph.currentWorld;\n }\n});\n\n\n\n/**\n * @class HandMorph\n * Since there may be multiple users manipulating a Morphic world\n * simultaneously, we do not want to use the default system cursor. \n */ \n\nMorph.subclass(\"HandMorph\", \n'default properties', { \n documentation: \"Defines a visual representation for the user's cursor.\",\n applyDropShadowFilter: !!Config.useDropShadow,\n dropShadowFilter: \"url(#DropShadowFilter)\",\n useShadowMorphs: Config.useShadowMorphs,\n\n shadowOffset: pt(8,8),\n handleOnCapture: false,\n logDnD: Config.logDnD,\n grabHaloLabelStyle: {fontSize: Math.floor((Config.defaultFontSize || 12) *0.85), padding: Rectangle.inset(0)},\n\n},\n'Basic',{\n initialize: function($super, local) {\n $super(new lively.scene.Polygon([pt(0,0), pt(10, 8), pt(4,9), pt(8,16), pt(4,9), pt(0, 12)]));\n\t\tthis.applyStyle({fill: local ? Color.primary.blue : Color.primary.red, borderColor: Color.black, borderWidth: 1});\n\t\n this.isLocal = local;\n\n this.keyboardFocus = null;\n this.mouseFocus = null;\n\t\tthis.mouseFocusChanges_ = 0; // count mouse focus changes until reset\n this.mouseOverMorph = null;\n this.lastMouseEvent = null;\n this.lastMouseDownPoint = pt(0,0);\n this.lastMouseDownEvent = null;\n this.hasMovedSignificantly = false;\n this.grabInfo = null;\n \n this.mouseButtonPressed = false;\n\n this.keyboardFocus = null; \n\n this.priorPoint = null;\n this.owner = null;\n\t\tthis.boundMorph = null; // surrounds bounds\n\t\tthis.layoutChangedCount = 0; // to prevent recursion on layoutChanged\n return this;\n },\n\n\tid: function() {\n\t\tif (!this.rawNode) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn this.rawNode.getAttribute(\"id\");\n\t},\n\n world: function() {\n return this.owner;\n },\n},\n'Looks',{\n\n lookNormal: function(morph) {\n this.shape.setVertices([pt(0,0), pt(10, 8), pt(4,9), pt(8,16), pt(4,9), pt(0, 12)]);\n },\n\t\n\tlookTouchy: function(morph) {\n\t\t// Make the cursor look polygonal to indicate touch events go to pan/zoom\n\t\tvar n = 5, r = 10, theta = 2*Math.PI/n;\n\t\tvar verts = [0, 1, 2, 3, 4, 0].map(function(i) { return Point.polar(r, i*theta).addXY(20,0) });\n\t\tthis.shape.setVertices(verts);\n },\n\n\n lookLinky: function(morph) {\n this.shape.setVertices([pt(0,0), pt(18,10), pt(10,18), pt(0,0)]);\n },\n\n\tlookLikeAnUpDownArrow: function() {\n\t\t// /\\\n\t\t// /_ _\\\n\t\t// _||_\n\t\t// \\ /\n\t\t// \\/\n\t\tvar verts = [\n\t\t\tpt(8.0,0.0), pt(16.0,8.0), pt(12.0,8.0), pt(12.0,16.0), pt(16.0,16.0),\n\t\t\tpt(8.0,24.0), pt(0.0,16.0), pt(4.0,16.0), pt(4.0,8.0), pt(0.0,8.0)\n\t\t];\n\t\tthis.shape.setVertices(verts);\n\t},\n},\n'Event Registering',{\n\taddOrRemoveEvents: function(morphOrNode, eventNames, isRemove) {\n\t\tvar node = morphOrNode.rawNode || morphOrNode;\n\t\tvar selector = isRemove ? 'removeEventListener' : 'addEventListener';\n\t\teventNames.forEach(function(name) { \n node[selector](name, (!UserAgent.isIE ? this : this.handleEvent.bind(this)), this.handleOnCapture);\n\t\t}, this);\n\t},\n\t\n registerForEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.basicInputEvents);\n },\n\n unregisterForEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.basicInputEvents, true);\n },\n \n registerForKeyboardEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.keyboardEvents);\n },\n\n unregisterForKeyboardEvents: function(morphOrNode) {\n\t\tthis.addOrRemoveEvents(morphOrNode, Event.keyboardEvents, true);\n },\n\n},\n'Focus',{\n resetMouseFocusChanges: function() {\n\t\tvar result = this.mouseFocusChanges_;\n\t\tthis.mouseFocusChanges_ = 0;\n\t\treturn result;\n },\n\n setMouseFocus: function(morphOrNull) {\n //console.log('setMouseFocus: ' + morphOrNull);\n\t\tthis.mouseFocus = morphOrNull;\n\t\t// this.setFill(this.mouseFocus ? Color.primary.blue.lighter(2) : Color.primary.blue);\n\t\tthis.mouseFocusChanges_ ++;\n },\n \n setKeyboardFocus: function(morphOrNull) {\n if (this.keyboardFocus === morphOrNull) return;\n\n if (this.keyboardFocus != null) {\n // console.log('blur %s', this.keyboardFocus);\n this.keyboardFocus.onBlur(this);\n this.keyboardFocus.setHasKeyboardFocus(false);\n }\n \n this.keyboardFocus = morphOrNull; \n \n if (this.keyboardFocus) {\n this.keyboardFocus.onFocus(this);\n }\n },\n \n},\n'Event Handling',{\n\t// this is the DOM Event callback\n\thandleEvent: function HandMorph$handleEvent(rawEvt) {\n\t\tvar evt = new Event(rawEvt);\n\t\t// for mutliple worlds since keyboard events can only be registered for entire documentElement\n\t\tif (rawEvt.world && rawEvt.world != this.world())\n\t\t\treturn evt;\n\t\trawEvt.world = this.world();\n\t\tevt.setCanvas(this.canvas());\n\t\tevt.hand = this;\n\t\t//if(Config.showLivelyConsole) console.log(\"event type = \" + rawEvt.type + \", platform = \" + window.navigator.platform);\n\n\t\tlively.lang.Execution.resetDebuggingStack();\n\t\tswitch (evt.type) {\n\t\t\tcase \"MouseWheel\":\n\t\t\tcase \"MouseMove\":\n\t\t\tcase \"MouseDown\":\n\t\t\tcase \"MouseUp\":\n\t\t\t\tthis.handleMouseEvent(evt);\n\t\t\t\tbreak;\n\t\t\tcase \"KeyDown\":\n\t\t\tcase \"KeyPress\": \n\t\t\tcase \"KeyUp\":\n\t\t\t\tthis.handleKeyboardEvent(evt);\n\t\t\t\tbreak;\n\t\t\tcase \"touchstart\":\n\t\t\tcase \"touchmove\":\n\t\t\tcase \"touchend\": \n\t\t\tcase \"touchcancel\":\n\t\t\t\tthis.handleTouchEvent(evt);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.log(\"unknown event type \" + evt.type);\n\t\t}\n\t\tevt.stopPropagation();\n\t\treturn evt; // for touch development FIXME remove\n\t}.logErrors('Event Handler'),\n\n armProfileFor: function(evtType) { \n\t\tthis.profileArmed = evtType; // either \"MouseDown\" or \"MouseUp\"\n },\n\n\tmakeANullMove: function() {\n\t\t// Process a null mouseMove event -- no change in x, y\n\t\t// Allows simulations to respond where, eg, a morph moves under the mouse\n\t\t// Note: Fabrik generates also Mouse events with newFakeMouseEvent; to be merged\n\t\tvar last = this.lastMouseEvent;\n\t\tif (!last) return;\n\t\tvar nullMove = new Event(last.rawEvent);\n\t\tnullMove.type = \"MouseMove\";\n\t\tnullMove.hand = this;\n\t\t// console.log(\"last = \" + Object.inspect(this.lastMouseEvent));\n\t\t// console.log(\"null = \" + Object.inspect(nullMove));\n\t\tthis.reallyHandleMouseEvent(nullMove);\n\t\tthis.lastMouseEvent = last; // Restore -- necess??\n\t},\n\n\thandleMouseEvent: function HandMorph$handleMouseEvent(evt) {\n\t\tif(!Config.debugExtras || !this.profileArmed || this.profileArmed != evt.type) {\n\t\t\t// Profile not armed or event doesnt match\n\t\t\treturn this.reallyHandleMouseEvent(evt);\n\t\t}\n\t\t// Run profile during handling of this event\n\t\tthis.profileArmed = null; // Only this once\n\t\tvar result;\n\t\tlively.lang.Execution.trace(function() { result = this.reallyHandleMouseEvent(evt) }.bind(this), this.profilingOptions );\n\t\treturn result;\n\t},\n\thandleTouchEvent: function(evt) {\n\t\t// to be implemented \n\t\t// console.log('handle touch event ')\n\t},\n\n\n\treallyHandleMouseEvent: function HandMorph$reallyHandleMouseEvent(evt) { \n\t\t// console.log(\"reallyHandleMouseEvent \" + evt + \" focus \" + this.mouseFocus);\n\t\t// var rawPosition = evt.mousePoint;\n\t\tvar world = this.owner;\n\t\tevt.mousePoint = evt.mousePoint.matrixTransform(world.getTransform().createInverse()); // for scaling\n\t\tevt.setButtonPressedAndPriorPoint(this.mouseButtonPressed, \n\t\t\t\t\t this.lastMouseEvent ? this.lastMouseEvent.mousePoint : null);\n\t\t//-------------\n\t\t// mouse move\n\t\t//-------------\n\t\tif (evt.type == \"MouseMove\" || evt.type == \"MouseWheel\") { // it is just a move\n\t\t\tthis.setPosition(evt.mousePoint);\n\t\t\t\n\t\t\tif(evt.isShiftDown())\n\t\t\t\tthis.alignToGrid();\n\t\t\t\n\t\t\tthis.updateGrabHalo();\n\t\t\t\n\t\t\tif (evt.mousePoint.dist(this.lastMouseDownPoint) > 10) { \n\t\t\t\tthis.hasMovedSignificantly = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.mouseFocus) { // if mouseFocus is set, events go to that morph\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t} else if (world) {\n\t\t\t\tvar receiver = world.morphToReceiveEvent(evt);\n\t\t\t\t// console.log(\"found receiver: \" + receiver)\n\t\t\t\tif (this.checkMouseOverAndOut(receiver, evt)) {\t // mouseOverMorph has changed...\n\t\t\t\t\tif (!receiver || !receiver.canvas()) return false;\t// prevent errors after world-switch\n\t\t\t\t\t// Note if onMouseOver sets focus, it will get onMouseMove\n\t\t\t\t\tif (this.mouseFocus) this.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t\t\telse if (!evt.hand.hasSubmorphs()) world.captureMouseEvent(evt, false); \n\t\t\t\t} else if (receiver) receiver.captureMouseEvent(evt, false);\n\t\t\t}\n\t\t\tthis.lastMouseEvent = evt;\n\t\t\treturn true;\n\t\t} \n\n\t\n\t\t//-------------------\n\t\t// mouse up or down\n\t\t//-------------------\n\t\tif (!evt.mousePoint.eqPt(this.position())) { // Only happens in some OSes\n\t\t\t// and when window wake-up click hits a morph\n\t\t\tthis.moveBy(evt.mousePoint.subPt(this.position())); \n\t\t}\n\n\t\tthis.mouseButtonPressed = (evt.type == \"MouseDown\"); \n\t\tthis.setBorderWidth(this.mouseButtonPressed ? 2 : 1);\n\t\tevt.setButtonPressedAndPriorPoint(this.mouseButtonPressed, this.lastMouseEvent ? this.lastMouseEvent.mousePoint : null);\n\t\n\t\tif (this.mouseFocus != null) {\n\t\t\tif (this.mouseButtonPressed) {\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t\tthis.lastMouseDownPoint = evt.mousePoint; \n\t\t\t} else {\n\t\t\t\tthis.mouseFocus.captureMouseEvent(evt, true);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.hasSubmorphs() && (evt.type == \"MouseDown\" || this.hasMovedSignificantly)) {\n\t\t\t\t// If laden, then drop on mouse up or down\n\t\t\t\tvar m = this.topSubmorph();\n\t\t\t\tvar receiver = world.morphToGrabOrReceiveDroppingMorph(evt, m);\n\t\t\t\t// For now, failed drops go to world; later maybe put them back?\n\t\t\t\tthis.dropMorphsOn(receiver || world);\n\t\t\t} else {\n\t\t\t\t// console.log(\"hand dispatching event %s to owner %s\", evt, this.owner);\n\t\t\t\t// This will tell the world to send the event to the right morph\n\t\t\t\t// We do not dispatch mouseup the same way -- only if focus gets set on mousedown\n\t\t\t\tif (evt.type == \"MouseDown\") world.captureMouseEvent(evt, false);\n\t\t\t}\n\t\t\tif (evt.type == \"MouseDown\") {\n\t\t\t\tthis.lastMouseDownPoint = evt.mousePoint;\n\t\t\t\tthis.lastMouseDownEvent = evt;\n\t\t\t\tthis.hasMovedSignificantly = false; \n\t\t\t}\n\t\t}\n\t\tthis.lastMouseEvent = evt; \n\t\treturn true;\n\t},\n},\n'Misc',{\t\n checkMouseUpIsInClickTimeSpan: function(mouseUpEvent) {\n\t\t// console.log(\"checkMouseUpIsInClickTimeSpan \" + this.lastMouseDownEvent.timeStamp )\n\t\tif (!this.lastMouseDownEvent || !mouseUpEvent)\n\t\t\treturn false;\n\t\treturn (mouseUpEvent.timeStamp - this.lastMouseDownEvent.timeStamp) < (400)\n\t},\n\n checkMouseOverAndOut: function(newMouseOverMorph, evt) {\n\t\tif (newMouseOverMorph === this.mouseOverMorph) return false;\n\n\t\t// if over a new morph, send onMouseOut, onMouseOver\n\t\tif (this.mouseOverMorph) this.mouseOverMorph.onMouseOut(evt);\n\t\tthis.mouseOverMorph = newMouseOverMorph;\n\t\t// console.log('msOverMorph set to: ' + Object.inspect(this.mouseOverMorph));\n\t\tif (this.mouseOverMorph) this.mouseOverMorph.onMouseOver(evt);\n\t\treturn true;\n\t},\n\n layoutChanged: function($super) {\n\t\tthis.layoutChangedCount ++;\n\t\ttry {\n\t\t\t$super();\n\t\t\tif (this.layoutChangedCount == 1) {\n\t\t\t\tConfig.showGrabHalo && this.updateGrabHalo();\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.layoutChangedCount --;\n\t\t}\n },\n},\n'Keyboard Events',{\n\tisKeyDown: function(character) {\n\t\tif (!this.keysDown)\n\t\t\treturn false;\n\t\treturn this.keysDown[character]\n\t},\n\t\n\tforgetKeyDown: function(evt) {\n\t\tif (!this.keysDown)\n\t\t\treturn;\n\t\tthis.keysDown[evt.getKeyChar()] = false;\n\t\t// hack, around weired events when command is pressed\n\t\tif (evt.getKeyCode() == 91) {\n\t\t\t// console.log(\"clear keydown list...\")\n\t\t\tthis.keysDown = {};\n\t\t\n\t\t};\n\t},\n\n\trememberKeyDown: function(evt) {\n\t\tif (!this.keysDown) {\n\t\t\tthis.keysDown = {};\n\t\t};\n \t\t//console.log(\"remember KeyDown \" + evt.getKeyChar())\n\t\tthis.keysDown[evt.getKeyChar().toUpperCase()] = true;\n\t},\n\n handleKeyboardEvent: function(evt) { \n\t\t// console.log(\"event: \" + evt )\n\t\tif(evt.type == \"KeyUp\") {\n \t\t\tthis.forgetKeyDown(evt);\t\t\t\n\t\t};\n if (this.hasSubmorphs()) {\n if (evt.type == \"KeyDown\" && this.moveSubmorphs(evt)) return;\n else if (evt.type == \"KeyPress\" && this.transformSubmorphs(evt)) return;\n }\n\t\tvar consumed = false;\n // manual bubbling up b/c the event won't bubble by itself\n\t\tvar world = this.world();\n for (var responder = this.keyboardFocus || world; responder != null; responder = responder.owner || world) {\n\t\t\tif (responder.takesKeyboardFocus()) {\n var handler = responder[evt.handlerName()];\n if (handler) {\n if (handler.call(responder, evt)) {\n\t\t\t\t\t\tconsumed = true;\n break; // event consumed?\t\t\n\t\t\t\t\t}\n }\n }\n\t\t\tif (responder == world) break;\n }\n\n\t\tif (!consumed) {\n\t\t\t// console.log(\"not consumed \" + evt)\n\t\t\t// the single command key evt \n\t\t\tif (evt.isCommandKey()) // rk: what is that supposed to do?\n\t\t\t\tClipboardHack.selectPasteBuffer();\t\t\t\n\t\t\t\t\n\t\t\t// remember key down for mouse events\n\t\t\tif(evt.type == \"KeyPress\") {\n\t\t\t\tthis.rememberKeyDown(evt);\n\t\t\t};\n\t\t};\n\t\tthis.blockBrowserKeyBindings(evt);\n },\n\t\n blockBrowserKeyBindings: function(evt) {\n\t\tswitch (evt.getKeyCode()) {\n\t\t\tcase Event.KEY_SPACEBAR: // [don't] scroll\n\t\t \t// stop keypress but don't try to stop preceeding keydown,\n\t\t \t// which would prevent keypress from firing and being handled by Text etc\n\t\t \tif (evt.type == \"KeyPress\") evt.stop();\n\t\t \tbreak;\n\t\t case Event.KEY_BACKSPACE: // [don't] go to the previous page \n\t\t \tevt.stop();\n\t\t \tbreak;\n\t\t\tcase 22:\n\t\t\tcase 3:\n\t\t\tcase 24:\n\t\t\t\tif (evt.isCtrlDown() && evt.type == \"KeyPress\") \n\t\t\t\t\tevt.preventDefault(); // ctrl+x, ctrl+c, or ctrl+v pressed\n\t\t\t\tbreak;\n\t\t\t}\n\t\tswitch (evt.getKeyChar()) {\n\t\t\tcase \"[\":\n\t\t\tcase \"]\":\n\t\t \tif (evt.isMetaDown() && evt.type == \"KeyPress\") {\n\t\t\t\t\t// Safari would want to navigate the history\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tbreak;\n\t\t }\n\t\t}\t\n },\n},\n'Geometry',{\n\tbounds: function($super) {\n\t\t// account for the extra extent of the drop shadow\n\t\t// FIXME drop shadow ...\n\t\treturn this.shadowMorph ? $super().expandBy(this.shadowOffset.x) : $super();\n\t},\n\n\tgetInsertPositionFor: function(m, isFront) {\n\t\tif (this.submorphs.length == 0) return this.shape.rawNode;\n\t\treturn isFront ? this.submorphs.last().rawNode : this.submorphs.first().rawNode;\n\t},\n\n toString: function($super) { \n var superString = $super();\n var extraString = Strings.format(\", local=%s,id=%s\", this.isLocal, this.id());\n if (!this.hasSubmorphs()) \n\t\t\treturn superString + \", an empty hand\" + extraString;\n return Strings.format(\"%s, a hand carrying %s%s\", superString, this.topSubmorph(), extraString);\n },\n\n\tsetPosition: function($super, pos) {\n\t\t$super(pos);\n\t\tif (this.hasSubmorphs())\n\t\t\tthis.scrollDuringDrag()\n\t\treturn pos;\n\t},\n},\n'Indicator',{\n\tremoveIndicatorMorph: function() {\n\t\tif (!this.indicatorMorph)\n\t\t\treturn;\n\t\tthis.indicatorMorph.remove();\n\t\tthis.indicatorMorph = undefined;\n\t},\n\n\tensureIndicatorMorph: function() {\n\t\tif (this.indicatorMorph)\n\t\t\treturn this.indicatorMorph;\n\t\tvar morph = new TextMorph(new Rectangle(0,0,100,20));\n\t\tmorph.setPosition(this.shape.bounds().bottomRight().addPt(pt(-5,-5)))\n\t\tmorph.ignoreEvents();\n\t\tmorph.isEpimorph = true;\n\t\tmorph.setBorderWidth(0);\n\t\tmorph.setStrokeOpacity(0);\n\t\tmorph.setFill(null);\n\t\tthis.indicatorMorph = morph;\n\t\tthis.addMorph(morph);\n\t\treturn morph\n\t},\n\n\thasSubmorphs: function() {\n\t\tif (this.submorphs.length == 0)\n\t\t\treturn false;\n\t\telse\n\t\t\treturn this.submorphs.reject(function(ea) {return ea.isEpimorph}).length != 0;\n\t},\n},\n'Scrolling',{\n\tscrollDuringDrag: function(counter) {\n\t\tvar scrollSpeed = 0.3; // should go into config options?\n\t\tvar maxSteps = 30;\n\t\t\n\t\tvar world = this.world();\n\t\tvar wb = world.windowBounds();\n\t\tvar pos = this.getPosition();\n\t\tcounter = counter || 1;\n\t\t\n\t\tvar worldScale = world.getScale();\n\t\tvar steps = counter * scrollSpeed * worldScale;\n\t\tsteps = Math.min(steps, maxSteps);\n\t\tvar animate = false;\n\t\tvar self = this;\n\t\t\n\t\tvar scroll = function(delta) {\n\t\t\tvar oldPos = pt(Global.scrollX, Global.scrollY)\n\t\t\tGlobal.scrollBy(delta.x, delta.y);\t\t\tvar newPos = pt(Global.scrollX, Global.scrollY)\n\t\t\tvar scrollDelta = newPos.subPt(oldPos).scaleBy(1 / worldScale);\n\t\t\tself.moveBy(scrollDelta.scaleBy(1))\n\t\t\tanimate = true;\n\t\t};\n\t\tvar offset = 50\n\t\tif (pos.x + offset > wb.right()) scroll(pt(steps,0));\n\t\tif (pos.x - offset < wb.left()) scroll(pt(-steps,0));\n\t\tif (pos.y - offset < wb.top()) scroll(pt(0, - steps));\n\t\tif (pos.y + offset > wb.bottom()) scroll(pt(0, steps))\n\t\tif (animate) {\n\t\t\t(function(){self.scrollDuringDrag( counter + 1)}).delay()\t\n\t\t}\n\t}\n},\n'Fabrik Extension (DEPRECATED)',{\n changed: function($super, morph) {\n $super();\n this.globalPosition = this.getPosition();\n this.submorphs.forEach(function(ea){\n // console.log(\"changed \"+ ea);\n ea.changed(\"globalPosition\", this.getPosition());\n }, this);\n },\n});\n\nMorph.subclass('LinkMorph', {\n\n documentation: \"two-way hyperlink between two Lively worlds\",\n helpText: \"Click here to enter or leave a subworld.\\n\" +\n \"Use menu 'grab' to move me. Drag objects\\n\" +\n \"onto me to transport objects between worlds.\",\n openForDragAndDrop: false,\n suppressHandles: true,\n\tstyle: {\n\t\tborderColor: Color.black, \n\t\tfill: lively.lang.let(lively.paint, function(g) { \n\t\t\treturn new g.RadialGradient([new g.Stop(0, Color.blue.lighter()) , new g.Stop(0.5, Color.blue), \n\t\t\tnew g.Stop(1, Color.blue.darker())], pt(0.4, 0.2))})\n\t},\n \n\tinitialize: function($super, otherWorld, initialPosition) {\n\t\t// In a scripter, type: world.addMorph(new LinkMorph(null))\n\n\t\t// Note: Initial position can be specified either as a rectangle or point.\n\t\t// If no position is specified, place the icon in the lower left corner\n\t\t// of the screen.\n\t\tinitialPosition = initialPosition || WorldMorph.current().bounds().bottomLeft().addXY(50, -50);\n\t\t$super(new lively.scene.Ellipse(initialPosition, 25));\n\t\tvar bounds = this.shape.bounds();\n\n\t\t// Make me look a bit like a world\n\t\t[new Rectangle(0.15,0,0.7,1), new Rectangle(0.35,0,0.3,1), new Rectangle(0,0.3,1,0.4)].forEach(function(each) {\n\t\t\t// Make longitude / latitude lines\n\t\t\tvar lineMorph = new Morph(new lively.scene.Ellipse(bounds.scaleByRect(each)));\n\t\t\tlineMorph.applyStyle({fill: null, borderWidth: 1, borderColor: Color.black}).ignoreEvents();\n\t\t\tthis.addMorph(lineMorph);\n\t\t}, this);\n\n\t\tif (!otherWorld) {\n\t\t\tthis.myWorld = this.makeNewWorld(this.canvas());\n\t\t\tthis.addPathBack();\n\t\t} else {\n\t\t\tthis.myWorld = otherWorld;\n\t\t}\n\t\treturn this;\n\t},\n \n\tmakeNewWorld: function(canvas) {\n\t\treturn new WorldMorph(canvas);\n\t},\n \n\taddPathBack: function() {\n\t\tvar pathBack = new LinkMorph(WorldMorph.current(), this.bounds().center());\n\n\t\tpathBack.setFill(lively.lang.let(lively.paint, function(gfx) {\n\t\t\treturn new gfx.RadialGradient([new gfx.Stop(0, Color.orange), \n\t\t\tnew gfx.Stop(0.5, Color.red), \n\t\t\tnew gfx.Stop(1, Color.red.darker(2))],\n\t\t\tpt(0.4, 0.2));\n\t\t}));\n\n\t\tthis.myWorld.addMorph(pathBack);\n\t\treturn pathBack;\n\t},\n \n\tonDeserialize: function() {\n\t\t//if (!this.myWorld) \n\t\tthis.myWorld = WorldMorph.current(); // a link to the current world: a reasonable default?\n\t},\n\n\thandlesMouseDown: function(evt) {\n\t\treturn true; \n\t},\n\n\tonMouseDown: function(evt) {\n\t\tthis.enterMyWorld(evt); \n\t\treturn true; \n\t},\n\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.addItem([\"publish linked world as ... \", function() { \n\t\tthis.world().prompt(\"world file (.xhtml)\", this.exportLinkedFile.bind(this)); }]);\n\t\tmenu.replaceItemNamed(\"package\", [\"package linked world\", function(evt) {\n\t\t\tnew PackageMorph(this.myWorld).openIn(this.world(), this.bounds().topLeft()); this.remove()} ]);\n\t\treturn menu;\n\t},\n\n\tenterMyWorld: function(evt) { // needs vars for oldWorld, newWorld\n\t\tcarriedMorphs = [];\n\n\t\t// Save, and suspend stepping of, any carried morphs\n\t\tevt.hand.unbundleCarriedSelection();\n\t\tevt.hand.carriedMorphsDo( function (m) {\n\t\t\tm.suspendAllActiveScripts();\n\t\t\tcarriedMorphs.splice(0, 0, m);\n\t\t\tevt.hand.shadowMorphsDo( function(m) { m.stopAllStepping(); });\n\t\t\tevt.hand.showAsUngrabbed(m);\n\t\t});\n\t\tevt.hand.removeAllMorphs();\n\t\tthis.hideHelp();\n\t\tthis.myWorld.changed();\n\t\tvar oldWorld = WorldMorph.current();\n\t\toldWorld.onExit(); \n\n\t\tif (Config.suspendScriptsOnWorldExit)\n\t\t\toldWorld.suspendAllActiveScripts();\n\n\t\tvar canvas = oldWorld.canvas();\n\t\toldWorld.remove(); // some SVG calls may stop working after this point in the old world.\n\n\t\tconsole.log('left world %s through %s', oldWorld, this);\n\n\t\t// display world first, then add hand, order is important!\n\t\tvar newWorld = this.myWorld;\n\t\tif (newWorld.owner) {\n\t\t\tconsole.log(\"new world had an owner, removing\");\n\t\t\tnewWorld.remove();\n\t\t}\n\n\t\tnewWorld.displayOnCanvas(canvas); // Becomes current at this point\n\n\t\tif (Config.suspendScriptsOnWorldExit) { \n\t\t\tnewWorld.resumeAllSuspendedScripts();\n\t\t}\n\n\t\tcarriedMorphs.forEach(function(m) {\n\t\t\tvar hand = newWorld.firstHand();\n\t\t\tm.resumeAllSuspendedScripts();\n\t\t\thand.addMorphAsGrabbed(m);\n\t\t});\n\n\t\tif (Config.showThumbnail) {\n\t\t\tvar scale = 0.1;\n\t\t\tif (newWorld.thumbnail) {\n\t\t\t\tconsole.log(\"disposing of a thumbnail\");\n\t\t\t\tnewWorld.thumbnail.remove();\n\t\t\t}\n\t\t\tnewWorld.thumbnail = Morph.makeRectangle(Rectangle.fromElement(canvas));\n\t\t\tnewWorld.thumbnail.setPosition(this.bounds().bottomRight());\n\t\t\tnewWorld.addMorph(newWorld.thumbnail);\n\t\t\tnewWorld.thumbnail.setScale(scale);\n\t\t\tnewWorld.thumbnail.addMorph(oldWorld);\n\t\t}\n\n\t\tif (carriedMorphs.length > 0) newWorld.firstHand().emergingFromWormHole = true; // prevent re-entering\n\t},\n \n\tonMouseOver: function($super, evt) {\n\t\tif (evt.hand.hasSubmorphs()) { // if hand is laden enter world bearing gifts\n\t\t\tif (!evt.hand.emergingFromWormHole) this.enterMyWorld(evt);\n\t\t} else {\n\t\t\t$super(evt);\n\t\t}\n\t},\n\n\tonMouseOut: function($super, evt) {\n\t\tevt.hand.emergingFromWormHole = false;\n\t\t$super(evt);\n\t},\n\n\tgetHelpText: function() {\n\t\treturn this.helpText;\n\t},\n\t\n\taddLabel: function(text) {\n\t\tvar label = new TextMorph(pt(110, 25).extentAsRectangle(), text).applyStyle({borderRadius: 10, borderWidth: 2});\n\t\tthis.addMorph(label);\n\t\tlabel.align(label.bounds().leftCenter(), this.shape.bounds().rightCenter().addXY(5, 0));\n\t\tlabel.linkToStyles(['raisedBorder']);\n\t\treturn label;\n\t},\n \n});\n\nLinkMorph.subclass('ExternalLinkMorph', {\n\n documentation: \"A link to a different web page, presumably containing another LK\",\n\n style: { borderColor: Color.black, fill: new lively.paint.RadialGradient([new lively.paint.Stop(0, Color.green), \n\t\t\t\t\t\t\t\t\t new lively.paint.Stop(1, Color.yellow)])},\n \n initialize: function($super, url, position) {\n\t\t$super(null, position || pt(0, 0));\n\t\tthis.url = url;\n\t\tthis.win = null; // browser window\n },\n\n makeNewWorld: Functions.Null, \n \n addPathBack: Functions.Null,\n\n\tenterMyWorld: function(evt) {\n\t\tif (evt.isCommandKey()) {\n\t\t\tthis.world().confirm(\"Leave current runtime to enter another page?\", function (answer) {\n\t\t\t\tif (answer) Global.location = this.url.toString();\n\t\t\t\telse console.log(\"cancelled loading \" + this.url);\n\t\t\t});\n\t\t} else {\n\t\t\tif (this.win && !this.win.closed) this.win.focus();\n\t\t\telse this.win = Global.window.open(this.url);\n\t\t}\n\t},\n \n getHelpText: function() {\n\t\treturn \"Click to enter \" + this.url;\n },\n\n\tmorphMenu: function($super, evt) { \n\t\tvar menu = $super(evt);\n\t\tmenu.addItem([\"set link target...\", function() {\n\t\t\tthis.world().prompt(\"Set new target file\", function(answer) {\n\t\t\t\tthis.url = URL.source.withFilename(answer);\n\t\t\t}.bind(this), URL.source.toString());\n\t\t}]);\n\t\treturn menu;\n\t}\n \n});\n\n\n/**\n * Morpsh for Structuring and Layouting \n */\n\nMorph.subclass('BoxMorph', {\n\n documentation: \"Occupies a rectangular area of the screen, can be laid out\",\n\n initialize: function($super, initialBounds) {\n\t\t$super(new lively.scene.Rectangle(initialBounds));\n },\n\n});\n\nBoxMorph.subclass('ContainerMorph', {\n documentation: \"Box morph whose shape grows to contain all its submrphs\",\n\n\tinitialize: function($super,rect) {\n\t\t$super(rect);//new Rectangle(0,0,0,0));\n\t},\n\n initializeTransientState: function($super) {\n $super();\n this.priorExtent = this.innerBounds().extent();\n },\n\n\taddMorph: function($super, m, isFront) {\n\t\tvar ret = $super(m, isFront);\n\t\tvar submorphBounds = this.submorphBounds(true);\n\t\tif (submorphBounds)\n\t\t\tthis.shape.setBounds(submorphBounds.outsetByRect(this.padding));\n\t\treturn ret;\n\t},\n\n\tadjustForNewBounds: function ($super) {\n\t\t// borrowed from PanelMorph\n\t\t// Compute scales of old submorph extents in priorExtent, then scale up to new extent\n\t\t$super();\n\t\tvar newExtent = this.innerBounds().extent();\n\t\tvar scalePt = newExtent.scaleByPt(this.priorExtent.invertedSafely());\n\t\tthis.submorphs.forEach(function(sub) {\n\t\t\tsub.setPosition(sub.getPosition().scaleByPt(scalePt));\n\t\t\tsub.setExtent(sub.getExtent().scaleByPt(scalePt));\n\t\t});\n\t\tthis.priorExtent = newExtent;\n\t}, \n});\nMorph.subclass('PathMorph',\n'documentation', {\n\tdocumentation: 'Morph that has a path shape. Either a line or a curve. Editable. Hmmmm',\n},\n'settings', {\n\tsuppressGrabbing: false,\n\topenForDragAndDrop: false,\n\tstyle: {borderWidth: 1, borderColor: Color.black, fill: null},\n\tisCurve: false,\n},\n'initializing', {\n\tinitialize: function($super, verts) {\n\t\t$super(this.createPathShape(verts));\n\t},\n\tcreatePathShape: function(verts) {\n\t\tvar g = lively.scene,\n\t\t\tcmds = [new g.MoveTo(true, verts[0].x, verts[0].y)];\n\t\tfor (var i = 1; i < verts.length; i++)\n\t\t\tcmds.push(new g.LineTo(true, verts[i].x, verts[i].y));\n\t\treturn new g.Path(cmds);\n\t},\n},\n'accessing', {\n\tgetLength: function() { return this.shape.rawNode.getTotalLength() },\n\tgetPointAtLength: function(length) { return Point.ensure(this.shape.rawNode.getPointAtLength(length)) },\n\tgetRelativePoint: function(relativeLength) {\n\t\tvar pos = this.getPointAtLength(this.getLength() * relativeLength);\n\t\t// return this.world() ? this.worldPoint(pos).subPt(this.shape.bounds().topLeft()) : pos;\n\t\treturn pos.matrixTransform(this.getGlobalTransform())\n\t},\n\n\tenableInsertionPoints: function() { this.shape.showInsertionPoints = true },\n\tdisableInsertionPoints: function() { this.shape.showInsertionPoints = false },\n},\n'geometry computing', {\n\tpathBetweenRects: function(rect1, rect2) {\n\t\t// copied and adpated from graffle Raphael 1.2.1 - JavaScript Vector Library\n\t\tvar p = [{x: rect1.x + rect1.width / 2, y: rect1.y - 1},\n\t {x: rect1.x + rect1.width / 2, y: rect1.y + rect1.height + 1},\n\t {x: rect1.x - 1, y: rect1.y + rect1.height / 2},\n\t {x: rect1.x + rect1.width + 1, y: rect1.y + rect1.height / 2},\n\t {x: rect2.x + rect2.width / 2, y: rect2.y - 1},\n\t {x: rect2.x + rect2.width / 2, y: rect2.y + rect2.height + 1},\n\t {x: rect2.x - 1, y: rect2.y + rect2.height / 2},\n\t {x: rect2.x + rect2.width + 1, y: rect2.y + rect2.height / 2}];\n\t\tvar d = {}, dis = [];\n\t\tfor (var i = 0; i < 4; i++) {\n\t\t\tfor (var j = 4; j < 8; j++) {\n\t\t\t\tvar dx = Math.abs(p[i].x - p[j].x),\n\t\t\t\t\tdy = Math.abs(p[i].y - p[j].y);\n\t\t\t\tif ((i == j - 4) || (((i != 3 && j != 6) || \n\t\t\t\t\tp[i].x < p[j].x) && ((i != 2 && j != 7) || p[i].x > p[j].x) && ((i != 0 && j != 5) || \n\t\t\t\t\tp[i].y > p[j].y) && ((i != 1 && j != 4) || p[i].y < p[j].y))) {\n\t\t\t\t\t\tdis.push(dx + dy);\n\t\t\t\t\t\td[dis[dis.length - 1]] = [i, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t res = dis.length == 0 ? [0, 4] : d[Math.min.apply(Math, dis)];\n\n\t\tvar x1 = p[res[0]].x,\n\t\t\ty1 = p[res[0]].y,\n\t\t\tx4 = p[res[1]].x,\n\t\t\ty4 = p[res[1]].y,\n\t\t\tdx = Math.max(Math.abs(x1 - x4) / 2, 10),\n\t\t\tdy = Math.max(Math.abs(y1 - y4) / 2, 10),\n\t\t\tx2 = [x1, x1, x1 - dx, x1 + dx][res[0]].toFixed(3),\n\t\t\ty2 = [y1 - dy, y1 + dy, y1, y1][res[0]].toFixed(3),\n\t\t\tx3 = [0, 0, 0, 0, x4, x4, x4 - dx, x4 + dx][res[1]].toFixed(3),\n\t\t\ty3 = [0, 0, 0, 0, y1 + dy, y1 - dy, y4, y4][res[1]].toFixed(3);\n\n\t\tvar p1 = this.localize(pt(x1, y1)),\n\t\t\tc1 = this.localize(pt(x2, y2)),\n\t\t\tc2 = this.localize(pt(x3, y3)),\n\t\t\tp2 = this.localize(pt(x4, y4));\n\n\t\treturn [p1, c1, c2, p2];\n\t},\n},\n'converting', {\n\tconvertToLine: function() {\n\t\tthis.shape.setElements(this.shape.getElements().collect(function(e) {\n\t\t\treturn (e.charCode == 'M' || e.charCode == 'L') ? e : new lively.scene.LineTo(true, e.x, e.y);\n\t\t}));\n\t},\n\tconvertToCurve: function() {\n\t\tvar g = lively.scene, elements = this.shape.getElements().clone();\n\t\tfor (var i = 1; i < elements.length; i++) {\n\t\t\tvar e = elements[i], prev = elements[i-1];\n\t\t\t// do nothing if it is already a curve\n\t\t\tif (e.charCode == 'Q' || e.charCode == 'C' || e.charCode == 'S') continue;\n\t\t\tvar ptArr = this.pathBetweenRects(new Rectangle(prev.x,prev.y,0,0), new Rectangle(e.x,e.y,0,0)),\n\t\t\t\tc1 = ptArr[1],\n\t\t\t\tc2 = ptArr[2],\n\t\t\t\tp = ptArr[3];\n\t\t\telements[i] = new g.BezierCurve2CtlTo(true, p.x, p.y, c1.x, c1.y, c2.x, c2.y);\n\t\t}\n\t\tthis.shape.setElements(elements);\n\t},\n},\n'menu', {\n\ttoggleLineStyle: function() {\n\t\tthis.isCurve ? this.convertToLine() : this.convertToCurve();\n\t\tthis.isCurve = !this.isCurve;\n\t},\n\tsubMenuItems: function($super, evt) {\n\t\tvar items = $super(evt);\n\t\titems.unshift(['Convert to ' + (this.isCurve ? 'line' : 'curve'), this.toggleLineStyle.bind(this)]);\n\t\treturn items;\n\t},\n});\n\nMorph.subclass('PseudoMorph', {\n description: \"This hack to make various objects serializable, despite not being morphs\",\n \n\tinitialize: function($super) {\n\t\t$super(new lively.scene.Group());\n\t\tthis.setVisible(false);\n\t}\n\n});\n\n\nPseudoMorph.subclass('Invocation', {\n\n\tinitialize: function($super, actor, scriptName, argIfAny) {\n\t\t$super();\n\t\tthis.actor = actor;\n\t\tthis.scriptName = scriptName;\n\t\tthis.argIfAny = argIfAny; // better be primitive\n\t},\n\n\texec: function Invocation$exec() {\n\t\tif (!this.actor) {\n\t\t\tconsole.warn(\"no actor on script %s\", this);\n\t\t\treturn null;\n\t\t}\n\t\tvar func = this.actor[this.scriptName];\n\t\tif (func) {\n\t\t\treturn func.call(this.actor, this.argIfAny);\n\t\t} else {\n\t\t\t//console.warn(\"no callback on actor %s\", this.actor);\n\t\t\treturn null;\n\t\t}\n\t},\n\n});\n\nInvocation.subclass('SchedulableAction', {\n\n\tdocumentation: \"Description of a periodic action\",\n\tbeVerbose: false,\n\n\tinitialize: function($super, actor, scriptName, argIfAny, stepTime) {\n\t\t$super(actor, scriptName, argIfAny);\n\t\tthis.stepTime = stepTime;\n\t\tthis.ticks = 0;\n\t},\n\n\ttoString: function() {\n\t\treturn Strings.format(\"#\", \n\t\tthis.actor, this.scriptName, this.argIfAny, this.stepTime);\n\t},\n\n\tstop: function(world) {\n\t\tif (this.beVerbose) console.log(\"stopped stepping task %s\", this);\n\t\tworld.stopSteppingFor(this);\n\t},\n\n\tstart: function(world) {\n\t\tif (this.beVerbose) console.log(\"started stepping task %s\", this);\n\t\tworld.startSteppingFor(this);\n\t},\n\n\tequalActorAndName: function(other) {\n\t\tif (!other) \n\t\t\treturn false;\n\t\tif (this === other) \n\t\t\treturn true;\n\t\treturn (this.actor === other.actor) && (this.scriptName == other.scriptName)\n\t}\n});\n\nMorph.addMethods(\n'plugs', {\n\tplugTo: function(model, connectSpec) {\n\t\t// experimental protocol\n\t\t// This message preserves the model-view \"plug\" API of MVC's pluggable views,\n\t\t// while using the \"direct connect\" form of change notification\n\t\t// {dir: String, name: String, options: Object}\n\t\tvar view = this;\n\n\t\tfunction parseStringSpec(stringSpec) {\n\t\t\tvar parsed = stringSpec.match(/(->?)(.*)/);\n\t\t\treturn {dir: parsed[1], name: parsed[2]};\n\t\t};\n\n\t\tProperties.forEachOwn(connectSpec, function (viewProp, spec) {\n\t\t\tif (Object.isString(spec)) spec = parseStringSpec(spec);\n\t\t\tvar dir = spec.dir || '->',\n\t\t\t\toptions = spec.options || {};\n\t\t\tif (dir == \"->\" || dir == \"<->\")\n\t\t\t\tlively.bindings.connect(view, viewProp, model, spec.name, options)\n\t\t\tif (dir == \"<-\" || dir == \"<->\")\n\t\t\t\tlively.bindings.connect(model, spec.name, view, viewProp, options)\n\t\t});\n\t\treturn this;\n\t},\n\n});\n\n}) // end of module\n","doNotSerialize":["$$targetURL"],"doNotCopyProperties":["$$targetURL"],"_rootNode":{"__isSmartRef__":true,"id":726},"Pane1Selection":{"__isSmartRef__":true,"id":732},"pane1Selection":{"__isSmartRef__":true,"id":732},"Pane2Selection":null,"pane2Selection":null,"Pane3Selection":null,"pane3Selection":null,"Pane4Selection":null,"pane4Selection":null,"Pane4Content":["-----"],"Pane3Content":["-----"],"Pane2Content":[{"__isSmartRef__":true,"id":1392},{"__isSmartRef__":true,"id":1394},{"__isSmartRef__":true,"id":1396},{"__isSmartRef__":true,"id":1398},{"__isSmartRef__":true,"id":1400},{"__isSmartRef__":true,"id":1402},{"__isSmartRef__":true,"id":1404},{"__isSmartRef__":true,"id":1406},{"__isSmartRef__":true,"id":1408},{"__isSmartRef__":true,"id":1410},{"__isSmartRef__":true,"id":1412},{"__isSmartRef__":true,"id":1414},{"__isSmartRef__":true,"id":1416},{"__isSmartRef__":true,"id":1418},{"__isSmartRef__":true,"id":1420},{"__isSmartRef__":true,"id":1422},{"__isSmartRef__":true,"id":1424},{"__isSmartRef__":true,"id":1426}],"Pane1Content":[{"__isSmartRef__":true,"id":723},{"__isSmartRef__":true,"id":1376},{"__isSmartRef__":true,"id":1377},{"__isSmartRef__":true,"id":1378},{"__isSmartRef__":true,"id":1379},{"__isSmartRef__":true,"id":1380},{"__isSmartRef__":true,"id":1381}],"view":{"__isSmartRef__":true,"id":1463},"Pane1Menu":[["Add to world requirements"],["check for redundant klass definitions"],["remove"],["show all"],["reparse"],["open ChangeList viewer"],["show versions"],["load"],["-------"],["open in text editor"],["diff versions"]],"Pane2Menu":[["-------"],["add class"],["add object extension"],["add layer"],["open in text editor"],["diff versions"]],"Pane3Menu":[["-------"],["open in text editor"],["diff versions"]],"currentModuleName":"lively.oldCore.Morphs","_statusMorph":{"__isSmartRef__":true,"id":1940},"Pane4Menu":[["-------"],["add method"]],"__SourceModuleName__":"Global.lively.ide.SystemCodeBrowser","targetURL":{"__isSmartRef__":true,"id":1858},"__LivelyClassName__":"lively.ide.SystemBrowser"},"521":{"browser":{"__isSmartRef__":true,"id":520},"button":{"__isSmartRef__":true,"id":522},"__SourceModuleName__":"Global.lively.ide.BrowserCommands","__LivelyClassName__":"lively.ide.AddNewFileCommand"},"522":{"submorphs":[{"__isSmartRef__":true,"id":523}],"scripts":[],"id":392,"shape":{"__isSmartRef__":true,"id":532},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":535},"priorExtent":{"__isSmartRef__":true,"id":536},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":537},"label":{"__isSmartRef__":true,"id":523},"command":{"__isSmartRef__":true,"id":521},"attributeConnections":[{"__isSmartRef__":true,"id":546},{"__isSmartRef__":true,"id":547}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":510},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"523":{"submorphs":[],"scripts":[],"id":393,"shape":{"__isSmartRef__":true,"id":524},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":527},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":528},"priorExtent":{"__isSmartRef__":true,"id":529},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":530}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":522},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"524":{"_Position":{"__isSmartRef__":true,"id":525},"_Extent":{"__isSmartRef__":true,"id":526},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"525":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"526":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"527":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"528":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"529":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"530":{"style":{"__isSmartRef__":true,"id":531},"morph":{"__isSmartRef__":true,"id":523},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"Add module","__LivelyClassName__":"lively.morphic.TextChunk"},"531":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"532":{"_Position":{"__isSmartRef__":true,"id":533},"_Extent":{"__isSmartRef__":true,"id":534},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"533":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"534":{"x":117.14285714285714,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"535":{"x":0,"y":220,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"536":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"537":{"stops":[{"__isSmartRef__":true,"id":538},{"__isSmartRef__":true,"id":540},{"__isSmartRef__":true,"id":542},{"__isSmartRef__":true,"id":544}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"538":{"offset":0,"color":{"__isSmartRef__":true,"id":539}},"539":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"540":{"offset":0.4,"color":{"__isSmartRef__":true,"id":541}},"541":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"542":{"offset":0.6,"color":{"__isSmartRef__":true,"id":543}},"543":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"544":{"offset":1,"color":{"__isSmartRef__":true,"id":545}},"545":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"546":{"sourceObj":{"__isSmartRef__":true,"id":522},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":521},"targetMethodName":"trigger","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"547":{"sourceObj":{"__isSmartRef__":true,"id":522},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":522},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"548":{"browser":{"__isSmartRef__":true,"id":520},"button":{"__isSmartRef__":true,"id":549},"__SourceModuleName__":"Global.lively.ide.BrowserCommands","__LivelyClassName__":"lively.ide.AllModulesLoadCommand"},"549":{"submorphs":[{"__isSmartRef__":true,"id":550}],"scripts":[],"id":394,"shape":{"__isSmartRef__":true,"id":559},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":562},"priorExtent":{"__isSmartRef__":true,"id":563},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":564},"label":{"__isSmartRef__":true,"id":550},"command":{"__isSmartRef__":true,"id":548},"attributeConnections":[{"__isSmartRef__":true,"id":573},{"__isSmartRef__":true,"id":574}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":510},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"550":{"submorphs":[],"scripts":[],"id":395,"shape":{"__isSmartRef__":true,"id":551},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":554},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":555},"priorExtent":{"__isSmartRef__":true,"id":556},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":557}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":549},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"551":{"_Position":{"__isSmartRef__":true,"id":552},"_Extent":{"__isSmartRef__":true,"id":553},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"552":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"553":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"554":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"555":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"556":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"557":{"style":{"__isSmartRef__":true,"id":558},"morph":{"__isSmartRef__":true,"id":550},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"Load all","__LivelyClassName__":"lively.morphic.TextChunk"},"558":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"559":{"_Position":{"__isSmartRef__":true,"id":560},"_Extent":{"__isSmartRef__":true,"id":561},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"560":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"561":{"x":117.14285714285714,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"562":{"x":117.14285714285714,"y":220,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"563":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"564":{"stops":[{"__isSmartRef__":true,"id":565},{"__isSmartRef__":true,"id":567},{"__isSmartRef__":true,"id":569},{"__isSmartRef__":true,"id":571}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"565":{"offset":0,"color":{"__isSmartRef__":true,"id":566}},"566":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"567":{"offset":0.4,"color":{"__isSmartRef__":true,"id":568}},"568":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"569":{"offset":0.6,"color":{"__isSmartRef__":true,"id":570}},"570":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"571":{"offset":1,"color":{"__isSmartRef__":true,"id":572}},"572":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"573":{"sourceObj":{"__isSmartRef__":true,"id":549},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":548},"targetMethodName":"trigger","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"574":{"sourceObj":{"__isSmartRef__":true,"id":549},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":549},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"575":{"browser":{"__isSmartRef__":true,"id":520},"button":{"__isSmartRef__":true,"id":576},"__SourceModuleName__":"Global.lively.ide.BrowserCommands","__LivelyClassName__":"lively.ide.ShowLineNumbersCommand"},"576":{"submorphs":[{"__isSmartRef__":true,"id":577}],"scripts":[],"id":396,"shape":{"__isSmartRef__":true,"id":586},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":589},"priorExtent":{"__isSmartRef__":true,"id":590},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":591},"label":{"__isSmartRef__":true,"id":577},"command":{"__isSmartRef__":true,"id":575},"attributeConnections":[{"__isSmartRef__":true,"id":600},{"__isSmartRef__":true,"id":601}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":510},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"577":{"submorphs":[],"scripts":[],"id":397,"shape":{"__isSmartRef__":true,"id":578},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":581},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":582},"priorExtent":{"__isSmartRef__":true,"id":583},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":584}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":576},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"578":{"_Position":{"__isSmartRef__":true,"id":579},"_Extent":{"__isSmartRef__":true,"id":580},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"579":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"580":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"581":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"582":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"583":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"584":{"style":{"__isSmartRef__":true,"id":585},"morph":{"__isSmartRef__":true,"id":577},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"LineNo","__LivelyClassName__":"lively.morphic.TextChunk"},"585":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"586":{"_Position":{"__isSmartRef__":true,"id":587},"_Extent":{"__isSmartRef__":true,"id":588},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"587":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"588":{"x":117.14285714285714,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"589":{"x":234.28571428571428,"y":220,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"590":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"591":{"stops":[{"__isSmartRef__":true,"id":592},{"__isSmartRef__":true,"id":594},{"__isSmartRef__":true,"id":596},{"__isSmartRef__":true,"id":598}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"592":{"offset":0,"color":{"__isSmartRef__":true,"id":593}},"593":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"594":{"offset":0.4,"color":{"__isSmartRef__":true,"id":595}},"595":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"596":{"offset":0.6,"color":{"__isSmartRef__":true,"id":597}},"597":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"598":{"offset":1,"color":{"__isSmartRef__":true,"id":599}},"599":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"600":{"sourceObj":{"__isSmartRef__":true,"id":576},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":575},"targetMethodName":"trigger","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"601":{"sourceObj":{"__isSmartRef__":true,"id":576},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":576},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"602":{"browser":{"__isSmartRef__":true,"id":520},"button":{"__isSmartRef__":true,"id":603},"__SourceModuleName__":"Global.lively.ide.BrowserCommands","__LivelyClassName__":"lively.ide.ParserDebugCommand"},"603":{"submorphs":[{"__isSmartRef__":true,"id":604}],"scripts":[],"id":398,"shape":{"__isSmartRef__":true,"id":613},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":616},"priorExtent":{"__isSmartRef__":true,"id":617},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":618},"label":{"__isSmartRef__":true,"id":604},"command":{"__isSmartRef__":true,"id":602},"attributeConnections":[{"__isSmartRef__":true,"id":627},{"__isSmartRef__":true,"id":628}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":510},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"604":{"submorphs":[],"scripts":[],"id":399,"shape":{"__isSmartRef__":true,"id":605},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":608},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":609},"priorExtent":{"__isSmartRef__":true,"id":610},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":611}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":603},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"605":{"_Position":{"__isSmartRef__":true,"id":606},"_Extent":{"__isSmartRef__":true,"id":607},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"606":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"607":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"608":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"609":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"610":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"611":{"style":{"__isSmartRef__":true,"id":612},"morph":{"__isSmartRef__":true,"id":604},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"Dbg errors is off","__LivelyClassName__":"lively.morphic.TextChunk"},"612":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"613":{"_Position":{"__isSmartRef__":true,"id":614},"_Extent":{"__isSmartRef__":true,"id":615},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"614":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"615":{"x":117.14285714285714,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"616":{"x":351.42857142857144,"y":220,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"617":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"618":{"stops":[{"__isSmartRef__":true,"id":619},{"__isSmartRef__":true,"id":621},{"__isSmartRef__":true,"id":623},{"__isSmartRef__":true,"id":625}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"619":{"offset":0,"color":{"__isSmartRef__":true,"id":620}},"620":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"621":{"offset":0.4,"color":{"__isSmartRef__":true,"id":622}},"622":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"623":{"offset":0.6,"color":{"__isSmartRef__":true,"id":624}},"624":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"625":{"offset":1,"color":{"__isSmartRef__":true,"id":626}},"626":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"627":{"sourceObj":{"__isSmartRef__":true,"id":603},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":602},"targetMethodName":"trigger","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"628":{"sourceObj":{"__isSmartRef__":true,"id":603},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":603},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"629":{"browser":{"__isSmartRef__":true,"id":520},"button":{"__isSmartRef__":true,"id":630},"__SourceModuleName__":"Global.lively.ide.BrowserCommands","__LivelyClassName__":"lively.ide.EvaluateCommand"},"630":{"submorphs":[{"__isSmartRef__":true,"id":631}],"scripts":[],"id":400,"shape":{"__isSmartRef__":true,"id":640},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":643},"priorExtent":{"__isSmartRef__":true,"id":644},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":645},"label":{"__isSmartRef__":true,"id":631},"command":{"__isSmartRef__":true,"id":629},"attributeConnections":[{"__isSmartRef__":true,"id":654},{"__isSmartRef__":true,"id":655}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":510},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"631":{"submorphs":[],"scripts":[],"id":401,"shape":{"__isSmartRef__":true,"id":632},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":635},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":636},"priorExtent":{"__isSmartRef__":true,"id":637},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":638}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":630},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"632":{"_Position":{"__isSmartRef__":true,"id":633},"_Extent":{"__isSmartRef__":true,"id":634},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"633":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"634":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"635":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"636":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"637":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"638":{"style":{"__isSmartRef__":true,"id":639},"morph":{"__isSmartRef__":true,"id":631},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"Eval on","__LivelyClassName__":"lively.morphic.TextChunk"},"639":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"640":{"_Position":{"__isSmartRef__":true,"id":641},"_Extent":{"__isSmartRef__":true,"id":642},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"641":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"642":{"x":117.14285714285714,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"643":{"x":468.57142857142856,"y":220,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"644":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"645":{"stops":[{"__isSmartRef__":true,"id":646},{"__isSmartRef__":true,"id":648},{"__isSmartRef__":true,"id":650},{"__isSmartRef__":true,"id":652}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"646":{"offset":0,"color":{"__isSmartRef__":true,"id":647}},"647":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"648":{"offset":0.4,"color":{"__isSmartRef__":true,"id":649}},"649":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"650":{"offset":0.6,"color":{"__isSmartRef__":true,"id":651}},"651":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"652":{"offset":1,"color":{"__isSmartRef__":true,"id":653}},"653":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"654":{"sourceObj":{"__isSmartRef__":true,"id":630},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":629},"targetMethodName":"trigger","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"655":{"sourceObj":{"__isSmartRef__":true,"id":630},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":630},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"656":{"browser":{"__isSmartRef__":true,"id":520},"button":{"__isSmartRef__":true,"id":657},"__SourceModuleName__":"Global.lively.ide.BrowserCommands","__LivelyClassName__":"lively.ide.SortCommand"},"657":{"submorphs":[{"__isSmartRef__":true,"id":658}],"scripts":[],"id":402,"shape":{"__isSmartRef__":true,"id":667},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":670},"priorExtent":{"__isSmartRef__":true,"id":671},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":672},"label":{"__isSmartRef__":true,"id":658},"command":{"__isSmartRef__":true,"id":656},"attributeConnections":[{"__isSmartRef__":true,"id":681},{"__isSmartRef__":true,"id":682}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":510},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"658":{"submorphs":[],"scripts":[],"id":403,"shape":{"__isSmartRef__":true,"id":659},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":662},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":663},"priorExtent":{"__isSmartRef__":true,"id":664},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":665}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":657},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"659":{"_Position":{"__isSmartRef__":true,"id":660},"_Extent":{"__isSmartRef__":true,"id":661},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"660":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"661":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"662":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"663":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"664":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"665":{"style":{"__isSmartRef__":true,"id":666},"morph":{"__isSmartRef__":true,"id":658},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"Sort","__LivelyClassName__":"lively.morphic.TextChunk"},"666":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"667":{"_Position":{"__isSmartRef__":true,"id":668},"_Extent":{"__isSmartRef__":true,"id":669},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"668":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"669":{"x":117.14285714285714,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"670":{"x":585.7142857142857,"y":220,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"671":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"672":{"stops":[{"__isSmartRef__":true,"id":673},{"__isSmartRef__":true,"id":675},{"__isSmartRef__":true,"id":677},{"__isSmartRef__":true,"id":679}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"673":{"offset":0,"color":{"__isSmartRef__":true,"id":674}},"674":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"675":{"offset":0.4,"color":{"__isSmartRef__":true,"id":676}},"676":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"677":{"offset":0.6,"color":{"__isSmartRef__":true,"id":678}},"678":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"679":{"offset":1,"color":{"__isSmartRef__":true,"id":680}},"680":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"681":{"sourceObj":{"__isSmartRef__":true,"id":657},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":656},"targetMethodName":"trigger","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"682":{"sourceObj":{"__isSmartRef__":true,"id":657},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":657},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"683":{"browser":{"__isSmartRef__":true,"id":520},"button":{"__isSmartRef__":true,"id":684},"__SourceModuleName__":"Global.lively.ide.BrowserCommands","__LivelyClassName__":"lively.ide.ViewSourceCommand"},"684":{"submorphs":[{"__isSmartRef__":true,"id":685}],"scripts":[],"id":404,"shape":{"__isSmartRef__":true,"id":694},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":697},"priorExtent":{"__isSmartRef__":true,"id":698},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":699},"label":{"__isSmartRef__":true,"id":685},"command":{"__isSmartRef__":true,"id":683},"attributeConnections":[{"__isSmartRef__":true,"id":708},{"__isSmartRef__":true,"id":709}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":510},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"685":{"submorphs":[],"scripts":[],"id":405,"shape":{"__isSmartRef__":true,"id":686},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":689},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":690},"priorExtent":{"__isSmartRef__":true,"id":691},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":692}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":684},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"686":{"_Position":{"__isSmartRef__":true,"id":687},"_Extent":{"__isSmartRef__":true,"id":688},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"687":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"688":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"689":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"690":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"691":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"692":{"style":{"__isSmartRef__":true,"id":693},"morph":{"__isSmartRef__":true,"id":685},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"View as...","__LivelyClassName__":"lively.morphic.TextChunk"},"693":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"694":{"_Position":{"__isSmartRef__":true,"id":695},"_Extent":{"__isSmartRef__":true,"id":696},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"695":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"696":{"x":117.14285714285714,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"697":{"x":702.8571428571429,"y":220,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"698":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"699":{"stops":[{"__isSmartRef__":true,"id":700},{"__isSmartRef__":true,"id":702},{"__isSmartRef__":true,"id":704},{"__isSmartRef__":true,"id":706}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"700":{"offset":0,"color":{"__isSmartRef__":true,"id":701}},"701":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"702":{"offset":0.4,"color":{"__isSmartRef__":true,"id":703}},"703":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"704":{"offset":0.6,"color":{"__isSmartRef__":true,"id":705}},"705":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"706":{"offset":1,"color":{"__isSmartRef__":true,"id":707}},"707":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"708":{"sourceObj":{"__isSmartRef__":true,"id":684},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":683},"targetMethodName":"trigger","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"709":{"sourceObj":{"__isSmartRef__":true,"id":684},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":684},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"710":{"__SourceModuleName__":"Global.lively.ide.BrowserFramework","__LivelyClassName__":"lively.ide.NodeFilter"},"711":{"__SourceModuleName__":"Global.lively.ide.BrowserFramework","__LivelyClassName__":"lively.ide.NodeFilter"},"712":{"attributes":["isClassNode","isGrammarNode","isChangeNode","isFunctionNode","isObjectNode"],"__SourceModuleName__":"Global.lively.ide.BrowserFramework","__LivelyClassName__":"lively.ide.NodeTypeFilter"},"713":{"__SourceModuleName__":"Global.lively.ide.BrowserFramework","__LivelyClassName__":"lively.ide.NodeFilter"},"714":{"__SourceModuleName__":"Global.lively.ide.BrowserFramework","__LivelyClassName__":"lively.ide.NodeFilter"},"715":{"__SourceModuleName__":"Global.lively.ide.BrowserFramework","__LivelyClassName__":"lively.ide.NodeFilter"},"716":{"sourceObj":{"__isSmartRef__":true,"id":520},"sourceAttrName":"setPane1Content","targetObj":{"__isSmartRef__":true,"id":717},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"717":{"submorphs":[],"scripts":[],"id":384,"shape":{"__isSmartRef__":true,"id":718},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":722},"itemList":[{"__isSmartRef__":true,"id":723},{"__isSmartRef__":true,"id":1376},{"__isSmartRef__":true,"id":1377},{"__isSmartRef__":true,"id":1378},{"__isSmartRef__":true,"id":1379},{"__isSmartRef__":true,"id":1380},{"__isSmartRef__":true,"id":1381}],"selectedLineNo":5,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":510},"attributeConnections":[{"__isSmartRef__":true,"id":1382},{"__isSmartRef__":true,"id":1383},{"__isSmartRef__":true,"id":1384},{"__isSmartRef__":true,"id":1385}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"prevScroll":[0,0],"__SourceModuleName__":"Global.lively.morphic.Core","selection":{"__isSmartRef__":true,"id":732},"__LivelyClassName__":"lively.morphic.List"},"718":{"_Position":{"__isSmartRef__":true,"id":719},"_Extent":{"__isSmartRef__":true,"id":720},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":721},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"719":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"720":{"x":205,"y":192.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"721":{"r":0.95,"g":0.95,"b":0.95,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"722":{"x":0,"y":27.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"723":{"isListItem":true,"string":"../","value":{"__isSmartRef__":true,"id":724}},"724":{"target":{"__isSmartRef__":true,"id":725},"browser":{"__isSmartRef__":true,"id":520},"parent":{"__isSmartRef__":true,"id":726},"localName":"../","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.NamespaceNode"},"725":{"protocol":"http:","hostname":"www.lively-kernel.org","pathname":"/repository/webwerkstatt/lively/oldCore/../","__SourceModuleName__":"Global.lively.Network","__LivelyClassName__":"URL"},"726":{"target":{"__isSmartRef__":true,"id":727},"browser":{"__isSmartRef__":true,"id":520},"parent":null,"allFiles":["lively/oldCore/Events.js","lively/oldCore/Morphs.js","lively/oldCore/Hacks.js","lively/oldCore/Misc.js","lively/oldCore/Layout.js"],"subNamespacePaths":[],"parentNamespacePath":{"__isSmartRef__":true,"id":725},"_childNodes":[{"__isSmartRef__":true,"id":724},{"__isSmartRef__":true,"id":728},{"__isSmartRef__":true,"id":729},{"__isSmartRef__":true,"id":730},{"__isSmartRef__":true,"id":731},{"__isSmartRef__":true,"id":732},{"__isSmartRef__":true,"id":1374}],"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.SourceControlNode"},"727":{"__SourceModuleName__":"Global.lively.ide.SourceDatabase","__LivelyClassName__":"AnotherSourceDatabase"},"728":{"browser":{"__isSmartRef__":true,"id":520},"parent":{"__isSmartRef__":true,"id":726},"moduleName":"lively/oldCore/Events.js","showAll":false,"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CompleteFileFragmentNode"},"729":{"browser":{"__isSmartRef__":true,"id":520},"parent":{"__isSmartRef__":true,"id":726},"moduleName":"lively/oldCore/Hacks.js","showAll":false,"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CompleteFileFragmentNode"},"730":{"browser":{"__isSmartRef__":true,"id":520},"parent":{"__isSmartRef__":true,"id":726},"moduleName":"lively/oldCore/Layout.js","showAll":false,"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CompleteFileFragmentNode"},"731":{"browser":{"__isSmartRef__":true,"id":520},"parent":{"__isSmartRef__":true,"id":726},"moduleName":"lively/oldCore/Misc.js","showAll":false,"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CompleteFileFragmentNode"},"732":{"target":{"__isSmartRef__":true,"id":733},"browser":{"__isSmartRef__":true,"id":520},"parent":{"__isSmartRef__":true,"id":726},"moduleName":"lively/oldCore/Morphs.js","showAll":false,"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CompleteFileFragmentNode"},"733":{"name":"lively.oldCore.Morphs","type":"moduleDef","startIndex":0,"stopIndex":182544,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":734},{"__isSmartRef__":true,"id":735},{"__isSmartRef__":true,"id":739},{"__isSmartRef__":true,"id":740},{"__isSmartRef__":true,"id":746},{"__isSmartRef__":true,"id":747},{"__isSmartRef__":true,"id":748},{"__isSmartRef__":true,"id":749},{"__isSmartRef__":true,"id":761},{"__isSmartRef__":true,"id":762},{"__isSmartRef__":true,"id":1078},{"__isSmartRef__":true,"id":1079},{"__isSmartRef__":true,"id":1080},{"__isSmartRef__":true,"id":1081},{"__isSmartRef__":true,"id":1091},{"__isSmartRef__":true,"id":1092},{"__isSmartRef__":true,"id":1215},{"__isSmartRef__":true,"id":1220},{"__isSmartRef__":true,"id":1221},{"__isSmartRef__":true,"id":1280},{"__isSmartRef__":true,"id":1281},{"__isSmartRef__":true,"id":1300},{"__isSmartRef__":true,"id":1301},{"__isSmartRef__":true,"id":1311},{"__isSmartRef__":true,"id":1312},{"__isSmartRef__":true,"id":1316},{"__isSmartRef__":true,"id":1317},{"__isSmartRef__":true,"id":1324},{"__isSmartRef__":true,"id":1349},{"__isSmartRef__":true,"id":1350},{"__isSmartRef__":true,"id":1354},{"__isSmartRef__":true,"id":1355},{"__isSmartRef__":true,"id":1359},{"__isSmartRef__":true,"id":1360},{"__isSmartRef__":true,"id":1369},{"__isSmartRef__":true,"id":1370},{"__isSmartRef__":true,"id":1373}],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"734":{"name":null,"type":"comment","startIndex":126,"stopIndex":308,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"735":{"name":"MouseHandlerForDragging","type":"klassDef","startIndex":309,"stopIndex":855,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":736},{"__isSmartRef__":true,"id":738}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Object","categories":[{"__isSmartRef__":true,"id":737}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"736":{"name":"handleMouseEvent","type":"propertyDef","startIndex":355,"stopIndex":811,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":737},"className":"MouseHandlerForDragging","_owner":{"__isSmartRef__":true,"id":735},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"737":{"name":"default category","type":"categoryDef","startIndex":352,"stopIndex":852,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":736},{"__isSmartRef__":true,"id":738}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"738":{"name":"handlesMouseDown","type":"propertyDef","startIndex":814,"stopIndex":851,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":737},"className":"MouseHandlerForDragging","_owner":{"__isSmartRef__":true,"id":735},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"739":{"name":null,"type":"comment","startIndex":856,"stopIndex":856,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"740":{"name":"MouseHandlerForRelay","type":"klassDef","startIndex":857,"stopIndex":1819,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":741},{"__isSmartRef__":true,"id":743},{"__isSmartRef__":true,"id":744},{"__isSmartRef__":true,"id":745}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Object","categories":[{"__isSmartRef__":true,"id":742}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"741":{"name":"defaultEventSpec","type":"propertyDef","startIndex":900,"stopIndex":999,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":742},"className":"MouseHandlerForRelay","_owner":{"__isSmartRef__":true,"id":740},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"742":{"name":"default category","type":"categoryDef","startIndex":897,"stopIndex":1816,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":741},{"__isSmartRef__":true,"id":743},{"__isSmartRef__":true,"id":744},{"__isSmartRef__":true,"id":745}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"743":{"name":"initialize","type":"propertyDef","startIndex":1003,"stopIndex":1291,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":742},"className":"MouseHandlerForRelay","_owner":{"__isSmartRef__":true,"id":740},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"744":{"name":"handleMouseEvent","type":"propertyDef","startIndex":1294,"stopIndex":1775,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":742},"className":"MouseHandlerForRelay","_owner":{"__isSmartRef__":true,"id":740},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"745":{"name":"handlesMouseDown","type":"propertyDef","startIndex":1778,"stopIndex":1815,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":742},"className":"MouseHandlerForRelay","_owner":{"__isSmartRef__":true,"id":740},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"746":{"name":null,"type":"comment","startIndex":1820,"stopIndex":1844,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"747":{"name":"Morph","type":"klassDef","startIndex":1845,"stopIndex":1883,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"lively.data.Wrapper","categories":[],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"748":{"name":null,"type":"comment","startIndex":1884,"stopIndex":1884,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"749":{"name":"Morph","type":"klassExtensionDef","startIndex":1885,"stopIndex":6944,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":750},{"__isSmartRef__":true,"id":752},{"__isSmartRef__":true,"id":753},{"__isSmartRef__":true,"id":754},{"__isSmartRef__":true,"id":755},{"__isSmartRef__":true,"id":756},{"__isSmartRef__":true,"id":757},{"__isSmartRef__":true,"id":758},{"__isSmartRef__":true,"id":759},{"__isSmartRef__":true,"id":760}],"sourceControl":{"__isSmartRef__":true,"id":727},"categories":[{"__isSmartRef__":true,"id":751}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"750":{"name":"onLayoutChange","type":"propertyDef","startIndex":1908,"stopIndex":2382,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"751":{"name":"default category","type":"categoryDef","startIndex":1906,"stopIndex":6941,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":750},{"__isSmartRef__":true,"id":752},{"__isSmartRef__":true,"id":753},{"__isSmartRef__":true,"id":754},{"__isSmartRef__":true,"id":755},{"__isSmartRef__":true,"id":756},{"__isSmartRef__":true,"id":757},{"__isSmartRef__":true,"id":758},{"__isSmartRef__":true,"id":759},{"__isSmartRef__":true,"id":760}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"752":{"name":"fromLiteral","type":"propertyDef","startIndex":2385,"stopIndex":2700,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"753":{"name":"makeLine","type":"propertyDef","startIndex":2703,"stopIndex":3374,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"754":{"name":"makeCircle","type":"propertyDef","startIndex":3377,"stopIndex":3710,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"755":{"name":"makeEllipse","type":"propertyDef","startIndex":3713,"stopIndex":3991,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"756":{"name":"makeRectangle","type":"propertyDef","startIndex":3994,"stopIndex":4718,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"757":{"name":"makePolygon","type":"propertyDef","startIndex":4721,"stopIndex":5041,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"758":{"name":"makeStar","type":"propertyDef","startIndex":5044,"stopIndex":5538,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"759":{"name":"makeCurve","type":"propertyDef","startIndex":5542,"stopIndex":6374,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"760":{"name":"makeHeart","type":"propertyDef","startIndex":6377,"stopIndex":6939,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":751},"className":"Morph","_owner":{"__isSmartRef__":true,"id":749},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"761":{"name":null,"type":"comment","startIndex":6945,"stopIndex":6945,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"762":{"name":"Morph","type":"klassExtensionDef","startIndex":6946,"stopIndex":95488,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":763},{"__isSmartRef__":true,"id":765},{"__isSmartRef__":true,"id":766},{"__isSmartRef__":true,"id":767},{"__isSmartRef__":true,"id":768},{"__isSmartRef__":true,"id":769},{"__isSmartRef__":true,"id":770},{"__isSmartRef__":true,"id":771},{"__isSmartRef__":true,"id":772},{"__isSmartRef__":true,"id":773},{"__isSmartRef__":true,"id":774},{"__isSmartRef__":true,"id":775},{"__isSmartRef__":true,"id":776},{"__isSmartRef__":true,"id":777},{"__isSmartRef__":true,"id":778},{"__isSmartRef__":true,"id":779},{"__isSmartRef__":true,"id":780},{"__isSmartRef__":true,"id":781},{"__isSmartRef__":true,"id":782},{"__isSmartRef__":true,"id":783},{"__isSmartRef__":true,"id":784},{"__isSmartRef__":true,"id":785},{"__isSmartRef__":true,"id":787},{"__isSmartRef__":true,"id":788},{"__isSmartRef__":true,"id":789},{"__isSmartRef__":true,"id":790},{"__isSmartRef__":true,"id":791},{"__isSmartRef__":true,"id":793},{"__isSmartRef__":true,"id":794},{"__isSmartRef__":true,"id":795},{"__isSmartRef__":true,"id":796},{"__isSmartRef__":true,"id":797},{"__isSmartRef__":true,"id":798},{"__isSmartRef__":true,"id":799},{"__isSmartRef__":true,"id":800},{"__isSmartRef__":true,"id":802},{"__isSmartRef__":true,"id":803},{"__isSmartRef__":true,"id":804},{"__isSmartRef__":true,"id":805},{"__isSmartRef__":true,"id":806},{"__isSmartRef__":true,"id":807},{"__isSmartRef__":true,"id":808},{"__isSmartRef__":true,"id":809},{"__isSmartRef__":true,"id":810},{"__isSmartRef__":true,"id":812},{"__isSmartRef__":true,"id":813},{"__isSmartRef__":true,"id":814},{"__isSmartRef__":true,"id":815},{"__isSmartRef__":true,"id":816},{"__isSmartRef__":true,"id":818},{"__isSmartRef__":true,"id":819},{"__isSmartRef__":true,"id":820},{"__isSmartRef__":true,"id":821},{"__isSmartRef__":true,"id":822},{"__isSmartRef__":true,"id":823},{"__isSmartRef__":true,"id":824},{"__isSmartRef__":true,"id":825},{"__isSmartRef__":true,"id":827},{"__isSmartRef__":true,"id":828},{"__isSmartRef__":true,"id":829},{"__isSmartRef__":true,"id":830},{"__isSmartRef__":true,"id":831},{"__isSmartRef__":true,"id":832},{"__isSmartRef__":true,"id":833},{"__isSmartRef__":true,"id":834},{"__isSmartRef__":true,"id":835},{"__isSmartRef__":true,"id":836},{"__isSmartRef__":true,"id":837},{"__isSmartRef__":true,"id":838},{"__isSmartRef__":true,"id":839},{"__isSmartRef__":true,"id":840},{"__isSmartRef__":true,"id":841},{"__isSmartRef__":true,"id":842},{"__isSmartRef__":true,"id":843},{"__isSmartRef__":true,"id":844},{"__isSmartRef__":true,"id":845},{"__isSmartRef__":true,"id":846},{"__isSmartRef__":true,"id":847},{"__isSmartRef__":true,"id":848},{"__isSmartRef__":true,"id":849},{"__isSmartRef__":true,"id":851},{"__isSmartRef__":true,"id":852},{"__isSmartRef__":true,"id":853},{"__isSmartRef__":true,"id":854},{"__isSmartRef__":true,"id":855},{"__isSmartRef__":true,"id":856},{"__isSmartRef__":true,"id":858},{"__isSmartRef__":true,"id":859},{"__isSmartRef__":true,"id":860},{"__isSmartRef__":true,"id":861},{"__isSmartRef__":true,"id":862},{"__isSmartRef__":true,"id":863},{"__isSmartRef__":true,"id":864},{"__isSmartRef__":true,"id":865},{"__isSmartRef__":true,"id":866},{"__isSmartRef__":true,"id":867},{"__isSmartRef__":true,"id":868},{"__isSmartRef__":true,"id":869},{"__isSmartRef__":true,"id":870},{"__isSmartRef__":true,"id":871},{"__isSmartRef__":true,"id":872},{"__isSmartRef__":true,"id":873},{"__isSmartRef__":true,"id":874},{"__isSmartRef__":true,"id":875},{"__isSmartRef__":true,"id":876},{"__isSmartRef__":true,"id":877},{"__isSmartRef__":true,"id":878},{"__isSmartRef__":true,"id":879},{"__isSmartRef__":true,"id":880},{"__isSmartRef__":true,"id":881},{"__isSmartRef__":true,"id":883},{"__isSmartRef__":true,"id":884},{"__isSmartRef__":true,"id":885},{"__isSmartRef__":true,"id":886},{"__isSmartRef__":true,"id":887},{"__isSmartRef__":true,"id":888},{"__isSmartRef__":true,"id":889},{"__isSmartRef__":true,"id":890},{"__isSmartRef__":true,"id":891},{"__isSmartRef__":true,"id":892},{"__isSmartRef__":true,"id":893},{"__isSmartRef__":true,"id":894},{"__isSmartRef__":true,"id":895},{"__isSmartRef__":true,"id":896},{"__isSmartRef__":true,"id":897},{"__isSmartRef__":true,"id":898},{"__isSmartRef__":true,"id":899},{"__isSmartRef__":true,"id":900},{"__isSmartRef__":true,"id":901},{"__isSmartRef__":true,"id":902},{"__isSmartRef__":true,"id":903},{"__isSmartRef__":true,"id":904},{"__isSmartRef__":true,"id":905},{"__isSmartRef__":true,"id":906},{"__isSmartRef__":true,"id":907},{"__isSmartRef__":true,"id":908},{"__isSmartRef__":true,"id":910},{"__isSmartRef__":true,"id":911},{"__isSmartRef__":true,"id":912},{"__isSmartRef__":true,"id":914},{"__isSmartRef__":true,"id":915},{"__isSmartRef__":true,"id":917},{"__isSmartRef__":true,"id":918},{"__isSmartRef__":true,"id":919},{"__isSmartRef__":true,"id":920},{"__isSmartRef__":true,"id":921},{"__isSmartRef__":true,"id":922},{"__isSmartRef__":true,"id":923},{"__isSmartRef__":true,"id":924},{"__isSmartRef__":true,"id":925},{"__isSmartRef__":true,"id":926},{"__isSmartRef__":true,"id":927},{"__isSmartRef__":true,"id":928},{"__isSmartRef__":true,"id":930},{"__isSmartRef__":true,"id":931},{"__isSmartRef__":true,"id":932},{"__isSmartRef__":true,"id":933},{"__isSmartRef__":true,"id":934},{"__isSmartRef__":true,"id":935},{"__isSmartRef__":true,"id":936},{"__isSmartRef__":true,"id":937},{"__isSmartRef__":true,"id":938},{"__isSmartRef__":true,"id":939},{"__isSmartRef__":true,"id":940},{"__isSmartRef__":true,"id":941},{"__isSmartRef__":true,"id":942},{"__isSmartRef__":true,"id":943},{"__isSmartRef__":true,"id":944},{"__isSmartRef__":true,"id":945},{"__isSmartRef__":true,"id":946},{"__isSmartRef__":true,"id":947},{"__isSmartRef__":true,"id":948},{"__isSmartRef__":true,"id":949},{"__isSmartRef__":true,"id":950},{"__isSmartRef__":true,"id":951},{"__isSmartRef__":true,"id":953},{"__isSmartRef__":true,"id":954},{"__isSmartRef__":true,"id":955},{"__isSmartRef__":true,"id":957},{"__isSmartRef__":true,"id":958},{"__isSmartRef__":true,"id":959},{"__isSmartRef__":true,"id":960},{"__isSmartRef__":true,"id":962},{"__isSmartRef__":true,"id":963},{"__isSmartRef__":true,"id":964},{"__isSmartRef__":true,"id":966},{"__isSmartRef__":true,"id":967},{"__isSmartRef__":true,"id":968},{"__isSmartRef__":true,"id":969},{"__isSmartRef__":true,"id":970},{"__isSmartRef__":true,"id":971},{"__isSmartRef__":true,"id":972},{"__isSmartRef__":true,"id":973},{"__isSmartRef__":true,"id":974},{"__isSmartRef__":true,"id":975},{"__isSmartRef__":true,"id":976},{"__isSmartRef__":true,"id":977},{"__isSmartRef__":true,"id":978},{"__isSmartRef__":true,"id":979},{"__isSmartRef__":true,"id":980},{"__isSmartRef__":true,"id":981},{"__isSmartRef__":true,"id":982},{"__isSmartRef__":true,"id":983},{"__isSmartRef__":true,"id":984},{"__isSmartRef__":true,"id":985},{"__isSmartRef__":true,"id":986},{"__isSmartRef__":true,"id":987},{"__isSmartRef__":true,"id":988},{"__isSmartRef__":true,"id":989},{"__isSmartRef__":true,"id":990},{"__isSmartRef__":true,"id":992},{"__isSmartRef__":true,"id":993},{"__isSmartRef__":true,"id":994},{"__isSmartRef__":true,"id":995},{"__isSmartRef__":true,"id":996},{"__isSmartRef__":true,"id":998},{"__isSmartRef__":true,"id":999},{"__isSmartRef__":true,"id":1000},{"__isSmartRef__":true,"id":1001},{"__isSmartRef__":true,"id":1002},{"__isSmartRef__":true,"id":1003},{"__isSmartRef__":true,"id":1004},{"__isSmartRef__":true,"id":1005},{"__isSmartRef__":true,"id":1006},{"__isSmartRef__":true,"id":1007},{"__isSmartRef__":true,"id":1008},{"__isSmartRef__":true,"id":1009},{"__isSmartRef__":true,"id":1010},{"__isSmartRef__":true,"id":1011},{"__isSmartRef__":true,"id":1012},{"__isSmartRef__":true,"id":1013},{"__isSmartRef__":true,"id":1014},{"__isSmartRef__":true,"id":1015},{"__isSmartRef__":true,"id":1016},{"__isSmartRef__":true,"id":1017},{"__isSmartRef__":true,"id":1018},{"__isSmartRef__":true,"id":1019},{"__isSmartRef__":true,"id":1020},{"__isSmartRef__":true,"id":1021},{"__isSmartRef__":true,"id":1023},{"__isSmartRef__":true,"id":1024},{"__isSmartRef__":true,"id":1025},{"__isSmartRef__":true,"id":1026},{"__isSmartRef__":true,"id":1027},{"__isSmartRef__":true,"id":1028},{"__isSmartRef__":true,"id":1029},{"__isSmartRef__":true,"id":1030},{"__isSmartRef__":true,"id":1031},{"__isSmartRef__":true,"id":1032},{"__isSmartRef__":true,"id":1034},{"__isSmartRef__":true,"id":1035},{"__isSmartRef__":true,"id":1036},{"__isSmartRef__":true,"id":1037},{"__isSmartRef__":true,"id":1038},{"__isSmartRef__":true,"id":1039},{"__isSmartRef__":true,"id":1040},{"__isSmartRef__":true,"id":1041},{"__isSmartRef__":true,"id":1042},{"__isSmartRef__":true,"id":1043},{"__isSmartRef__":true,"id":1044},{"__isSmartRef__":true,"id":1045},{"__isSmartRef__":true,"id":1046},{"__isSmartRef__":true,"id":1048},{"__isSmartRef__":true,"id":1049},{"__isSmartRef__":true,"id":1050},{"__isSmartRef__":true,"id":1051},{"__isSmartRef__":true,"id":1052},{"__isSmartRef__":true,"id":1054},{"__isSmartRef__":true,"id":1055},{"__isSmartRef__":true,"id":1056},{"__isSmartRef__":true,"id":1057},{"__isSmartRef__":true,"id":1058},{"__isSmartRef__":true,"id":1059},{"__isSmartRef__":true,"id":1060},{"__isSmartRef__":true,"id":1061},{"__isSmartRef__":true,"id":1062},{"__isSmartRef__":true,"id":1063},{"__isSmartRef__":true,"id":1064},{"__isSmartRef__":true,"id":1066},{"__isSmartRef__":true,"id":1067},{"__isSmartRef__":true,"id":1069},{"__isSmartRef__":true,"id":1070},{"__isSmartRef__":true,"id":1071},{"__isSmartRef__":true,"id":1072},{"__isSmartRef__":true,"id":1073},{"__isSmartRef__":true,"id":1074},{"__isSmartRef__":true,"id":1076}],"sourceControl":{"__isSmartRef__":true,"id":727},"categories":[{"__isSmartRef__":true,"id":764},{"__isSmartRef__":true,"id":786},{"__isSmartRef__":true,"id":792},{"__isSmartRef__":true,"id":801},{"__isSmartRef__":true,"id":811},{"__isSmartRef__":true,"id":817},{"__isSmartRef__":true,"id":826},{"__isSmartRef__":true,"id":850},{"__isSmartRef__":true,"id":857},{"__isSmartRef__":true,"id":882},{"__isSmartRef__":true,"id":909},{"__isSmartRef__":true,"id":913},{"__isSmartRef__":true,"id":916},{"__isSmartRef__":true,"id":929},{"__isSmartRef__":true,"id":952},{"__isSmartRef__":true,"id":956},{"__isSmartRef__":true,"id":961},{"__isSmartRef__":true,"id":965},{"__isSmartRef__":true,"id":991},{"__isSmartRef__":true,"id":997},{"__isSmartRef__":true,"id":1022},{"__isSmartRef__":true,"id":1033},{"__isSmartRef__":true,"id":1047},{"__isSmartRef__":true,"id":1053},{"__isSmartRef__":true,"id":1065},{"__isSmartRef__":true,"id":1068},{"__isSmartRef__":true,"id":1075},{"__isSmartRef__":true,"id":1077}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"763":{"name":"documentation","type":"propertyDef","startIndex":6977,"stopIndex":7064,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"764":{"name":"settings","type":"categoryDef","startIndex":6963,"stopIndex":8455,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":763},{"__isSmartRef__":true,"id":765},{"__isSmartRef__":true,"id":766},{"__isSmartRef__":true,"id":767},{"__isSmartRef__":true,"id":768},{"__isSmartRef__":true,"id":769},{"__isSmartRef__":true,"id":770},{"__isSmartRef__":true,"id":771},{"__isSmartRef__":true,"id":772},{"__isSmartRef__":true,"id":773},{"__isSmartRef__":true,"id":774},{"__isSmartRef__":true,"id":775},{"__isSmartRef__":true,"id":776},{"__isSmartRef__":true,"id":777},{"__isSmartRef__":true,"id":778},{"__isSmartRef__":true,"id":779},{"__isSmartRef__":true,"id":780},{"__isSmartRef__":true,"id":781},{"__isSmartRef__":true,"id":782},{"__isSmartRef__":true,"id":783},{"__isSmartRef__":true,"id":784}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"765":{"name":"doNotSerialize","type":"propertyDef","startIndex":7068,"stopIndex":7099,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"766":{"name":"name","type":"propertyDef","startIndex":7102,"stopIndex":7133,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"767":{"name":"rotation","type":"propertyDef","startIndex":7135,"stopIndex":7152,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"768":{"name":"scalePoint","type":"propertyDef","startIndex":7154,"stopIndex":7177,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"769":{"name":"style","type":"propertyDef","startIndex":7180,"stopIndex":7193,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"770":{"name":"focusHaloBorderWidth","type":"propertyDef","startIndex":7196,"stopIndex":7223,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"771":{"name":"fishEye","type":"propertyDef","startIndex":7226,"stopIndex":7244,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"772":{"name":"fisheyeScale","type":"propertyDef","startIndex":7245,"stopIndex":7311,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"773":{"name":"fisheyeGrowth","type":"propertyDef","startIndex":7312,"stopIndex":7373,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"774":{"name":"fisheyeProximity","type":"propertyDef","startIndex":7374,"stopIndex":7458,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"775":{"name":"keyboardHandler","type":"propertyDef","startIndex":7515,"stopIndex":7540,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"776":{"name":"layoutHandler","type":"propertyDef","startIndex":7541,"stopIndex":7612,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"777":{"name":"openForDragAndDrop","type":"propertyDef","startIndex":7613,"stopIndex":7699,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"778":{"name":"mouseHandler","type":"propertyDef","startIndex":7700,"stopIndex":7806,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"779":{"name":"noShallowCopyProperties","type":"propertyDef","startIndex":7853,"stopIndex":8013,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"780":{"name":"doNotCopyProperties","type":"propertyDef","startIndex":8017,"stopIndex":8154,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"781":{"name":"isEpimorph","type":"propertyDef","startIndex":8157,"stopIndex":8178,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"782":{"name":"ignoreWhenCopying","type":"propertyDef","startIndex":8179,"stopIndex":8282,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"783":{"name":"suppressBalloonHelp","type":"propertyDef","startIndex":8344,"stopIndex":8395,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"784":{"name":"nextNavigableSibling","type":"propertyDef","startIndex":8398,"stopIndex":8428,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":764},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"785":{"name":"initialize","type":"propertyDef","startIndex":8476,"stopIndex":8992,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":786},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"786":{"name":"initializing","type":"categoryDef","startIndex":8457,"stopIndex":10210,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":785},{"__isSmartRef__":true,"id":787},{"__isSmartRef__":true,"id":788},{"__isSmartRef__":true,"id":789},{"__isSmartRef__":true,"id":790}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"787":{"name":"createRawNode","type":"propertyDef","startIndex":8995,"stopIndex":9056,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":786},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"788":{"name":"internalInitialize","type":"propertyDef","startIndex":9061,"stopIndex":9294,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":786},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"789":{"name":"initializePersistentState","type":"propertyDef","startIndex":9297,"stopIndex":9786,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":786},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"790":{"name":"initializeTransientState","type":"propertyDef","startIndex":9789,"stopIndex":10206,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":786},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"791":{"name":"okToDuplicate","type":"propertyDef","startIndex":10226,"stopIndex":10256,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"792":{"name":"copying","type":"categoryDef","startIndex":10212,"stopIndex":14291,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":791},{"__isSmartRef__":true,"id":793},{"__isSmartRef__":true,"id":794},{"__isSmartRef__":true,"id":795},{"__isSmartRef__":true,"id":796},{"__isSmartRef__":true,"id":797},{"__isSmartRef__":true,"id":798},{"__isSmartRef__":true,"id":799}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"793":{"name":"shallowCopy","type":"propertyDef","startIndex":10278,"stopIndex":10460,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"794":{"name":"duplicate","type":"propertyDef","startIndex":10463,"stopIndex":10682,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"795":{"name":"copySubmorphsFrom","type":"propertyDef","startIndex":10690,"stopIndex":11301,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"796":{"name":"copyAttributesFrom","type":"propertyDef","startIndex":11305,"stopIndex":12783,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"797":{"name":"copyActiveScriptsFrom","type":"propertyDef","startIndex":12786,"stopIndex":13205,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"798":{"name":"copyModelFrom","type":"propertyDef","startIndex":13208,"stopIndex":13530,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"799":{"name":"copyFrom","type":"propertyDef","startIndex":13533,"stopIndex":14287,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":792},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"800":{"name":"deserialize","type":"propertyDef","startIndex":14314,"stopIndex":14976,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"801":{"name":"serialization","type":"categoryDef","startIndex":14293,"stopIndex":20630,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":800},{"__isSmartRef__":true,"id":802},{"__isSmartRef__":true,"id":803},{"__isSmartRef__":true,"id":804},{"__isSmartRef__":true,"id":805},{"__isSmartRef__":true,"id":806},{"__isSmartRef__":true,"id":807},{"__isSmartRef__":true,"id":808},{"__isSmartRef__":true,"id":809}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"802":{"name":"prepareForSerialization","type":"propertyDef","startIndex":14979,"stopIndex":15642,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"803":{"name":"restorePersistentState","type":"propertyDef","startIndex":15649,"stopIndex":15943,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"804":{"name":"restoreFromSubnode","type":"propertyDef","startIndex":15946,"stopIndex":16013,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"805":{"name":"restoreFromDefsNode","type":"propertyDef","startIndex":16016,"stopIndex":16458,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"806":{"name":"restoreFromSubnodes","type":"propertyDef","startIndex":16461,"stopIndex":19439,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"807":{"name":"resolveUriToObject","type":"propertyDef","startIndex":19442,"stopIndex":19805,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"808":{"name":"collectAllUsedFills","type":"propertyDef","startIndex":19810,"stopIndex":20244,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"809":{"name":"exportLinkedFile","type":"propertyDef","startIndex":20247,"stopIndex":20626,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":801},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"810":{"name":"getName","type":"propertyDef","startIndex":20647,"stopIndex":20688,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":811},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"811":{"name":"accessing","type":"categoryDef","startIndex":20632,"stopIndex":21147,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":810},{"__isSmartRef__":true,"id":812},{"__isSmartRef__":true,"id":813},{"__isSmartRef__":true,"id":814},{"__isSmartRef__":true,"id":815}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"812":{"name":"setName","type":"propertyDef","startIndex":20691,"stopIndex":20747,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":811},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"813":{"name":"canvas","type":"propertyDef","startIndex":20750,"stopIndex":20811,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":811},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"814":{"name":"getOwnerWidget","type":"propertyDef","startIndex":20815,"stopIndex":20908,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":811},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"815":{"name":"ownerChain","type":"propertyDef","startIndex":20911,"stopIndex":21143,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":811},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"816":{"name":"getStyleClass","type":"propertyDef","startIndex":21174,"stopIndex":21233,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"817":{"name":"styling","type":"categoryDef","startIndex":21149,"stopIndex":24757,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":816},{"__isSmartRef__":true,"id":818},{"__isSmartRef__":true,"id":819},{"__isSmartRef__":true,"id":820},{"__isSmartRef__":true,"id":821},{"__isSmartRef__":true,"id":822},{"__isSmartRef__":true,"id":823},{"__isSmartRef__":true,"id":824}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"818":{"name":"setStyleClass","type":"propertyDef","startIndex":21236,"stopIndex":21501,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"819":{"name":"applyStyle","type":"propertyDef","startIndex":21504,"stopIndex":23081,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"820":{"name":"makeStyleSpec","type":"propertyDef","startIndex":23084,"stopIndex":23642,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"821":{"name":"applyStyleNamed","type":"propertyDef","startIndex":23645,"stopIndex":23819,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"822":{"name":"styleNamed","type":"propertyDef","startIndex":23822,"stopIndex":24251,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"823":{"name":"linkToStyles","type":"propertyDef","startIndex":24254,"stopIndex":24490,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"824":{"name":"applyLinkedStyles","type":"propertyDef","startIndex":24493,"stopIndex":24754,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":817},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"825":{"name":"setFill","type":"propertyDef","startIndex":24839,"stopIndex":24929,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"826":{"name":"appearance","type":"categoryDef","startIndex":24759,"stopIndex":28453,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":825},{"__isSmartRef__":true,"id":827},{"__isSmartRef__":true,"id":828},{"__isSmartRef__":true,"id":829},{"__isSmartRef__":true,"id":830},{"__isSmartRef__":true,"id":831},{"__isSmartRef__":true,"id":832},{"__isSmartRef__":true,"id":833},{"__isSmartRef__":true,"id":834},{"__isSmartRef__":true,"id":835},{"__isSmartRef__":true,"id":836},{"__isSmartRef__":true,"id":837},{"__isSmartRef__":true,"id":838},{"__isSmartRef__":true,"id":839},{"__isSmartRef__":true,"id":840},{"__isSmartRef__":true,"id":841},{"__isSmartRef__":true,"id":842},{"__isSmartRef__":true,"id":843},{"__isSmartRef__":true,"id":844},{"__isSmartRef__":true,"id":845},{"__isSmartRef__":true,"id":846},{"__isSmartRef__":true,"id":847},{"__isSmartRef__":true,"id":848}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"827":{"name":"getFill","type":"propertyDef","startIndex":24932,"stopIndex":24984,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"828":{"name":"setBorderColor","type":"propertyDef","startIndex":24987,"stopIndex":25100,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"829":{"name":"getBorderColor","type":"propertyDef","startIndex":25103,"stopIndex":25196,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"830":{"name":"nearlyZeroBorderWidth","type":"propertyDef","startIndex":25199,"stopIndex":25262,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"831":{"name":"setBorderWidth","type":"propertyDef","startIndex":25265,"stopIndex":25619,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"832":{"name":"getBorderWidth","type":"propertyDef","startIndex":25622,"stopIndex":25726,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"833":{"name":"setBorderRadius","type":"propertyDef","startIndex":25729,"stopIndex":25833,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"834":{"name":"getBorderRadius","type":"propertyDef","startIndex":25836,"stopIndex":25910,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"835":{"name":"shapeRoundEdgesBy","type":"propertyDef","startIndex":25913,"stopIndex":25976,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"836":{"name":"getFillOpacity","type":"propertyDef","startIndex":25979,"stopIndex":26046,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"837":{"name":"setFillOpacity","type":"propertyDef","startIndex":26049,"stopIndex":26183,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"838":{"name":"setStrokeOpacity","type":"propertyDef","startIndex":26186,"stopIndex":26325,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"839":{"name":"getStrokeOpacity","type":"propertyDef","startIndex":26328,"stopIndex":26398,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"840":{"name":"setLineJoin","type":"propertyDef","startIndex":26401,"stopIndex":26490,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"841":{"name":"getLineJoin","type":"propertyDef","startIndex":26493,"stopIndex":26553,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"842":{"name":"setLineCap","type":"propertyDef","startIndex":26557,"stopIndex":26641,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"843":{"name":"getLineCap","type":"propertyDef","startIndex":26644,"stopIndex":26703,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"844":{"name":"toggleFisheye","type":"propertyDef","startIndex":26706,"stopIndex":27006,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"845":{"name":"setFisheyeScale","type":"propertyDef","startIndex":27009,"stopIndex":27700,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"846":{"name":"isVisible","type":"propertyDef","startIndex":27703,"stopIndex":27988,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"847":{"name":"setVisible","type":"propertyDef","startIndex":27991,"stopIndex":28216,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"848":{"name":"applyFilter","type":"propertyDef","startIndex":28220,"stopIndex":28448,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":826},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"849":{"name":"applyFunctionToShape","type":"propertyDef","startIndex":28475,"stopIndex":28801,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":850},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"850":{"name":"shape related","type":"categoryDef","startIndex":28455,"stopIndex":30221,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":849},{"__isSmartRef__":true,"id":851},{"__isSmartRef__":true,"id":852},{"__isSmartRef__":true,"id":853},{"__isSmartRef__":true,"id":854},{"__isSmartRef__":true,"id":855}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"851":{"name":"internalSetShape","type":"propertyDef","startIndex":28804,"stopIndex":29080,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":850},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"852":{"name":"setShape","type":"propertyDef","startIndex":29083,"stopIndex":29207,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":850},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"853":{"name":"reshape","type":"propertyDef","startIndex":29210,"stopIndex":29552,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":850},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"854":{"name":"setVertices","type":"propertyDef","startIndex":29555,"stopIndex":29740,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":850},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"855":{"name":"beClipMorph","type":"propertyDef","startIndex":29743,"stopIndex":30217,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":850},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"856":{"name":"padding","type":"propertyDef","startIndex":30238,"stopIndex":30410,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"857":{"name":"layouting","type":"categoryDef","startIndex":30223,"stopIndex":36454,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":856},{"__isSmartRef__":true,"id":858},{"__isSmartRef__":true,"id":859},{"__isSmartRef__":true,"id":860},{"__isSmartRef__":true,"id":861},{"__isSmartRef__":true,"id":862},{"__isSmartRef__":true,"id":863},{"__isSmartRef__":true,"id":864},{"__isSmartRef__":true,"id":865},{"__isSmartRef__":true,"id":866},{"__isSmartRef__":true,"id":867},{"__isSmartRef__":true,"id":868},{"__isSmartRef__":true,"id":869},{"__isSmartRef__":true,"id":870},{"__isSmartRef__":true,"id":871},{"__isSmartRef__":true,"id":872},{"__isSmartRef__":true,"id":873},{"__isSmartRef__":true,"id":874},{"__isSmartRef__":true,"id":875},{"__isSmartRef__":true,"id":876},{"__isSmartRef__":true,"id":877},{"__isSmartRef__":true,"id":878},{"__isSmartRef__":true,"id":879},{"__isSmartRef__":true,"id":880}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"858":{"name":"margin","type":"propertyDef","startIndex":30411,"stopIndex":30500,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"859":{"name":"layoutManager","type":"propertyDef","startIndex":30548,"stopIndex":30568,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"860":{"name":"relayout","type":"propertyDef","startIndex":30603,"stopIndex":30742,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"861":{"name":"setBounds","type":"propertyDef","startIndex":30745,"stopIndex":30904,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"862":{"name":"setExtent","type":"propertyDef","startIndex":30907,"stopIndex":31012,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"863":{"name":"getExtent","type":"propertyDef","startIndex":31015,"stopIndex":31084,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"864":{"name":"position","type":"propertyDef","startIndex":31087,"stopIndex":31206,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"865":{"name":"getPosition","type":"propertyDef","startIndex":31209,"stopIndex":31298,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"866":{"name":"setPosition","type":"propertyDef","startIndex":31301,"stopIndex":31416,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"867":{"name":"containsPoint","type":"propertyDef","startIndex":31419,"stopIndex":31592,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"868":{"name":"containsWorldPoint","type":"propertyDef","startIndex":31595,"stopIndex":31771,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"869":{"name":"fullContainsPoint","type":"propertyDef","startIndex":31774,"stopIndex":31881,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"870":{"name":"fullContainsWorldPoint","type":"propertyDef","startIndex":31884,"stopIndex":32072,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"871":{"name":"bounds","type":"propertyDef","startIndex":32075,"stopIndex":32877,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"872":{"name":"submorphBounds","type":"propertyDef","startIndex":32884,"stopIndex":33272,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"873":{"name":"innerBounds","type":"propertyDef","startIndex":33279,"stopIndex":33460,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"874":{"name":"localBorderBounds","type":"propertyDef","startIndex":33467,"stopIndex":34030,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"875":{"name":"changed","type":"propertyDef","startIndex":34034,"stopIndex":34261,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"876":{"name":"invalidRect","type":"propertyDef","startIndex":34264,"stopIndex":34353,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"877":{"name":"layoutOnSubmorphLayout","type":"propertyDef","startIndex":34356,"stopIndex":34565,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"878":{"name":"transformChanged","type":"propertyDef","startIndex":34568,"stopIndex":34885,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"879":{"name":"layoutChanged","type":"propertyDef","startIndex":34888,"stopIndex":35595,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"880":{"name":"adjustForNewBounds","type":"propertyDef","startIndex":35598,"stopIndex":36451,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":857},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"881":{"name":"addMorph","type":"propertyDef","startIndex":36505,"stopIndex":36583,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"882":{"name":"submorphs","type":"categoryDef","startIndex":36489,"stopIndex":43106,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":881},{"__isSmartRef__":true,"id":883},{"__isSmartRef__":true,"id":884},{"__isSmartRef__":true,"id":885},{"__isSmartRef__":true,"id":886},{"__isSmartRef__":true,"id":887},{"__isSmartRef__":true,"id":888},{"__isSmartRef__":true,"id":889},{"__isSmartRef__":true,"id":890},{"__isSmartRef__":true,"id":891},{"__isSmartRef__":true,"id":892},{"__isSmartRef__":true,"id":893},{"__isSmartRef__":true,"id":894},{"__isSmartRef__":true,"id":895},{"__isSmartRef__":true,"id":896},{"__isSmartRef__":true,"id":897},{"__isSmartRef__":true,"id":898},{"__isSmartRef__":true,"id":899},{"__isSmartRef__":true,"id":900},{"__isSmartRef__":true,"id":901},{"__isSmartRef__":true,"id":902},{"__isSmartRef__":true,"id":903},{"__isSmartRef__":true,"id":904},{"__isSmartRef__":true,"id":905},{"__isSmartRef__":true,"id":906},{"__isSmartRef__":true,"id":907}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"883":{"name":"addMorphAt","type":"propertyDef","startIndex":36586,"stopIndex":36729,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"884":{"name":"addMorphFront","type":"propertyDef","startIndex":36732,"stopIndex":36815,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"885":{"name":"addMorphBack","type":"propertyDef","startIndex":36818,"stopIndex":36901,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"886":{"name":"addMorphFrontOrBack","type":"propertyDef","startIndex":36904,"stopIndex":37640,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"887":{"name":"addNonMorph","type":"propertyDef","startIndex":37644,"stopIndex":37864,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"888":{"name":"addWrapper","type":"propertyDef","startIndex":37867,"stopIndex":37987,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"889":{"name":"addPseudoMorph","type":"propertyDef","startIndex":37990,"stopIndex":38191,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"890":{"name":"bringToFront","type":"propertyDef","startIndex":38194,"stopIndex":38372,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"891":{"name":"setSubmorphs","type":"propertyDef","startIndex":38375,"stopIndex":38845,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"892":{"name":"indexOfSubmorph","type":"propertyDef","startIndex":38848,"stopIndex":39073,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"893":{"name":"getInsertPositionFor","type":"propertyDef","startIndex":39076,"stopIndex":39302,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"894":{"name":"insertMorph","type":"propertyDef","startIndex":39306,"stopIndex":39644,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"895":{"name":"removeMorph","type":"propertyDef","startIndex":39648,"stopIndex":40316,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"896":{"name":"removeAllMorphs","type":"propertyDef","startIndex":40319,"stopIndex":40463,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"897":{"name":"hasSubmorphs","type":"propertyDef","startIndex":40466,"stopIndex":40533,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"898":{"name":"remove","type":"propertyDef","startIndex":40536,"stopIndex":40790,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"899":{"name":"withAllSubmorphsDo","type":"propertyDef","startIndex":40793,"stopIndex":41120,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"900":{"name":"invokeOnAllSubmorphs","type":"propertyDef","startIndex":41123,"stopIndex":41382,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"901":{"name":"topSubmorph","type":"propertyDef","startIndex":41385,"stopIndex":41505,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"902":{"name":"visibleSubmorphs","type":"propertyDef","startIndex":41508,"stopIndex":41628,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"903":{"name":"getMorphNamed","type":"propertyDef","startIndex":41631,"stopIndex":42025,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"904":{"name":"get","type":"propertyDef","startIndex":42027,"stopIndex":42175,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"905":{"name":"getBreadthFirstUpwards","type":"propertyDef","startIndex":42178,"stopIndex":42631,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"906":{"name":"shutdown","type":"propertyDef","startIndex":42637,"stopIndex":42744,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"907":{"name":"indentedListItemsOfMorphNames","type":"propertyDef","startIndex":42746,"stopIndex":43101,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":882},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"908":{"name":"world","type":"propertyDef","startIndex":43172,"stopIndex":43244,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":909},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"909":{"name":"world","type":"categoryDef","startIndex":43161,"stopIndex":43749,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":908},{"__isSmartRef__":true,"id":910},{"__isSmartRef__":true,"id":911}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"910":{"name":"validatedWorld","type":"propertyDef","startIndex":43247,"stopIndex":43495,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":909},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"911":{"name":"openInWorld","type":"propertyDef","startIndex":43498,"stopIndex":43745,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":909},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"912":{"name":"asLogo","type":"propertyDef","startIndex":43767,"stopIndex":44540,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":913},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"913":{"name":"conversion","type":"categoryDef","startIndex":43751,"stopIndex":45541,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":912},{"__isSmartRef__":true,"id":914}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"914":{"name":"makeCurve","type":"propertyDef","startIndex":44543,"stopIndex":45537,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":913},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"915":{"name":"getTransform","type":"propertyDef","startIndex":45604,"stopIndex":47271,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"916":{"name":"transform","type":"categoryDef","startIndex":45543,"stopIndex":50219,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":915},{"__isSmartRef__":true,"id":917},{"__isSmartRef__":true,"id":918},{"__isSmartRef__":true,"id":919},{"__isSmartRef__":true,"id":920},{"__isSmartRef__":true,"id":921},{"__isSmartRef__":true,"id":922},{"__isSmartRef__":true,"id":923},{"__isSmartRef__":true,"id":924},{"__isSmartRef__":true,"id":925},{"__isSmartRef__":true,"id":926},{"__isSmartRef__":true,"id":927}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"917":{"name":"pvtSetTransform","type":"propertyDef","startIndex":47274,"stopIndex":47637,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"918":{"name":"setTransforms","type":"propertyDef","startIndex":47640,"stopIndex":47862,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"919":{"name":"setTransform","type":"propertyDef","startIndex":47865,"stopIndex":47967,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"920":{"name":"transformToMorph","type":"propertyDef","startIndex":47970,"stopIndex":48462,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"921":{"name":"getGlobalTransform","type":"propertyDef","startIndex":48465,"stopIndex":48729,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"922":{"name":"worldPoint","type":"propertyDef","startIndex":48732,"stopIndex":48921,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"923":{"name":"relativize","type":"propertyDef","startIndex":48924,"stopIndex":49254,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"924":{"name":"relativizeRect","type":"propertyDef","startIndex":49257,"stopIndex":49424,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"925":{"name":"localize","type":"propertyDef","startIndex":49427,"stopIndex":49770,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"926":{"name":"localizePointFrom","type":"propertyDef","startIndex":49773,"stopIndex":50089,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"927":{"name":"transformForNewOwner","type":"propertyDef","startIndex":50092,"stopIndex":50215,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":916},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"928":{"name":"translateBy","type":"propertyDef","startIndex":50248,"stopIndex":50833,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"929":{"name":"transform - accessors","type":"categoryDef","startIndex":50221,"stopIndex":57397,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":928},{"__isSmartRef__":true,"id":930},{"__isSmartRef__":true,"id":931},{"__isSmartRef__":true,"id":932},{"__isSmartRef__":true,"id":933},{"__isSmartRef__":true,"id":934},{"__isSmartRef__":true,"id":935},{"__isSmartRef__":true,"id":936},{"__isSmartRef__":true,"id":937},{"__isSmartRef__":true,"id":938},{"__isSmartRef__":true,"id":939},{"__isSmartRef__":true,"id":940},{"__isSmartRef__":true,"id":941},{"__isSmartRef__":true,"id":942},{"__isSmartRef__":true,"id":943},{"__isSmartRef__":true,"id":944},{"__isSmartRef__":true,"id":945},{"__isSmartRef__":true,"id":946},{"__isSmartRef__":true,"id":947},{"__isSmartRef__":true,"id":948},{"__isSmartRef__":true,"id":949},{"__isSmartRef__":true,"id":950}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"930":{"name":"setRotation","type":"propertyDef","startIndex":50836,"stopIndex":51003,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"931":{"name":"setScale","type":"propertyDef","startIndex":51010,"stopIndex":51216,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"932":{"name":"setScalePoint","type":"propertyDef","startIndex":51219,"stopIndex":51368,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"933":{"name":"gettranslation","type":"propertyDef","startIndex":51371,"stopIndex":51452,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"934":{"name":"getRotation","type":"propertyDef","startIndex":51455,"stopIndex":51803,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"935":{"name":"getScale","type":"propertyDef","startIndex":51806,"stopIndex":51874,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"936":{"name":"moveBy","type":"propertyDef","startIndex":51877,"stopIndex":51933,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"937":{"name":"rotateBy","type":"propertyDef","startIndex":51936,"stopIndex":52013,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"938":{"name":"scaleBy","type":"propertyDef","startIndex":52016,"stopIndex":52157,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"939":{"name":"throb","type":"propertyDef","startIndex":52160,"stopIndex":52231,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"940":{"name":"align","type":"propertyDef","startIndex":52234,"stopIndex":52305,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"941":{"name":"centerAt","type":"propertyDef","startIndex":52308,"stopIndex":52390,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"942":{"name":"getCenter","type":"propertyDef","startIndex":52393,"stopIndex":52449,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"943":{"name":"setCenter","type":"propertyDef","startIndex":52451,"stopIndex":52541,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"944":{"name":"moveOriginBy","type":"propertyDef","startIndex":52545,"stopIndex":52924,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"945":{"name":"moveSubmorphs","type":"propertyDef","startIndex":52927,"stopIndex":54441,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"946":{"name":"transformSubmorphs","type":"propertyDef","startIndex":54444,"stopIndex":54991,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"947":{"name":"moveForwardBy","type":"propertyDef","startIndex":54994,"stopIndex":55164,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"948":{"name":"rotateAround","type":"propertyDef","startIndex":55167,"stopIndex":55655,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"949":{"name":"turnBy","type":"propertyDef","startIndex":55658,"stopIndex":55746,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"950":{"name":"moveRadially","type":"propertyDef","startIndex":55749,"stopIndex":57394,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":929},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"951":{"name":"animatedInterpolateTo","type":"propertyDef","startIndex":57415,"stopIndex":57959,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":952},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"952":{"name":"animations","type":"categoryDef","startIndex":57399,"stopIndex":58623,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":951},{"__isSmartRef__":true,"id":953},{"__isSmartRef__":true,"id":954}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"953":{"name":"animatedFollowPath","type":"propertyDef","startIndex":57962,"stopIndex":58190,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":952},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"954":{"name":"animatedPathStep","type":"propertyDef","startIndex":58193,"stopIndex":58619,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":952},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"955":{"name":"bounceInOwnerBounds","type":"propertyDef","startIndex":58653,"stopIndex":58739,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":956},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"956":{"name":"particle behavior","type":"categoryDef","startIndex":58625,"stopIndex":59974,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":955},{"__isSmartRef__":true,"id":957},{"__isSmartRef__":true,"id":958},{"__isSmartRef__":true,"id":959}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"957":{"name":"bounceInBounds","type":"propertyDef","startIndex":58743,"stopIndex":59690,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":956},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"958":{"name":"stepByVelocities","type":"propertyDef","startIndex":59694,"stopIndex":59842,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":956},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"959":{"name":"stepAndBounce","type":"propertyDef","startIndex":59846,"stopIndex":59969,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":956},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"960":{"name":"getHelpText","type":"propertyDef","startIndex":59995,"stopIndex":60023,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":961},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"961":{"name":"balloon help","type":"categoryDef","startIndex":59976,"stopIndex":60967,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":960},{"__isSmartRef__":true,"id":962},{"__isSmartRef__":true,"id":963}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"962":{"name":"showHelp","type":"propertyDef","startIndex":60059,"stopIndex":60825,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":961},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"963":{"name":"hideHelp","type":"propertyDef","startIndex":60828,"stopIndex":60963,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":961},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"964":{"name":"captureMouseEvent","type":"propertyDef","startIndex":60988,"stopIndex":62535,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"965":{"name":"mouse events","type":"categoryDef","startIndex":60969,"stopIndex":66016,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":964},{"__isSmartRef__":true,"id":966},{"__isSmartRef__":true,"id":967},{"__isSmartRef__":true,"id":968},{"__isSmartRef__":true,"id":969},{"__isSmartRef__":true,"id":970},{"__isSmartRef__":true,"id":971},{"__isSmartRef__":true,"id":972},{"__isSmartRef__":true,"id":973},{"__isSmartRef__":true,"id":974},{"__isSmartRef__":true,"id":975},{"__isSmartRef__":true,"id":976},{"__isSmartRef__":true,"id":977},{"__isSmartRef__":true,"id":978},{"__isSmartRef__":true,"id":979},{"__isSmartRef__":true,"id":980},{"__isSmartRef__":true,"id":981},{"__isSmartRef__":true,"id":982},{"__isSmartRef__":true,"id":983},{"__isSmartRef__":true,"id":984},{"__isSmartRef__":true,"id":985},{"__isSmartRef__":true,"id":986},{"__isSmartRef__":true,"id":987},{"__isSmartRef__":true,"id":988},{"__isSmartRef__":true,"id":989}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"966":{"name":"areEventsIgnored","type":"propertyDef","startIndex":62539,"stopIndex":62625,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"967":{"name":"ignoreEvents","type":"propertyDef","startIndex":62628,"stopIndex":62778,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"968":{"name":"enableEvents","type":"propertyDef","startIndex":62781,"stopIndex":62922,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"969":{"name":"relayMouseEvents","type":"propertyDef","startIndex":62925,"stopIndex":63044,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"970":{"name":"handlesMouseDown","type":"propertyDef","startIndex":63047,"stopIndex":63220,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"971":{"name":"onMouseDown","type":"propertyDef","startIndex":63223,"stopIndex":63275,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"972":{"name":"onMouseMove","type":"propertyDef","startIndex":63297,"stopIndex":63658,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"973":{"name":"onMouseUp","type":"propertyDef","startIndex":63661,"stopIndex":63690,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"974":{"name":"considerShowHelp","type":"propertyDef","startIndex":63712,"stopIndex":63984,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"975":{"name":"delayShowHelp","type":"propertyDef","startIndex":63987,"stopIndex":64208,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"976":{"name":"onMouseOver","type":"propertyDef","startIndex":64211,"stopIndex":64270,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"977":{"name":"onMouseOut","type":"propertyDef","startIndex":64274,"stopIndex":64325,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"978":{"name":"onMouseWheel","type":"propertyDef","startIndex":64329,"stopIndex":64438,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"979":{"name":"takesKeyboardFocus","type":"propertyDef","startIndex":64441,"stopIndex":64477,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"980":{"name":"setHasKeyboardFocus","type":"propertyDef","startIndex":64480,"stopIndex":64517,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"981":{"name":"requestKeyboardFocus","type":"propertyDef","startIndex":64546,"stopIndex":64760,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"982":{"name":"relinquishKeyboardFocus","type":"propertyDef","startIndex":64763,"stopIndex":64882,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"983":{"name":"onFocus","type":"propertyDef","startIndex":64885,"stopIndex":64937,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"984":{"name":"onBlur","type":"propertyDef","startIndex":64940,"stopIndex":64994,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"985":{"name":"removeFocusHalo","type":"propertyDef","startIndex":64997,"stopIndex":65170,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"986":{"name":"focusHaloInset","type":"propertyDef","startIndex":65173,"stopIndex":65191,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"987":{"name":"focusStyle","type":"propertyDef","startIndex":65194,"stopIndex":65274,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"988":{"name":"adjustFocusHalo","type":"propertyDef","startIndex":65277,"stopIndex":65394,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"989":{"name":"addFocusHalo","type":"propertyDef","startIndex":65397,"stopIndex":66012,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":965},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"990":{"name":"checkForControlPointNear","type":"propertyDef","startIndex":66031,"stopIndex":66731,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":991},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"991":{"name":"handles","type":"categoryDef","startIndex":66018,"stopIndex":67983,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":990},{"__isSmartRef__":true,"id":992},{"__isSmartRef__":true,"id":993},{"__isSmartRef__":true,"id":994},{"__isSmartRef__":true,"id":995}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"992":{"name":"addAllHandles","type":"propertyDef","startIndex":66735,"stopIndex":67391,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":991},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"993":{"name":"hasHandles","type":"propertyDef","startIndex":67395,"stopIndex":67500,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":991},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"994":{"name":"removeAllHandlesExcept","type":"propertyDef","startIndex":67504,"stopIndex":67719,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":991},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"995":{"name":"makeHandle","type":"propertyDef","startIndex":67722,"stopIndex":67980,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":991},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"996":{"name":"copySubmorphsOnGrab","type":"propertyDef","startIndex":68012,"stopIndex":68042,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"997":{"name":"grabbing and dragging","type":"categoryDef","startIndex":67985,"stopIndex":76614,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":996},{"__isSmartRef__":true,"id":998},{"__isSmartRef__":true,"id":999},{"__isSmartRef__":true,"id":1000},{"__isSmartRef__":true,"id":1001},{"__isSmartRef__":true,"id":1002},{"__isSmartRef__":true,"id":1003},{"__isSmartRef__":true,"id":1004},{"__isSmartRef__":true,"id":1005},{"__isSmartRef__":true,"id":1006},{"__isSmartRef__":true,"id":1007},{"__isSmartRef__":true,"id":1008},{"__isSmartRef__":true,"id":1009},{"__isSmartRef__":true,"id":1010},{"__isSmartRef__":true,"id":1011},{"__isSmartRef__":true,"id":1012},{"__isSmartRef__":true,"id":1013},{"__isSmartRef__":true,"id":1014},{"__isSmartRef__":true,"id":1015},{"__isSmartRef__":true,"id":1016},{"__isSmartRef__":true,"id":1017},{"__isSmartRef__":true,"id":1018},{"__isSmartRef__":true,"id":1019},{"__isSmartRef__":true,"id":1020}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"998":{"name":"suppressGrabbing","type":"propertyDef","startIndex":68043,"stopIndex":68100,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"999":{"name":"okToBeGrabbedBy","type":"propertyDef","startIndex":68103,"stopIndex":68378,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1000":{"name":"grid","type":"propertyDef","startIndex":68381,"stopIndex":68436,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1001":{"name":"isSnappingToGrid","type":"propertyDef","startIndex":68439,"stopIndex":68502,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1002":{"name":"snapToGrid","type":"propertyDef","startIndex":68505,"stopIndex":68626,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1003":{"name":"dragMe","type":"propertyDef","startIndex":68629,"stopIndex":69196,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1004":{"name":"showAsGrabbed","type":"propertyDef","startIndex":69199,"stopIndex":71209,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1005":{"name":"showAsUngrabbed","type":"propertyDef","startIndex":71212,"stopIndex":71490,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1006":{"name":"alignToGrid","type":"propertyDef","startIndex":71497,"stopIndex":72092,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1007":{"name":"updateGrabHalo","type":"propertyDef","startIndex":72095,"stopIndex":72777,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1008":{"name":"grabMorph","type":"propertyDef","startIndex":72780,"stopIndex":74058,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1009":{"name":"addMorphAsGrabbed","type":"propertyDef","startIndex":74065,"stopIndex":74192,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1010":{"name":"dropMorphsOn","type":"propertyDef","startIndex":74199,"stopIndex":74629,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1011":{"name":"carriedMorphsDo","type":"propertyDef","startIndex":74632,"stopIndex":74932,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1012":{"name":"shadowMorphsDo","type":"propertyDef","startIndex":74935,"stopIndex":75162,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1013":{"name":"unbundleCarriedSelection","type":"propertyDef","startIndex":75165,"stopIndex":75605,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1014":{"name":"toggleDnD","type":"propertyDef","startIndex":75608,"stopIndex":75732,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1015":{"name":"openDnD","type":"propertyDef","startIndex":75735,"stopIndex":75797,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1016":{"name":"closeDnD","type":"propertyDef","startIndex":75800,"stopIndex":75903,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1017":{"name":"closeAllToDnD","type":"propertyDef","startIndex":75906,"stopIndex":76221,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1018":{"name":"openAllToDnD","type":"propertyDef","startIndex":76224,"stopIndex":76364,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1019":{"name":"dropMeOnMorph","type":"propertyDef","startIndex":76367,"stopIndex":76462,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1020":{"name":"pickMeUp","type":"propertyDef","startIndex":76465,"stopIndex":76611,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":997},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1021":{"name":"editMenuItems","type":"propertyDef","startIndex":76633,"stopIndex":76714,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1022":{"name":"morph menu","type":"categoryDef","startIndex":76616,"stopIndex":83043,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1021},{"__isSmartRef__":true,"id":1023},{"__isSmartRef__":true,"id":1024},{"__isSmartRef__":true,"id":1025},{"__isSmartRef__":true,"id":1026},{"__isSmartRef__":true,"id":1027},{"__isSmartRef__":true,"id":1028},{"__isSmartRef__":true,"id":1029},{"__isSmartRef__":true,"id":1030},{"__isSmartRef__":true,"id":1031}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1023":{"name":"showMorphMenu","type":"propertyDef","startIndex":76717,"stopIndex":77372,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1024":{"name":"morphMenuBasicItems","type":"propertyDef","startIndex":77375,"stopIndex":78492,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1025":{"name":"morphMenu","type":"propertyDef","startIndex":78495,"stopIndex":78770,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1026":{"name":"subMenuLayoutItems","type":"propertyDef","startIndex":78772,"stopIndex":79147,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1027":{"name":"subMenuPropertiesItems","type":"propertyDef","startIndex":79151,"stopIndex":80258,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1028":{"name":"subMenuWindowItems","type":"propertyDef","startIndex":80262,"stopIndex":80883,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1029":{"name":"subMenuStyleItems","type":"propertyDef","startIndex":80886,"stopIndex":80984,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1030":{"name":"subMenuItems","type":"propertyDef","startIndex":80987,"stopIndex":81230,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1031":{"name":"showPieMenu","type":"propertyDef","startIndex":81233,"stopIndex":83039,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1022},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1032":{"name":"putMeInAWindow","type":"propertyDef","startIndex":83066,"stopIndex":83349,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1033":{"name":"window related","type":"categoryDef","startIndex":83045,"stopIndex":88039,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1032},{"__isSmartRef__":true,"id":1034},{"__isSmartRef__":true,"id":1035},{"__isSmartRef__":true,"id":1036},{"__isSmartRef__":true,"id":1037},{"__isSmartRef__":true,"id":1038},{"__isSmartRef__":true,"id":1039},{"__isSmartRef__":true,"id":1040},{"__isSmartRef__":true,"id":1041},{"__isSmartRef__":true,"id":1042},{"__isSmartRef__":true,"id":1043},{"__isSmartRef__":true,"id":1044},{"__isSmartRef__":true,"id":1045}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1034":{"name":"putMeInATab","type":"propertyDef","startIndex":83352,"stopIndex":83579,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1035":{"name":"putMeInTheWorld","type":"propertyDef","startIndex":83582,"stopIndex":83785,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1036":{"name":"immediateContainer","type":"propertyDef","startIndex":83788,"stopIndex":83946,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1037":{"name":"windowContent","type":"propertyDef","startIndex":83949,"stopIndex":84041,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1038":{"name":"windowTitle","type":"propertyDef","startIndex":84044,"stopIndex":84161,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1039":{"name":"copyToHand","type":"propertyDef","startIndex":84166,"stopIndex":85036,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1040":{"name":"shadowCopy","type":"propertyDef","startIndex":85039,"stopIndex":85800,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1041":{"name":"shadowCopyIntoShapes","type":"propertyDef","startIndex":85802,"stopIndex":86141,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1042":{"name":"morphToGrabOrReceiveDroppingMorph","type":"propertyDef","startIndex":86145,"stopIndex":86276,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1043":{"name":"morphToGrabOrReceive","type":"propertyDef","startIndex":86279,"stopIndex":87672,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1044":{"name":"morphToReceiveEvent","type":"propertyDef","startIndex":87675,"stopIndex":87897,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1045":{"name":"acceptsDropping","type":"propertyDef","startIndex":87901,"stopIndex":88035,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1033},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1046":{"name":"enterFullScreen","type":"propertyDef","startIndex":88057,"stopIndex":89075,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1047},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1047":{"name":"fullscreen","type":"categoryDef","startIndex":88041,"stopIndex":90098,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1046},{"__isSmartRef__":true,"id":1048},{"__isSmartRef__":true,"id":1049},{"__isSmartRef__":true,"id":1050},{"__isSmartRef__":true,"id":1051}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1048":{"name":"leaveFullScreen","type":"propertyDef","startIndex":89078,"stopIndex":89516,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1047},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1049":{"name":"isInFullScreen","type":"propertyDef","startIndex":89518,"stopIndex":89577,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1047},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1050":{"name":"clipWorld","type":"propertyDef","startIndex":89581,"stopIndex":89909,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1047},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1051":{"name":"unclipWorld","type":"propertyDef","startIndex":89912,"stopIndex":90095,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1047},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1052":{"name":"startSteppingScripts","type":"propertyDef","startIndex":90149,"stopIndex":90189,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1053":{"name":"stepping","type":"categoryDef","startIndex":90100,"stopIndex":93075,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1052},{"__isSmartRef__":true,"id":1054},{"__isSmartRef__":true,"id":1055},{"__isSmartRef__":true,"id":1056},{"__isSmartRef__":true,"id":1057},{"__isSmartRef__":true,"id":1058},{"__isSmartRef__":true,"id":1059},{"__isSmartRef__":true,"id":1060},{"__isSmartRef__":true,"id":1061},{"__isSmartRef__":true,"id":1062},{"__isSmartRef__":true,"id":1063}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1054":{"name":"stopStepping","type":"propertyDef","startIndex":90239,"stopIndex":90532,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1055":{"name":"stopSteppingScriptNamed","type":"propertyDef","startIndex":90536,"stopIndex":90890,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1056":{"name":"stopSteppingScriptNamedAndRemoveFromSubmorphs","type":"propertyDef","startIndex":90892,"stopIndex":91376,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1057":{"name":"startStepping","type":"propertyDef","startIndex":91380,"stopIndex":91640,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1058":{"name":"addActiveScript","type":"propertyDef","startIndex":91643,"stopIndex":92017,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1059":{"name":"stopAllStepping","type":"propertyDef","startIndex":92020,"stopIndex":92157,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1060":{"name":"suspendAllActiveScripts","type":"propertyDef","startIndex":92160,"stopIndex":92311,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1061":{"name":"suspendActiveScripts","type":"propertyDef","startIndex":92314,"stopIndex":92464,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1062":{"name":"resumeAllSuspendedScripts","type":"propertyDef","startIndex":92467,"stopIndex":92823,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1063":{"name":"forceRestartAllActiveScripts","type":"propertyDef","startIndex":92825,"stopIndex":93070,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1053},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1064":{"name":"addScript","type":"propertyDef","startIndex":93090,"stopIndex":93227,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1065},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1065":{"name":"scripts","type":"categoryDef","startIndex":93077,"stopIndex":93347,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1064},{"__isSmartRef__":true,"id":1066}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1066":{"name":"addScriptNamed","type":"propertyDef","startIndex":93230,"stopIndex":93344,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1065},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1067":{"name":"notify","type":"propertyDef","startIndex":93364,"stopIndex":93537,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1068},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1068":{"name":"debugging","type":"categoryDef","startIndex":93349,"stopIndex":95117,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1067},{"__isSmartRef__":true,"id":1069},{"__isSmartRef__":true,"id":1070},{"__isSmartRef__":true,"id":1071},{"__isSmartRef__":true,"id":1072},{"__isSmartRef__":true,"id":1073}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1069":{"name":"showOwnerChain","type":"propertyDef","startIndex":93540,"stopIndex":93835,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1068},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1070":{"name":"toString","type":"propertyDef","startIndex":93838,"stopIndex":94185,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1068},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1071":{"name":"inspect","type":"propertyDef","startIndex":94188,"stopIndex":94313,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1068},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1072":{"name":"addSvgInspector","type":"propertyDef","startIndex":94317,"stopIndex":94652,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1068},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1073":{"name":"addModelInspector","type":"propertyDef","startIndex":94655,"stopIndex":95113,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1068},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1074":{"name":"isContainedIn","type":"propertyDef","startIndex":95130,"stopIndex":95281,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1075},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1075":{"name":"Fabrik","type":"categoryDef","startIndex":95119,"stopIndex":95284,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1074}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1076":{"name":"signalGeometryChange","type":"propertyDef","startIndex":95298,"stopIndex":95482,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1077},"className":"Morph","_owner":{"__isSmartRef__":true,"id":762},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1077":{"name":"signals","type":"categoryDef","startIndex":95286,"stopIndex":95485,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1076}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1078":{"name":null,"type":"comment","startIndex":95489,"stopIndex":95489,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1079":{"name":null,"type":"unknown","startIndex":95490,"stopIndex":95518,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1080":{"name":null,"type":"comment","startIndex":95519,"stopIndex":96275,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1081":{"name":"PasteUpMorph","type":"klassDef","startIndex":96276,"stopIndex":99649,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1082},{"__isSmartRef__":true,"id":1084},{"__isSmartRef__":true,"id":1085},{"__isSmartRef__":true,"id":1086},{"__isSmartRef__":true,"id":1087},{"__isSmartRef__":true,"id":1088},{"__isSmartRef__":true,"id":1089},{"__isSmartRef__":true,"id":1090}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Morph","categories":[{"__isSmartRef__":true,"id":1083}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1082":{"name":"documentation","type":"propertyDef","startIndex":96310,"stopIndex":96390,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1083":{"name":"default category","type":"categoryDef","startIndex":96307,"stopIndex":99646,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1082},{"__isSmartRef__":true,"id":1084},{"__isSmartRef__":true,"id":1085},{"__isSmartRef__":true,"id":1086},{"__isSmartRef__":true,"id":1087},{"__isSmartRef__":true,"id":1088},{"__isSmartRef__":true,"id":1089},{"__isSmartRef__":true,"id":1090}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1084":{"name":"initialize","type":"propertyDef","startIndex":96393,"stopIndex":96494,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1085":{"name":"captureMouseEvent","type":"propertyDef","startIndex":96501,"stopIndex":96744,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1086":{"name":"onMouseDown","type":"propertyDef","startIndex":96747,"stopIndex":97496,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1087":{"name":"bounds","type":"propertyDef","startIndex":97500,"stopIndex":97606,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1088":{"name":"onMouseWheel","type":"propertyDef","startIndex":97610,"stopIndex":98964,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1089":{"name":"okToBeGrabbedBy","type":"propertyDef","startIndex":98968,"stopIndex":99103,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1090":{"name":"makeSelection","type":"propertyDef","startIndex":99106,"stopIndex":99643,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1083},"className":"PasteUpMorph","_owner":{"__isSmartRef__":true,"id":1081},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1091":{"name":null,"type":"comment","startIndex":99650,"stopIndex":99650,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1092":{"name":"WorldMorph","type":"klassDef","startIndex":99651,"stopIndex":150691,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1093},{"__isSmartRef__":true,"id":1095},{"__isSmartRef__":true,"id":1096},{"__isSmartRef__":true,"id":1097},{"__isSmartRef__":true,"id":1098},{"__isSmartRef__":true,"id":1100},{"__isSmartRef__":true,"id":1101},{"__isSmartRef__":true,"id":1102},{"__isSmartRef__":true,"id":1103},{"__isSmartRef__":true,"id":1104},{"__isSmartRef__":true,"id":1106},{"__isSmartRef__":true,"id":1107},{"__isSmartRef__":true,"id":1108},{"__isSmartRef__":true,"id":1109},{"__isSmartRef__":true,"id":1110},{"__isSmartRef__":true,"id":1111},{"__isSmartRef__":true,"id":1112},{"__isSmartRef__":true,"id":1113},{"__isSmartRef__":true,"id":1114},{"__isSmartRef__":true,"id":1115},{"__isSmartRef__":true,"id":1117},{"__isSmartRef__":true,"id":1119},{"__isSmartRef__":true,"id":1120},{"__isSmartRef__":true,"id":1121},{"__isSmartRef__":true,"id":1123},{"__isSmartRef__":true,"id":1124},{"__isSmartRef__":true,"id":1125},{"__isSmartRef__":true,"id":1126},{"__isSmartRef__":true,"id":1127},{"__isSmartRef__":true,"id":1128},{"__isSmartRef__":true,"id":1129},{"__isSmartRef__":true,"id":1130},{"__isSmartRef__":true,"id":1132},{"__isSmartRef__":true,"id":1133},{"__isSmartRef__":true,"id":1134},{"__isSmartRef__":true,"id":1135},{"__isSmartRef__":true,"id":1136},{"__isSmartRef__":true,"id":1137},{"__isSmartRef__":true,"id":1138},{"__isSmartRef__":true,"id":1139},{"__isSmartRef__":true,"id":1140},{"__isSmartRef__":true,"id":1141},{"__isSmartRef__":true,"id":1142},{"__isSmartRef__":true,"id":1144},{"__isSmartRef__":true,"id":1145},{"__isSmartRef__":true,"id":1146},{"__isSmartRef__":true,"id":1147},{"__isSmartRef__":true,"id":1148},{"__isSmartRef__":true,"id":1149},{"__isSmartRef__":true,"id":1150},{"__isSmartRef__":true,"id":1151},{"__isSmartRef__":true,"id":1152},{"__isSmartRef__":true,"id":1154},{"__isSmartRef__":true,"id":1155},{"__isSmartRef__":true,"id":1156},{"__isSmartRef__":true,"id":1157},{"__isSmartRef__":true,"id":1158},{"__isSmartRef__":true,"id":1159},{"__isSmartRef__":true,"id":1160},{"__isSmartRef__":true,"id":1161},{"__isSmartRef__":true,"id":1162},{"__isSmartRef__":true,"id":1163},{"__isSmartRef__":true,"id":1165},{"__isSmartRef__":true,"id":1166},{"__isSmartRef__":true,"id":1168},{"__isSmartRef__":true,"id":1169},{"__isSmartRef__":true,"id":1170},{"__isSmartRef__":true,"id":1171},{"__isSmartRef__":true,"id":1172},{"__isSmartRef__":true,"id":1173},{"__isSmartRef__":true,"id":1174},{"__isSmartRef__":true,"id":1175},{"__isSmartRef__":true,"id":1176},{"__isSmartRef__":true,"id":1177},{"__isSmartRef__":true,"id":1178},{"__isSmartRef__":true,"id":1180},{"__isSmartRef__":true,"id":1181},{"__isSmartRef__":true,"id":1182},{"__isSmartRef__":true,"id":1183},{"__isSmartRef__":true,"id":1184},{"__isSmartRef__":true,"id":1185},{"__isSmartRef__":true,"id":1186},{"__isSmartRef__":true,"id":1187},{"__isSmartRef__":true,"id":1188},{"__isSmartRef__":true,"id":1189},{"__isSmartRef__":true,"id":1190},{"__isSmartRef__":true,"id":1191},{"__isSmartRef__":true,"id":1192},{"__isSmartRef__":true,"id":1194},{"__isSmartRef__":true,"id":1195},{"__isSmartRef__":true,"id":1196},{"__isSmartRef__":true,"id":1197},{"__isSmartRef__":true,"id":1199},{"__isSmartRef__":true,"id":1200},{"__isSmartRef__":true,"id":1201},{"__isSmartRef__":true,"id":1202},{"__isSmartRef__":true,"id":1204},{"__isSmartRef__":true,"id":1205},{"__isSmartRef__":true,"id":1206},{"__isSmartRef__":true,"id":1207},{"__isSmartRef__":true,"id":1208},{"__isSmartRef__":true,"id":1210},{"__isSmartRef__":true,"id":1211},{"__isSmartRef__":true,"id":1212},{"__isSmartRef__":true,"id":1213}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"PasteUpMorph","categories":[{"__isSmartRef__":true,"id":1094},{"__isSmartRef__":true,"id":1099},{"__isSmartRef__":true,"id":1105},{"__isSmartRef__":true,"id":1116},{"__isSmartRef__":true,"id":1118},{"__isSmartRef__":true,"id":1122},{"__isSmartRef__":true,"id":1131},{"__isSmartRef__":true,"id":1143},{"__isSmartRef__":true,"id":1153},{"__isSmartRef__":true,"id":1164},{"__isSmartRef__":true,"id":1167},{"__isSmartRef__":true,"id":1179},{"__isSmartRef__":true,"id":1193},{"__isSmartRef__":true,"id":1198},{"__isSmartRef__":true,"id":1203},{"__isSmartRef__":true,"id":1209},{"__isSmartRef__":true,"id":1214}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1093":{"name":"documentation","type":"propertyDef","startIndex":99702,"stopIndex":99775,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1094},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1094":{"name":"defaults","type":"categoryDef","startIndex":99688,"stopIndex":99916,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1093},{"__isSmartRef__":true,"id":1095},{"__isSmartRef__":true,"id":1096},{"__isSmartRef__":true,"id":1097}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1095":{"name":"fill","type":"propertyDef","startIndex":99777,"stopIndex":99805,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1094},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1096":{"name":"defaultExtent","type":"propertyDef","startIndex":99807,"stopIndex":99840,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1094},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1097":{"name":"styleClass","type":"propertyDef","startIndex":99842,"stopIndex":99864,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1094},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1098":{"name":"initialize","type":"propertyDef","startIndex":99938,"stopIndex":100772,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1099},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1099":{"name":"initialization","type":"categoryDef","startIndex":99918,"stopIndex":102418,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1098},{"__isSmartRef__":true,"id":1100},{"__isSmartRef__":true,"id":1101},{"__isSmartRef__":true,"id":1102},{"__isSmartRef__":true,"id":1103}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1100":{"name":"doNotSerialize","type":"propertyDef","startIndex":100775,"stopIndex":100938,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1099},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1101":{"name":"initializeTransientState","type":"propertyDef","startIndex":100941,"stopIndex":101854,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1099},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1102":{"name":"collectAllUsedFills","type":"propertyDef","startIndex":101857,"stopIndex":102179,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1099},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1103":{"name":"remove","type":"propertyDef","startIndex":102186,"stopIndex":102415,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1099},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1104":{"name":"getInsertPositionFor","type":"propertyDef","startIndex":102434,"stopIndex":102756,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1105":{"name":"private","type":"categoryDef","startIndex":102420,"stopIndex":105617,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1104},{"__isSmartRef__":true,"id":1106},{"__isSmartRef__":true,"id":1107},{"__isSmartRef__":true,"id":1108},{"__isSmartRef__":true,"id":1109},{"__isSmartRef__":true,"id":1110},{"__isSmartRef__":true,"id":1111},{"__isSmartRef__":true,"id":1112},{"__isSmartRef__":true,"id":1113},{"__isSmartRef__":true,"id":1114}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1106":{"name":"toggleNativeCursor","type":"propertyDef","startIndex":102760,"stopIndex":102872,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1107":{"name":"resizeCanvasToFitWorld","type":"propertyDef","startIndex":102875,"stopIndex":103387,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1108":{"name":"displayOnCanvas","type":"propertyDef","startIndex":103390,"stopIndex":103820,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1109":{"name":"addHand","type":"propertyDef","startIndex":103827,"stopIndex":104433,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1110":{"name":"removeHand","type":"propertyDef","startIndex":104440,"stopIndex":104808,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1111":{"name":"toggleBalloonHelp","type":"propertyDef","startIndex":104812,"stopIndex":104937,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1112":{"name":"chooseDisplayTheme","type":"propertyDef","startIndex":104942,"stopIndex":105351,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1113":{"name":"setDisplayTheme","type":"propertyDef","startIndex":105358,"stopIndex":105522,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1114":{"name":"restart","type":"propertyDef","startIndex":105529,"stopIndex":105613,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1105},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1115":{"name":"getMorphNamed","type":"propertyDef","startIndex":105634,"stopIndex":105756,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1116},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1116":{"name":"accessing","type":"categoryDef","startIndex":105619,"stopIndex":105759,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1115}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1117":{"name":"layoutChanged","type":"propertyDef","startIndex":105780,"stopIndex":105832,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1118},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1118":{"name":"geometry","type":"categoryDef","startIndex":105761,"stopIndex":105973,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1117},{"__isSmartRef__":true,"id":1119},{"__isSmartRef__":true,"id":1120}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1119":{"name":"layoutOnSubmorphLayout","type":"propertyDef","startIndex":105835,"stopIndex":105896,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1118},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1120":{"name":"moveBy","type":"propertyDef","startIndex":105904,"stopIndex":105970,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1118},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1121":{"name":"world","type":"propertyDef","startIndex":105987,"stopIndex":106039,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1122":{"name":"world","type":"categoryDef","startIndex":105975,"stopIndex":106983,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1121},{"__isSmartRef__":true,"id":1123},{"__isSmartRef__":true,"id":1124},{"__isSmartRef__":true,"id":1125},{"__isSmartRef__":true,"id":1126},{"__isSmartRef__":true,"id":1127},{"__isSmartRef__":true,"id":1128},{"__isSmartRef__":true,"id":1129}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1123":{"name":"validatedWorld","type":"propertyDef","startIndex":106043,"stopIndex":106104,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1124":{"name":"firstHand","type":"propertyDef","startIndex":106111,"stopIndex":106238,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1125":{"name":"onEnter","type":"propertyDef","startIndex":106241,"stopIndex":106267,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1126":{"name":"onExit","type":"propertyDef","startIndex":106269,"stopIndex":106294,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1127":{"name":"relativize","type":"propertyDef","startIndex":106354,"stopIndex":106509,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1128":{"name":"hideHostMouseCursor","type":"propertyDef","startIndex":106511,"stopIndex":106897,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1129":{"name":"showHostMouseCursor","type":"propertyDef","startIndex":106899,"stopIndex":106977,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1122},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1130":{"name":"getScheduledActions","type":"propertyDef","startIndex":108665,"stopIndex":108773,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1131":{"name":"stepping","type":"categoryDef","startIndex":106985,"stopIndex":114991,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1130},{"__isSmartRef__":true,"id":1132},{"__isSmartRef__":true,"id":1133},{"__isSmartRef__":true,"id":1134},{"__isSmartRef__":true,"id":1135},{"__isSmartRef__":true,"id":1136},{"__isSmartRef__":true,"id":1137},{"__isSmartRef__":true,"id":1138},{"__isSmartRef__":true,"id":1139},{"__isSmartRef__":true,"id":1140},{"__isSmartRef__":true,"id":1141}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1132":{"name":"scheduleForLater","type":"propertyDef","startIndex":108776,"stopIndex":109001,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1133":{"name":"startSteppingFor","type":"propertyDef","startIndex":109008,"stopIndex":109322,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1134":{"name":"stopSteppingFor","type":"propertyDef","startIndex":109329,"stopIndex":109880,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1135":{"name":"stopSteppingForActionsMatching","type":"propertyDef","startIndex":109882,"stopIndex":110050,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1136":{"name":"validateScheduler","type":"propertyDef","startIndex":110060,"stopIndex":110276,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1137":{"name":"inspectScheduledActions","type":"propertyDef","startIndex":110279,"stopIndex":110606,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1138":{"name":"doOneCycle","type":"propertyDef","startIndex":110609,"stopIndex":114118,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1139":{"name":"setNextStepTime","type":"propertyDef","startIndex":114121,"stopIndex":114299,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1140":{"name":"kickstartMainLoop","type":"propertyDef","startIndex":114302,"stopIndex":114463,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1141":{"name":"scheduleAction","type":"propertyDef","startIndex":114466,"stopIndex":114988,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1131},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1142":{"name":"openURLasText","type":"propertyDef","startIndex":115011,"stopIndex":115347,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1143":{"name":"dialogs","type":"categoryDef","startIndex":114993,"stopIndex":120087,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1142},{"__isSmartRef__":true,"id":1144},{"__isSmartRef__":true,"id":1145},{"__isSmartRef__":true,"id":1146},{"__isSmartRef__":true,"id":1147},{"__isSmartRef__":true,"id":1148},{"__isSmartRef__":true,"id":1149},{"__isSmartRef__":true,"id":1150},{"__isSmartRef__":true,"id":1151}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1144":{"name":"viewport","type":"propertyDef","startIndex":115350,"stopIndex":115524,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1145":{"name":"alert","type":"propertyDef","startIndex":115527,"stopIndex":115768,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1146":{"name":"prompt","type":"propertyDef","startIndex":115771,"stopIndex":116389,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1147":{"name":"editPrompt","type":"propertyDef","startIndex":116392,"stopIndex":116858,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1148":{"name":"confirm","type":"propertyDef","startIndex":116861,"stopIndex":117289,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1149":{"name":"showErrorDialog","type":"propertyDef","startIndex":117291,"stopIndex":118857,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1150":{"name":"logError","type":"propertyDef","startIndex":118859,"stopIndex":119068,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1151":{"name":"showErrorDiaglogInWorkspace","type":"propertyDef","startIndex":119071,"stopIndex":120084,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1143},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1152":{"name":"addFramedMorph","type":"propertyDef","startIndex":120110,"stopIndex":120395,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1153":{"name":"new content","type":"categoryDef","startIndex":120089,"stopIndex":123779,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1152},{"__isSmartRef__":true,"id":1154},{"__isSmartRef__":true,"id":1155},{"__isSmartRef__":true,"id":1156},{"__isSmartRef__":true,"id":1157},{"__isSmartRef__":true,"id":1158},{"__isSmartRef__":true,"id":1159},{"__isSmartRef__":true,"id":1160},{"__isSmartRef__":true,"id":1161},{"__isSmartRef__":true,"id":1162}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1154":{"name":"addTextWindow","type":"propertyDef","startIndex":120398,"stopIndex":120877,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1155":{"name":"addTextListWindow","type":"propertyDef","startIndex":120880,"stopIndex":121446,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1156":{"name":"internalAddWindow","type":"propertyDef","startIndex":121449,"stopIndex":121858,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1157":{"name":"addMorphFrontOrBack","type":"propertyDef","startIndex":121862,"stopIndex":122183,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1158":{"name":"topWindow","type":"propertyDef","startIndex":122186,"stopIndex":122367,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1159":{"name":"positionForNewMorph","type":"propertyDef","startIndex":122370,"stopIndex":122858,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1160":{"name":"reactiveAddMorph","type":"propertyDef","startIndex":122861,"stopIndex":123056,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1161":{"name":"resizeByUser","type":"propertyDef","startIndex":123063,"stopIndex":123472,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1162":{"name":"addProgressBar","type":"propertyDef","startIndex":123475,"stopIndex":123776,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1153},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1163":{"name":"showAddWorldRequirementsMenu","type":"propertyDef","startIndex":123800,"stopIndex":124966,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1164},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1164":{"name":"Requirements","type":"categoryDef","startIndex":123782,"stopIndex":125504,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1163},{"__isSmartRef__":true,"id":1165}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1165":{"name":"showRemoveWorldRequirementsMenu","type":"propertyDef","startIndex":124968,"stopIndex":125502,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1164},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1166":{"name":"promptAndSaveWorld","type":"propertyDef","startIndex":125532,"stopIndex":126218,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1167":{"name":"Feedback and Saving","type":"categoryDef","startIndex":125506,"stopIndex":131354,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1166},{"__isSmartRef__":true,"id":1168},{"__isSmartRef__":true,"id":1169},{"__isSmartRef__":true,"id":1170},{"__isSmartRef__":true,"id":1171},{"__isSmartRef__":true,"id":1172},{"__isSmartRef__":true,"id":1173},{"__isSmartRef__":true,"id":1174},{"__isSmartRef__":true,"id":1175},{"__isSmartRef__":true,"id":1176},{"__isSmartRef__":true,"id":1177}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1168":{"name":"saveWorldWithJSON","type":"propertyDef","startIndex":126221,"stopIndex":127375,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1169":{"name":"saveWorld","type":"propertyDef","startIndex":127379,"stopIndex":128915,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1170":{"name":"windowBounds","type":"propertyDef","startIndex":128918,"stopIndex":129433,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1171":{"name":"visibleBounds","type":"propertyDef","startIndex":129437,"stopIndex":129860,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1172":{"name":"ensureStatusMessageContainer","type":"propertyDef","startIndex":129863,"stopIndex":130255,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1173":{"name":"setStatusMessage","type":"propertyDef","startIndex":130258,"stopIndex":130486,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1174":{"name":"showStatusProgress","type":"propertyDef","startIndex":130490,"stopIndex":130658,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1175":{"name":"askForWorldTitle","type":"propertyDef","startIndex":130662,"stopIndex":130909,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1176":{"name":"askForUserName","type":"propertyDef","startIndex":130911,"stopIndex":131207,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1177":{"name":"setCurrentUser","type":"propertyDef","startIndex":131209,"stopIndex":131350,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1167},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1178":{"name":"isProtectedWorld","type":"propertyDef","startIndex":131558,"stopIndex":131656,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1179":{"name":"Menus ","type":"categoryDef","startIndex":131546,"stopIndex":145959,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1178},{"__isSmartRef__":true,"id":1180},{"__isSmartRef__":true,"id":1181},{"__isSmartRef__":true,"id":1182},{"__isSmartRef__":true,"id":1183},{"__isSmartRef__":true,"id":1184},{"__isSmartRef__":true,"id":1185},{"__isSmartRef__":true,"id":1186},{"__isSmartRef__":true,"id":1187},{"__isSmartRef__":true,"id":1188},{"__isSmartRef__":true,"id":1189},{"__isSmartRef__":true,"id":1190},{"__isSmartRef__":true,"id":1191}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1180":{"name":"morphMenu","type":"propertyDef","startIndex":131660,"stopIndex":132454,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1181":{"name":"simpleMorphsSubMenuItems","type":"propertyDef","startIndex":132458,"stopIndex":133521,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1182":{"name":"complexMorphsSubMenuItems","type":"propertyDef","startIndex":133524,"stopIndex":136199,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1183":{"name":"toolSubMenuItems","type":"propertyDef","startIndex":136203,"stopIndex":138403,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1184":{"name":"scriptingSubMenuItems","type":"propertyDef","startIndex":138406,"stopIndex":139055,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1185":{"name":"preferencesSubMenuItems","type":"propertyDef","startIndex":139058,"stopIndex":140288,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1186":{"name":"propertiesSubMenuItems","type":"propertyDef","startIndex":140290,"stopIndex":140772,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1187":{"name":"deprecatedSubMenuItems","type":"propertyDef","startIndex":140775,"stopIndex":142075,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1188":{"name":"helpSubMenuItems","type":"propertyDef","startIndex":142080,"stopIndex":142520,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1189":{"name":"debuggingSubMenuItems","type":"propertyDef","startIndex":142524,"stopIndex":144344,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1190":{"name":"subMenuItems","type":"propertyDef","startIndex":144349,"stopIndex":144873,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1191":{"name":"showPieMenu","type":"propertyDef","startIndex":144877,"stopIndex":145957,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1179},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1192":{"name":"pastePosition","type":"propertyDef","startIndex":146011,"stopIndex":146182,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1193},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1193":{"name":"Copy And Paste (Private)","type":"categoryDef","startIndex":145961,"stopIndex":146910,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1192},{"__isSmartRef__":true,"id":1194},{"__isSmartRef__":true,"id":1195},{"__isSmartRef__":true,"id":1196}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1194":{"name":"pasteFromSource","type":"propertyDef","startIndex":146190,"stopIndex":146469,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1193},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1195":{"name":"copySelectionAsXMLString","type":"propertyDef","startIndex":146473,"stopIndex":146846,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1193},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1196":{"name":"pasteDestinationMorph","type":"propertyDef","startIndex":146849,"stopIndex":146903,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1193},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1197":{"name":"takesKeyboardFocus","type":"propertyDef","startIndex":146933,"stopIndex":146968,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1198},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1198":{"name":"Keyboard Events","type":"categoryDef","startIndex":146912,"stopIndex":149028,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1197},{"__isSmartRef__":true,"id":1199},{"__isSmartRef__":true,"id":1200},{"__isSmartRef__":true,"id":1201}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1199":{"name":"onKeyDown","type":"propertyDef","startIndex":146972,"stopIndex":148749,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1198},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1200":{"name":"onKeyPress","type":"propertyDef","startIndex":148753,"stopIndex":148891,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1198},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1201":{"name":"onKeyUp","type":"propertyDef","startIndex":148894,"stopIndex":149025,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1198},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1202":{"name":"doCopy","type":"propertyDef","startIndex":149044,"stopIndex":149154,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1203},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1203":{"name":"Commands","type":"categoryDef","startIndex":149030,"stopIndex":150110,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1202},{"__isSmartRef__":true,"id":1204},{"__isSmartRef__":true,"id":1205},{"__isSmartRef__":true,"id":1206},{"__isSmartRef__":true,"id":1207}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1204":{"name":"doPaste","type":"propertyDef","startIndex":149158,"stopIndex":149311,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1203},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1205":{"name":"doCopyStyle","type":"propertyDef","startIndex":149313,"stopIndex":149648,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1203},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1206":{"name":"doPasteStyle","type":"propertyDef","startIndex":149650,"stopIndex":149964,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1203},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1207":{"name":"doCut","type":"propertyDef","startIndex":149970,"stopIndex":150107,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1203},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1208":{"name":"getChangeSet","type":"propertyDef","startIndex":150128,"stopIndex":150194,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1209},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1209":{"name":"local code","type":"categoryDef","startIndex":150112,"stopIndex":150568,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1208},{"__isSmartRef__":true,"id":1210},{"__isSmartRef__":true,"id":1211},{"__isSmartRef__":true,"id":1212}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1210":{"name":"setChangeSet","type":"propertyDef","startIndex":150196,"stopIndex":150289,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1209},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1211":{"name":"getCodeNode","type":"propertyDef","startIndex":150292,"stopIndex":150426,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1209},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1212":{"name":"replaceCodeNode","type":"propertyDef","startIndex":150428,"stopIndex":150562,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1209},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1213":{"name":"signalGeometryChange","type":"propertyDef","startIndex":150581,"stopIndex":150684,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1214},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1092},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1214":{"name":"signals","type":"categoryDef","startIndex":150569,"stopIndex":150687,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1213}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1215":{"name":"WorldMorph","type":"klassExtensionDef","startIndex":150692,"stopIndex":150852,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1216},{"__isSmartRef__":true,"id":1218},{"__isSmartRef__":true,"id":1219}],"sourceControl":{"__isSmartRef__":true,"id":727},"categories":[{"__isSmartRef__":true,"id":1217}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1216":{"name":"worldCount","type":"propertyDef","startIndex":150724,"stopIndex":150741,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":1217},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1215},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1217":{"name":"default category","type":"categoryDef","startIndex":150718,"stopIndex":150849,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1216},{"__isSmartRef__":true,"id":1218},{"__isSmartRef__":true,"id":1219}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1218":{"name":"currentWorld","type":"propertyDef","startIndex":150748,"stopIndex":150770,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":1217},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1215},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1219":{"name":"current","type":"propertyDef","startIndex":150777,"stopIndex":150848,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":true,"category":{"__isSmartRef__":true,"id":1217},"className":"WorldMorph","_owner":{"__isSmartRef__":true,"id":1215},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1220":{"name":null,"type":"comment","startIndex":150853,"stopIndex":151022,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1221":{"name":"HandMorph","type":"klassDef","startIndex":151023,"stopIndex":167712,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1222},{"__isSmartRef__":true,"id":1224},{"__isSmartRef__":true,"id":1225},{"__isSmartRef__":true,"id":1226},{"__isSmartRef__":true,"id":1227},{"__isSmartRef__":true,"id":1228},{"__isSmartRef__":true,"id":1229},{"__isSmartRef__":true,"id":1230},{"__isSmartRef__":true,"id":1231},{"__isSmartRef__":true,"id":1233},{"__isSmartRef__":true,"id":1234},{"__isSmartRef__":true,"id":1235},{"__isSmartRef__":true,"id":1237},{"__isSmartRef__":true,"id":1238},{"__isSmartRef__":true,"id":1239},{"__isSmartRef__":true,"id":1240},{"__isSmartRef__":true,"id":1242},{"__isSmartRef__":true,"id":1243},{"__isSmartRef__":true,"id":1244},{"__isSmartRef__":true,"id":1245},{"__isSmartRef__":true,"id":1246},{"__isSmartRef__":true,"id":1248},{"__isSmartRef__":true,"id":1249},{"__isSmartRef__":true,"id":1250},{"__isSmartRef__":true,"id":1252},{"__isSmartRef__":true,"id":1253},{"__isSmartRef__":true,"id":1254},{"__isSmartRef__":true,"id":1255},{"__isSmartRef__":true,"id":1256},{"__isSmartRef__":true,"id":1257},{"__isSmartRef__":true,"id":1259},{"__isSmartRef__":true,"id":1260},{"__isSmartRef__":true,"id":1261},{"__isSmartRef__":true,"id":1263},{"__isSmartRef__":true,"id":1264},{"__isSmartRef__":true,"id":1265},{"__isSmartRef__":true,"id":1266},{"__isSmartRef__":true,"id":1267},{"__isSmartRef__":true,"id":1269},{"__isSmartRef__":true,"id":1270},{"__isSmartRef__":true,"id":1271},{"__isSmartRef__":true,"id":1272},{"__isSmartRef__":true,"id":1274},{"__isSmartRef__":true,"id":1275},{"__isSmartRef__":true,"id":1276},{"__isSmartRef__":true,"id":1278}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Morph","categories":[{"__isSmartRef__":true,"id":1223},{"__isSmartRef__":true,"id":1232},{"__isSmartRef__":true,"id":1236},{"__isSmartRef__":true,"id":1241},{"__isSmartRef__":true,"id":1247},{"__isSmartRef__":true,"id":1251},{"__isSmartRef__":true,"id":1258},{"__isSmartRef__":true,"id":1262},{"__isSmartRef__":true,"id":1268},{"__isSmartRef__":true,"id":1273},{"__isSmartRef__":true,"id":1277},{"__isSmartRef__":true,"id":1279}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1222":{"name":"documentation","type":"propertyDef","startIndex":151079,"stopIndex":151154,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1223":{"name":"default properties","type":"categoryDef","startIndex":151052,"stopIndex":151500,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1222},{"__isSmartRef__":true,"id":1224},{"__isSmartRef__":true,"id":1225},{"__isSmartRef__":true,"id":1226},{"__isSmartRef__":true,"id":1227},{"__isSmartRef__":true,"id":1228},{"__isSmartRef__":true,"id":1229},{"__isSmartRef__":true,"id":1230}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1224":{"name":"applyDropShadowFilter","type":"propertyDef","startIndex":151156,"stopIndex":151205,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1225":{"name":"dropShadowFilter","type":"propertyDef","startIndex":151207,"stopIndex":151253,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1226":{"name":"useShadowMorphs","type":"propertyDef","startIndex":151255,"stopIndex":151298,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1227":{"name":"shadowOffset","type":"propertyDef","startIndex":151301,"stopIndex":151326,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1228":{"name":"handleOnCapture","type":"propertyDef","startIndex":151328,"stopIndex":151354,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1229":{"name":"logDnD","type":"propertyDef","startIndex":151356,"stopIndex":151381,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1230":{"name":"grabHaloLabelStyle","type":"propertyDef","startIndex":151383,"stopIndex":151496,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1223},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1231":{"name":"initialize","type":"propertyDef","startIndex":151512,"stopIndex":152466,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1232},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1232":{"name":"Basic","type":"categoryDef","startIndex":151502,"stopIndex":152640,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1231},{"__isSmartRef__":true,"id":1233},{"__isSmartRef__":true,"id":1234}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1233":{"name":"id","type":"propertyDef","startIndex":152469,"stopIndex":152578,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1232},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1234":{"name":"world","type":"propertyDef","startIndex":152581,"stopIndex":152637,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1232},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1235":{"name":"lookNormal","type":"propertyDef","startIndex":152653,"stopIndex":152785,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1236},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1236":{"name":"Looks","type":"categoryDef","startIndex":152642,"stopIndex":153502,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1235},{"__isSmartRef__":true,"id":1237},{"__isSmartRef__":true,"id":1238},{"__isSmartRef__":true,"id":1239}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1237":{"name":"lookTouchy","type":"propertyDef","startIndex":152789,"stopIndex":153074,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1236},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1238":{"name":"lookLinky","type":"propertyDef","startIndex":153078,"stopIndex":153190,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1236},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1239":{"name":"lookLikeAnUpDownArrow","type":"propertyDef","startIndex":153193,"stopIndex":153499,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1236},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1240":{"name":"addOrRemoveEvents","type":"propertyDef","startIndex":153526,"stopIndex":153878,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1241},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1241":{"name":"Event Registering","type":"categoryDef","startIndex":153504,"stopIndex":154387,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1240},{"__isSmartRef__":true,"id":1242},{"__isSmartRef__":true,"id":1243},{"__isSmartRef__":true,"id":1244},{"__isSmartRef__":true,"id":1245}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1242":{"name":"registerForEvents","type":"propertyDef","startIndex":153882,"stopIndex":153997,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1241},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1243":{"name":"unregisterForEvents","type":"propertyDef","startIndex":154000,"stopIndex":154123,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1241},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1244":{"name":"registerForKeyboardEvents","type":"propertyDef","startIndex":154130,"stopIndex":154251,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1241},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1245":{"name":"unregisterForKeyboardEvents","type":"propertyDef","startIndex":154254,"stopIndex":154383,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1241},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1246":{"name":"resetMouseFocusChanges","type":"propertyDef","startIndex":154399,"stopIndex":154533,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1247},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1247":{"name":"Focus","type":"categoryDef","startIndex":154389,"stopIndex":155281,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1246},{"__isSmartRef__":true,"id":1248},{"__isSmartRef__":true,"id":1249}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1248":{"name":"setMouseFocus","type":"propertyDef","startIndex":154536,"stopIndex":154792,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1247},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1249":{"name":"setKeyboardFocus","type":"propertyDef","startIndex":154799,"stopIndex":155273,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1247},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1250":{"name":"handleEvent","type":"propertyDef","startIndex":155302,"stopIndex":156395,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1251},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1251":{"name":"Event Handling","type":"categoryDef","startIndex":155283,"stopIndex":160938,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1250},{"__isSmartRef__":true,"id":1252},{"__isSmartRef__":true,"id":1253},{"__isSmartRef__":true,"id":1254},{"__isSmartRef__":true,"id":1255},{"__isSmartRef__":true,"id":1256}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1252":{"name":"armProfileFor","type":"propertyDef","startIndex":156398,"stopIndex":156510,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1251},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1253":{"name":"makeANullMove","type":"propertyDef","startIndex":156513,"stopIndex":157131,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1251},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1254":{"name":"handleMouseEvent","type":"propertyDef","startIndex":157134,"stopIndex":157624,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1251},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1255":{"name":"handleTouchEvent","type":"propertyDef","startIndex":157626,"stopIndex":157727,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1251},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1256":{"name":"reallyHandleMouseEvent","type":"propertyDef","startIndex":157731,"stopIndex":160935,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1251},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1257":{"name":"checkMouseUpIsInClickTimeSpan","type":"propertyDef","startIndex":160950,"stopIndex":161244,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1258},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1258":{"name":"Misc","type":"categoryDef","startIndex":160940,"stopIndex":161939,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1257},{"__isSmartRef__":true,"id":1259},{"__isSmartRef__":true,"id":1260}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1259":{"name":"checkMouseOverAndOut","type":"propertyDef","startIndex":161247,"stopIndex":161696,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1258},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1260":{"name":"layoutChanged","type":"propertyDef","startIndex":161699,"stopIndex":161936,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1258},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1261":{"name":"isKeyDown","type":"propertyDef","startIndex":161961,"stopIndex":162070,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1262},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1262":{"name":"Keyboard Events","type":"categoryDef","startIndex":161941,"stopIndex":164669,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1261},{"__isSmartRef__":true,"id":1263},{"__isSmartRef__":true,"id":1264},{"__isSmartRef__":true,"id":1265},{"__isSmartRef__":true,"id":1266}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1263":{"name":"forgetKeyDown","type":"propertyDef","startIndex":162074,"stopIndex":162346,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1262},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1264":{"name":"rememberKeyDown","type":"propertyDef","startIndex":162349,"stopIndex":162550,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1262},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1265":{"name":"handleKeyboardEvent","type":"propertyDef","startIndex":162553,"stopIndex":163844,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1262},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1266":{"name":"blockBrowserKeyBindings","type":"propertyDef","startIndex":163848,"stopIndex":164666,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1262},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1267":{"name":"bounds","type":"propertyDef","startIndex":164684,"stopIndex":164873,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1268},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1268":{"name":"Geometry","type":"categoryDef","startIndex":164671,"stopIndex":165559,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1267},{"__isSmartRef__":true,"id":1269},{"__isSmartRef__":true,"id":1270},{"__isSmartRef__":true,"id":1271}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1269":{"name":"getInsertPositionFor","type":"propertyDef","startIndex":164876,"stopIndex":165068,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1268},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1270":{"name":"toString","type":"propertyDef","startIndex":165071,"stopIndex":165430,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1268},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1271":{"name":"setPosition","type":"propertyDef","startIndex":165433,"stopIndex":165556,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1268},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1272":{"name":"removeIndicatorMorph","type":"propertyDef","startIndex":165575,"stopIndex":165719,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1273},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1273":{"name":"Indicator","type":"categoryDef","startIndex":165561,"stopIndex":166322,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1272},{"__isSmartRef__":true,"id":1274},{"__isSmartRef__":true,"id":1275}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1274":{"name":"ensureIndicatorMorph","type":"propertyDef","startIndex":165722,"stopIndex":166146,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1273},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1275":{"name":"hasSubmorphs","type":"propertyDef","startIndex":166149,"stopIndex":166319,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1273},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1276":{"name":"scrollDuringDrag","type":"propertyDef","startIndex":166338,"stopIndex":167388,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1277},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1277":{"name":"Scrolling","type":"categoryDef","startIndex":166324,"stopIndex":167390,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1276}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1278":{"name":"changed","type":"propertyDef","startIndex":167426,"stopIndex":167707,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1279},"className":"HandMorph","_owner":{"__isSmartRef__":true,"id":1221},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1279":{"name":"Fabrik Extension (DEPRECATED)","type":"categoryDef","startIndex":167392,"stopIndex":167709,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1278}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1280":{"name":null,"type":"comment","startIndex":167713,"stopIndex":167713,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1281":{"name":"LinkMorph","type":"klassDef","startIndex":167714,"stopIndex":173075,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1282},{"__isSmartRef__":true,"id":1284},{"__isSmartRef__":true,"id":1285},{"__isSmartRef__":true,"id":1286},{"__isSmartRef__":true,"id":1287},{"__isSmartRef__":true,"id":1288},{"__isSmartRef__":true,"id":1289},{"__isSmartRef__":true,"id":1290},{"__isSmartRef__":true,"id":1291},{"__isSmartRef__":true,"id":1292},{"__isSmartRef__":true,"id":1293},{"__isSmartRef__":true,"id":1294},{"__isSmartRef__":true,"id":1295},{"__isSmartRef__":true,"id":1296},{"__isSmartRef__":true,"id":1297},{"__isSmartRef__":true,"id":1298},{"__isSmartRef__":true,"id":1299}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Morph","categories":[{"__isSmartRef__":true,"id":1283}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1282":{"name":"documentation","type":"propertyDef","startIndex":167745,"stopIndex":167809,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1283":{"name":"default category","type":"categoryDef","startIndex":167742,"stopIndex":173072,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1282},{"__isSmartRef__":true,"id":1284},{"__isSmartRef__":true,"id":1285},{"__isSmartRef__":true,"id":1286},{"__isSmartRef__":true,"id":1287},{"__isSmartRef__":true,"id":1288},{"__isSmartRef__":true,"id":1289},{"__isSmartRef__":true,"id":1290},{"__isSmartRef__":true,"id":1291},{"__isSmartRef__":true,"id":1292},{"__isSmartRef__":true,"id":1293},{"__isSmartRef__":true,"id":1294},{"__isSmartRef__":true,"id":1295},{"__isSmartRef__":true,"id":1296},{"__isSmartRef__":true,"id":1297},{"__isSmartRef__":true,"id":1298},{"__isSmartRef__":true,"id":1299}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1284":{"name":"helpText","type":"propertyDef","startIndex":167811,"stopIndex":167982,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1285":{"name":"openForDragAndDrop","type":"propertyDef","startIndex":167984,"stopIndex":168013,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1286":{"name":"suppressHandles","type":"propertyDef","startIndex":168015,"stopIndex":168040,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1287":{"name":"style","type":"propertyDef","startIndex":168042,"stopIndex":168292,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1288":{"name":"initialize","type":"propertyDef","startIndex":168299,"stopIndex":169353,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1289":{"name":"makeNewWorld","type":"propertyDef","startIndex":169360,"stopIndex":169429,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1290":{"name":"addPathBack","type":"propertyDef","startIndex":169436,"stopIndex":169831,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1291":{"name":"onDeserialize","type":"propertyDef","startIndex":169838,"stopIndex":169986,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1292":{"name":"handlesMouseDown","type":"propertyDef","startIndex":169989,"stopIndex":170042,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1293":{"name":"onMouseDown","type":"propertyDef","startIndex":170045,"stopIndex":170120,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1294":{"name":"morphMenu","type":"propertyDef","startIndex":170123,"stopIndex":170526,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1295":{"name":"enterMyWorld","type":"propertyDef","startIndex":170529,"stopIndex":172371,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1296":{"name":"onMouseOver","type":"propertyDef","startIndex":172378,"stopIndex":172591,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1297":{"name":"onMouseOut","type":"propertyDef","startIndex":172594,"stopIndex":172689,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1298":{"name":"getHelpText","type":"propertyDef","startIndex":172692,"stopIndex":172745,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1299":{"name":"addLabel","type":"propertyDef","startIndex":172749,"stopIndex":173065,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1283},"className":"LinkMorph","_owner":{"__isSmartRef__":true,"id":1281},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1300":{"name":null,"type":"comment","startIndex":173076,"stopIndex":173076,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1301":{"name":"ExternalLinkMorph","type":"klassDef","startIndex":173077,"stopIndex":174387,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1302},{"__isSmartRef__":true,"id":1304},{"__isSmartRef__":true,"id":1305},{"__isSmartRef__":true,"id":1306},{"__isSmartRef__":true,"id":1307},{"__isSmartRef__":true,"id":1308},{"__isSmartRef__":true,"id":1309},{"__isSmartRef__":true,"id":1310}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"LinkMorph","categories":[{"__isSmartRef__":true,"id":1303}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1302":{"name":"documentation","type":"propertyDef","startIndex":173120,"stopIndex":173205,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1303":{"name":"default category","type":"categoryDef","startIndex":173117,"stopIndex":174384,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1302},{"__isSmartRef__":true,"id":1304},{"__isSmartRef__":true,"id":1305},{"__isSmartRef__":true,"id":1306},{"__isSmartRef__":true,"id":1307},{"__isSmartRef__":true,"id":1308},{"__isSmartRef__":true,"id":1309},{"__isSmartRef__":true,"id":1310}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1304":{"name":"style","type":"propertyDef","startIndex":173208,"stopIndex":173381,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1305":{"name":"initialize","type":"propertyDef","startIndex":173388,"stopIndex":173536,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1306":{"name":"makeNewWorld","type":"propertyDef","startIndex":173539,"stopIndex":173571,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1307":{"name":"addPathBack","type":"propertyDef","startIndex":173579,"stopIndex":173610,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1308":{"name":"enterMyWorld","type":"propertyDef","startIndex":173613,"stopIndex":174002,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1309":{"name":"getHelpText","type":"propertyDef","startIndex":174009,"stopIndex":174083,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1310":{"name":"morphMenu","type":"propertyDef","startIndex":174086,"stopIndex":174383,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1303},"className":"ExternalLinkMorph","_owner":{"__isSmartRef__":true,"id":1301},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1311":{"name":null,"type":"comment","startIndex":174388,"stopIndex":174440,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1312":{"name":"BoxMorph","type":"klassDef","startIndex":174441,"stopIndex":174667,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1313},{"__isSmartRef__":true,"id":1315}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Morph","categories":[{"__isSmartRef__":true,"id":1314}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1313":{"name":"documentation","type":"propertyDef","startIndex":174471,"stopIndex":174550,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1314},"className":"BoxMorph","_owner":{"__isSmartRef__":true,"id":1312},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1314":{"name":"default category","type":"categoryDef","startIndex":174468,"stopIndex":174664,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1313},{"__isSmartRef__":true,"id":1315}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1315":{"name":"initialize","type":"propertyDef","startIndex":174553,"stopIndex":174661,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1314},"className":"BoxMorph","_owner":{"__isSmartRef__":true,"id":1312},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1316":{"name":null,"type":"comment","startIndex":174668,"stopIndex":174668,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1317":{"name":"ContainerMorph","type":"klassDef","startIndex":174669,"stopIndex":175726,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1318},{"__isSmartRef__":true,"id":1320},{"__isSmartRef__":true,"id":1321},{"__isSmartRef__":true,"id":1322},{"__isSmartRef__":true,"id":1323}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"BoxMorph","categories":[{"__isSmartRef__":true,"id":1319}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1318":{"name":"documentation","type":"propertyDef","startIndex":174707,"stopIndex":174783,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1319},"className":"ContainerMorph","_owner":{"__isSmartRef__":true,"id":1317},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1319":{"name":"default category","type":"categoryDef","startIndex":174705,"stopIndex":175723,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1318},{"__isSmartRef__":true,"id":1320},{"__isSmartRef__":true,"id":1321},{"__isSmartRef__":true,"id":1322},{"__isSmartRef__":true,"id":1323}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1320":{"name":"initialize","type":"propertyDef","startIndex":174786,"stopIndex":174867,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1319},"className":"ContainerMorph","_owner":{"__isSmartRef__":true,"id":1317},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1321":{"name":"initializeTransientState","type":"propertyDef","startIndex":174870,"stopIndex":174998,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1319},"className":"ContainerMorph","_owner":{"__isSmartRef__":true,"id":1317},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1322":{"name":"addMorph","type":"propertyDef","startIndex":175001,"stopIndex":175231,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1319},"className":"ContainerMorph","_owner":{"__isSmartRef__":true,"id":1317},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1323":{"name":"adjustForNewBounds","type":"propertyDef","startIndex":175234,"stopIndex":175717,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1319},"className":"ContainerMorph","_owner":{"__isSmartRef__":true,"id":1317},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1324":{"name":"PathMorph","type":"klassDef","startIndex":175727,"stopIndex":179938,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1325},{"__isSmartRef__":true,"id":1327},{"__isSmartRef__":true,"id":1329},{"__isSmartRef__":true,"id":1330},{"__isSmartRef__":true,"id":1331},{"__isSmartRef__":true,"id":1332},{"__isSmartRef__":true,"id":1334},{"__isSmartRef__":true,"id":1335},{"__isSmartRef__":true,"id":1337},{"__isSmartRef__":true,"id":1338},{"__isSmartRef__":true,"id":1339},{"__isSmartRef__":true,"id":1340},{"__isSmartRef__":true,"id":1341},{"__isSmartRef__":true,"id":1343},{"__isSmartRef__":true,"id":1345},{"__isSmartRef__":true,"id":1346},{"__isSmartRef__":true,"id":1348}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Morph","categories":[{"__isSmartRef__":true,"id":1326},{"__isSmartRef__":true,"id":1328},{"__isSmartRef__":true,"id":1333},{"__isSmartRef__":true,"id":1336},{"__isSmartRef__":true,"id":1342},{"__isSmartRef__":true,"id":1344},{"__isSmartRef__":true,"id":1347}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1325":{"name":"documentation","type":"propertyDef","startIndex":175774,"stopIndex":175862,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1326},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1326":{"name":"documentation","type":"categoryDef","startIndex":175755,"stopIndex":175865,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1325}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1327":{"name":"suppressGrabbing","type":"propertyDef","startIndex":175881,"stopIndex":175905,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1328},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1328":{"name":"settings","type":"categoryDef","startIndex":175867,"stopIndex":176017,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1327},{"__isSmartRef__":true,"id":1329},{"__isSmartRef__":true,"id":1330},{"__isSmartRef__":true,"id":1331}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1329":{"name":"openForDragAndDrop","type":"propertyDef","startIndex":175907,"stopIndex":175933,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1328},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1330":{"name":"style","type":"propertyDef","startIndex":175935,"stopIndex":175997,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1328},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1331":{"name":"isCurve","type":"propertyDef","startIndex":175999,"stopIndex":176014,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1328},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1332":{"name":"initialize","type":"propertyDef","startIndex":176037,"stopIndex":176117,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1333},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1333":{"name":"initializing","type":"categoryDef","startIndex":176019,"stopIndex":176367,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1332},{"__isSmartRef__":true,"id":1334}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1334":{"name":"createPathShape","type":"propertyDef","startIndex":176119,"stopIndex":176364,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1333},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1335":{"name":"getLength","type":"propertyDef","startIndex":176384,"stopIndex":176453,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1336},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1336":{"name":"accessing","type":"categoryDef","startIndex":176369,"stopIndex":176990,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1335},{"__isSmartRef__":true,"id":1337},{"__isSmartRef__":true,"id":1338},{"__isSmartRef__":true,"id":1339},{"__isSmartRef__":true,"id":1340}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1337":{"name":"getPointAtLength","type":"propertyDef","startIndex":176455,"stopIndex":176560,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1336},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1338":{"name":"getRelativePoint","type":"propertyDef","startIndex":176562,"stopIndex":176828,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1336},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1339":{"name":"enableInsertionPoints","type":"propertyDef","startIndex":176831,"stopIndex":176907,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1336},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1340":{"name":"disableInsertionPoints","type":"propertyDef","startIndex":176909,"stopIndex":176987,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1336},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1341":{"name":"pathBetweenRects","type":"propertyDef","startIndex":177016,"stopIndex":178779,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1342},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1342":{"name":"geometry computing","type":"categoryDef","startIndex":176992,"stopIndex":178782,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1341}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1343":{"name":"convertToLine","type":"propertyDef","startIndex":178800,"stopIndex":179008,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1344},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1344":{"name":"converting","type":"categoryDef","startIndex":178784,"stopIndex":179604,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1343},{"__isSmartRef__":true,"id":1345}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1345":{"name":"convertToCurve","type":"propertyDef","startIndex":179010,"stopIndex":179601,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1344},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1346":{"name":"toggleLineStyle","type":"propertyDef","startIndex":179616,"stopIndex":179744,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1347},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1347":{"name":"menu","type":"categoryDef","startIndex":179606,"stopIndex":179935,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1346},{"__isSmartRef__":true,"id":1348}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1348":{"name":"subMenuItems","type":"propertyDef","startIndex":179746,"stopIndex":179933,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1347},"className":"PathMorph","_owner":{"__isSmartRef__":true,"id":1324},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1349":{"name":null,"type":"comment","startIndex":179939,"stopIndex":179939,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1350":{"name":"PseudoMorph","type":"klassDef","startIndex":179940,"stopIndex":180171,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1351},{"__isSmartRef__":true,"id":1353}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Morph","categories":[{"__isSmartRef__":true,"id":1352}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1351":{"name":"description","type":"propertyDef","startIndex":179972,"stopIndex":180063,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1352},"className":"PseudoMorph","_owner":{"__isSmartRef__":true,"id":1350},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1352":{"name":"default category","type":"categoryDef","startIndex":179970,"stopIndex":180168,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1351},{"__isSmartRef__":true,"id":1353}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1353":{"name":"initialize","type":"propertyDef","startIndex":180070,"stopIndex":180167,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1352},"className":"PseudoMorph","_owner":{"__isSmartRef__":true,"id":1350},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1354":{"name":null,"type":"comment","startIndex":180172,"stopIndex":180173,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1355":{"name":"Invocation","type":"klassDef","startIndex":180174,"stopIndex":180721,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1356},{"__isSmartRef__":true,"id":1358}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"PseudoMorph","categories":[{"__isSmartRef__":true,"id":1357}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1356":{"name":"initialize","type":"propertyDef","startIndex":180212,"stopIndex":180392,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1357},"className":"Invocation","_owner":{"__isSmartRef__":true,"id":1355},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1357":{"name":"default category","type":"categoryDef","startIndex":180209,"stopIndex":180718,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1356},{"__isSmartRef__":true,"id":1358}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1358":{"name":"exec","type":"propertyDef","startIndex":180395,"stopIndex":180715,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1357},"className":"Invocation","_owner":{"__isSmartRef__":true,"id":1355},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1359":{"name":null,"type":"comment","startIndex":180722,"stopIndex":180722,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1360":{"name":"SchedulableAction","type":"klassDef","startIndex":180723,"stopIndex":181635,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1361},{"__isSmartRef__":true,"id":1363},{"__isSmartRef__":true,"id":1364},{"__isSmartRef__":true,"id":1365},{"__isSmartRef__":true,"id":1366},{"__isSmartRef__":true,"id":1367},{"__isSmartRef__":true,"id":1368}],"sourceControl":{"__isSmartRef__":true,"id":727},"superclassName":"Invocation","categories":[{"__isSmartRef__":true,"id":1362}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1361":{"name":"documentation","type":"propertyDef","startIndex":180767,"stopIndex":180817,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1362},"className":"SchedulableAction","_owner":{"__isSmartRef__":true,"id":1360},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1362":{"name":"default category","type":"categoryDef","startIndex":180764,"stopIndex":181632,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1361},{"__isSmartRef__":true,"id":1363},{"__isSmartRef__":true,"id":1364},{"__isSmartRef__":true,"id":1365},{"__isSmartRef__":true,"id":1366},{"__isSmartRef__":true,"id":1367},{"__isSmartRef__":true,"id":1368}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1363":{"name":"beVerbose","type":"propertyDef","startIndex":180819,"stopIndex":180836,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1362},"className":"SchedulableAction","_owner":{"__isSmartRef__":true,"id":1360},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1364":{"name":"initialize","type":"propertyDef","startIndex":180839,"stopIndex":180997,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1362},"className":"SchedulableAction","_owner":{"__isSmartRef__":true,"id":1360},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1365":{"name":"toString","type":"propertyDef","startIndex":181000,"stopIndex":181176,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1362},"className":"SchedulableAction","_owner":{"__isSmartRef__":true,"id":1360},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1366":{"name":"stop","type":"propertyDef","startIndex":181179,"stopIndex":181306,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1362},"className":"SchedulableAction","_owner":{"__isSmartRef__":true,"id":1360},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1367":{"name":"start","type":"propertyDef","startIndex":181309,"stopIndex":181438,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1362},"className":"SchedulableAction","_owner":{"__isSmartRef__":true,"id":1360},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1368":{"name":"equalActorAndName","type":"propertyDef","startIndex":181441,"stopIndex":181631,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1362},"className":"SchedulableAction","_owner":{"__isSmartRef__":true,"id":1360},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1369":{"name":null,"type":"comment","startIndex":181636,"stopIndex":181636,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1370":{"name":"Morph","type":"klassExtensionDef","startIndex":181637,"stopIndex":182523,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1371}],"sourceControl":{"__isSmartRef__":true,"id":727},"categories":[{"__isSmartRef__":true,"id":1372}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1371":{"name":"plugTo","type":"propertyDef","startIndex":181666,"stopIndex":182517,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1372},"className":"Morph","_owner":{"__isSmartRef__":true,"id":1370},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1372":{"name":"plugs","type":"categoryDef","startIndex":181655,"stopIndex":182520,"fileName":"lively/oldCore/Morphs.js","_subElements":[{"__isSmartRef__":true,"id":1371}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1373":{"name":null,"type":"comment","startIndex":182524,"stopIndex":182524,"fileName":"lively/oldCore/Morphs.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1374":{"target":{"__isSmartRef__":true,"id":1375},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.LocalBrowser","__LivelyClassName__":"lively.ide.ChangeSetNode"},"1375":{"name":"Local code","__SourceModuleName__":"Global.lively.ChangeSet","__LivelyClassName__":"ChangeSet"},"1376":{"isListItem":true,"string":"Events.js (not parsed)","value":{"__isSmartRef__":true,"id":728}},"1377":{"isListItem":true,"string":"Hacks.js (not parsed)","value":{"__isSmartRef__":true,"id":729}},"1378":{"isListItem":true,"string":"Layout.js (not parsed)","value":{"__isSmartRef__":true,"id":730}},"1379":{"isListItem":true,"string":"Misc.js (not parsed)","value":{"__isSmartRef__":true,"id":731}},"1380":{"isListItem":true,"string":"Morphs.js","value":{"__isSmartRef__":true,"id":732}},"1381":{"isListItem":true,"string":"Local code","value":{"__isSmartRef__":true,"id":1374}},"1382":{"sourceObj":{"__isSmartRef__":true,"id":717},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setPane1Selection","converter":null,"converterString":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1383":{"sourceObj":{"__isSmartRef__":true,"id":717},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane1Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1384":{"sourceObj":{"__isSmartRef__":true,"id":717},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane1Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1385":{"sourceObj":{"__isSmartRef__":true,"id":717},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane1Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1386":{"sourceObj":{"__isSmartRef__":true,"id":520},"sourceAttrName":"setPane2Content","targetObj":{"__isSmartRef__":true,"id":1387},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1387":{"submorphs":[],"scripts":[],"id":385,"shape":{"__isSmartRef__":true,"id":1388},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":1391},"itemList":[{"__isSmartRef__":true,"id":1392},{"__isSmartRef__":true,"id":1394},{"__isSmartRef__":true,"id":1396},{"__isSmartRef__":true,"id":1398},{"__isSmartRef__":true,"id":1400},{"__isSmartRef__":true,"id":1402},{"__isSmartRef__":true,"id":1404},{"__isSmartRef__":true,"id":1406},{"__isSmartRef__":true,"id":1408},{"__isSmartRef__":true,"id":1410},{"__isSmartRef__":true,"id":1412},{"__isSmartRef__":true,"id":1414},{"__isSmartRef__":true,"id":1416},{"__isSmartRef__":true,"id":1418},{"__isSmartRef__":true,"id":1420},{"__isSmartRef__":true,"id":1422},{"__isSmartRef__":true,"id":1424},{"__isSmartRef__":true,"id":1426}],"selectedLineNo":1,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":510},"attributeConnections":[{"__isSmartRef__":true,"id":1428},{"__isSmartRef__":true,"id":1429},{"__isSmartRef__":true,"id":1430},{"__isSmartRef__":true,"id":1431}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"__SourceModuleName__":"Global.lively.morphic.Core","selection":{"__isSmartRef__":true,"id":1432},"__LivelyClassName__":"lively.morphic.List"},"1388":{"_Position":{"__isSmartRef__":true,"id":1389},"_Extent":{"__isSmartRef__":true,"id":1390},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":721},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1389":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1390":{"x":205,"y":192.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1391":{"x":205,"y":27.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1392":{"isListItem":true,"string":"MouseHandlerForDragging","value":{"__isSmartRef__":true,"id":1393}},"1393":{"target":{"__isSmartRef__":true,"id":735},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1394":{"isListItem":true,"string":"MouseHandlerForRelay","value":{"__isSmartRef__":true,"id":1395}},"1395":{"target":{"__isSmartRef__":true,"id":740},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1396":{"isListItem":true,"string":"Morph","value":{"__isSmartRef__":true,"id":1397}},"1397":{"target":{"__isSmartRef__":true,"id":747},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1398":{"isListItem":true,"string":"Morph (extension)","value":{"__isSmartRef__":true,"id":1399}},"1399":{"target":{"__isSmartRef__":true,"id":749},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1400":{"isListItem":true,"string":"Morph (extension)","value":{"__isSmartRef__":true,"id":1401}},"1401":{"target":{"__isSmartRef__":true,"id":762},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1402":{"isListItem":true,"string":"PasteUpMorph","value":{"__isSmartRef__":true,"id":1403}},"1403":{"target":{"__isSmartRef__":true,"id":1081},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1404":{"isListItem":true,"string":"WorldMorph","value":{"__isSmartRef__":true,"id":1405}},"1405":{"target":{"__isSmartRef__":true,"id":1092},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1406":{"isListItem":true,"string":"WorldMorph (extension)","value":{"__isSmartRef__":true,"id":1407}},"1407":{"target":{"__isSmartRef__":true,"id":1215},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1408":{"isListItem":true,"string":"HandMorph","value":{"__isSmartRef__":true,"id":1409}},"1409":{"target":{"__isSmartRef__":true,"id":1221},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1410":{"isListItem":true,"string":"LinkMorph","value":{"__isSmartRef__":true,"id":1411}},"1411":{"target":{"__isSmartRef__":true,"id":1281},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1412":{"isListItem":true,"string":"ExternalLinkMorph","value":{"__isSmartRef__":true,"id":1413}},"1413":{"target":{"__isSmartRef__":true,"id":1301},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1414":{"isListItem":true,"string":"BoxMorph","value":{"__isSmartRef__":true,"id":1415}},"1415":{"target":{"__isSmartRef__":true,"id":1312},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1416":{"isListItem":true,"string":"ContainerMorph","value":{"__isSmartRef__":true,"id":1417}},"1417":{"target":{"__isSmartRef__":true,"id":1317},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1418":{"isListItem":true,"string":"PathMorph","value":{"__isSmartRef__":true,"id":1419}},"1419":{"target":{"__isSmartRef__":true,"id":1324},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1420":{"isListItem":true,"string":"PseudoMorph","value":{"__isSmartRef__":true,"id":1421}},"1421":{"target":{"__isSmartRef__":true,"id":1350},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1422":{"isListItem":true,"string":"Invocation","value":{"__isSmartRef__":true,"id":1423}},"1423":{"target":{"__isSmartRef__":true,"id":1355},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1424":{"isListItem":true,"string":"SchedulableAction","value":{"__isSmartRef__":true,"id":1425}},"1425":{"target":{"__isSmartRef__":true,"id":1360},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1426":{"isListItem":true,"string":"Morph (extension)","value":{"__isSmartRef__":true,"id":1427}},"1427":{"target":{"__isSmartRef__":true,"id":1370},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1428":{"sourceObj":{"__isSmartRef__":true,"id":1387},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setPane2Selection","converter":null,"converterString":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1429":{"sourceObj":{"__isSmartRef__":true,"id":1387},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane2Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1430":{"sourceObj":{"__isSmartRef__":true,"id":1387},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane2Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1431":{"sourceObj":{"__isSmartRef__":true,"id":1387},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane2Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1432":{"target":{"__isSmartRef__":true,"id":1433},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1433":{"name":"TextMorph","type":"klassExtensionDef","startIndex":427,"stopIndex":3405,"fileName":"lively/deprecated/SyntaxHighlighting.js","_subElements":[{"__isSmartRef__":true,"id":1434},{"__isSmartRef__":true,"id":1436},{"__isSmartRef__":true,"id":1437},{"__isSmartRef__":true,"id":1438}],"sourceControl":{"__isSmartRef__":true,"id":727},"categories":[{"__isSmartRef__":true,"id":1435}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1434":{"name":"simpleEmphasizeFromTo","type":"propertyDef","startIndex":468,"stopIndex":683,"fileName":"lively/deprecated/SyntaxHighlighting.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1435},"className":"TextMorph","_owner":{"__isSmartRef__":true,"id":1433},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1435":{"name":"SyntaxHighlight","type":"categoryDef","startIndex":448,"stopIndex":3402,"fileName":"lively/deprecated/SyntaxHighlighting.js","_subElements":[{"__isSmartRef__":true,"id":1434},{"__isSmartRef__":true,"id":1436},{"__isSmartRef__":true,"id":1437},{"__isSmartRef__":true,"id":1438}],"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1436":{"name":"highlightJavaScriptSyntaxFromTo","type":"propertyDef","startIndex":686,"stopIndex":1759,"fileName":"lively/deprecated/SyntaxHighlighting.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1435},"className":"TextMorph","_owner":{"__isSmartRef__":true,"id":1433},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1437":{"name":"highlightJavaScriptSyntax","type":"propertyDef","startIndex":1762,"stopIndex":1872,"fileName":"lively/deprecated/SyntaxHighlighting.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1435},"className":"TextMorph","_owner":{"__isSmartRef__":true,"id":1433},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1438":{"name":"delayedSyntaxHighlighting","type":"propertyDef","startIndex":1875,"stopIndex":3400,"fileName":"lively/deprecated/SyntaxHighlighting.js","_subElements":[],"sourceControl":{"__isSmartRef__":true,"id":727},"_isStatic":false,"category":{"__isSmartRef__":true,"id":1435},"className":"TextMorph","_owner":{"__isSmartRef__":true,"id":1433},"__SourceModuleName__":"Global.lively.ide.FileParsing","__LivelyClassName__":"lively.ide.FileFragment"},"1439":{"sourceObj":{"__isSmartRef__":true,"id":520},"sourceAttrName":"setPane3Content","targetObj":{"__isSmartRef__":true,"id":1440},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1440":{"submorphs":[],"scripts":[],"id":386,"shape":{"__isSmartRef__":true,"id":1441},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":1444},"itemList":["-----"],"selectedLineNo":0,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":510},"attributeConnections":[{"__isSmartRef__":true,"id":1445},{"__isSmartRef__":true,"id":1446},{"__isSmartRef__":true,"id":1447},{"__isSmartRef__":true,"id":1448}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"__SourceModuleName__":"Global.lively.morphic.Core","selection":{"__isSmartRef__":true,"id":1449},"__LivelyClassName__":"lively.morphic.List"},"1441":{"_Position":{"__isSmartRef__":true,"id":1442},"_Extent":{"__isSmartRef__":true,"id":1443},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":721},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1442":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1443":{"x":205,"y":192.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1444":{"x":410,"y":27.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1445":{"sourceObj":{"__isSmartRef__":true,"id":1440},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setPane3Selection","converter":null,"converterString":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1446":{"sourceObj":{"__isSmartRef__":true,"id":1440},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane3Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1447":{"sourceObj":{"__isSmartRef__":true,"id":1440},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane3Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1448":{"sourceObj":{"__isSmartRef__":true,"id":1440},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane3Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1449":{"target":{"__isSmartRef__":true,"id":1433},"browser":{"__isSmartRef__":true,"id":520},"parent":{"__isSmartRef__":true,"id":1450},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.AllMethodCategoryFragmentNode"},"1450":{"target":{"__isSmartRef__":true,"id":1433},"browser":{"__isSmartRef__":true,"id":520},"__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes","__LivelyClassName__":"lively.ide.CategorizedClassFragmentNode"},"1451":{"sourceObj":{"__isSmartRef__":true,"id":520},"sourceAttrName":"setPane4Content","targetObj":{"__isSmartRef__":true,"id":1452},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1452":{"submorphs":[],"scripts":[],"id":387,"shape":{"__isSmartRef__":true,"id":1453},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":1456},"itemList":["-----"],"selectedLineNo":-1,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":510},"attributeConnections":[{"__isSmartRef__":true,"id":1457},{"__isSmartRef__":true,"id":1458},{"__isSmartRef__":true,"id":1459},{"__isSmartRef__":true,"id":1460}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"__SourceModuleName__":"Global.lively.morphic.Core","selection":null,"__LivelyClassName__":"lively.morphic.List"},"1453":{"_Position":{"__isSmartRef__":true,"id":1454},"_Extent":{"__isSmartRef__":true,"id":1455},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":721},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1454":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1455":{"x":205,"y":192.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1456":{"x":615,"y":27.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1457":{"sourceObj":{"__isSmartRef__":true,"id":1452},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setPane4Selection","converter":null,"converterString":null,"updater":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1458":{"sourceObj":{"__isSmartRef__":true,"id":1452},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane4Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1459":{"sourceObj":{"__isSmartRef__":true,"id":1452},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane4Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1460":{"sourceObj":{"__isSmartRef__":true,"id":1452},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"getPane4Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1461":{"sourceObj":{"__isSmartRef__":true,"id":520},"sourceAttrName":"setSourceString","targetObj":{"__isSmartRef__":true,"id":500},"targetMethodName":"setTextString","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1462":{"sourceObj":{"__isSmartRef__":true,"id":520},"sourceAttrName":"targetURL","targetObj":{"__isSmartRef__":true,"id":511},"targetMethodName":"setTextString","converter":null,"converterString":null,"updaterString":"function ($upd, value) { value && $upd(String(value)) }","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1463":{"submorphs":[{"__isSmartRef__":true,"id":1464},{"__isSmartRef__":true,"id":1566}],"scripts":[],"id":406,"shape":{"__isSmartRef__":true,"id":1934},"droppingEnabled":true,"halosEnabled":true,"draggingEnabled":true,"layout":{"__isSmartRef__":true,"id":1936},"_Position":{"__isSmartRef__":true,"id":1937},"priorExtent":{"__isSmartRef__":true,"id":1938},"targetMorph":{"__isSmartRef__":true,"id":1566},"titleBar":{"__isSmartRef__":true,"id":1464},"contentOffset":{"__isSmartRef__":true,"id":1933},"collapsedTransform":null,"collapsedExtent":null,"expandedTransform":null,"expandedExtent":null,"ignoreEventsOnExpand":false,"owner":null,"highlighted":true,"_Rotation":0,"_Scale":1,"prevDragPos":{"__isSmartRef__":true,"id":1939},"__SourceModuleName__":"Global.lively.morphic.Widgets","state":"shutdown","__LivelyClassName__":"lively.morphic.Window"},"1464":{"submorphs":[{"__isSmartRef__":true,"id":1465},{"__isSmartRef__":true,"id":1473},{"__isSmartRef__":true,"id":1500},{"__isSmartRef__":true,"id":1526}],"scripts":[],"id":407,"shape":{"__isSmartRef__":true,"id":1553},"droppingEnabled":true,"halosEnabled":true,"layout":{"__isSmartRef__":true,"id":1563},"_Position":{"__isSmartRef__":true,"id":1564},"eventsAreIgnored":true,"windowMorph":{"__isSmartRef__":true,"id":1463},"label":{"__isSmartRef__":true,"id":1465},"closeButton":{"__isSmartRef__":true,"id":1473},"menuButton":{"__isSmartRef__":true,"id":1500},"collapseButton":{"__isSmartRef__":true,"id":1526},"priorExtent":{"__isSmartRef__":true,"id":1565},"owner":{"__isSmartRef__":true,"id":1463},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.TitleBar"},"1465":{"submorphs":[],"scripts":[],"id":408,"shape":{"__isSmartRef__":true,"id":1466},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":382},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1469},"priorExtent":{"__isSmartRef__":true,"id":1470},"_MaxTextWidth":null,"_MaxTextHeight":14,"textChunks":[{"__isSmartRef__":true,"id":1471}],"evalEnabled":false,"isLabel":true,"eventsAreIgnored":true,"_FontSize":10,"_Align":"center","owner":{"__isSmartRef__":true,"id":1464},"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"1466":{"_Position":{"__isSmartRef__":true,"id":1467},"_Extent":{"__isSmartRef__":true,"id":1468},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"_BorderRadius":0,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1467":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1468":{"x":-20,"y":14,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1469":{"x":420,"y":6,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1470":{"x":-20,"y":14,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1471":{"style":{"__isSmartRef__":true,"id":1472},"morph":{"__isSmartRef__":true,"id":1465},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"Morphs.js","__LivelyClassName__":"lively.morphic.TextChunk"},"1472":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"1473":{"submorphs":[{"__isSmartRef__":true,"id":1474}],"scripts":[],"id":409,"shape":{"__isSmartRef__":true,"id":1483},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1486},"priorExtent":{"__isSmartRef__":true,"id":1487},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":1488},"label":{"__isSmartRef__":true,"id":1474},"owner":{"__isSmartRef__":true,"id":1464},"layout":{"__isSmartRef__":true,"id":1497},"attributeConnections":[{"__isSmartRef__":true,"id":1498},{"__isSmartRef__":true,"id":1499}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"1474":{"submorphs":[],"scripts":[],"id":410,"shape":{"__isSmartRef__":true,"id":1475},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1478},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1479},"priorExtent":{"__isSmartRef__":true,"id":1480},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":1481}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1473},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"1475":{"_Position":{"__isSmartRef__":true,"id":1476},"_Extent":{"__isSmartRef__":true,"id":1477},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1476":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1477":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1478":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"1479":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1480":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1481":{"style":{"__isSmartRef__":true,"id":1482},"morph":{"__isSmartRef__":true,"id":1474},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"X","__LivelyClassName__":"lively.morphic.TextChunk"},"1482":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"1483":{"_Position":{"__isSmartRef__":true,"id":1484},"_Extent":{"__isSmartRef__":true,"id":1485},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1484":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1485":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1486":{"x":800,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1487":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1488":{"stops":[{"__isSmartRef__":true,"id":1489},{"__isSmartRef__":true,"id":1491},{"__isSmartRef__":true,"id":1493},{"__isSmartRef__":true,"id":1495}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"1489":{"offset":0,"color":{"__isSmartRef__":true,"id":1490}},"1490":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1491":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1492}},"1492":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1493":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1494}},"1494":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1495":{"offset":1,"color":{"__isSmartRef__":true,"id":1496}},"1496":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1497":{"moveHorizontal":true},"1498":{"sourceObj":{"__isSmartRef__":true,"id":1473},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":1463},"targetMethodName":"getCloseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1499":{"sourceObj":{"__isSmartRef__":true,"id":1473},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1463},"targetMethodName":"initiateShutdown","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1500":{"submorphs":[{"__isSmartRef__":true,"id":1501}],"scripts":[],"id":411,"shape":{"__isSmartRef__":true,"id":1510},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1513},"priorExtent":{"__isSmartRef__":true,"id":1514},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":1515},"label":{"__isSmartRef__":true,"id":1501},"owner":{"__isSmartRef__":true,"id":1464},"attributeConnections":[{"__isSmartRef__":true,"id":1524},{"__isSmartRef__":true,"id":1525}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"1501":{"submorphs":[],"scripts":[],"id":412,"shape":{"__isSmartRef__":true,"id":1502},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1505},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1506},"priorExtent":{"__isSmartRef__":true,"id":1507},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":1508}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1500},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"1502":{"_Position":{"__isSmartRef__":true,"id":1503},"_Extent":{"__isSmartRef__":true,"id":1504},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1503":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1504":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1505":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"1506":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1507":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1508":{"style":{"__isSmartRef__":true,"id":1509},"morph":{"__isSmartRef__":true,"id":1501},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"M","__LivelyClassName__":"lively.morphic.TextChunk"},"1509":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"1510":{"_Position":{"__isSmartRef__":true,"id":1511},"_Extent":{"__isSmartRef__":true,"id":1512},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1511":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1512":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1513":{"x":3,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1514":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1515":{"stops":[{"__isSmartRef__":true,"id":1516},{"__isSmartRef__":true,"id":1518},{"__isSmartRef__":true,"id":1520},{"__isSmartRef__":true,"id":1522}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"1516":{"offset":0,"color":{"__isSmartRef__":true,"id":1517}},"1517":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1518":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1519}},"1519":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1520":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1521}},"1521":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1522":{"offset":1,"color":{"__isSmartRef__":true,"id":1523}},"1523":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1524":{"sourceObj":{"__isSmartRef__":true,"id":1500},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":1463},"targetMethodName":"getMenuHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1525":{"sourceObj":{"__isSmartRef__":true,"id":1500},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1463},"targetMethodName":"showTargetMorphMenu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1526":{"submorphs":[{"__isSmartRef__":true,"id":1527}],"scripts":[],"id":413,"shape":{"__isSmartRef__":true,"id":1536},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1539},"priorExtent":{"__isSmartRef__":true,"id":1540},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":1541},"label":{"__isSmartRef__":true,"id":1527},"owner":{"__isSmartRef__":true,"id":1464},"layout":{"__isSmartRef__":true,"id":1550},"attributeConnections":[{"__isSmartRef__":true,"id":1551},{"__isSmartRef__":true,"id":1552}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"1527":{"submorphs":[],"scripts":[],"id":414,"shape":{"__isSmartRef__":true,"id":1528},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1531},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1532},"priorExtent":{"__isSmartRef__":true,"id":1533},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":1534}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1526},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"1528":{"_Position":{"__isSmartRef__":true,"id":1529},"_Extent":{"__isSmartRef__":true,"id":1530},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1529":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1530":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1531":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"1532":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1533":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1534":{"style":{"__isSmartRef__":true,"id":1535},"morph":{"__isSmartRef__":true,"id":1527},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"–","__LivelyClassName__":"lively.morphic.TextChunk"},"1535":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"1536":{"_Position":{"__isSmartRef__":true,"id":1537},"_Extent":{"__isSmartRef__":true,"id":1538},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1537":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1538":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1539":{"x":781,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1540":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1541":{"stops":[{"__isSmartRef__":true,"id":1542},{"__isSmartRef__":true,"id":1544},{"__isSmartRef__":true,"id":1546},{"__isSmartRef__":true,"id":1548}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"1542":{"offset":0,"color":{"__isSmartRef__":true,"id":1543}},"1543":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1544":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1545}},"1545":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1546":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1547}},"1547":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1548":{"offset":1,"color":{"__isSmartRef__":true,"id":1549}},"1549":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1550":{"moveHorizontal":true},"1551":{"sourceObj":{"__isSmartRef__":true,"id":1526},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":1463},"targetMethodName":"getCollapseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1552":{"sourceObj":{"__isSmartRef__":true,"id":1526},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1463},"targetMethodName":"toggleCollapse","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1553":{"_Position":{"__isSmartRef__":true,"id":1554},"_Extent":{"__isSmartRef__":true,"id":1555},"_BorderWidth":2,"_BorderColor":{"__isSmartRef__":true,"id":481},"_Fill":{"__isSmartRef__":true,"id":1556},"_StrokeOpacity":1,"_BorderRadius":"8px 8px 0px 0px","__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1554":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1555":{"x":820,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1556":{"stops":[{"__isSmartRef__":true,"id":1557},{"__isSmartRef__":true,"id":1559},{"__isSmartRef__":true,"id":1561}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"1557":{"offset":0,"color":{"__isSmartRef__":true,"id":1558}},"1558":{"r":0.8600000000000001,"g":0.8600000000000001,"b":0.8600000000000001,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1559":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1560}},"1560":{"r":0.95,"g":0.95,"b":0.95,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1561":{"offset":1,"color":{"__isSmartRef__":true,"id":1562}},"1562":{"r":0.8600000000000001,"g":0.8600000000000001,"b":0.8600000000000001,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1563":{"resizeWidth":true,"adjustForNewBounds":true},"1564":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1565":{"x":820,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1566":{"submorphs":[{"__isSmartRef__":true,"id":1567},{"__isSmartRef__":true,"id":1859},{"__isSmartRef__":true,"id":1884},{"__isSmartRef__":true,"id":1787},{"__isSmartRef__":true,"id":1816},{"__isSmartRef__":true,"id":1826},{"__isSmartRef__":true,"id":1836},{"__isSmartRef__":true,"id":1909},{"__isSmartRef__":true,"id":1846},{"__isSmartRef__":true,"id":1915},{"__isSmartRef__":true,"id":1920},{"__isSmartRef__":true,"id":1581},{"__isSmartRef__":true,"id":1619},{"__isSmartRef__":true,"id":1646},{"__isSmartRef__":true,"id":1673},{"__isSmartRef__":true,"id":1700},{"__isSmartRef__":true,"id":1727},{"__isSmartRef__":true,"id":1754}],"scripts":[],"id":29,"shape":{"__isSmartRef__":true,"id":1928},"droppingEnabled":true,"halosEnabled":true,"layout":{"__isSmartRef__":true,"id":1932},"_Position":{"__isSmartRef__":true,"id":1933},"locationPane":{"__isSmartRef__":true,"id":1567},"codeBaseDirBtn":{"__isSmartRef__":true,"id":1859},"localDirBtn":{"__isSmartRef__":true,"id":1884},"Pane1":{"__isSmartRef__":true,"id":1787},"Pane2":{"__isSmartRef__":true,"id":1816},"Pane3":{"__isSmartRef__":true,"id":1826},"Pane4":{"__isSmartRef__":true,"id":1836},"midResizer":{"__isSmartRef__":true,"id":1909},"sourcePane":{"__isSmartRef__":true,"id":1846},"bottomResizer":{"__isSmartRef__":true,"id":1915},"commentPane":{"__isSmartRef__":true,"id":1920},"ownerWidget":{"__isSmartRef__":true,"id":1579},"owner":{"__isSmartRef__":true,"id":1463},"__LivelyClassName__":"lively.ide.BrowserPanel","__SourceModuleName__":"Global.lively.ide.BrowserFramework"},"1567":{"submorphs":[],"scripts":[],"id":30,"shape":{"__isSmartRef__":true,"id":1568},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1573},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1574},"priorExtent":{"__isSmartRef__":true,"id":1575},"_MaxTextWidth":656,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1576}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1566},"isInputLine":true,"noEval":true,"styleClass":["Browser_locationInput"],"attributeConnections":[{"__isSmartRef__":true,"id":1578}],"doNotSerialize":["$$savedTextString"],"doNotCopyProperties":["$$savedTextString"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1568":{"_Position":{"__isSmartRef__":true,"id":1569},"_Extent":{"__isSmartRef__":true,"id":1570},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":{"__isSmartRef__":true,"id":1572},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1569":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1570":{"x":656,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1571":{"r":0,"g":0,"b":0,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1572":{"r":1,"g":1,"b":1,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1573":{"x":2,"y":1,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1574":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1575":{"x":656,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1576":{"style":{"__isSmartRef__":true,"id":1577},"morph":{"__isSmartRef__":true,"id":1567},"storedString":"http://www.lively-kernel.org/repository/webwerkstatt/lively/oldCore/","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1577":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1578":{"sourceObj":{"__isSmartRef__":true,"id":1567},"sourceAttrName":"savedTextString","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setTargetURL","converter":null,"converterString":"function (value) { return new URL(value) }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1579":{"buttonCommands":[{"__isSmartRef__":true,"id":1580},{"__isSmartRef__":true,"id":1618},{"__isSmartRef__":true,"id":1645},{"__isSmartRef__":true,"id":1672},{"__isSmartRef__":true,"id":1699},{"__isSmartRef__":true,"id":1726},{"__isSmartRef__":true,"id":1753}],"RootFilters":[{"__isSmartRef__":true,"id":1780}],"Pane1Filters":[{"__isSmartRef__":true,"id":1781},{"__isSmartRef__":true,"id":1782}],"Pane2Filters":[{"__isSmartRef__":true,"id":1783}],"Pane3Filters":[{"__isSmartRef__":true,"id":1784}],"Pane4Filters":[{"__isSmartRef__":true,"id":1785}],"evaluate":true,"panel":{"__isSmartRef__":true,"id":1566},"attributeConnections":[{"__isSmartRef__":true,"id":1786},{"__isSmartRef__":true,"id":1815},{"__isSmartRef__":true,"id":1825},{"__isSmartRef__":true,"id":1835},{"__isSmartRef__":true,"id":1845},{"__isSmartRef__":true,"id":1857}],"SourceString":"-----","sourceString":"-----","doNotSerialize":["$$targetURL"],"doNotCopyProperties":["$$targetURL"],"targetURL":{"__isSmartRef__":true,"id":1858},"_rootNode":{"__isSmartRef__":true,"id":1796},"Pane1Selection":null,"pane1Selection":null,"Pane2Selection":null,"pane2Selection":null,"Pane3Selection":null,"pane3Selection":null,"Pane4Selection":null,"pane4Selection":null,"Pane4Content":["-----"],"Pane3Content":["-----"],"Pane2Content":["-----"],"Pane1Content":[{"__isSmartRef__":true,"id":1793},{"__isSmartRef__":true,"id":1805},{"__isSmartRef__":true,"id":1806},{"__isSmartRef__":true,"id":1807},{"__isSmartRef__":true,"id":1808},{"__isSmartRef__":true,"id":1809},{"__isSmartRef__":true,"id":1810}],"__LivelyClassName__":"lively.ide.SystemBrowser","__SourceModuleName__":"Global.lively.ide.SystemCodeBrowser"},"1580":{"browser":{"__isSmartRef__":true,"id":1579},"button":{"__isSmartRef__":true,"id":1581},"__LivelyClassName__":"lively.ide.AddNewFileCommand","__SourceModuleName__":"Global.lively.ide.BrowserCommands"},"1581":{"submorphs":[{"__isSmartRef__":true,"id":1582}],"scripts":[],"id":43,"shape":{"__isSmartRef__":true,"id":1591},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1605},"priorExtent":{"__isSmartRef__":true,"id":1606},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1607},"label":{"__isSmartRef__":true,"id":1582},"command":{"__isSmartRef__":true,"id":1580},"attributeConnections":[{"__isSmartRef__":true,"id":1616},{"__isSmartRef__":true,"id":1617}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":1566},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1582":{"submorphs":[],"scripts":[],"id":44,"shape":{"__isSmartRef__":true,"id":1583},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1586},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1587},"priorExtent":{"__isSmartRef__":true,"id":1588},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1589}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1581},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1583":{"_Position":{"__isSmartRef__":true,"id":1584},"_Extent":{"__isSmartRef__":true,"id":1585},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1584":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1585":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1586":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1587":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1588":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1589":{"style":{"__isSmartRef__":true,"id":1590},"morph":{"__isSmartRef__":true,"id":1582},"storedString":"Add module","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1590":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1591":{"_Position":{"__isSmartRef__":true,"id":1592},"_Extent":{"__isSmartRef__":true,"id":1593},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1592":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1593":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1594":{"r":0.7411764705882353,"g":0.7450980392156863,"b":0.7529411764705882,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1595":{"stops":[{"__isSmartRef__":true,"id":1596},{"__isSmartRef__":true,"id":1598},{"__isSmartRef__":true,"id":1600},{"__isSmartRef__":true,"id":1602}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1596":{"offset":0,"color":{"__isSmartRef__":true,"id":1597}},"1597":{"r":0.9600000000000001,"g":0.9600000000000001,"b":0.9600000000000001,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1598":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1599}},"1599":{"r":0.8200000000000001,"g":0.8200000000000001,"b":0.8200000000000001,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1600":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1601}},"1601":{"r":0.8200000000000001,"g":0.8200000000000001,"b":0.8200000000000001,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1602":{"offset":1,"color":{"__isSmartRef__":true,"id":1603}},"1603":{"r":0.94,"g":0.94,"b":0.94,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1604":{"x":0,"y":0,"width":0,"height":1,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1605":{"x":0,"y":220,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1606":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1607":{"stops":[{"__isSmartRef__":true,"id":1608},{"__isSmartRef__":true,"id":1610},{"__isSmartRef__":true,"id":1612},{"__isSmartRef__":true,"id":1614}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1608":{"offset":0,"color":{"__isSmartRef__":true,"id":1609}},"1609":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1610":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1611}},"1611":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1612":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1613}},"1613":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1614":{"offset":1,"color":{"__isSmartRef__":true,"id":1615}},"1615":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1616":{"sourceObj":{"__isSmartRef__":true,"id":1581},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1580},"targetMethodName":"trigger","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1617":{"sourceObj":{"__isSmartRef__":true,"id":1581},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1581},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1618":{"browser":{"__isSmartRef__":true,"id":1579},"button":{"__isSmartRef__":true,"id":1619},"__LivelyClassName__":"lively.ide.AllModulesLoadCommand","__SourceModuleName__":"Global.lively.ide.BrowserCommands"},"1619":{"submorphs":[{"__isSmartRef__":true,"id":1620}],"scripts":[],"id":45,"shape":{"__isSmartRef__":true,"id":1629},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1632},"priorExtent":{"__isSmartRef__":true,"id":1633},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1634},"label":{"__isSmartRef__":true,"id":1620},"command":{"__isSmartRef__":true,"id":1618},"attributeConnections":[{"__isSmartRef__":true,"id":1643},{"__isSmartRef__":true,"id":1644}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":1566},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1620":{"submorphs":[],"scripts":[],"id":46,"shape":{"__isSmartRef__":true,"id":1621},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1624},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1625},"priorExtent":{"__isSmartRef__":true,"id":1626},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1627}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1619},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1621":{"_Position":{"__isSmartRef__":true,"id":1622},"_Extent":{"__isSmartRef__":true,"id":1623},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1622":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1623":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1624":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1625":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1626":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1627":{"style":{"__isSmartRef__":true,"id":1628},"morph":{"__isSmartRef__":true,"id":1620},"storedString":"Load all","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1628":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1629":{"_Position":{"__isSmartRef__":true,"id":1630},"_Extent":{"__isSmartRef__":true,"id":1631},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1630":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1631":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1632":{"x":117.14285714285714,"y":220,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1633":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1634":{"stops":[{"__isSmartRef__":true,"id":1635},{"__isSmartRef__":true,"id":1637},{"__isSmartRef__":true,"id":1639},{"__isSmartRef__":true,"id":1641}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1635":{"offset":0,"color":{"__isSmartRef__":true,"id":1636}},"1636":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1637":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1638}},"1638":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1639":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1640}},"1640":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1641":{"offset":1,"color":{"__isSmartRef__":true,"id":1642}},"1642":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1643":{"sourceObj":{"__isSmartRef__":true,"id":1619},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1618},"targetMethodName":"trigger","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1644":{"sourceObj":{"__isSmartRef__":true,"id":1619},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1619},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1645":{"browser":{"__isSmartRef__":true,"id":1579},"button":{"__isSmartRef__":true,"id":1646},"__LivelyClassName__":"lively.ide.ShowLineNumbersCommand","__SourceModuleName__":"Global.lively.ide.BrowserCommands"},"1646":{"submorphs":[{"__isSmartRef__":true,"id":1647}],"scripts":[],"id":47,"shape":{"__isSmartRef__":true,"id":1656},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1659},"priorExtent":{"__isSmartRef__":true,"id":1660},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1661},"label":{"__isSmartRef__":true,"id":1647},"command":{"__isSmartRef__":true,"id":1645},"attributeConnections":[{"__isSmartRef__":true,"id":1670},{"__isSmartRef__":true,"id":1671}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":1566},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1647":{"submorphs":[],"scripts":[],"id":48,"shape":{"__isSmartRef__":true,"id":1648},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1651},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1652},"priorExtent":{"__isSmartRef__":true,"id":1653},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1654}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1646},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1648":{"_Position":{"__isSmartRef__":true,"id":1649},"_Extent":{"__isSmartRef__":true,"id":1650},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1649":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1650":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1651":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1652":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1653":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1654":{"style":{"__isSmartRef__":true,"id":1655},"morph":{"__isSmartRef__":true,"id":1647},"storedString":"LineNo","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1655":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1656":{"_Position":{"__isSmartRef__":true,"id":1657},"_Extent":{"__isSmartRef__":true,"id":1658},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1657":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1658":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1659":{"x":234.28571428571428,"y":220,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1660":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1661":{"stops":[{"__isSmartRef__":true,"id":1662},{"__isSmartRef__":true,"id":1664},{"__isSmartRef__":true,"id":1666},{"__isSmartRef__":true,"id":1668}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1662":{"offset":0,"color":{"__isSmartRef__":true,"id":1663}},"1663":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1664":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1665}},"1665":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1666":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1667}},"1667":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1668":{"offset":1,"color":{"__isSmartRef__":true,"id":1669}},"1669":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1670":{"sourceObj":{"__isSmartRef__":true,"id":1646},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1645},"targetMethodName":"trigger","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1671":{"sourceObj":{"__isSmartRef__":true,"id":1646},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1646},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1672":{"browser":{"__isSmartRef__":true,"id":1579},"button":{"__isSmartRef__":true,"id":1673},"__LivelyClassName__":"lively.ide.ParserDebugCommand","__SourceModuleName__":"Global.lively.ide.BrowserCommands"},"1673":{"submorphs":[{"__isSmartRef__":true,"id":1674}],"scripts":[],"id":49,"shape":{"__isSmartRef__":true,"id":1683},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1686},"priorExtent":{"__isSmartRef__":true,"id":1687},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1688},"label":{"__isSmartRef__":true,"id":1674},"command":{"__isSmartRef__":true,"id":1672},"attributeConnections":[{"__isSmartRef__":true,"id":1697},{"__isSmartRef__":true,"id":1698}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":1566},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1674":{"submorphs":[],"scripts":[],"id":50,"shape":{"__isSmartRef__":true,"id":1675},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1678},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1679},"priorExtent":{"__isSmartRef__":true,"id":1680},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1681}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1673},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1675":{"_Position":{"__isSmartRef__":true,"id":1676},"_Extent":{"__isSmartRef__":true,"id":1677},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1676":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1677":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1678":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1679":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1680":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1681":{"style":{"__isSmartRef__":true,"id":1682},"morph":{"__isSmartRef__":true,"id":1674},"storedString":"Dbg errors is off","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1682":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1683":{"_Position":{"__isSmartRef__":true,"id":1684},"_Extent":{"__isSmartRef__":true,"id":1685},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1684":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1685":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1686":{"x":351.42857142857144,"y":220,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1687":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1688":{"stops":[{"__isSmartRef__":true,"id":1689},{"__isSmartRef__":true,"id":1691},{"__isSmartRef__":true,"id":1693},{"__isSmartRef__":true,"id":1695}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1689":{"offset":0,"color":{"__isSmartRef__":true,"id":1690}},"1690":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1691":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1692}},"1692":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1693":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1694}},"1694":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1695":{"offset":1,"color":{"__isSmartRef__":true,"id":1696}},"1696":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1697":{"sourceObj":{"__isSmartRef__":true,"id":1673},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1672},"targetMethodName":"trigger","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1698":{"sourceObj":{"__isSmartRef__":true,"id":1673},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1673},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1699":{"browser":{"__isSmartRef__":true,"id":1579},"button":{"__isSmartRef__":true,"id":1700},"__LivelyClassName__":"lively.ide.EvaluateCommand","__SourceModuleName__":"Global.lively.ide.BrowserCommands"},"1700":{"submorphs":[{"__isSmartRef__":true,"id":1701}],"scripts":[],"id":51,"shape":{"__isSmartRef__":true,"id":1710},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1713},"priorExtent":{"__isSmartRef__":true,"id":1714},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1715},"label":{"__isSmartRef__":true,"id":1701},"command":{"__isSmartRef__":true,"id":1699},"attributeConnections":[{"__isSmartRef__":true,"id":1724},{"__isSmartRef__":true,"id":1725}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":1566},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1701":{"submorphs":[],"scripts":[],"id":52,"shape":{"__isSmartRef__":true,"id":1702},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1705},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1706},"priorExtent":{"__isSmartRef__":true,"id":1707},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1708}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1700},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1702":{"_Position":{"__isSmartRef__":true,"id":1703},"_Extent":{"__isSmartRef__":true,"id":1704},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1703":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1704":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1705":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1706":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1707":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1708":{"style":{"__isSmartRef__":true,"id":1709},"morph":{"__isSmartRef__":true,"id":1701},"storedString":"Eval on","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1709":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1710":{"_Position":{"__isSmartRef__":true,"id":1711},"_Extent":{"__isSmartRef__":true,"id":1712},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1711":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1712":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1713":{"x":468.57142857142856,"y":220,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1714":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1715":{"stops":[{"__isSmartRef__":true,"id":1716},{"__isSmartRef__":true,"id":1718},{"__isSmartRef__":true,"id":1720},{"__isSmartRef__":true,"id":1722}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1716":{"offset":0,"color":{"__isSmartRef__":true,"id":1717}},"1717":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1718":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1719}},"1719":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1720":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1721}},"1721":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1722":{"offset":1,"color":{"__isSmartRef__":true,"id":1723}},"1723":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1724":{"sourceObj":{"__isSmartRef__":true,"id":1700},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1699},"targetMethodName":"trigger","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1725":{"sourceObj":{"__isSmartRef__":true,"id":1700},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1700},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1726":{"browser":{"__isSmartRef__":true,"id":1579},"button":{"__isSmartRef__":true,"id":1727},"__LivelyClassName__":"lively.ide.SortCommand","__SourceModuleName__":"Global.lively.ide.BrowserCommands"},"1727":{"submorphs":[{"__isSmartRef__":true,"id":1728}],"scripts":[],"id":53,"shape":{"__isSmartRef__":true,"id":1737},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1740},"priorExtent":{"__isSmartRef__":true,"id":1741},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1742},"label":{"__isSmartRef__":true,"id":1728},"command":{"__isSmartRef__":true,"id":1726},"attributeConnections":[{"__isSmartRef__":true,"id":1751},{"__isSmartRef__":true,"id":1752}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":1566},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1728":{"submorphs":[],"scripts":[],"id":54,"shape":{"__isSmartRef__":true,"id":1729},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1732},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1733},"priorExtent":{"__isSmartRef__":true,"id":1734},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1735}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1727},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1729":{"_Position":{"__isSmartRef__":true,"id":1730},"_Extent":{"__isSmartRef__":true,"id":1731},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1730":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1731":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1732":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1733":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1734":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1735":{"style":{"__isSmartRef__":true,"id":1736},"morph":{"__isSmartRef__":true,"id":1728},"storedString":"Sort","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1736":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1737":{"_Position":{"__isSmartRef__":true,"id":1738},"_Extent":{"__isSmartRef__":true,"id":1739},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1738":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1739":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1740":{"x":585.7142857142857,"y":220,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1741":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1742":{"stops":[{"__isSmartRef__":true,"id":1743},{"__isSmartRef__":true,"id":1745},{"__isSmartRef__":true,"id":1747},{"__isSmartRef__":true,"id":1749}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1743":{"offset":0,"color":{"__isSmartRef__":true,"id":1744}},"1744":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1745":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1746}},"1746":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1747":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1748}},"1748":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1749":{"offset":1,"color":{"__isSmartRef__":true,"id":1750}},"1750":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1751":{"sourceObj":{"__isSmartRef__":true,"id":1727},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1726},"targetMethodName":"trigger","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1752":{"sourceObj":{"__isSmartRef__":true,"id":1727},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1727},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1753":{"browser":{"__isSmartRef__":true,"id":1579},"button":{"__isSmartRef__":true,"id":1754},"__LivelyClassName__":"lively.ide.ViewSourceCommand","__SourceModuleName__":"Global.lively.ide.BrowserCommands"},"1754":{"submorphs":[{"__isSmartRef__":true,"id":1755}],"scripts":[],"id":55,"shape":{"__isSmartRef__":true,"id":1764},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1767},"priorExtent":{"__isSmartRef__":true,"id":1768},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1769},"label":{"__isSmartRef__":true,"id":1755},"command":{"__isSmartRef__":true,"id":1753},"attributeConnections":[{"__isSmartRef__":true,"id":1778},{"__isSmartRef__":true,"id":1779}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"owner":{"__isSmartRef__":true,"id":1566},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1755":{"submorphs":[],"scripts":[],"id":56,"shape":{"__isSmartRef__":true,"id":1756},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1759},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1760},"priorExtent":{"__isSmartRef__":true,"id":1761},"_MaxTextWidth":117.14285714285714,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1762}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1754},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1756":{"_Position":{"__isSmartRef__":true,"id":1757},"_Extent":{"__isSmartRef__":true,"id":1758},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1757":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1758":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1759":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1760":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1761":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1762":{"style":{"__isSmartRef__":true,"id":1763},"morph":{"__isSmartRef__":true,"id":1755},"storedString":"View as...","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1763":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1764":{"_Position":{"__isSmartRef__":true,"id":1765},"_Extent":{"__isSmartRef__":true,"id":1766},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1765":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1766":{"x":117.14285714285714,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1767":{"x":702.8571428571429,"y":220,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1768":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1769":{"stops":[{"__isSmartRef__":true,"id":1770},{"__isSmartRef__":true,"id":1772},{"__isSmartRef__":true,"id":1774},{"__isSmartRef__":true,"id":1776}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1770":{"offset":0,"color":{"__isSmartRef__":true,"id":1771}},"1771":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1772":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1773}},"1773":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1774":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1775}},"1775":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1776":{"offset":1,"color":{"__isSmartRef__":true,"id":1777}},"1777":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1778":{"sourceObj":{"__isSmartRef__":true,"id":1754},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1753},"targetMethodName":"trigger","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1779":{"sourceObj":{"__isSmartRef__":true,"id":1754},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1754},"targetMethodName":"setLabel","converter":null,"converterString":"function () { return this.getSourceObj().command.asString() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1780":{"__LivelyClassName__":"lively.ide.NodeFilter","__SourceModuleName__":"Global.lively.ide.BrowserFramework"},"1781":{"__LivelyClassName__":"lively.ide.NodeFilter","__SourceModuleName__":"Global.lively.ide.BrowserFramework"},"1782":{"attributes":["isClassNode","isGrammarNode","isChangeNode","isFunctionNode","isObjectNode"],"__LivelyClassName__":"lively.ide.NodeTypeFilter","__SourceModuleName__":"Global.lively.ide.BrowserFramework"},"1783":{"__LivelyClassName__":"lively.ide.NodeFilter","__SourceModuleName__":"Global.lively.ide.BrowserFramework"},"1784":{"__LivelyClassName__":"lively.ide.NodeFilter","__SourceModuleName__":"Global.lively.ide.BrowserFramework"},"1785":{"__LivelyClassName__":"lively.ide.NodeFilter","__SourceModuleName__":"Global.lively.ide.BrowserFramework"},"1786":{"sourceObj":{"__isSmartRef__":true,"id":1579},"sourceAttrName":"setPane1Content","targetObj":{"__isSmartRef__":true,"id":1787},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1787":{"submorphs":[],"scripts":[],"id":35,"shape":{"__isSmartRef__":true,"id":1788},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":1792},"itemList":[{"__isSmartRef__":true,"id":1793},{"__isSmartRef__":true,"id":1805},{"__isSmartRef__":true,"id":1806},{"__isSmartRef__":true,"id":1807},{"__isSmartRef__":true,"id":1808},{"__isSmartRef__":true,"id":1809},{"__isSmartRef__":true,"id":1810}],"selectedLineNo":-1,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":1566},"attributeConnections":[{"__isSmartRef__":true,"id":1811},{"__isSmartRef__":true,"id":1812},{"__isSmartRef__":true,"id":1813},{"__isSmartRef__":true,"id":1814}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"selection":null,"__LivelyClassName__":"lively.morphic.List","__SourceModuleName__":"Global.lively.morphic.Core"},"1788":{"_Position":{"__isSmartRef__":true,"id":1789},"_Extent":{"__isSmartRef__":true,"id":1790},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":{"__isSmartRef__":true,"id":1791},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1789":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1790":{"x":205,"y":192.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1791":{"r":0.95,"g":0.95,"b":0.95,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1792":{"x":0,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1793":{"isListItem":true,"string":"../","value":{"__isSmartRef__":true,"id":1794}},"1794":{"target":{"__isSmartRef__":true,"id":1795},"browser":{"__isSmartRef__":true,"id":1579},"parent":{"__isSmartRef__":true,"id":1796},"localName":"../","__LivelyClassName__":"lively.ide.NamespaceNode","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes"},"1795":{"protocol":"http:","hostname":"www.lively-kernel.org","pathname":"/repository/webwerkstatt/lively/oldCore/../","__LivelyClassName__":"URL","__SourceModuleName__":"Global.lively.Network"},"1796":{"target":{"__isSmartRef__":true,"id":1797},"browser":{"__isSmartRef__":true,"id":1579},"parent":null,"allFiles":["lively/oldCore/Events.js","lively/oldCore/Morphs.js","lively/oldCore/Hacks.js","lively/oldCore/Misc.js","lively/oldCore/Layout.js"],"subNamespacePaths":[],"parentNamespacePath":{"__isSmartRef__":true,"id":1795},"_childNodes":[{"__isSmartRef__":true,"id":1794},{"__isSmartRef__":true,"id":1798},{"__isSmartRef__":true,"id":1799},{"__isSmartRef__":true,"id":1800},{"__isSmartRef__":true,"id":1801},{"__isSmartRef__":true,"id":1802},{"__isSmartRef__":true,"id":1803}],"__LivelyClassName__":"lively.ide.SourceControlNode","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes"},"1797":{"__LivelyClassName__":"AnotherSourceDatabase","__SourceModuleName__":"Global.lively.ide.SourceDatabase"},"1798":{"browser":{"__isSmartRef__":true,"id":1579},"parent":{"__isSmartRef__":true,"id":1796},"moduleName":"lively/oldCore/Events.js","showAll":false,"__LivelyClassName__":"lively.ide.CompleteFileFragmentNode","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes"},"1799":{"browser":{"__isSmartRef__":true,"id":1579},"parent":{"__isSmartRef__":true,"id":1796},"moduleName":"lively/oldCore/Hacks.js","showAll":false,"__LivelyClassName__":"lively.ide.CompleteFileFragmentNode","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes"},"1800":{"browser":{"__isSmartRef__":true,"id":1579},"parent":{"__isSmartRef__":true,"id":1796},"moduleName":"lively/oldCore/Layout.js","showAll":false,"__LivelyClassName__":"lively.ide.CompleteFileFragmentNode","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes"},"1801":{"browser":{"__isSmartRef__":true,"id":1579},"parent":{"__isSmartRef__":true,"id":1796},"moduleName":"lively/oldCore/Misc.js","showAll":false,"__LivelyClassName__":"lively.ide.CompleteFileFragmentNode","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes"},"1802":{"browser":{"__isSmartRef__":true,"id":1579},"parent":{"__isSmartRef__":true,"id":1796},"moduleName":"lively/oldCore/Morphs.js","showAll":false,"__LivelyClassName__":"lively.ide.CompleteFileFragmentNode","__SourceModuleName__":"Global.lively.ide.SystemBrowserNodes"},"1803":{"target":{"__isSmartRef__":true,"id":1804},"browser":{"__isSmartRef__":true,"id":1579},"__LivelyClassName__":"lively.ide.ChangeSetNode","__SourceModuleName__":"Global.lively.ide.LocalBrowser"},"1804":{"name":"Local code","__LivelyClassName__":"ChangeSet","__SourceModuleName__":"Global.lively.ChangeSet"},"1805":{"isListItem":true,"string":"Events.js (not parsed)","value":{"__isSmartRef__":true,"id":1798}},"1806":{"isListItem":true,"string":"Hacks.js (not parsed)","value":{"__isSmartRef__":true,"id":1799}},"1807":{"isListItem":true,"string":"Layout.js (not parsed)","value":{"__isSmartRef__":true,"id":1800}},"1808":{"isListItem":true,"string":"Misc.js (not parsed)","value":{"__isSmartRef__":true,"id":1801}},"1809":{"isListItem":true,"string":"Morphs.js (not parsed)","value":{"__isSmartRef__":true,"id":1802}},"1810":{"isListItem":true,"string":"Local code","value":{"__isSmartRef__":true,"id":1803}},"1811":{"sourceObj":{"__isSmartRef__":true,"id":1787},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setPane1Selection","converter":null,"converterString":null,"updater":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1812":{"sourceObj":{"__isSmartRef__":true,"id":1787},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane1Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1813":{"sourceObj":{"__isSmartRef__":true,"id":1787},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane1Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1814":{"sourceObj":{"__isSmartRef__":true,"id":1787},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane1Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1815":{"sourceObj":{"__isSmartRef__":true,"id":1579},"sourceAttrName":"setPane2Content","targetObj":{"__isSmartRef__":true,"id":1816},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1816":{"submorphs":[],"scripts":[],"id":36,"shape":{"__isSmartRef__":true,"id":1817},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":1820},"itemList":["-----"],"selectedLineNo":-1,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":1566},"attributeConnections":[{"__isSmartRef__":true,"id":1821},{"__isSmartRef__":true,"id":1822},{"__isSmartRef__":true,"id":1823},{"__isSmartRef__":true,"id":1824}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"selection":null,"__LivelyClassName__":"lively.morphic.List","__SourceModuleName__":"Global.lively.morphic.Core"},"1817":{"_Position":{"__isSmartRef__":true,"id":1818},"_Extent":{"__isSmartRef__":true,"id":1819},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":{"__isSmartRef__":true,"id":1791},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1818":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1819":{"x":205,"y":192.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1820":{"x":205,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1821":{"sourceObj":{"__isSmartRef__":true,"id":1816},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setPane2Selection","converter":null,"converterString":null,"updater":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1822":{"sourceObj":{"__isSmartRef__":true,"id":1816},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane2Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1823":{"sourceObj":{"__isSmartRef__":true,"id":1816},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane2Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1824":{"sourceObj":{"__isSmartRef__":true,"id":1816},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane2Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1825":{"sourceObj":{"__isSmartRef__":true,"id":1579},"sourceAttrName":"setPane3Content","targetObj":{"__isSmartRef__":true,"id":1826},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1826":{"submorphs":[],"scripts":[],"id":37,"shape":{"__isSmartRef__":true,"id":1827},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":1830},"itemList":["-----"],"selectedLineNo":-1,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":1566},"attributeConnections":[{"__isSmartRef__":true,"id":1831},{"__isSmartRef__":true,"id":1832},{"__isSmartRef__":true,"id":1833},{"__isSmartRef__":true,"id":1834}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"selection":null,"__LivelyClassName__":"lively.morphic.List","__SourceModuleName__":"Global.lively.morphic.Core"},"1827":{"_Position":{"__isSmartRef__":true,"id":1828},"_Extent":{"__isSmartRef__":true,"id":1829},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":{"__isSmartRef__":true,"id":1791},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1828":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1829":{"x":205,"y":192.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1830":{"x":410,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1831":{"sourceObj":{"__isSmartRef__":true,"id":1826},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setPane3Selection","converter":null,"converterString":null,"updater":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1832":{"sourceObj":{"__isSmartRef__":true,"id":1826},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane3Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1833":{"sourceObj":{"__isSmartRef__":true,"id":1826},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane3Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1834":{"sourceObj":{"__isSmartRef__":true,"id":1826},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane3Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1835":{"sourceObj":{"__isSmartRef__":true,"id":1579},"sourceAttrName":"setPane4Content","targetObj":{"__isSmartRef__":true,"id":1836},"targetMethodName":"updateList","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1836":{"submorphs":[],"scripts":[],"id":38,"shape":{"__isSmartRef__":true,"id":1837},"droppingEnabled":true,"halosEnabled":true,"_ClipMode":"scroll","_Position":{"__isSmartRef__":true,"id":1840},"itemList":["-----"],"selectedLineNo":-1,"selectOnMove":false,"owner":{"__isSmartRef__":true,"id":1566},"attributeConnections":[{"__isSmartRef__":true,"id":1841},{"__isSmartRef__":true,"id":1842},{"__isSmartRef__":true,"id":1843},{"__isSmartRef__":true,"id":1844}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"selection":null,"__LivelyClassName__":"lively.morphic.List","__SourceModuleName__":"Global.lively.morphic.Core"},"1837":{"_Position":{"__isSmartRef__":true,"id":1838},"_Extent":{"__isSmartRef__":true,"id":1839},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":{"__isSmartRef__":true,"id":1791},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1838":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1839":{"x":205,"y":192.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1840":{"x":615,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1841":{"sourceObj":{"__isSmartRef__":true,"id":1836},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setPane4Selection","converter":null,"converterString":null,"updater":null,"updaterString":"function ($upd, v) { $upd(v, this.sourceObj) }","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1842":{"sourceObj":{"__isSmartRef__":true,"id":1836},"sourceAttrName":"getSelection","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane4Selection","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1843":{"sourceObj":{"__isSmartRef__":true,"id":1836},"sourceAttrName":"getList","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane4Content","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1844":{"sourceObj":{"__isSmartRef__":true,"id":1836},"sourceAttrName":"getMenu","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"getPane4Menu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1845":{"sourceObj":{"__isSmartRef__":true,"id":1579},"sourceAttrName":"setSourceString","targetObj":{"__isSmartRef__":true,"id":1846},"targetMethodName":"setTextString","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1846":{"submorphs":[],"scripts":[],"id":40,"shape":{"__isSmartRef__":true,"id":1847},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1850},"_ClipMode":"scroll","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Courier","_Position":{"__isSmartRef__":true,"id":1851},"priorExtent":{"__isSmartRef__":true,"id":1852},"_MaxTextWidth":820,"_MaxTextHeight":269.5,"textChunks":[{"__isSmartRef__":true,"id":1853}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1566},"layout":{"__isSmartRef__":true,"id":1855},"_FontSize":10,"noEval":true,"attributeConnections":[{"__isSmartRef__":true,"id":1856}],"doNotSerialize":["$$savedTextString"],"doNotCopyProperties":["$$savedTextString"],"styleClass":["Browser_codePaneText"],"focusHaloBorderWidth":0.5,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1847":{"_Position":{"__isSmartRef__":true,"id":1848},"_Extent":{"__isSmartRef__":true,"id":1849},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":{"__isSmartRef__":true,"id":1572},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1848":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1849":{"x":820,"y":269.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1850":{"x":5,"y":5,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1851":{"x":0,"y":247.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1852":{"x":820,"y":269.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1853":{"style":{"__isSmartRef__":true,"id":1854},"morph":{"__isSmartRef__":true,"id":1846},"storedString":"-----","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1854":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1855":{"resizeWidth":true,"resizeHeight":true},"1856":{"sourceObj":{"__isSmartRef__":true,"id":1846},"sourceAttrName":"savedTextString","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setSourceString","converter":null,"converterString":null,"updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1857":{"sourceObj":{"__isSmartRef__":true,"id":1579},"sourceAttrName":"targetURL","targetObj":{"__isSmartRef__":true,"id":1567},"targetMethodName":"setTextString","converter":null,"converterString":null,"updaterString":"function ($upd, value) { value && $upd(String(value)) }","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1858":{"protocol":"http:","hostname":"www.lively-kernel.org","pathname":"/repository/webwerkstatt/lively/oldCore/","__SourceModuleName__":"Global.lively.Network","__LivelyClassName__":"URL"},"1859":{"submorphs":[{"__isSmartRef__":true,"id":1860}],"scripts":[],"id":31,"shape":{"__isSmartRef__":true,"id":1869},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1872},"priorExtent":{"__isSmartRef__":true,"id":1873},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1874},"label":{"__isSmartRef__":true,"id":1860},"owner":{"__isSmartRef__":true,"id":1566},"attributeConnections":[{"__isSmartRef__":true,"id":1883}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1860":{"submorphs":[],"scripts":[],"id":32,"shape":{"__isSmartRef__":true,"id":1861},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1864},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1865},"priorExtent":{"__isSmartRef__":true,"id":1866},"_MaxTextWidth":98.39999999999999,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1867}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1859},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1861":{"_Position":{"__isSmartRef__":true,"id":1862},"_Extent":{"__isSmartRef__":true,"id":1863},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1862":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1863":{"x":98.39999999999999,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1864":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1865":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1866":{"x":98.39999999999999,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1867":{"style":{"__isSmartRef__":true,"id":1868},"morph":{"__isSmartRef__":true,"id":1860},"storedString":"codebase","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1868":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1869":{"_Position":{"__isSmartRef__":true,"id":1870},"_Extent":{"__isSmartRef__":true,"id":1871},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1870":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1871":{"x":98.39999999999999,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1872":{"x":656,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1873":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1874":{"stops":[{"__isSmartRef__":true,"id":1875},{"__isSmartRef__":true,"id":1877},{"__isSmartRef__":true,"id":1879},{"__isSmartRef__":true,"id":1881}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1875":{"offset":0,"color":{"__isSmartRef__":true,"id":1876}},"1876":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1877":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1878}},"1878":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1879":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1880}},"1880":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1881":{"offset":1,"color":{"__isSmartRef__":true,"id":1882}},"1882":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1883":{"sourceObj":{"__isSmartRef__":true,"id":1859},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setTargetURL","converter":null,"converterString":"function () { return URL.codeBase.withFilename('lively/')}","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1884":{"submorphs":[{"__isSmartRef__":true,"id":1885}],"scripts":[],"id":33,"shape":{"__isSmartRef__":true,"id":1894},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1897},"priorExtent":{"__isSmartRef__":true,"id":1898},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":1595},"lighterFill":{"__isSmartRef__":true,"id":1899},"label":{"__isSmartRef__":true,"id":1885},"owner":{"__isSmartRef__":true,"id":1566},"attributeConnections":[{"__isSmartRef__":true,"id":1908}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1885":{"submorphs":[],"scripts":[],"id":34,"shape":{"__isSmartRef__":true,"id":1886},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1889},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1890},"priorExtent":{"__isSmartRef__":true,"id":1891},"_MaxTextWidth":65.6,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1892}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1884},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1886":{"_Position":{"__isSmartRef__":true,"id":1887},"_Extent":{"__isSmartRef__":true,"id":1888},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":null,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1887":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1888":{"x":65.6,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1889":{"x":0,"y":0,"width":0,"height":0,"__LivelyClassName__":"Rectangle","__SourceModuleName__":"Global"},"1890":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1891":{"x":65.6,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1892":{"style":{"__isSmartRef__":true,"id":1893},"morph":{"__isSmartRef__":true,"id":1885},"storedString":"local","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1893":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1894":{"_Position":{"__isSmartRef__":true,"id":1895},"_Extent":{"__isSmartRef__":true,"id":1896},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1594},"_Fill":{"__isSmartRef__":true,"id":1595},"_BorderRadius":5,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1895":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1896":{"x":65.6,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1897":{"x":754.4,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1898":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1899":{"stops":[{"__isSmartRef__":true,"id":1900},{"__isSmartRef__":true,"id":1902},{"__isSmartRef__":true,"id":1904},{"__isSmartRef__":true,"id":1906}],"vector":{"__isSmartRef__":true,"id":1604},"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1900":{"offset":0,"color":{"__isSmartRef__":true,"id":1901}},"1901":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1902":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1903}},"1903":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1904":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1905}},"1905":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1906":{"offset":1,"color":{"__isSmartRef__":true,"id":1907}},"1907":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1908":{"sourceObj":{"__isSmartRef__":true,"id":1884},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":1579},"targetMethodName":"setTargetURL","converter":null,"converterString":"function () { return URL.source.getDirectory() }","updater":null,"updaterString":null,"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings"},"1909":{"submorphs":[],"scripts":[],"id":39,"shape":{"__isSmartRef__":true,"id":1910},"droppingEnabled":true,"halosEnabled":true,"draggingEnabled":true,"_Position":{"__isSmartRef__":true,"id":1914},"fixed":[{"__isSmartRef__":true,"id":1581},{"__isSmartRef__":true,"id":1619},{"__isSmartRef__":true,"id":1646},{"__isSmartRef__":true,"id":1673},{"__isSmartRef__":true,"id":1700},{"__isSmartRef__":true,"id":1727},{"__isSmartRef__":true,"id":1754}],"scalingBelow":[{"__isSmartRef__":true,"id":1846}],"scalingAbove":[{"__isSmartRef__":true,"id":1787},{"__isSmartRef__":true,"id":1816},{"__isSmartRef__":true,"id":1826},{"__isSmartRef__":true,"id":1836}],"minHeight":20,"pointerConnection":null,"owner":{"__isSmartRef__":true,"id":1566},"styleClass":["Browser_resizer"],"__LivelyClassName__":"lively.morphic.HorizontalDivider","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1910":{"_Position":{"__isSmartRef__":true,"id":1911},"_Extent":{"__isSmartRef__":true,"id":1912},"_Fill":{"__isSmartRef__":true,"id":1913},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1911":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1912":{"x":820,"y":5.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1913":{"r":0.95,"g":0.95,"b":0.95,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1914":{"x":0,"y":242,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1915":{"submorphs":[],"scripts":[],"id":41,"shape":{"__isSmartRef__":true,"id":1916},"droppingEnabled":true,"halosEnabled":true,"draggingEnabled":true,"_Position":{"__isSmartRef__":true,"id":1919},"fixed":[],"scalingBelow":[{"__isSmartRef__":true,"id":1920}],"scalingAbove":[{"__isSmartRef__":true,"id":1846}],"minHeight":20,"pointerConnection":null,"owner":{"__isSmartRef__":true,"id":1566},"styleClass":["Browser_resizer"],"__LivelyClassName__":"lively.morphic.HorizontalDivider","__SourceModuleName__":"Global.lively.morphic.Widgets"},"1916":{"_Position":{"__isSmartRef__":true,"id":1917},"_Extent":{"__isSmartRef__":true,"id":1918},"_Fill":{"__isSmartRef__":true,"id":1913},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1917":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1918":{"x":820,"y":5.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1919":{"x":0,"y":517,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1920":{"submorphs":[],"scripts":[],"id":42,"shape":{"__isSmartRef__":true,"id":1921},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1573},"_ClipMode":"scroll","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1924},"priorExtent":{"__isSmartRef__":true,"id":1925},"_MaxTextWidth":820,"_MaxTextHeight":27.5,"textChunks":[{"__isSmartRef__":true,"id":1926}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1566},"styleClass":["Browser_commentPaneText"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1921":{"_Position":{"__isSmartRef__":true,"id":1922},"_Extent":{"__isSmartRef__":true,"id":1923},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":1571},"_Fill":{"__isSmartRef__":true,"id":1572},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1922":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1923":{"x":820,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1924":{"x":0,"y":522.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1925":{"x":820,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1926":{"style":{"__isSmartRef__":true,"id":1927},"morph":{"__isSmartRef__":true,"id":1920},"storedString":"","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1927":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1928":{"_Position":{"__isSmartRef__":true,"id":1929},"_Extent":{"__isSmartRef__":true,"id":1930},"_Fill":{"__isSmartRef__":true,"id":1931},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes"},"1929":{"x":0,"y":0,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1930":{"x":820,"y":550,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1931":{"r":0.9,"g":0.9,"b":0.9,"a":1,"__LivelyClassName__":"Color","__SourceModuleName__":"Global"},"1932":{"adjustForNewBounds":true},"1933":{"x":0,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1934":{"_BorderWidth":0,"_Fill":null,"_StrokeOpacity":0,"_BorderRadius":0,"_Extent":{"__isSmartRef__":true,"id":1935},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1935":{"x":820,"y":572,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1936":{"adjustForNewBounds":true},"1937":{"x":182.56484712941176,"y":125.993990987985,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1938":{"x":820,"y":572,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1939":{"x":651.301952603254,"y":138.27641455269085,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1940":{"submorphs":[],"scripts":[],"id":416,"shape":{"__isSmartRef__":true,"id":1941},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":371},"_ClipMode":"visible","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1944},"priorExtent":{"__isSmartRef__":true,"id":1945},"_MaxTextWidth":300,"_MaxTextHeight":30,"textChunks":[{"__isSmartRef__":true,"id":1946}],"evalEnabled":false,"owner":null,"_TextColor":{"__isSmartRef__":true,"id":194},"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"1941":{"_Position":{"__isSmartRef__":true,"id":1942},"_Extent":{"__isSmartRef__":true,"id":1943},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":370},"_StrokeOpacity":0,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1942":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1943":{"x":300,"y":30,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1944":{"x":260,"y":119.75,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1945":{"x":300,"y":30,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1946":{"style":{"__isSmartRef__":true,"id":1947},"morph":{"__isSmartRef__":true,"id":1940},"storedString":"","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1947":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"1948":{"submorphs":[{"__isSmartRef__":true,"id":1949}],"scripts":[],"id":380,"shape":{"__isSmartRef__":true,"id":1958},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1961},"priorExtent":{"__isSmartRef__":true,"id":1962},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":1963},"label":{"__isSmartRef__":true,"id":1949},"owner":{"__isSmartRef__":true,"id":510},"attributeConnections":[{"__isSmartRef__":true,"id":1972}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"1949":{"submorphs":[],"scripts":[],"id":381,"shape":{"__isSmartRef__":true,"id":1950},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1953},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1954},"priorExtent":{"__isSmartRef__":true,"id":1955},"_MaxTextWidth":98.39999999999999,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1956}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1948},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"1950":{"_Position":{"__isSmartRef__":true,"id":1951},"_Extent":{"__isSmartRef__":true,"id":1952},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1951":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1952":{"x":98.39999999999999,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1953":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"1954":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1955":{"x":98.39999999999999,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1956":{"style":{"__isSmartRef__":true,"id":1957},"morph":{"__isSmartRef__":true,"id":1949},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"codebase","__LivelyClassName__":"lively.morphic.TextChunk"},"1957":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"1958":{"_Position":{"__isSmartRef__":true,"id":1959},"_Extent":{"__isSmartRef__":true,"id":1960},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1959":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1960":{"x":98.39999999999999,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1961":{"x":656,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1962":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1963":{"stops":[{"__isSmartRef__":true,"id":1964},{"__isSmartRef__":true,"id":1966},{"__isSmartRef__":true,"id":1968},{"__isSmartRef__":true,"id":1970}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"1964":{"offset":0,"color":{"__isSmartRef__":true,"id":1965}},"1965":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1966":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1967}},"1967":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1968":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1969}},"1969":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1970":{"offset":1,"color":{"__isSmartRef__":true,"id":1971}},"1971":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1972":{"sourceObj":{"__isSmartRef__":true,"id":1948},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setTargetURL","converterString":"function () { return URL.codeBase.withFilename('lively/')}","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1973":{"submorphs":[{"__isSmartRef__":true,"id":1974}],"scripts":[],"id":382,"shape":{"__isSmartRef__":true,"id":1983},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":1986},"priorExtent":{"__isSmartRef__":true,"id":1987},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":1988},"label":{"__isSmartRef__":true,"id":1974},"owner":{"__isSmartRef__":true,"id":510},"attributeConnections":[{"__isSmartRef__":true,"id":1997}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.Button"},"1974":{"submorphs":[],"scripts":[],"id":383,"shape":{"__isSmartRef__":true,"id":1975},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":1978},"_ClipMode":"hidden","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":1979},"priorExtent":{"__isSmartRef__":true,"id":1980},"_MaxTextWidth":65.6,"_MaxTextHeight":22,"textChunks":[{"__isSmartRef__":true,"id":1981}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":1973},"isLabel":true,"eventsAreIgnored":true,"_Align":"center","__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"1975":{"_Position":{"__isSmartRef__":true,"id":1976},"_Extent":{"__isSmartRef__":true,"id":1977},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1976":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1977":{"x":65.6,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1978":{"x":0,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"1979":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1980":{"x":65.6,"y":22,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"1981":{"style":{"__isSmartRef__":true,"id":1982},"morph":{"__isSmartRef__":true,"id":1974},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"local","__LivelyClassName__":"lively.morphic.TextChunk"},"1982":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"1983":{"_Position":{"__isSmartRef__":true,"id":1984},"_Extent":{"__isSmartRef__":true,"id":1985},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"1984":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1985":{"x":65.6,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1986":{"x":754.4,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1987":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"1988":{"stops":[{"__isSmartRef__":true,"id":1989},{"__isSmartRef__":true,"id":1991},{"__isSmartRef__":true,"id":1993},{"__isSmartRef__":true,"id":1995}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"1989":{"offset":0,"color":{"__isSmartRef__":true,"id":1990}},"1990":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1991":{"offset":0.4,"color":{"__isSmartRef__":true,"id":1992}},"1992":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1993":{"offset":0.6,"color":{"__isSmartRef__":true,"id":1994}},"1994":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1995":{"offset":1,"color":{"__isSmartRef__":true,"id":1996}},"1996":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"1997":{"sourceObj":{"__isSmartRef__":true,"id":1973},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setTargetURL","converter":null,"converterString":"function () { return URL.source.getDirectory() }","updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"1998":{"submorphs":[],"scripts":[],"id":388,"shape":{"__isSmartRef__":true,"id":1999},"droppingEnabled":true,"halosEnabled":true,"draggingEnabled":true,"_Position":{"__isSmartRef__":true,"id":2003},"fixed":[{"__isSmartRef__":true,"id":522},{"__isSmartRef__":true,"id":549},{"__isSmartRef__":true,"id":576},{"__isSmartRef__":true,"id":603},{"__isSmartRef__":true,"id":630},{"__isSmartRef__":true,"id":657},{"__isSmartRef__":true,"id":684}],"scalingBelow":[{"__isSmartRef__":true,"id":500}],"scalingAbove":[{"__isSmartRef__":true,"id":717},{"__isSmartRef__":true,"id":1387},{"__isSmartRef__":true,"id":1440},{"__isSmartRef__":true,"id":1452}],"minHeight":20,"pointerConnection":null,"owner":{"__isSmartRef__":true,"id":510},"styleClass":["Browser_resizer"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.HorizontalDivider"},"1999":{"_Position":{"__isSmartRef__":true,"id":2000},"_Extent":{"__isSmartRef__":true,"id":2001},"_Fill":{"__isSmartRef__":true,"id":2002},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2000":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2001":{"x":820,"y":5.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2002":{"r":0.95,"g":0.95,"b":0.95,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2003":{"x":0,"y":242,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2004":{"submorphs":[],"scripts":[],"id":390,"shape":{"__isSmartRef__":true,"id":2005},"droppingEnabled":true,"halosEnabled":true,"draggingEnabled":true,"_Position":{"__isSmartRef__":true,"id":2008},"fixed":[],"scalingBelow":[{"__isSmartRef__":true,"id":2009}],"scalingAbove":[{"__isSmartRef__":true,"id":500}],"minHeight":20,"pointerConnection":null,"owner":{"__isSmartRef__":true,"id":510},"styleClass":["Browser_resizer"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.HorizontalDivider"},"2005":{"_Position":{"__isSmartRef__":true,"id":2006},"_Extent":{"__isSmartRef__":true,"id":2007},"_Fill":{"__isSmartRef__":true,"id":2002},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2006":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2007":{"x":820,"y":5.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2008":{"x":0,"y":517,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2009":{"submorphs":[],"scripts":[],"id":391,"shape":{"__isSmartRef__":true,"id":2010},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":371},"_ClipMode":"scroll","fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":true,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":2013},"priorExtent":{"__isSmartRef__":true,"id":2014},"_MaxTextWidth":820,"_MaxTextHeight":27.5,"textChunks":[{"__isSmartRef__":true,"id":2015}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":510},"styleClass":["Browser_commentPaneText"],"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"2010":{"_Position":{"__isSmartRef__":true,"id":2011},"_Extent":{"__isSmartRef__":true,"id":2012},"_BorderWidth":1,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":{"__isSmartRef__":true,"id":504},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2011":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2012":{"x":820,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2013":{"x":0,"y":522.5,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2014":{"x":820,"y":27.5,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2015":{"style":{"__isSmartRef__":true,"id":2016},"morph":{"__isSmartRef__":true,"id":2009},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"","__LivelyClassName__":"lively.morphic.TextChunk"},"2016":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"2017":{"_Position":{"__isSmartRef__":true,"id":2018},"_Extent":{"__isSmartRef__":true,"id":2019},"_Fill":{"__isSmartRef__":true,"id":2020},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2018":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2019":{"x":820,"y":550,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2020":{"r":0.9,"g":0.9,"b":0.9,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2021":{"adjustForNewBounds":true},"2022":{"resizeWidth":true,"resizeHeight":true},"2023":{"sourceObj":{"__isSmartRef__":true,"id":500},"sourceAttrName":"savedTextString","targetObj":{"__isSmartRef__":true,"id":520},"targetMethodName":"setSourceString","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2024":{"submorphs":[{"__isSmartRef__":true,"id":2025},{"__isSmartRef__":true,"id":2033},{"__isSmartRef__":true,"id":2060},{"__isSmartRef__":true,"id":2086}],"scripts":[],"id":690,"shape":{"__isSmartRef__":true,"id":2113},"droppingEnabled":true,"halosEnabled":true,"layout":{"__isSmartRef__":true,"id":2116},"_Position":{"__isSmartRef__":true,"id":2117},"eventsAreIgnored":true,"windowMorph":{"__isSmartRef__":true,"id":490},"label":{"__isSmartRef__":true,"id":2025},"closeButton":{"__isSmartRef__":true,"id":2033},"menuButton":{"__isSmartRef__":true,"id":2060},"collapseButton":{"__isSmartRef__":true,"id":2086},"priorExtent":{"__isSmartRef__":true,"id":2118},"owner":{"__isSmartRef__":true,"id":490},"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.TitleBar"},"2025":{"submorphs":[],"scripts":[],"id":691,"shape":{"__isSmartRef__":true,"id":2026},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":382},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":2029},"priorExtent":{"__isSmartRef__":true,"id":2030},"_MaxTextWidth":null,"_MaxTextHeight":14,"textChunks":[{"__isSmartRef__":true,"id":2031}],"evalEnabled":false,"isLabel":true,"eventsAreIgnored":true,"_FontSize":10,"_Align":"center","owner":{"__isSmartRef__":true,"id":2024},"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"2026":{"_Position":{"__isSmartRef__":true,"id":2027},"_Extent":{"__isSmartRef__":true,"id":2028},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"_BorderRadius":0,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2027":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2028":{"x":-20,"y":14,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2029":{"x":20,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2030":{"x":-20,"y":14,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2031":{"style":{"__isSmartRef__":true,"id":2032},"morph":{"__isSmartRef__":true,"id":2025},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"Inspector for ","__LivelyClassName__":"lively.morphic.TextChunk"},"2032":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"2033":{"submorphs":[{"__isSmartRef__":true,"id":2034}],"scripts":[],"id":692,"shape":{"__isSmartRef__":true,"id":2043},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":2046},"priorExtent":{"__isSmartRef__":true,"id":2047},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":2048},"label":{"__isSmartRef__":true,"id":2034},"owner":{"__isSmartRef__":true,"id":2024},"layout":{"__isSmartRef__":true,"id":2057},"attributeConnections":[{"__isSmartRef__":true,"id":2058},{"__isSmartRef__":true,"id":2059}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"2034":{"submorphs":[],"scripts":[],"id":693,"shape":{"__isSmartRef__":true,"id":2035},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":2038},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":2039},"priorExtent":{"__isSmartRef__":true,"id":2040},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":2041}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":2033},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"2035":{"_Position":{"__isSmartRef__":true,"id":2036},"_Extent":{"__isSmartRef__":true,"id":2037},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2036":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2037":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2038":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"2039":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2040":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2041":{"style":{"__isSmartRef__":true,"id":2042},"morph":{"__isSmartRef__":true,"id":2034},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"X","__LivelyClassName__":"lively.morphic.TextChunk"},"2042":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"2043":{"_Position":{"__isSmartRef__":true,"id":2044},"_Extent":{"__isSmartRef__":true,"id":2045},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2044":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2045":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2046":{"x":480,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2047":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2048":{"stops":[{"__isSmartRef__":true,"id":2049},{"__isSmartRef__":true,"id":2051},{"__isSmartRef__":true,"id":2053},{"__isSmartRef__":true,"id":2055}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"2049":{"offset":0,"color":{"__isSmartRef__":true,"id":2050}},"2050":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2051":{"offset":0.4,"color":{"__isSmartRef__":true,"id":2052}},"2052":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2053":{"offset":0.6,"color":{"__isSmartRef__":true,"id":2054}},"2054":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2055":{"offset":1,"color":{"__isSmartRef__":true,"id":2056}},"2056":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2057":{"moveHorizontal":true},"2058":{"sourceObj":{"__isSmartRef__":true,"id":2033},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":490},"targetMethodName":"getCloseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2059":{"sourceObj":{"__isSmartRef__":true,"id":2033},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":490},"targetMethodName":"initiateShutdown","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2060":{"submorphs":[{"__isSmartRef__":true,"id":2061}],"scripts":[],"id":694,"shape":{"__isSmartRef__":true,"id":2070},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":2073},"priorExtent":{"__isSmartRef__":true,"id":2074},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":2075},"label":{"__isSmartRef__":true,"id":2061},"owner":{"__isSmartRef__":true,"id":2024},"attributeConnections":[{"__isSmartRef__":true,"id":2084},{"__isSmartRef__":true,"id":2085}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"2061":{"submorphs":[],"scripts":[],"id":695,"shape":{"__isSmartRef__":true,"id":2062},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":2065},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":2066},"priorExtent":{"__isSmartRef__":true,"id":2067},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":2068}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":2060},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"2062":{"_Position":{"__isSmartRef__":true,"id":2063},"_Extent":{"__isSmartRef__":true,"id":2064},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2063":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2064":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2065":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"2066":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2067":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2068":{"style":{"__isSmartRef__":true,"id":2069},"morph":{"__isSmartRef__":true,"id":2061},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"M","__LivelyClassName__":"lively.morphic.TextChunk"},"2069":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"2070":{"_Position":{"__isSmartRef__":true,"id":2071},"_Extent":{"__isSmartRef__":true,"id":2072},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2071":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2072":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2073":{"x":3,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2074":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2075":{"stops":[{"__isSmartRef__":true,"id":2076},{"__isSmartRef__":true,"id":2078},{"__isSmartRef__":true,"id":2080},{"__isSmartRef__":true,"id":2082}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"2076":{"offset":0,"color":{"__isSmartRef__":true,"id":2077}},"2077":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2078":{"offset":0.4,"color":{"__isSmartRef__":true,"id":2079}},"2079":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2080":{"offset":0.6,"color":{"__isSmartRef__":true,"id":2081}},"2081":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2082":{"offset":1,"color":{"__isSmartRef__":true,"id":2083}},"2083":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2084":{"sourceObj":{"__isSmartRef__":true,"id":2060},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":490},"targetMethodName":"getMenuHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2085":{"sourceObj":{"__isSmartRef__":true,"id":2060},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":490},"targetMethodName":"showTargetMorphMenu","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2086":{"submorphs":[{"__isSmartRef__":true,"id":2087}],"scripts":[],"id":696,"shape":{"__isSmartRef__":true,"id":2096},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Position":{"__isSmartRef__":true,"id":2099},"priorExtent":{"__isSmartRef__":true,"id":2100},"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":401},"lighterFill":{"__isSmartRef__":true,"id":2101},"label":{"__isSmartRef__":true,"id":2087},"owner":{"__isSmartRef__":true,"id":2024},"layout":{"__isSmartRef__":true,"id":2110},"attributeConnections":[{"__isSmartRef__":true,"id":2111},{"__isSmartRef__":true,"id":2112}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__SourceModuleName__":"Global.lively.morphic.Widgets","__LivelyClassName__":"lively.morphic.WindowControl"},"2087":{"submorphs":[],"scripts":[],"id":697,"shape":{"__isSmartRef__":true,"id":2088},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"_Padding":{"__isSmartRef__":true,"id":2091},"_ClipMode":"hidden","fixedWidth":false,"_WhiteSpaceHandling":"pre","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","_Position":{"__isSmartRef__":true,"id":2092},"priorExtent":{"__isSmartRef__":true,"id":2093},"_MaxTextWidth":null,"_MaxTextHeight":17,"textChunks":[{"__isSmartRef__":true,"id":2094}],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":2086},"isLabel":true,"eventsAreIgnored":true,"_FontSize":8,"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.Text"},"2088":{"_Position":{"__isSmartRef__":true,"id":2089},"_Extent":{"__isSmartRef__":true,"id":2090},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":194},"_Fill":null,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2089":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2090":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2091":{"x":5,"y":0,"width":0,"height":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Rectangle"},"2092":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2093":{"x":17,"y":17,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2094":{"style":{"__isSmartRef__":true,"id":2095},"morph":{"__isSmartRef__":true,"id":2087},"__SourceModuleName__":"Global.lively.morphic.TextCore","storedString":"–","__LivelyClassName__":"lively.morphic.TextChunk"},"2095":{"__SourceModuleName__":"Global.lively.morphic.TextCore","__LivelyClassName__":"lively.morphic.TextEmphasis"},"2096":{"_Position":{"__isSmartRef__":true,"id":2097},"_Extent":{"__isSmartRef__":true,"id":2098},"_BorderWidth":0,"_BorderColor":{"__isSmartRef__":true,"id":400},"_Fill":{"__isSmartRef__":true,"id":401},"_StrokeOpacity":0,"_BorderRadius":5,"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2097":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2098":{"x":17,"y":17,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2099":{"x":461,"y":3,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2100":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2101":{"stops":[{"__isSmartRef__":true,"id":2102},{"__isSmartRef__":true,"id":2104},{"__isSmartRef__":true,"id":2106},{"__isSmartRef__":true,"id":2108}],"vector":{"__isSmartRef__":true,"id":410},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.LinearGradient"},"2102":{"offset":0,"color":{"__isSmartRef__":true,"id":2103}},"2103":{"r":0.98,"g":0.98,"b":0.98,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2104":{"offset":0.4,"color":{"__isSmartRef__":true,"id":2105}},"2105":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2106":{"offset":0.6,"color":{"__isSmartRef__":true,"id":2107}},"2107":{"r":0.91,"g":0.91,"b":0.91,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2108":{"offset":1,"color":{"__isSmartRef__":true,"id":2109}},"2109":{"r":0.97,"g":0.97,"b":0.97,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2110":{"moveHorizontal":true},"2111":{"sourceObj":{"__isSmartRef__":true,"id":2086},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":490},"targetMethodName":"getCollapseHelp","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2112":{"sourceObj":{"__isSmartRef__":true,"id":2086},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":490},"targetMethodName":"toggleCollapse","converter":null,"converterString":null,"updater":null,"updaterString":null,"__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2113":{"_Position":{"__isSmartRef__":true,"id":2114},"_Extent":{"__isSmartRef__":true,"id":2115},"_BorderWidth":2,"_BorderColor":{"__isSmartRef__":true,"id":481},"_Fill":{"__isSmartRef__":true,"id":157},"_StrokeOpacity":1,"_BorderRadius":"8px 8px 0px 0px","__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2114":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2115":{"x":500,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2116":{"resizeWidth":true,"adjustForNewBounds":true},"2117":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2118":{"x":500,"y":22,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2119":{"_BorderWidth":0,"_Fill":null,"_StrokeOpacity":0,"_BorderRadius":0,"_Extent":{"__isSmartRef__":true,"id":2120},"__SourceModuleName__":"Global.lively.morphic.Shapes","__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2120":{"x":500,"y":222,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2121":{"adjustForNewBounds":true},"2122":{"x":1011.0310460610762,"y":572.1537303068835,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2123":{"x":500,"y":222,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2124":{"submorphs":[],"scripts":[],"id":226,"shape":{"__isSmartRef__":true,"id":2125},"grabbingEnabled":false,"droppingEnabled":false,"showsMorphMenu":false,"halosEnabled":false,"registeredForMouseEvents":true,"_world":{"__isSmartRef__":true,"id":0},"_Position":{"__isSmartRef__":true,"id":2129},"owner":{"__isSmartRef__":true,"id":0},"__SourceModuleName__":"Global.lively.morphic.Events","carriesGrabbedMorphs":false,"_Rotation":0,"_Scale":1.0040100200350561,"__LivelyClassName__":"lively.morphic.HandMorph"},"2125":{"__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":{"__isSmartRef__":true,"id":2126},"_Extent":{"__isSmartRef__":true,"id":2127},"_Fill":{"__isSmartRef__":true,"id":2128},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2126":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2127":{"x":2,"y":2,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2128":{"r":0.8,"g":0,"b":0,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2129":{"x":832.3243066090615,"y":572.285711419982,"__LivelyClassName__":"Point","__SourceModuleName__":"Global"},"2130":{"__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":{"__isSmartRef__":true,"id":2131},"_Extent":{"__isSmartRef__":true,"id":2132},"_Fill":{"__isSmartRef__":true,"id":2133},"__LivelyClassName__":"lively.morphic.Shapes.Rectangle"},"2131":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2132":{"x":2800,"y":2900,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2133":{"r":1,"g":1,"b":1,"a":1,"__SourceModuleName__":"Global","__LivelyClassName__":"Color"},"2134":{"x":0,"y":0,"__SourceModuleName__":"Global","__LivelyClassName__":"Point"},"2135":{"sourceObj":{"__isSmartRef__":true,"id":0},"sourceAttrName":"savedWorldAsURL","targetObj":{"__isSmartRef__":true,"id":0},"targetMethodName":"visitNewPageAfterSaveAs","converter":null,"converterString":null,"updaterString":"function ($upd, v) { \n\t\t\t\tif (v && v.toString() !== URL.source.toString()) {\n\t\t\t\t\t$upd(v) \n\t\t\t\t}\n\t\t\t}","__SourceModuleName__":"Global.lively.bindings","__LivelyClassName__":"AttributeConnection"},"2136":{"protocol":"http:","hostname":"www.lively-kernel.org","pathname":"/repository/webwerkstatt/issues/110513_MakeSyntaxHighlightingWorkInNewWorld.xhtml","__SourceModuleName__":"Global.lively.Network","__LivelyClassName__":"URL"},"isSimplifiedRegistry":true}}]]>