Object subclass: #CanvasRenderingContext
	instanceVariableNames: ''
	category: 'Canvas'!

!CanvasRenderingContext methodsFor: 'drawing arcs'!

arcTo: aPoint radius: aNumber startAngle: aNumber2 endAngle: aNumber3 anticlockwise: aBoolean
	{'self.arc(aPoint._x(), aPoint._y(), aNumber, aNumber2, aNumber3, aBoolean)'} 
!

arcTo: aPoint radius: aNumber
	self arcTo: aPoint radius: aNumber startAngle: 0 endAngle: Number pi * 2 anticlockwise: false
! !

!CanvasRenderingContext methodsFor: 'drawing paths'!

fillStyle: aString
	{'self.fillStyle = String(aString)'}
!

beginPath
	{'self.beginPath()'}
!

closePath
	{'self.closePath()'}
!

fill
	{'self.fill()'}
!

stroke
	{'self.stroke()'}
!

moveTo: aPoint
	{'self.moveTo(aPoint._x(), aPoint._y())'}
!

lineTo: aPoint
	{'self.lineTo(aPoint._x(), aPoint._y())'}
!

strokeStyle: aString
	{'self.strokeStyle = String(aString)'}
!

lineWidth: aNumber
	{'self.lineWidth = aNumber'}
! !

!CanvasRenderingContext methodsFor: 'drawing rectangles'!

fillRectFrom: aPoint to: anotherPoint
	{'self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y())'}
!

strokeRectFrom: aPoint to: anotherPoint
	{'self.strokeRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y())'}
!

clearRectFrom: aPoint to: anotherPoint
	{'self.fillRect(aPoint._x(), aPoint._y(), anotherPoint._x(), anotherPoint._y())'}
! !

!CanvasRenderingContext class methodsFor: 'instance creation'!

tagBrush: aTagBrush
	{'return aTagBrush._element().getContext(''2d'')'}
! !

Object subclass: #HTMLCanvas
	instanceVariableNames: 'root'
	category: 'Canvas'!

!HTMLCanvas methodsFor: '*JQuery'!

appendToJQuery: aJQuery
    aJQuery appendElement: root element

! !

!HTMLCanvas methodsFor: 'accessing'!

root: aTagBrush
    root := aTagBrush

!

root
    ^root

! !

!HTMLCanvas methodsFor: 'adding'!

with: anObject
    ^self root with: anObject

! !

!HTMLCanvas methodsFor: 'initialization'!

initialize
    super initialize.
    root := TagBrush fromString: 'div' canvas: self

! !

!HTMLCanvas methodsFor: 'tags'!

newTag: aString
    ^TagBrush fromString: aString canvas: self

!

tag: aString
    ^root addBrush: (self newTag: aString)

!

h1
    ^self tag: 'h1'

!

h2
    ^self tag: 'h2'

!

h3
    ^self tag: 'h3'

!

h4
    ^self tag: 'h4'

!

h5
    ^self tag: 'h5'

!

h6
    ^self tag: 'h6'

!

p
    ^self tag: 'p'

!

div
    ^self tag: 'div'

!

span
    ^self tag: 'span'

!

img
    ^self tag: 'img'

!

ul
    ^self tag: 'ul'

!

ol
    ^self tag: 'ol'

!

li
    ^self tag: 'li'

!

table
    ^self tag: 'table'

!

tr
    ^self tag: 'tr'

!

td 
    ^self tag: 'td'

!

th
    ^self tag: 'th'

!

form
    ^self tag: 'form'

!

input
    ^self tag: 'input'

!

button
    ^self tag: 'button'

!

select
    ^self tag: 'select'

!

option
    ^self tag: 'option'

!

textarea
    ^self tag: 'textarea'

!

a
    ^self tag: 'a'

!

canvas
	^self tag: 'canvas'

! !

Object subclass: #TagBrush
	instanceVariableNames: 'canvas, element'
	category: 'Canvas'!

!TagBrush methodsFor: 'accessing'!

element
    ^element

! !

!TagBrush methodsFor: 'adding'!

contents: anObject
    self asJQuery empty.
    self append: anObject

!

addBrush: aTagBrush
    self appendChild: aTagBrush element.
    ^aTagBrush

!

with: anObject
    self append: anObject

!

append: anObject
    anObject appendToBrush: self

!

appendToBrush: aTagBrush
    aTagBrush addBrush: self

!

appendBlock: aBlock
    | root |
    root := canvas root.
    canvas root: self.
    aBlock value: canvas.
    canvas root: root

!

appendChild: anElement
    {'self[''@element''].appendChild(anElement)'}

!

appendString: aString
    self appendChild: (self createTextNodeFor: aString)

! !

!TagBrush methodsFor: 'attributes'!

at: aString put: aValue
    {'self[''@element''].setAttribute(aString, aValue)'}

!

removeAt: aString
    {'self[''@element''].removeAttribute(aString)'}

!

class: aString
    self at: 'class' put: aString

!

id: aString
    self at: 'id' put: aString

!

src: aString
    self  at: 'src' put: aString

!

href: aString
    self at: 'href' put: aString

!

title: aString
    self at: 'title' put: aString

!

style: aString
    self at: 'style' put: aString

! !

!TagBrush methodsFor: 'converting'!

asJQuery
	{'return smalltalk.JQuery._from_(jQuery(self[''@element'']))'}

!

asJQueryDo: aBlock
    aBlock value: self asJQuery

! !

!TagBrush methodsFor: 'events'!

onKeyDown: aBlock
    self asJQuery on: 'keydown' do: aBlock

!

onKeyPress: aBlock
    self asJQuery on: 'keypress' do: aBlock

!

onKeyUp: aBlock
    self asJQuery on: 'keyup' do: aBlock

!

onFocus: aBlock
    self asJQuery on: 'focus' do: aBlock

!

onBlur: aBlock
    self asJQuery on: 'blur' do: aBlock

!

onChange: aBlock
    self asJQuery on: 'change' do: aBlock

!

onClick: aBlock
    self asJQuery on: 'click' do: aBlock

! !

!TagBrush methodsFor: 'initialization'!

initializeFromString: aString canvas: aCanvas
    element := self createElementFor: aString.
    canvas := aCanvas

! !

!TagBrush methodsFor: 'private'!

createElementFor: aString
	{'return document.createElement(String(aString))'}

!

createTextNodeFor: aString
	{'return document.createTextNode(String(aString))'}

! !

!TagBrush class methodsFor: 'instance creation'!

fromString: aString canvas: aCanvas
    ^self new
	initializeFromString: aString canvas: aCanvas;
	yourself

! !

Object subclass: #Widget
	instanceVariableNames: 'root'
	category: 'Canvas'!

!Widget methodsFor: 'accessing'!

root
    ^root

! !

!Widget methodsFor: 'actions'!

alert: aString
    {'alert(aString)'}

!

confirm: aString
    {'return window.confirm(aString)'}

!

prompt: aString
    ^self prompt: aString default: ''

!

prompt: aString default: anotherString
    {'return window.prompt(aString, anotherString)'}

!

update
    | canvas |
    canvas := HTMLCanvas new.
    canvas root: self root.
    self root asJQuery empty.
    self renderOn: canvas

! !

!Widget methodsFor: 'adding'!

appendToBrush: aTagBrush
    self appendToJQuery: aTagBrush asJQuery

!

appendToJQuery: aJQuery
    self render.
    aJQuery append: self root asJQuery

! !

!Widget methodsFor: 'rendering'!

render
    | canvas |
    canvas := HTMLCanvas new.
    root := canvas root.
    self renderOn: canvas

!

renderOn: html
    self

! !

TagBrush subclass: #CanvasBrush
	instanceVariableNames: ''
	category: 'Canvas'!

!CanvasBrush methodsFor: 'initialization'!

initializeWithCanvas: aCanvas
	canvas := aCanvas
! !

!CanvasBrush methodsFor: 'private'!

createElement
	{'return document.createElement(''canvas'')'}
! !

!CanvasBrush class methodsFor: 'instance creation'!

canvas: aCanvas
	^self new
		initializeWithCanvas: aCanvas;
		yourself
! !



appendToBrush: aTagBrush
    aTagBrush append: self asString

!

appendToBrush: aTagBrush
    aTagBrush appendBlock: self
!

appendToBrush: aTagBrush
    aTagBrush appendString: self

!