|  | @@ -1,205 +1,70 @@
 | 
	
		
			
				|  |  |  Smalltalk current createPackage: 'Presentation' properties: #{}!
 | 
	
		
			
				|  |  | -Widget subclass: #PresentationNavigator
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'presentationBrush currentPresentation slideSelect'
 | 
	
		
			
				|  |  | +Widget subclass: #Slide
 | 
	
		
			
				|  |  | +	instanceVariableNames: 'presentation'
 | 
	
		
			
				|  |  |  	category: 'Presentation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!PresentationNavigator methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -currentPresentation: aPresentation
 | 
	
		
			
				|  |  | -	currentPresentation := aPresentation.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -currentPresentation
 | 
	
		
			
				|  |  | -	^  currentPresentation ifNil: [currentPresentation := Presentation concretePresentations first new].
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -style
 | 
	
		
			
				|  |  | -	^ '
 | 
	
		
			
				|  |  | -#navigator {
 | 
	
		
			
				|  |  | -    z-index: 1;
 | 
	
		
			
				|  |  | -    position: fixed;
 | 
	
		
			
				|  |  | -    top: 0;
 | 
	
		
			
				|  |  | -    left: 50%;
 | 
	
		
			
				|  |  | -    margin-left: -150px;
 | 
	
		
			
				|  |  | -    padding: 5px;
 | 
	
		
			
				|  |  | -    border-radius: 5px;
 | 
	
		
			
				|  |  | -    -moz-border-radius: 5px;
 | 
	
		
			
				|  |  | -    -webkit-border-radius: 5px;
 | 
	
		
			
				|  |  | -    background: #333;
 | 
	
		
			
				|  |  | -    opacity: 0.3;
 | 
	
		
			
				|  |  | -    color: #eee;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#navigator a {
 | 
	
		
			
				|  |  | -    font-weight: bold;
 | 
	
		
			
				|  |  | -    color: #eee;
 | 
	
		
			
				|  |  | -    text-decoration: none;
 | 
	
		
			
				|  |  | -    cursor: pointer;
 | 
	
		
			
				|  |  | -    padding: 0 2px;
 | 
	
		
			
				|  |  | -    font-size: 14px;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#navigator:hover {
 | 
	
		
			
				|  |  | -    opacity: 0.8;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!PresentationNavigator methodsFor: 'callbacks'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectPresentation: aPresentationClass
 | 
	
		
			
				|  |  | -	self currentPresentation: aPresentationClass new.
 | 
	
		
			
				|  |  | -	self renderCurrentPresentation.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectPresentationNamed: aString
 | 
	
		
			
				|  |  | -	|presentationClass|
 | 
	
		
			
				|  |  | -	presentationClass :=  (Smalltalk current at: aString).
 | 
	
		
			
				|  |  | -	presentationClass ifNotNil: [ self selectPresentation: presentationClass ].
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!Slide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -previousSlide
 | 
	
		
			
				|  |  | -	self currentPresentation previousSlide.
 | 
	
		
			
				|  |  | -	self updateHash.
 | 
	
		
			
				|  |  | +presentation
 | 
	
		
			
				|  |  | +	^presentation
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -nextSlide
 | 
	
		
			
				|  |  | -	self currentPresentation nextSlide.
 | 
	
		
			
				|  |  | -	self updateHash.
 | 
	
		
			
				|  |  | +presentation: aPresentation
 | 
	
		
			
				|  |  | +	presentation := aPresentation
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -reload
 | 
	
		
			
				|  |  | -	|slideIndex|
 | 
	
		
			
				|  |  | -	slideIndex := self currentPresentation currentSlideIndex.
 | 
	
		
			
				|  |  | -	self currentPresentation: self currentPresentation class new.
 | 
	
		
			
				|  |  | -	self renderCurrentPresentation.
 | 
	
		
			
				|  |  | -	self selectSlideAt: slideIndex.
 | 
	
		
			
				|  |  | +id
 | 
	
		
			
				|  |  | +	^ self class name
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -selectSlideAt: anInteger
 | 
	
		
			
				|  |  | -	self currentPresentation moveAt: anInteger.
 | 
	
		
			
				|  |  | -	self updateHash.
 | 
	
		
			
				|  |  | +cssClass
 | 
	
		
			
				|  |  | +	^'slide'
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -updateHash
 | 
	
		
			
				|  |  | -	document location hash: self currentPresentation class name, '-', self currentPresentation currentSlideIndex.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!PresentationNavigator methodsFor: 'hash'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -checkHash
 | 
	
		
			
				|  |  | -	| hash presentation |
 | 
	
		
			
				|  |  | -	hash := (document location hash  replace: '^#' with: '') tokenize: '-'. 
 | 
	
		
			
				|  |  | -	presentation := Presentation concretePresentations 
 | 
	
		
			
				|  |  | -				detect: [:aPresentationClass | aPresentationClass name == hash first]
 | 
	
		
			
				|  |  | -				ifNone: [^ self].
 | 
	
		
			
				|  |  | -	presentation == self currentPresentation class ifFalse: [
 | 
	
		
			
				|  |  | -          	self selectPresentationNamed: presentation.
 | 
	
		
			
				|  |  | -          	self selectSlideAt: hash last
 | 
	
		
			
				|  |  | -        ].
 | 
	
		
			
				|  |  | +backgroundColor
 | 
	
		
			
				|  |  | +	^'#555'
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -checkHashChange
 | 
	
		
			
				|  |  | -	(window jQuery: window) bind: 'hashchange' do: [self checkHash]
 | 
	
		
			
				|  |  | +title
 | 
	
		
			
				|  |  | +	^ self id
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!PresentationNavigator methodsFor: 'keybindings'!
 | 
	
		
			
				|  |  | +!Slide methodsFor: 'actions'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -setKeybindings
 | 
	
		
			
				|  |  | -	(window jQuery: document) keyup: [:e || node |
 | 
	
		
			
				|  |  | -		node := e target nodeName asLowercase.
 | 
	
		
			
				|  |  | -		(node = 'textarea' or: [node = 'input']) ifFalse: [
 | 
	
		
			
				|  |  | -			e keyCode = 39 ifTrue: [self nextSlide].
 | 
	
		
			
				|  |  | -			e keyCode = 37 ifTrue: [self previousSlide]]]
 | 
	
		
			
				|  |  | +show
 | 
	
		
			
				|  |  | +	self backgroundColor ifNotNil: [
 | 
	
		
			
				|  |  | +		(window jQuery: '#slides') css: 'background' color: self backgroundColor].
 | 
	
		
			
				|  |  | +	(window jQuery: '.slide') hide: self presentation slideTransition options: #() duration: 300.
 | 
	
		
			
				|  |  | +	(window jQuery: '#', self id) show: self presentation slideTransition options: #() duration: 300.
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!PresentationNavigator methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderToolsOn: html
 | 
	
		
			
				|  |  | -	html a 
 | 
	
		
			
				|  |  | -		with: 'IDE';
 | 
	
		
			
				|  |  | -		onClick: [TabManager current open].
 | 
	
		
			
				|  |  | -	html a
 | 
	
		
			
				|  |  | -		with: 'Reload';
 | 
	
		
			
				|  |  | -		onClick: [self reload].
 | 
	
		
			
				|  |  | -	html a
 | 
	
		
			
				|  |  | -		with: '←';
 | 
	
		
			
				|  |  | -		onClick: [self previousSlide].
 | 
	
		
			
				|  |  | -	html a
 | 
	
		
			
				|  |  | -		with: '→';
 | 
	
		
			
				|  |  | -		onClick: [self nextSlide].
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderPresentationSelectOn: html
 | 
	
		
			
				|  |  | -	|presentationSelect|
 | 
	
		
			
				|  |  | -	presentationSelect := html select.
 | 
	
		
			
				|  |  | -	presentationSelect
 | 
	
		
			
				|  |  | -		onChange: [self  selectPresentationNamed:  presentationSelect asJQuery val];
 | 
	
		
			
				|  |  | -		with: [	Presentation concretePresentationsDo: [:aPresentationClass |   
 | 
	
		
			
				|  |  | -                                                              							html option
 | 
	
		
			
				|  |  | -                                                              								value: aPresentationClass name;
 | 
	
		
			
				|  |  | -                                                              								with: aPresentationClass title ] ].
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	(window jQuery: document)  ready: [
 | 
	
		
			
				|  |  | -          	self 
 | 
	
		
			
				|  |  | -          		appendToJQuery: 'body' asJQuery;
 | 
	
		
			
				|  |  | -          		setKeybindings;
 | 
	
		
			
				|  |  | -          		checkHashChange.
 | 
	
		
			
				|  |  | -        ].
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!Slide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  renderOn: html
 | 
	
		
			
				|  |  | -	html style
 | 
	
		
			
				|  |  | -		type: 'text/css';
 | 
	
		
			
				|  |  | -		with: self style.
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		id: 'navigator';
 | 
	
		
			
				|  |  | -		with: [	self
 | 
	
		
			
				|  |  | -					renderToolsOn: html;
 | 
	
		
			
				|  |  | -					renderPresentationSelectOn: html;
 | 
	
		
			
				|  |  | -                      			renderSlideSelectOn: html].
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	presentationBrush := html div 
 | 
	
		
			
				|  |  | -							id: 'presentation';
 | 
	
		
			
				|  |  | -							yourself.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	self checkHash.
 | 
	
		
			
				|  |  | -	self renderCurrentPresentation.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderCurrentPresentation
 | 
	
		
			
				|  |  | -	presentationBrush contents: [:html |
 | 
	
		
			
				|  |  | -        	self currentPresentation renderOn: html.
 | 
	
		
			
				|  |  | -        ].
 | 
	
		
			
				|  |  | -	self updateSlideSelect.
 | 
	
		
			
				|  |  | +	html div class: self cssClass; id: self id; with: [
 | 
	
		
			
				|  |  | +		self renderSlideOn: html.
 | 
	
		
			
				|  |  | +		self renderMetaOn: html]
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -renderSlideSelectOn: html
 | 
	
		
			
				|  |  | -	slideSelect := html select.
 | 
	
		
			
				|  |  | -	slideSelect onChange: [ self  selectSlideAt:  slideSelect asJQuery val ].
 | 
	
		
			
				|  |  | -	self updateSlideSelect.
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -updateSlideSelect
 | 
	
		
			
				|  |  | -	slideSelect contents: [:html| |index|
 | 
	
		
			
				|  |  | -		                       		index := 0.
 | 
	
		
			
				|  |  | -                		       		self currentPresentation slidesDo: [ :aSlide|  
 | 
	
		
			
				|  |  | -                                		                                    				index := index + 1.
 | 
	
		
			
				|  |  | -                                                		                    				html option
 | 
	
		
			
				|  |  | -                                                                		    					value: index;
 | 
	
		
			
				|  |  | -                                                            								with: aSlide title ] ].
 | 
	
		
			
				|  |  | +renderMetaOn: html
 | 
	
		
			
				|  |  | +	html div 
 | 
	
		
			
				|  |  | +		id: 'meta';
 | 
	
		
			
				|  |  | +		with: [
 | 
	
		
			
				|  |  | +			html p class: 'title'; with: self presentation title.
 | 
	
		
			
				|  |  | +			html p class: 'description'; with: self presentation description.
 | 
	
		
			
				|  |  | +			html a class: 'author'; with: self presentation author; href: 'mailto:', self presentation email.
 | 
	
		
			
				|  |  | +			html a class: 'url'; with: self presentation url; href: self presentation url]
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!PresentationNavigator class methodsFor: 'initialize'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	^ self open
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!Slide class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	^ self new open
 | 
	
		
			
				|  |  | +on: aPresentation
 | 
	
		
			
				|  |  | +	^self new
 | 
	
		
			
				|  |  | +		presentation: aPresentation;
 | 
	
		
			
				|  |  | +		yourself
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Widget subclass: #Presentation
 | 
	
	
		
			
				|  | @@ -348,72 +213,207 @@ isConcrete
 | 
	
		
			
				|  |  |  	^false
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Widget subclass: #Slide
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'presentation'
 | 
	
		
			
				|  |  | +Widget subclass: #PresentationNavigator
 | 
	
		
			
				|  |  | +	instanceVariableNames: 'presentationBrush currentPresentation slideSelect'
 | 
	
		
			
				|  |  |  	category: 'Presentation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +!PresentationNavigator methodsFor: 'accessing'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -presentation
 | 
	
		
			
				|  |  | -	^presentation
 | 
	
		
			
				|  |  | +currentPresentation: aPresentation
 | 
	
		
			
				|  |  | +	currentPresentation := aPresentation.
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -presentation: aPresentation
 | 
	
		
			
				|  |  | -	presentation := aPresentation
 | 
	
		
			
				|  |  | +currentPresentation
 | 
	
		
			
				|  |  | +	^  currentPresentation ifNil: [currentPresentation := Presentation concretePresentations first new].
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -id
 | 
	
		
			
				|  |  | -	^ self class name
 | 
	
		
			
				|  |  | +style
 | 
	
		
			
				|  |  | +	^ '
 | 
	
		
			
				|  |  | +#navigator {
 | 
	
		
			
				|  |  | +    z-index: 1;
 | 
	
		
			
				|  |  | +    position: fixed;
 | 
	
		
			
				|  |  | +    top: 0;
 | 
	
		
			
				|  |  | +    left: 50%;
 | 
	
		
			
				|  |  | +    margin-left: -150px;
 | 
	
		
			
				|  |  | +    padding: 5px;
 | 
	
		
			
				|  |  | +    border-radius: 5px;
 | 
	
		
			
				|  |  | +    -moz-border-radius: 5px;
 | 
	
		
			
				|  |  | +    -webkit-border-radius: 5px;
 | 
	
		
			
				|  |  | +    background: #333;
 | 
	
		
			
				|  |  | +    opacity: 0.3;
 | 
	
		
			
				|  |  | +    color: #eee;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#navigator a {
 | 
	
		
			
				|  |  | +    font-weight: bold;
 | 
	
		
			
				|  |  | +    color: #eee;
 | 
	
		
			
				|  |  | +    text-decoration: none;
 | 
	
		
			
				|  |  | +    cursor: pointer;
 | 
	
		
			
				|  |  | +    padding: 0 2px;
 | 
	
		
			
				|  |  | +    font-size: 14px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#navigator:hover {
 | 
	
		
			
				|  |  | +    opacity: 0.8;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +'
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!PresentationNavigator methodsFor: 'callbacks'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +selectPresentation: aPresentationClass
 | 
	
		
			
				|  |  | +	self currentPresentation: aPresentationClass new.
 | 
	
		
			
				|  |  | +	self renderCurrentPresentation.
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -cssClass
 | 
	
		
			
				|  |  | -	^'slide'
 | 
	
		
			
				|  |  | +selectPresentationNamed: aString
 | 
	
		
			
				|  |  | +	|presentationClass|
 | 
	
		
			
				|  |  | +	presentationClass :=  (Smalltalk current at: aString).
 | 
	
		
			
				|  |  | +	presentationClass ifNotNil: [ self selectPresentation: presentationClass ].
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -backgroundColor
 | 
	
		
			
				|  |  | -	^'#555'
 | 
	
		
			
				|  |  | +previousSlide
 | 
	
		
			
				|  |  | +	self currentPresentation previousSlide.
 | 
	
		
			
				|  |  | +	self updateHash.
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -title
 | 
	
		
			
				|  |  | -	^ self id
 | 
	
		
			
				|  |  | +nextSlide
 | 
	
		
			
				|  |  | +	self currentPresentation nextSlide.
 | 
	
		
			
				|  |  | +	self updateHash.
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +reload
 | 
	
		
			
				|  |  | +	|slideIndex|
 | 
	
		
			
				|  |  | +	slideIndex := self currentPresentation currentSlideIndex.
 | 
	
		
			
				|  |  | +	self currentPresentation: self currentPresentation class new.
 | 
	
		
			
				|  |  | +	self renderCurrentPresentation.
 | 
	
		
			
				|  |  | +	self selectSlideAt: slideIndex.
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +selectSlideAt: anInteger
 | 
	
		
			
				|  |  | +	self currentPresentation moveAt: anInteger.
 | 
	
		
			
				|  |  | +	self updateHash.
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +updateHash
 | 
	
		
			
				|  |  | +	document location hash: self currentPresentation class name, '-', self currentPresentation currentSlideIndex.
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide methodsFor: 'actions'!
 | 
	
		
			
				|  |  | +!PresentationNavigator methodsFor: 'hash'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -show
 | 
	
		
			
				|  |  | -	self backgroundColor ifNotNil: [
 | 
	
		
			
				|  |  | -		(window jQuery: '#slides') css: 'background' color: self backgroundColor].
 | 
	
		
			
				|  |  | -	(window jQuery: '.slide') hide: self presentation slideTransition options: #() duration: 300.
 | 
	
		
			
				|  |  | -	(window jQuery: '#', self id) show: self presentation slideTransition options: #() duration: 300.
 | 
	
		
			
				|  |  | +checkHash
 | 
	
		
			
				|  |  | +	| hash presentation |
 | 
	
		
			
				|  |  | +	hash := (document location hash  replace: '^#' with: '') tokenize: '-'. 
 | 
	
		
			
				|  |  | +	presentation := Presentation concretePresentations 
 | 
	
		
			
				|  |  | +				detect: [:aPresentationClass | aPresentationClass name == hash first]
 | 
	
		
			
				|  |  | +				ifNone: [^ self].
 | 
	
		
			
				|  |  | +	presentation == self currentPresentation class ifFalse: [
 | 
	
		
			
				|  |  | +          	self selectPresentationNamed: presentation.
 | 
	
		
			
				|  |  | +          	self selectSlideAt: hash last
 | 
	
		
			
				|  |  | +        ].
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +checkHashChange
 | 
	
		
			
				|  |  | +	(window jQuery: window) bind: 'hashchange' do: [self checkHash]
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +!PresentationNavigator methodsFor: 'keybindings'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +setKeybindings
 | 
	
		
			
				|  |  | +	(window jQuery: document) keyup: [:e || node |
 | 
	
		
			
				|  |  | +		node := e target nodeName asLowercase.
 | 
	
		
			
				|  |  | +		(node = 'textarea' or: [node = 'input']) ifFalse: [
 | 
	
		
			
				|  |  | +			e keyCode = 39 ifTrue: [self nextSlide].
 | 
	
		
			
				|  |  | +			e keyCode = 37 ifTrue: [self previousSlide]]]
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!PresentationNavigator methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderToolsOn: html
 | 
	
		
			
				|  |  | +	html a 
 | 
	
		
			
				|  |  | +		with: 'IDE';
 | 
	
		
			
				|  |  | +		onClick: [TabManager current open].
 | 
	
		
			
				|  |  | +	html a
 | 
	
		
			
				|  |  | +		with: 'Reload';
 | 
	
		
			
				|  |  | +		onClick: [self reload].
 | 
	
		
			
				|  |  | +	html a
 | 
	
		
			
				|  |  | +		with: '←';
 | 
	
		
			
				|  |  | +		onClick: [self previousSlide].
 | 
	
		
			
				|  |  | +	html a
 | 
	
		
			
				|  |  | +		with: '→';
 | 
	
		
			
				|  |  | +		onClick: [self nextSlide].
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderPresentationSelectOn: html
 | 
	
		
			
				|  |  | +	|presentationSelect|
 | 
	
		
			
				|  |  | +	presentationSelect := html select.
 | 
	
		
			
				|  |  | +	presentationSelect
 | 
	
		
			
				|  |  | +		onChange: [self  selectPresentationNamed:  presentationSelect asJQuery val];
 | 
	
		
			
				|  |  | +		with: [	Presentation concretePresentationsDo: [:aPresentationClass |   
 | 
	
		
			
				|  |  | +                                                              							html option
 | 
	
		
			
				|  |  | +                                                              								value: aPresentationClass name;
 | 
	
		
			
				|  |  | +                                                              								with: aPresentationClass title ] ].
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +open
 | 
	
		
			
				|  |  | +	(window jQuery: document)  ready: [
 | 
	
		
			
				|  |  | +          	self 
 | 
	
		
			
				|  |  | +          		appendToJQuery: 'body' asJQuery;
 | 
	
		
			
				|  |  | +          		setKeybindings;
 | 
	
		
			
				|  |  | +          		checkHashChange.
 | 
	
		
			
				|  |  | +        ].
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  renderOn: html
 | 
	
		
			
				|  |  | -	html div class: self cssClass; id: self id; with: [
 | 
	
		
			
				|  |  | -		self renderSlideOn: html.
 | 
	
		
			
				|  |  | -		self renderMetaOn: html]
 | 
	
		
			
				|  |  | +	html style
 | 
	
		
			
				|  |  | +		type: 'text/css';
 | 
	
		
			
				|  |  | +		with: self style.
 | 
	
		
			
				|  |  | +	html div
 | 
	
		
			
				|  |  | +		id: 'navigator';
 | 
	
		
			
				|  |  | +		with: [	self
 | 
	
		
			
				|  |  | +					renderToolsOn: html;
 | 
	
		
			
				|  |  | +					renderPresentationSelectOn: html;
 | 
	
		
			
				|  |  | +                      			renderSlideSelectOn: html].
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	presentationBrush := html div 
 | 
	
		
			
				|  |  | +							id: 'presentation';
 | 
	
		
			
				|  |  | +							yourself.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	self checkHash.
 | 
	
		
			
				|  |  | +	self renderCurrentPresentation.
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | +renderCurrentPresentation
 | 
	
		
			
				|  |  | +	presentationBrush contents: [:html |
 | 
	
		
			
				|  |  | +        	self currentPresentation renderOn: html.
 | 
	
		
			
				|  |  | +        ].
 | 
	
		
			
				|  |  | +	self updateSlideSelect.
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -renderMetaOn: html
 | 
	
		
			
				|  |  | -	html div 
 | 
	
		
			
				|  |  | -		id: 'meta';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			html p class: 'title'; with: self presentation title.
 | 
	
		
			
				|  |  | -			html p class: 'description'; with: self presentation description.
 | 
	
		
			
				|  |  | -			html a class: 'author'; with: self presentation author; href: 'mailto:', self presentation email.
 | 
	
		
			
				|  |  | -			html a class: 'url'; with: self presentation url; href: self presentation url]
 | 
	
		
			
				|  |  | +renderSlideSelectOn: html
 | 
	
		
			
				|  |  | +	slideSelect := html select.
 | 
	
		
			
				|  |  | +	slideSelect onChange: [ self  selectSlideAt:  slideSelect asJQuery val ].
 | 
	
		
			
				|  |  | +	self updateSlideSelect.
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +updateSlideSelect
 | 
	
		
			
				|  |  | +	slideSelect contents: [:html| |index|
 | 
	
		
			
				|  |  | +		                       		index := 0.
 | 
	
		
			
				|  |  | +                		       		self currentPresentation slidesDo: [ :aSlide|  
 | 
	
		
			
				|  |  | +                                		                                    				index := index + 1.
 | 
	
		
			
				|  |  | +                                                		                    				html option
 | 
	
		
			
				|  |  | +                                                                		    					value: index;
 | 
	
		
			
				|  |  | +                                                            								with: aSlide title ] ].
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | +!PresentationNavigator class methodsFor: 'initialize'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -on: aPresentation
 | 
	
		
			
				|  |  | -	^self new
 | 
	
		
			
				|  |  | -		presentation: aPresentation;
 | 
	
		
			
				|  |  | -		yourself
 | 
	
		
			
				|  |  | +initialize
 | 
	
		
			
				|  |  | +	^ self open
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +open
 | 
	
		
			
				|  |  | +	^ self new open
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Presentation subclass: #ESUG2011Presentation
 | 
	
	
		
			
				|  | @@ -1576,6 +1576,10 @@ body {
 | 
	
		
			
				|  |  |  	margin: 5px;
 | 
	
		
			
				|  |  |  	-webkit-animation: rotate-horizontal 2s infinite alternate ease-in-out;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.slide#ide {
 | 
	
		
			
				|  |  | +    background: black url("esug2011/images/ide_star_wars.png") center center no-repeat;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  '
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1583,8 +1587,10 @@ slideClasses
 | 
	
		
			
				|  |  |  ^ {
 | 
	
		
			
				|  |  |  	FOSDEMIntroSlide.
 | 
	
		
			
				|  |  |  	CountersSlide.
 | 
	
		
			
				|  |  | +	IDESlide.
 | 
	
		
			
				|  |  |  	JtalkAndJavascriptSlide.
 | 
	
		
			
				|  |  |  	FOSDEMJSPlayGroundSlide.
 | 
	
		
			
				|  |  | +	FOSDEMJSToSmalltalk.
 | 
	
		
			
				|  |  |  	FOSDEMBookletSlide.
 | 
	
		
			
				|  |  |  	FOSDEMCanvasSlide.
 | 
	
		
			
				|  |  |  	FOSDEMAmberBackend
 | 
	
	
		
			
				|  | @@ -1789,3 +1795,23 @@ updateCanvas
 | 
	
		
			
				|  |  |  	window setTimeout: [self updateCanvas] delay: 500.
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Slide subclass: #FOSDEMJSToSmalltalk
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMJSToSmalltalk methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cssClass
 | 
	
		
			
				|  |  | +	^ 'slide blue3d'
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMJSToSmalltalk methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html h1: 'Call Smalltalk from Javascript'.
 | 
	
		
			
				|  |  | +	html pre with:
 | 
	
		
			
				|  |  | +'var counter = window.smalltalk.Counter._new();
 | 
	
		
			
				|  |  | +counter._appendToJQuery_($(''#jsToSmalltalk''));'.
 | 
	
		
			
				|  |  | +	html div id: 'jsToSmalltalk'
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 |