I had already defined & accepted defaultSpec , as per page 6.
Attached is my CustomerSatisfaction.st file : I assume Pharo will suck
it back in !
On 21/03/18 17:55, Alistair Grant wrote:
On 21 March 2018 at 03:12, dragoncity <dragoncitybr...@gmail.com> wrote:
Hello, I'm just getting into Pharo, and am trying to
do the example 'tutorial' UI programs in chapter 2 of The Spec UI Framework
book. I have a special interest in end user GUI interfaces for programs. I
enter the first example code as written and the methods are all accepted
without errors. And yes, I did generate the accessors.
However , on attempting to execute the code at the bottom of page 6 from the
latest Spec UI Framework book,
| ui |
ui := CustomerSatisfaction newopenWithSpec.
ui close.
this error message appears, no UI image appears of course.
"SubclassResponsibility:CustomerSatisfaction class had the subclass
responsibility to implement #defaultSpec"
======
Not only don't I understand the message, but it implies I have to write
something called #defaultSpec !, which is not mentioned in the tutorial.
CustomerSatisfaction is a subclass of ComposableModel
(ComposablePresenter in Pharo 7). If you have a look at the
implementation of #defaultSpec in ComposableModel or
ComposablePresenter (depending on which version of Pharo you are
using) it says that it is up to subclasses to implement the method
(#subclassResponsibility). Since you haven't defined it (yet), the
call to #defaultSpec uses the inherited definition from
ComposableModel, which raises the error you are seeing.
CustomerSatisfaction class>>defaultSpec is on page 6 of my version of
the booklet, dated Feb 6, 2107.
Cheers,
Alistair
--
Cheers,
Brett
'From Pharo6.0 of 13 May 2016 [Latest update: #60513] on 21 March 2018 at
6:28:13.790017 pm'!
ComposableModel subclass: #CustomerSatisfaction
instanceVariableNames: 'buttonHappy buttonNeutral buttonBad screen'
classVariableNames: ''
poolDictionaries: ''
category: 'Spec-BuildUIWithSpec'!
!CustomerSatisfaction methodsFor: 'initialization' stamp: 'BrettHallett
3/19/2018 15:40'!
title
^ 'Customer Satisfaction Survey'.
! !
!CustomerSatisfaction methodsFor: 'initialization' stamp: 'BrettHallett
3/21/2018 18:26'!
defaultSpec
^ SpecLayout composed
newRow: [ :row |
row add: #buttonHappy; add: #buttonNeutral; add: #buttonBad ]
origin: 0 @ 0 corner: 1 @ 0.7;
newRow: [ :row | row add: #screen ]
origin: 0 @ 0.7 corner: 1 @ 1;
yourself
! !
!CustomerSatisfaction methodsFor: 'initialization' stamp: 'BrettHallett
3/21/2018 17:18'!
initializePresenter
buttonHappy action: [ screen label: buttonHappy label ].
buttonNeutral action: [ screen label: buttonNeutral label ].
buttonBad action: [ screen label: buttonBad label ].! !
!CustomerSatisfaction methodsFor: 'initialization' stamp: 'BrettHallett
3/19/2018 16:14'!
initializeWidgets
" set up Widgets"
screen := self newLabel.
buttonHappy := self newButton.
buttonNeutral := self newButton.
buttonBad := self newButton.
" widget config "
screen label: 'Please give us your feedback.'.
buttonHappy
label: 'Happy';
icon: ( self iconNamed: #thumbsUp).
buttonNeutral
label: 'Neutral' ;
icon: ( self iconNamed: #user).
buttonBad
label: 'Bad' ;
icon: ( self iconNamed: #thumbsDown) .
" specification of order of focus "
self focusOrder
add: buttonHappy;
add: buttonNeutral;
add: buttonBad
! !
!CustomerSatisfaction methodsFor: 'initialization' stamp: 'BrettHallett
3/19/2018 15:40'!
extent
^ 400@100
! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
buttonBad
^ buttonBad! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
buttonNeutral
^ buttonNeutral! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
buttonHappy: anObject
buttonHappy := anObject! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
screen
^ screen! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
screen: anObject
screen := anObject! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
buttonNeutral: anObject
buttonNeutral := anObject! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
buttonBad: anObject
buttonBad := anObject! !
!CustomerSatisfaction methodsFor: 'accessing' stamp: 'BrettHallett 3/19/2018
16:04'!
buttonHappy
^ buttonHappy! !