| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | EnyoFriend subclass: #HelloAmber        instanceVariableNames: 'count popup'        category: 'HelloAmber'!!HelloAmber methodsFor: 'accessing'!count	^count! !!HelloAmber methodsFor: 'actions'!buttonClicked	count := count + 1.	self dollar input setValue: (self dollar input getValue, 'You clicked the button ', count asString, ' times so far').	"Okidoki, why not throw up a popup?"	popup openAtCenter!popupSelected: value	"The user picked a value in the popup."	self dollar input setValue: (self dollar input getValue, ' ', value)! !!HelloAmber methodsFor: 'initialization'!initialize	"Create Enyo stuff and hook in callback blocks calling our action methods,	very similar to how Seaside does it.	Creating the templates for component construction	is clearly simpler to do in js. Yes, we can use	method temps inside the js code and ivars are accessed	using this syntax:		this['@ivarname']	We can not easily mix in arbitrary Amber expressions in the js code, thus	we use method temps for holding the blocks instead of embedding the blocks	directly. Blocks are js functions which is really neat. And we can use:		this._amberMessage()	to send messages to self for embedding the result."	| props block block2 |	super initialize.	count := 0.	"Create a callback block to embed below."	block := [self buttonClicked].	"We need to go through a method temp (props) for doing js, just inlining it	after 'enyo create:' does not work so js escaping is on the statement level	and not on the expression level."	<props = {		kind: 'VFlexBox',		components: [			{kind: 'PageHeader', content: 'Amber Live'}, 			{kind: "RowGroup", caption: "Rock on", components: [				{kind: 'Input', components: [					{kind: 'Button', caption: 'Click me', onclick: 'ablock'}]				}]			}],		ablock: block}>.	self ui: (enyo create: props).	"If we like we can create a kind for the UI (then the props need a name EnyoHelloAmber),	but we do not have to in this case so this is commented out."	"self kind: (enyo kind: props).	<this['@ui'] = new EnyoHelloAmber()>"	"This Enyo popup instance is created and held in an ivar for later use."	block2 := [:sender :value :old | self popupSelected: value].	<props = {kind: "Popup", components: [	    		{content: "Pick something you like a lot"},	    		{kind: "ListSelector", onChange: "popupSelected", value: "Foo", items: ["Foo", "Bar", "Bot"]			}],		popupSelected: block2}>.	popup := enyo create: props	! !!HelloAmber class methodsFor: 'initialization'!initialize	enyo log: 'Class initialized'! !
 |