--- a/AssistantApplication.st Thu Oct 22 19:38:57 2009 +0200
+++ b/AssistantApplication.st Thu Oct 22 21:07:29 2009 +0200
@@ -1,6 +1,6 @@
"{ Package: 'stx:libwidg2' }"
-ApplicationModel subclass:#AssistantApplication
+ToolApplicationModel subclass:#AssistantApplication
instanceVariableNames:'currentPageSpecHolder backButtonEnabled forwardButtonEnabled
backButtonVisible forwardButtonVisible finishButtonVisible
finishButtonEnabled currentPageInfoHTMLHolder
@@ -13,93 +13,23 @@
!AssistantApplication class methodsFor:'documentation'!
-documentation
-"
- an easy to use framework for assistant-dialog applications.
- These are multipage applications, in which the user is able to navigate
- along achain of pages as specified in the AssistantSpec
-
- see stx:doc/coding:DemoAssistant for a demo example.
- see ProjectBuilderAssistantApplication for a concrete example.
-"
+documentation'
! !
!AssistantApplication class methodsFor:'help'!
-flyByHelpSpec
- <resource: #help>
-
- ^ super flyByHelpSpec addPairsFrom:#(
-
-#backButton
-'Navigate to the previous page %(previousPageInfo)'
-
-#nextButton
-'Navigate to the next page %(nextPageInfo)'
-
-)
+hodsFor:'help'
! !
!AssistantApplication class methodsFor:'image specs'!
-bulletIcon
- "This resource specification was automatically generated
- by the ImageEditor of ST/X."
-
- "Do not manually edit this!! If it is corrupted,
- the ImageEditor may not be able to read the specification."
-
- "
- self bulletIcon inspect
- ImageEditor openOnClass:self andSelector:#bulletIcon
- Icon flushCachedIcons
- "
-
- <resource: #image>
-
- ^Icon
- constantNamed:'AssistantApplication class bulletIcon'
- ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#[2]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@% @@BPA @@P@D@@ @@ @D@@D@A@@A@@ @@ @A@@P@@$@X@@@% @@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 84 84 84 170 170 170 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@<@O<@?0G? _>A?8G? O<@?0@<@@@@@@@@@b') ; yourself); yourself]
+:'image specs'
!
-leftArrowIcon
- "This resource specification was automatically generated
- by the ImageEditor of ST/X."
-
- "Do not manually edit this!! If it is corrupted,
- the ImageEditor may not be able to read the specification."
-
- "
- self leftArrowIcon inspect
- ImageEditor openOnClass:self andSelector:#leftArrowIcon
- Icon flushCachedIcons
- "
-
- <resource: #image>
-
- ^Icon
- constantNamed:'AssistantApplication class leftArrowIcon'
- ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#[2]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@G@@@@G??<@A???@@G@@@@@P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 84 84 84 170 170 170 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@A@@L@A0@O@A?>O?9??''?>O?8_? <@A0@C@@D@@@@b') ; yourself); yourself]
+); yourself]
!
-rightArrowIcon
- "This resource specification was automatically generated
- by the ImageEditor of ST/X."
-
- "Do not manually edit this!! If it is corrupted,
- the ImageEditor may not be able to read the specification."
-
- "
- self rightArrowIcon inspect
- ImageEditor openOnClass:self andSelector:#rightArrowIcon
- Icon flushCachedIcons
- "
-
- <resource: #image>
-
- ^Icon
- constantNamed:'AssistantApplication class rightArrowIcon'
- ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#[2]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@@@@M@@O??4@C??=@@@@M@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 84 84 84 170 170 170 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@ @C@@N@@<G?8_?1??''?>_?1?>@C0@N@@0@B@@@@b') ; yourself); yourself]
+); yourself]
! !
!AssistantApplication class methodsFor:'interface specs'!
@@ -126,6 +56,7 @@
(WindowSpec
label: 'NewApplication'
name: 'NewApplication'
+ min: (Point 534 440)
bounds: (Rectangle 0 0 534 440)
menu: mainMenu
)
@@ -157,17 +88,19 @@
collection: (
(SequenceViewSpec
name: 'PagesLabelList'
- layout: (LayoutFrame 0 0 0 0 0 1 0 0.7)
+ layout: (LayoutFrame 0 0 0 0 0 1 0 0.6)
level: 0
enableChannel: false
hasHorizontalScrollBar: true
hasVerticalScrollBar: true
+ miniScrollerHorizontal: true
+ miniScrollerVertical: true
useIndex: true
sequenceList: pageLabelsInList
)
(HTMLViewSpec
name: 'HTMLBrowser1'
- layout: (LayoutFrame 0 0 0 0.7 0 1 0 1)
+ layout: (LayoutFrame 0 0 0 0.6 0 1 0 1)
level: 0
hasHorizontalScrollBar: true
hasVerticalScrollBar: true
@@ -283,31 +216,43 @@
!AssistantApplication class methodsFor:'menu specs'!
-mainMenu
- "This resource specification was automatically generated
- by the MenuEditor of ST/X."
-
- "Do not manually edit this!! If it is corrupted,
- the MenuEditor may not be able to read the specification."
-
- "
- MenuEditor new openOnClass:AssistantApplication andSelector:#mainMenu
- (Menu new fromLiteralArrayEncoding:(AssistantApplication mainMenu)) startUp
- "
+enableChannel: finishButtonEnabled
+ extent: (Point 65 22)
+ )
+ (ActionButtonSpec
+ label: 'Cancel'
+ name: 'Button8'
+ translateLabel: true
+ resizeForLabel: true
+ model: doCancel
+ extent: (Point 65 22)
+ )
+ )
+
+ )
+ )
+ )
+
+ )
+ )
+ (LabelSpec
+ label: 'Label'
+ name: 'Label1'
+ layout: (LayoutFrame 1 0 -25 1 -1 1 -1 1)
+ level: -1
+ translateLabel: true
+ labelChannel: infoHolder
+ adjust: left
+ )
+ )
+
+ )
+ )
+! !
- <resource: #menu>
+!AssistantApplication class methodsFor:'required protocol'!
- ^
- #(Menu
- (
- (MenuItem
- label: 'File'
- translateLabel: true
- submenu:
- (Menu
- (
- (MenuItem
- label: 'Exit'
+label: 'Exit'
itemValue: closeRequest
translateLabel: true
)
@@ -347,23 +292,53 @@
)
! !
-!AssistantApplication class methodsFor:'required protocol'!
-
-assistantSpec
- "must return a sequenceable collection of assistantPageSpecs - one for each page"
-
- self subclassResponsibility
-! !
-
!AssistantApplication methodsFor:'actions'!
-canGoBackward
- |currentPageSpec previousPageSpec|
+)
+ (MenuItem
+ label: 'Help'
+ translateLabel: true
+ startGroup: right
+ submenu:
+ (Menu
+ (
+ (MenuItem
+ label: 'Documentation'
+ itemValue: openDocumentation
+ translateLabel: true
+ )
+ (MenuItem
+ label: '-'
+ )
+ (MenuItem
+ label: 'About this Application...'
+ itemValue: openAboutThisApplication
+ translateLabel: true
+ )
+ )
+ nil
+ nil
+ )
+ )
+ )
+ nil
+ nil
+ )
+!
- "/ see if we are allowed to leave...
- currentPageSpec := self currentPageSpec.
- currentPageSpec canLeaveQuerySelector notNil ifTrue:[
- (self perform:currentPageSpec canLeaveQuerySelector) ifFalse:[^ false].
+)
+ )
+ nil
+ nil
+ )
+ )
+ )
+ nil
+ nil
+ )
+!
+
+ector) ifFalse:[^ false].
].
"/ see if we are allowed to enter the next...
@@ -376,15 +351,27 @@
^ true
!
-canGoForward
- |currentPageSpec nextPageSpec|
+"/ see if we are allowed to enter the next...
+ previousPageSpec := self previousEnabledPageSpec.
+ previousPageSpec isNil ifTrue:[^ false].
- self currentPageIndex == self numberOfPages ifTrue:[^ false].
+ previousPageSpec canEnterQuerySelector notNil ifTrue:[
+ (self perform:previousPageSpec canEnterQuerySelector) ifFalse:[^ false].
+ ].
+ ^ true
+!
- "/ see if we are allowed to leave...
- currentPageSpec := self currentPageSpec.
- currentPageSpec canLeaveQuerySelector notNil ifTrue:[
- (self perform:currentPageSpec canLeaveQuerySelector) ifFalse:[^ false].
+he next...
+ previousPageSpec := self previousEnabledPageSpec.
+ previousPageSpec isNil ifTrue:[^ false].
+
+ previousPageSpec canEnterQuerySelector notNil ifTrue:[
+ (self perform:previousPageSpec canEnterQuerySelector) ifFalse:[^ false].
+ ].
+ ^ true
+!
+
+lf perform:currentPageSpec canLeaveQuerySelector) ifFalse:[^ false].
].
"/ see if we are allowed to enter the next...
@@ -395,23 +382,11 @@
(self perform:nextPageSpec canEnterQuerySelector) ifFalse:[^ false].
].
^ true
-!
-
-doCancel
- self closeRequest
-!
+! !
-doFinish
- self closeRequest
-!
+!AssistantApplication methodsFor:'aspects'!
-goBackward
- |currentPageSpec|
-
- (self canGoBackward) ifFalse:[^ self].
-
- currentPageSpec := self currentPageSpec.
- currentPageSpec leaveCallbackSelector notNil ifTrue:[
+tPageSpec leaveCallbackSelector notNil ifTrue:[
self perform:currentPageSpec leaveCallbackSelector
].
@@ -425,7 +400,28 @@
self updateButtonEnableState.
!
-goForward
+self perform:currentPageSpec leaveCallbackSelector
+ ].
+
+ self currentPageIndexHolder value:((self indexOfPreviousEnabledPageSpec) max:1).
+
+ currentPageSpec := self currentPageSpec.
+ currentPageSpec enterCallbackSelector notNil ifTrue:[
+ self perform:currentPageSpec enterCallbackSelector
+ ].
+
+ self updateButtonEnableState.
+!
+
+Spec := self currentPageSpec.
+ currentPageSpec enterCallbackSelector notNil ifTrue:[
+ self perform:currentPageSpec enterCallbackSelector
+ ].
+
+ self updateButtonEnableState.
+!
+
+oForward
|currentPageSpec|
(self canGoForward) ifFalse:[^ self].
@@ -443,131 +439,57 @@
].
self updateButtonEnableState.
-! !
-
-!AssistantApplication methodsFor:'aspects'!
-
-assistantSpec
- ^ self class assistantSpec
!
-backButtonEnabled
- <resource: #uiAspect>
+otNil ifTrue:[
+ self perform:currentPageSpec leaveCallbackSelector
+ ].
+
+ self currentPageIndexHolder value:(self indexOfNextEnabledPageSpec).
- backButtonEnabled isNil ifTrue:[
- backButtonEnabled := false asValue.
+ currentPageSpec := self currentPageSpec.
+ currentPageSpec enterCallbackSelector notNil ifTrue:[
+ self perform:currentPageSpec enterCallbackSelector
].
- ^ backButtonEnabled.
+
+ self updateButtonEnableState.
!
-backButtonLabelHolder
- <resource: #uiAspect>
+Nil ifTrue:[
+ self perform:currentPageSpec enterCallbackSelector
+ ].
- backButtonLabelHolder isNil ifTrue:[
- backButtonLabelHolder := self backButtonLabel asValue.
- ].
- ^ backButtonLabelHolder.
+ self updateButtonEnableState.
+!
+
+assistantSpec
!
-backButtonVisible
- <resource: #uiAspect>
+!
- backButtonVisible isNil ifTrue:[
- backButtonVisible := true asValue.
- ].
- ^ backButtonVisible.
+backButtonLabelHolder.
!
-currentPageIndexHolder
- <resource: #uiAspect>
+ButtonVisible.
+!
- currentPageIndexHolder isNil ifTrue:[
- currentPageIndexHolder := 1 asValue.
- currentPageIndexHolder onChangeSend:#updateCanvas to:self
+IndexHolder onChangeSend:#updateCanvas to:self
].
^ currentPageIndexHolder.
!
-currentPageInfoHTMLHolder
- <resource: #uiAspect>
-
- currentPageInfoHTMLHolder isNil ifTrue:[
+il ifTrue:[
currentPageInfoHTMLHolder := ValueHolder new.
].
^ currentPageInfoHTMLHolder.
!
-currentPageSpecHolder
- <resource: #uiAspect>
-
- currentPageSpecHolder isNil ifTrue:[
+True:[
currentPageSpecHolder := nil asValue.
].
^ currentPageSpecHolder.
!
-finishButtonEnabled
- <resource: #uiAspect>
-
- finishButtonEnabled isNil ifTrue:[
- finishButtonEnabled := false asValue.
- ].
- ^ finishButtonEnabled.
-!
-
-finishButtonVisible
- <resource: #uiAspect>
-
- finishButtonVisible isNil ifTrue:[
- finishButtonVisible := false asValue.
- ].
- ^ finishButtonVisible.
-!
-
-forwardButtonEnabled
- <resource: #uiAspect>
-
- forwardButtonEnabled isNil ifTrue:[
- forwardButtonEnabled := false asValue.
- ].
- ^ forwardButtonEnabled.
-!
-
-forwardButtonVisible
- <resource: #uiAspect>
-
- forwardButtonVisible isNil ifTrue:[
- forwardButtonVisible := true asValue.
- ].
- ^ forwardButtonVisible.
-!
-
-nextButtonLabelHolder
- <resource: #uiAspect>
-
- nextButtonLabelHolder isNil ifTrue:[
- nextButtonLabelHolder := self nextButtonLabel asValue.
- ].
- ^ nextButtonLabelHolder.
-!
-
-pageInfoHolder
- <resource: #uiAspect>
-
- pageInfoHolder isNil ifTrue:[
- pageInfoHolder := nil asValue.
- ].
- ^ pageInfoHolder.
-!
-
-pageLabelsInList
- pageLabelsInList isNil ifTrue:[
- pageLabelsInList := List new.
- pageLabelsInList contents:(self pageLabelsInListWithBullet).
- ].
- ^ pageLabelsInList
-!
-
pageLabelsInListWithBullet
|newList|
@@ -592,15 +514,37 @@
!AssistantApplication methodsFor:'help'!
-flyByHelpTextForKey:aKey
- <resource: #help>
+pageInfoHolder isNil ifTrue:[
+ pageInfoHolder := nil asValue.
+ ].
+ ^ pageInfoHolder.
+!
- |text bindings nextSpec prevSpec|
+pageInfoHolder isNil ifTrue:[
+ pageInfoHolder := nil asValue.
+ ].
+ ^ pageInfoHolder.
+! !
+
+!AssistantApplication methodsFor:'initialization & release'!
- text := super flyByHelpTextForKey:aKey.
+ith:(TextView defaultSelectionForegroundColor) on:(TextView defaultSelectionBackgroundColor) );
+ icon:(self class rightArrowIcon);
+ image2:(self class leftArrowIcon)
+ ] ifFalse:[
+ (self isPageEnabledAtIndex:index) ifFalse:[
+ entry colorizeAllWith:(Button defaultDisabledForegroundColor) "Color grey".
+ ] ifTrue:[
+ entry
+ ].
+ ].
+ ].
+ ^ newList
+! !
- nextSpec := self nextEnabledPageSpec.
- prevSpec := self previousEnabledPageSpec.
+!AssistantApplication methodsFor:'look'!
+
+revSpec := self previousEnabledPageSpec.
bindings := Dictionary new.
bindings
@@ -611,15 +555,14 @@
put:(nextSpec notNil ifTrue:[ '"',nextSpec pageTitle,'"' ] ifFalse:['']).
^ self resources string:text withArgs:bindings.
-! !
+!
-!AssistantApplication methodsFor:'initialization & release'!
+xtSpec notNil ifTrue:[ '"',nextSpec pageTitle,'"' ] ifFalse:['']).
-postBuildWith:aBuilder
- |maxCanvasExtent|
+ ^ self resources string:text withArgs:bindings.
+!
- super postBuildWith:aBuilder.
- self updateCanvas.
+self updateCanvas.
maxCanvasExtent := (self assistantSpec
collect:[:eachPageSpec |
@@ -635,48 +578,58 @@
self window extent:(maxCanvasExtent + (200 @ 40)).
! !
-!AssistantApplication methodsFor:'look'!
+!AssistantApplication methodsFor:'private'!
+
+|windowSpecSelector specArray windowSpec|
+
+ windowSpecSelector := eachPageSpec windowSpecSelector.
+ specArray := self perform:windowSpecSelector ifNotUnderstood:[self class perform:windowSpecSelector].
+ windowSpec := specArray decodeAsLiteralArray.
+ windowSpec window bounds extent.
+ ]
+ ) max.
-backButtonLabel
- ^ LabelAndIcon
- label:(resources string:'Back')
- icon:(self backButtonEnabled value
- ifTrue:[ToolbarIconLibrary leftArrow24x24Icon]
- ifFalse:[ToolbarIconLibrary leftArrow24x24disabledIcon])
+ self window extent:(maxCanvasExtent + (200 @ 40)).
+!
+
+[self class perform:windowSpecSelector].
+ windowSpec := specArray decodeAsLiteralArray.
+ windowSpec window bounds extent.
+ ]
+ ) max.
+
+ self window extent:(maxCanvasExtent + (200 @ 40)).
!
-nextButtonLabel
- ^ LabelAndTwoIcons new
- string:(resources string:'Next');
- image2:(self forwardButtonEnabled value
- ifTrue:[ToolbarIconLibrary rightArrow24x24Icon]
- ifFalse:[ToolbarIconLibrary rightArrow24x24disabledIcon])
+windowSpec := specArray decodeAsLiteralArray.
+ windowSpec window bounds extent.
+ ]
+ ) max.
+
+ self window extent:(maxCanvasExtent + (200 @ 40)).
!
-pageLabels
- ^ self assistantSpec collect:[:specEntry | specEntry pageTitle].
-! !
+windowSpec window bounds extent.
+ ]
+ ) max.
-!AssistantApplication methodsFor:'private'!
+ self window extent:(maxCanvasExtent + (200 @ 40)).
+!
-canFinish
- |pageIndex pageSpec|
+Arrow24x24disabledIcon])
+!
- pageIndex := self currentPageIndexHolder value.
- pageSpec := self assistantSpec at:pageIndex.
- ^ pageSpec canLeaveQuerySelector isNil
+ication methodsFor:'private'
+!
+
+isNil
or:[ self perform:pageSpec canLeaveQuerySelector ]
!
-currentPageIndex
- ^ self currentPageIndexHolder value
+elf assistantSpec at:(self currentPageIndex).
!
-currentPageSpec
- ^ self assistantSpec at:(self currentPageIndex).
-!
-
-indexOfNextEnabledPageSpec
+c
|delta currentPageIndex|
currentPageIndex := self currentPageIndex.
@@ -693,65 +646,37 @@
^ nil
!
-indexOfPreviousEnabledPageSpec
- |delta currentPageIndex|
-
- currentPageIndex := self currentPageIndex.
+ndex := self currentPageIndex.
delta := 1.
[
- (currentPageIndex - delta) > 0
- and:[ (self isPageEnabledAtIndex:(currentPageIndex - delta)) not ]
+ (currentPageIndex + delta) <= (self numberOfPages)
+ and:[ (self isPageEnabledAtIndex:(currentPageIndex + delta)) not ]
] whileTrue:[
delta := delta + 1.
].
- (currentPageIndex - delta) > 0 ifTrue:[
- ^ (currentPageIndex - delta).
+ (currentPageIndex + delta) <= (self numberOfPages) ifTrue:[
+ ^ (currentPageIndex + delta).
].
^ nil
!
-isPageEnabledAtIndex:index
- |isEnabledSelector|
-
- isEnabledSelector := (self assistantSpec at:index) isEnabledQuerySelector.
- ^ isEnabledSelector isNil or:[ (self perform:isEnabledSelector) ]
-!
-
-nextEnabledPageSpec
- |index|
-
- index := self indexOfNextEnabledPageSpec.
- index isNil ifTrue:[^ nil].
- ^ self assistantSpec at:index.
-!
-
-nextPageSpec
- ^ self assistantSpec at:(self currentPageIndex + 1).
-!
-
-numberOfPages
- ^ self assistantSpec size
-!
-
-previousEnabledPageSpec
- |index|
-
- index := self indexOfPreviousEnabledPageSpec.
- index isNil ifTrue:[^ nil].
- ^ self assistantSpec at:index.
-!
-
-previousPageSpec
- ^ self assistantSpec at:(self currentPageIndex - 1).
+tPageIndex + delta)) not ]
+ ] whileTrue:[
+ delta := delta + 1.
+ ].
+ (currentPageIndex + delta) <= (self numberOfPages) ifTrue:[
+ ^ (currentPageIndex + delta).
+ ].
+ ^ nil
! !
!AssistantApplication methodsFor:'update'!
-updateButtonEnableState
- self backButtonEnabled value:(self canGoBackward).
- self forwardButtonEnabled value:(self canGoForward).
- self backButtonLabelHolder value:(self backButtonLabel).
- self nextButtonLabelHolder value:(self nextButtonLabel).
+.
+ (currentPageIndex + delta) <= (self numberOfPages) ifTrue:[
+ ^ (currentPageIndex + delta).
+ ].
+ ^ nil
!
updateCanvas
@@ -780,5 +705,5 @@
!AssistantApplication class methodsFor:'documentation'!
version_CVS
- ^ '$Header: /cvs/stx/stx/libwidg2/AssistantApplication.st,v 1.9 2009-10-22 17:38:57 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libwidg2/AssistantApplication.st,v 1.10 2009-10-22 19:07:29 cg Exp $'
! !