'From Squeak3.8gamma of ''24 November 2004'' [latest update: #6662] on 18 May 2005 at 12:21:52 am'! CWidgetTest subclass: #CBookTest instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Books'! !CBookTest commentStamp: 'tak 5/15/2005 16:33' prior: 0! CBookTest buildSuite run! CList subclass: #CBook instanceVariableNames: ' view selectionName ' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Books'! CPlayer subclass: #CBookCostume instanceVariableNames: ' playerItems selectedPlayer ' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Books'! CSymbolType subclass: #CBookViewType instanceVariableNames: ' ' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Books'! CPlayer subclass: #CBookWindow instanceVariableNames: ' list control book view nameField ' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Books'! !CBookTest methodsFor: 'testing' stamp: 'tak 5/16/2005 11:41'! testAdd "self debug: #testAdd" | window | window _ CBookWindow new. window open. window add. self waitTick. self assert: window player items cursor = 1. self assert: window player items size = 1. self assert: window book elements size = 1. self assert: window book elements first class = CPlayer. window close. ! ! !CBookTest methodsFor: 'testing' stamp: 'tak 5/15/2005 22:56'! testBuildPanel "self debug: #testBuildPanel" | panel | panel _ CBookWindow new. panel open. self assert: panel player = panel book player. self assert: panel player items = panel list items. panel close! ! !CBookTest methodsFor: 'testing' stamp: 'tak 5/16/2005 17:37'! testCleanupWhenCostumeChange "self debug: #testCleanupWhenCostumeChange" | book bookCostume | book _ CBook open. book open. CViewerFlap openForTarget: book inWorld: book. book view: #small. bookCostume _ book costume. book view: #window. self assert: bookCostume container isNil. book close.! ! !CBookTest methodsFor: 'testing' stamp: 'tak 5/15/2005 09:06'! testCostume "self debug: #testCostume" | book | book _ CBook new. self assert: book costume class = CBookCostume ! ! !CBookTest methodsFor: 'testing' stamp: 'tak 5/16/2005 18:25'! testDrop "self debug: #testDrop" | book bookPane rect | book _ CBook newWindow. book costume setupCostume. bookPane _ book costume book. book add. bookPane onDrop: (rect _ CRectanglePlayer new). self waitTick. self assert: rect container name = 'page'. "Reject myself" bookPane onDrop: book. self waitTick. self assert: (book container name = 'page') not.! ! !CBookTest methodsFor: 'testing' stamp: 'tak 5/15/2005 17:01'! testFirstPage "self debug: #testFirstPage" | book element1 element2 | book _ CBook new. element1 _ CRectanglePlayer new. element1 name: 'first'. element2 _ CEllipsePlayer new. element2 name: 'second'. book add: element1. book add: element2. self waitTick. book cursor: 2. self waitTick. self assert: book items size = 2. self assert: book elements size = 1. self assert: book elements first = element2. ! ! !CBookTest methodsFor: 'testing' stamp: 'tak 5/16/2005 17:23'! testFollowPlayerAfterCostumeChanged "self debug: #testFollowPlayerAfterCostumeChanged" | book oldCostume | book _ CBook newWindow. book add: CEllipsePlayer new. book add: CRectanglePlayer new. book open. book view: #small. oldCostume _ book costume. book view: #window. self assert: oldCostume player = nil. ! ! !CBookTest methodsFor: 'testing' stamp: 'tak 5/15/2005 22:56'! testView "self debug: #testView" | book | book _ CBook new. self assert: book view = #small. book view: #window. self assert: book view = #window. self assert: book costume class = CBookWindow. book view: #small. self assert: book view = #small. book costume class = CBookCostume. ! ! !CPlayer methodsFor: 'graphic' stamp: 'tak 5/17/2005 11:16'! thumbnail ^ self makeIcon! ! !CBook methodsFor: 'actions' stamp: 'tak 5/16/2005 11:42'! add | newPage | newPage _ self class buildNewPage. self add: newPage. self selection: newPage! ! !CBook methodsFor: 'actions' stamp: 'tak 5/15/2005 00:50'! remove self removeAt: self cursor! ! !CBook methodsFor: 'initialize' stamp: 'tak 5/15/2005 00:40'! defaultCostume ^ CBookCostume! ! !CBook methodsFor: 'accessing' stamp: 'tak 5/15/2005 23:41'! selectionName ^ self selection ifNotNil: [self selection name]! ! !CBook methodsFor: 'accessing' stamp: 'tak 5/15/2005 23:41'! selectionName: aValue self selection ifNotNil: [self selection name: aValue]. ^ aValue! ! !CBook methodsFor: 'accessing' stamp: 'tak 5/15/2005 14:57'! view ^ costume view! ! !CBook methodsFor: 'accessing' stamp: 'tak 5/16/2005 12:37'! view: aSymbol aSymbol = self view ifTrue: [self]. aSymbol = #small ifTrue: [^ self openSmallCostume]. aSymbol = #window ifTrue: [self openWindowCostume]. aSymbol = #full ifTrue: [self openFullCostume]. ^ costume view: aSymbol! ! !CBook methodsFor: 'events' stamp: 'tak 5/16/2005 00:24'! onCursorChanged: newCursor super onCursorChanged: newCursor. self signal: #selectionNameChanged! ! !CBook methodsFor: 'costume' stamp: 'tak 5/16/2005 17:24'! openFullCostume | oldCostume newCostume base pos box | oldCostume _ self costume. newCostume _ CBookWindow new. newCostume setupFullCostume. self costume: newCostume. oldCostume container ifNotNil: [self open. base _ oldCostume world project. self world project addFirst: newCostume book. newCostume book bounds: base standardBounds]. pos _ CWindowManager default altCollapsePositionFor: self. box _ pos x @ (pos y - self asPrimCostume minExtent y) extent: self asPrimCostume minExtent. self bounds: box. newCostume costume costume animateBoundsFrom: oldCostume bounds to: box. oldCostume close. oldCostume player: nil. self waitTick! ! !CBook methodsFor: 'costume' stamp: 'tak 5/16/2005 17:24'! openSmallCostume | oldCostume newCostume | oldCostume _ self costume. newCostume _ CBookCostume new. newCostume stopScript: #onMouseDown. newCostume layout: CTableLayout new. newCostume layout hResizing: #shrinkWrap. newCostume layout vResizing: #shrinkWrap. self costume: newCostume. oldCostume container ifNotNil: [self open. newCostume globalPosition: oldCostume book globalPosition. oldCostume costume costume animateBoundsFrom: oldCostume bounds to: newCostume bounds]. oldCostume close. oldCostume player: nil. self waitTick! ! !CBook methodsFor: 'costume' stamp: 'tak 5/16/2005 17:24'! openWindowCostume | oldCostume newCostume | oldCostume _ self costume. newCostume _ CBookWindow new. self costume: newCostume. oldCostume container ifNotNil: [self open. newCostume globalPosition: oldCostume book globalPosition. newCostume costume costume animateBoundsFrom: oldCostume bounds to: newCostume bounds]. oldCostume close. oldCostume player: nil. self waitTick! ! !CBook methodsFor: 'tiles' stamp: 'tak 5/16/2005 23:56'! viewerSpecAdditions ^ ' '! ! !CBook methodsFor: 'scripting' stamp: 'tak 5/18/2005 00:21'! scriptsWithClassDo: aBlock super scriptsWithClassDo: aBlock. " #(#next prev ) do: [:each | aBlock value: each value: CHolder] "! ! !CBook class methodsFor: 'instance creation' stamp: 'tak 5/16/2005 18:27'! buildNewPage | page | page _ CPlayer new. page hResizing: #spaceFill; vResizing: #spaceFill. page name: 'page'. " page color: Color blue lighter lighter." ^ page! ! !CBook class methodsFor: 'instance creation' stamp: 'tak 5/16/2005 16:42'! newWindow | book | book _ self new. book costume: CBookWindow. ^ book! ! !CBook class methodsFor: 'instance creation' stamp: 'tak 5/16/2005 16:43'! open | book | book _ self newWindow. book add: self startPage. book cursor: 1. ^ book open! ! !CBook class methodsFor: 'constants' stamp: 'tak 5/15/2005 18:54'! startPage | page item | page _ self buildNewPage. item _ CPlayer new. item position: 100@50. item graphic: (Form fromBinaryStream: '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 HosnGUuxhPh/K7pFt9E2vvIAAAAASUVORK5CYII=' base64Decoded asByteArray readStream). item extent: item graphic extent. page add: item. ^ page! ! !CBookCostume methodsFor: 'initialize' stamp: 'tak 5/15/2005 00:38'! defaultPlayer ^CBook! ! !CBookCostume methodsFor: 'events' stamp: 'tak 5/16/2005 17:30'! onCursorChanged self removeAll. (player notNil and: [player selection notNil]) ifTrue: [self add: player selection].! ! !CBookCostume methodsFor: 'events' stamp: 'tak 5/16/2005 18:25'! onDrop: aPlayer | selection aCostume tfm | aPlayer = self ifTrue: [^aPlayer signal: #dropReject]. (self isIn: aPlayer) ifTrue: [^aPlayer signal: #dropReject]. selection _ self player selection. selection ifNil: [^aPlayer signal: #dropReject]. aCostume := aPlayer asPrimCostume. "Get player in child frame" tfm := selection globalToLocal composedWithLocal: aCostume localToGlobal. aCostume transform: tfm. selection add: aPlayer. "And inform it about the drop" aPlayer signal: #dropAccept with: selection. ! ! !CBookCostume methodsFor: 'events' stamp: 'tak 5/16/2005 17:26'! onItemsChangedInPlayer "There should be no need for subclasses to override this method; It merely ensures that changes in the player are propagated accordingly." playerItems := player ifNil: [nil] ifNotNil: [player items]! ! !CBookCostume methodsFor: 'events' stamp: 'tak 5/15/2005 18:46'! onMouseDown | draggee | self player selection ifNil: [^self]. self player view = #small ifTrue: [^self]. draggee _ self player selection costume dragChildAt: self cursorPoint. draggee notNil ifTrue: [^ draggee onDrag]. ! ! !CBookCostume methodsFor: 'events' stamp: 'tak 5/15/2005 16:45'! onPlayerChanged "My player has changed, update the items" super onPlayerChanged. self onItemsChangedInPlayer. self onCursorChanged.! ! !CBookCostume methodsFor: 'accessing' stamp: 'tak 5/16/2005 16:09'! book ^ self! ! !CBookCostume methodsFor: 'accessing' stamp: 'tak 5/15/2005 00:53'! playerItems "Answer the playerItems of the receiver" ^self propertyValueAt: #playerItems! ! !CBookCostume methodsFor: 'accessing' stamp: 'tak 5/15/2005 00:53'! playerItems: aValue "Modify the receiver's playerItems" ^self propertyValueAt: #playerItems put: aValue with: #playerItemsChanged! ! !CBookCostume methodsFor: 'accessing' stamp: 'tak 5/15/2005 09:08'! selectedPlayer "Answer the selectedPlayer of the receiver" ^self propertyValueAt: #selectedPlayer! ! !CBookCostume methodsFor: 'accessing' stamp: 'tak 5/15/2005 09:08'! selectedPlayer: aValue "Modify the receiver's selectedPlayer" ^self propertyValueAt: #selectedPlayer put: aValue with: #selectedPlayerChanged! ! !CBookCostume methodsFor: 'accessing' stamp: 'tak 5/15/2005 14:59'! view ^ #small! ! !CBookCostume methodsFor: 'accessing' stamp: 'tak 5/16/2005 11:53'! view: aSymbol ^ #small! ! !CBookViewType class methodsFor: 'accessing' stamp: 'tak 5/15/2005 16:55'! enumValues ^#(small window full)! ! !CBookWindow methodsFor: 'actions' stamp: 'tak 5/15/2005 14:24'! add player add.! ! !CBookWindow methodsFor: 'actions' stamp: 'tak 5/16/2005 01:03'! close super close. book close! ! !CBookWindow methodsFor: 'actions' stamp: 'tak 5/15/2005 14:14'! next player next.! ! !CBookWindow methodsFor: 'actions' stamp: 'tak 5/15/2005 12:06'! prev player prev.! ! !CBookWindow methodsFor: 'actions' stamp: 'tak 5/15/2005 14:24'! remove player remove! ! !CBookWindow methodsFor: 'events' stamp: 'tak 5/17/2005 10:26'! onCursorChanged player selection signal: #thumbnailChanged! ! !CBookWindow methodsFor: 'events' stamp: 'tak 5/15/2005 15:24'! onPlayerChanged super onPlayerChanged. self updateAll! ! !CBookWindow methodsFor: 'events' stamp: 'tak 5/16/2005 17:32'! updateAll book player: player. player ifNil: [list items: CCollection new. nameField player: nil] ifNotNil: [list items: player items. list wrapCursor: true. nameField player: (player fieldNamed: #selectionName)]! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/16/2005 13:53'! buttonSpec "#(label selector)" ^ #( ('-' remove) ('L' prev) ('R' next) ('+' add) ) ! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/15/2005 23:01'! defaultCostume ^ CWindow! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/15/2005 23:01'! defaultPlayer ^ CBook! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/16/2005 00:06'! initialize super initialize. self define: #list as: CList new. self define: #control as: CPlayer new. self define: #book as: CBookCostume new. self define: #nameField as: CInputField new. self updateAll. ! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/15/2005 23:12'! setupBookCostume | aFrame | book hResizing: #spaceFill; vResizing: #spaceFill. book hScrollable: false; vScrollable: nil. book color: Color transparent. book layout: CTableLayout new. book layoutFrame: (aFrame _ CLayoutFrame new). aFrame leftOffset: 0; leftFraction: 100/400. aFrame topOffset: 25; topFraction: 0.0. aFrame rightOffset: 0; rightFraction: 1.0. aFrame bottomOffset: 0; bottomFraction: 1.0. ! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/16/2005 13:50'! setupControlCostume | aFrame button | control removeAll. self buttonSpec do: [ :spec | button _ CButton new. self startScript: spec second when: {button. #fire}. button fillStyle: #none. button label: spec first. button font: (TextStyle named: #WindowFont) defaultFont. button extent: 20@20. control add: button]. nameField borderStyle: #simple. nameField extent: 60 @ 20. control add: nameField. control fillStyle: #verticalGradient. control fillColors: CWidgetLibrary default menuColors. control borderStyle: #none. control extent: 160@25. control layout: CTableLayout new. control layout listDirection: #leftToRight. control hResizing: #spaceFill; vResizing: #spaceFill. control layout listCentering: #center. control layout cellInset: 4. control layoutInset: 2. control layoutFrame: (aFrame _ CLayoutFrame new). aFrame leftOffset: 0; leftFraction: 0.0. aFrame topOffset: 0; topFraction: 0.0. aFrame rightOffset: 0; rightFraction: 1.0. aFrame bottomOffset: 25; bottomFraction: 0. ! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/15/2005 23:07'! setupCostume self removeAll. super setupCostume. costume extent: 400@300. costume layout _ CProportionalLayout new. " costume layout hResizing: #rigid. costume layout vResizing: #rigid." costume label: 'Book'. self setupListCostume. self add: list. self setupBookCostume. self add: book. costume decorate: costume elements color: CWidgetLibrary default windowColor. self setupControlCostume. self add: control. ! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/17/2005 10:37'! setupFullCostume self removeAll. self setupControlCostume. self add: control. self layout: CTableLayout new. self layout hResizing: #shrinkWrap. self layout vResizing: #shrinkWrap. self control hResizing: #shrinkWrap. self control vResizing: #shrinkWrap. self width: 200. self! ! !CBookWindow methodsFor: 'initialize' stamp: 'tak 5/17/2005 10:01'! setupListCostume | aFrame | list hResizing: #spaceFill; vResizing: #spaceFill. list width: 120. list allowDeselect: false. list layoutFrame: (aFrame _ CLayoutFrame new). list itemMaker: CProjectCostume. aFrame leftOffset: 0; leftFraction: 0.0. aFrame topOffset: 25; topFraction: 0.0. aFrame rightOffset: 0; rightFraction: 100 / 400. aFrame bottomOffset: 0; bottomFraction: 1.0. ! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 12:03'! book "Answer the book of the receiver" ^self propertyValueAt: #book! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 12:03'! book: aValue "Modify the receiver's book" ^self propertyValueAt: #book put: aValue with: #bookChanged! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 10:10'! control "Answer the control of the receiver" ^self propertyValueAt: #control! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 10:10'! control: aValue "Modify the receiver's control" ^self propertyValueAt: #control put: aValue with: #controlChanged! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 10:10'! list "Answer the list of the receiver" ^self propertyValueAt: #list! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 10:10'! list: aValue "Modify the receiver's list" ^self propertyValueAt: #list put: aValue with: #listChanged! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 23:35'! nameField "Answer the nameField of the receiver" ^self propertyValueAt: #nameField! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 23:35'! nameField: aValue "Modify the receiver's nameField" ^self propertyValueAt: #nameField put: aValue with: #nameFieldChanged! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 19:43'! view "Answer the view of the receiver" ^self propertyValueAt: #view ifAbsentPut: #window! ! !CBookWindow methodsFor: 'accessing' stamp: 'tak 5/15/2005 19:40'! view: aValue "Modify the receiver's view" ^self propertyValueAt: #view put: aValue with: #viewChanged! ! !CBookWindow class methodsFor: 'class initialization' stamp: 'tak 5/15/2005 17:56'! initialize Smalltalk at: #CProjectBuilder ifPresent: [:pb | pb registerOpenCommand: {'Book'. {CBook. #open}. 'Muti-page structures'}]! ! CBookWindow initialize! !CBook reorganize! ('actions' add remove) ('initialize' defaultCostume) ('accessing' selectionName selectionName: view view:) ('events' onCursorChanged:) ('costume' openFullCostume openSmallCostume openWindowCostume) ('tiles' viewerSpecAdditions) ('scripting' scriptsWithClassDo:) !