'From etoys2.1 of 26 July 2007 [latest update: #1570] on 30 August 2007 at 3:17:39 pm'! "Change Set: QuickGuide1-yo Date: 30 August 2007 Author: Yoshiki Ohshima First cut of quick guide index viewer system. "! PasteUpMorph subclass: #QuickGuideHolderMorph instanceVariableNames: 'guideName' classVariableNames: '' poolDictionaries: '' category: 'Morphic-Books'! BookMorph subclass: #QuickGuideMorph instanceVariableNames: 'control order' classVariableNames: 'Descriptions IndexPage Thumbnails' poolDictionaries: '' category: 'Morphic-Books'! !BooklikeMorph methodsFor: 'misc' stamp: 'yo 8/29/2007 11:48'! move (owner isWorldMorph and:[self isSticky not]) ifTrue: [self activeHand grabMorph: self]! ! !BooklikeMorph methodsFor: 'misc' stamp: 'yo 8/29/2007 11:48'! moveViaTitle (self isSticky not) ifTrue: [self activeHand grabMorph: self] ! ! !BooklikeMorph methodsFor: 'page controls' stamp: 'yo 8/30/2007 10:12'! makeDescriptionViewer | descriptionItem font box | font _ Preferences standardMenuFont. descriptionItem := UpdatingStringMorph new. descriptionItem target: self; getSelector: #descriptionReport. descriptionItem useStringFormat. descriptionItem font: font. box _ Morph new. box color: Color transparent. box layoutPolicy: TableLayout new. box vResizing: #rigid. box hResizing: #rigid. box cellInset: 3. box cellPositioning: #center. box listCentering: #center. box wrapCentering: #center. box width: (font widthOfString: (String new: 12 withAll: $M)). box height: font height. box addMorph: descriptionItem. ^ box! ! !BooklikeMorph methodsFor: 'page controls' stamp: 'yo 8/29/2007 12:26'! makePageControlsFrom: controlSpecs allowDragging: aBoolean "From the controlSpecs, create a set of page control and return them -- this method does *not* add the controls to the receiver." | c col row b lastGuy | c _ (color saturation > 0.1) ifTrue: [color slightlyLighter] ifFalse: [color slightlyDarker]. col _ AlignmentMorph newColumn. col color: c; borderWidth: 0; layoutInset: 0. col hResizing: #spaceFill; vResizing: #shrinkWrap; extent: 5@5. row _ AlignmentMorph newRow beTransparent. row borderWidth: 0; layoutInset: 0. row hResizing: #spaceFill; vResizing: #shrinkWrap; extent: 5@5. aBoolean ifTrue: [row on: #mouseDown send: #moveViaTitle to: self]. controlSpecs do: [:spec | spec == #showDescription ifTrue: [row addMorphBack: self makeDescriptionViewer] ifFalse: [ spec == #pageNumber ifTrue: [row addMorphBack: self makePageNumberItem] ifFalse: [spec == #spacer ifTrue: [row addTransparentSpacerOfSize: (3 @ 0)] ifFalse: [spec == #variableSpacer ifTrue: [row addMorphBack: AlignmentMorph newVariableTransparentSpacer] ifFalse: [spec first isSymbol ifTrue: [b := ThreePhaseButtonMorph labelSymbol: spec first] ifFalse: [b := SimpleButtonMorph new borderWidth: 2; borderColor: Color black; color: c darker. b label: spec first font: Preferences standardMenuFont]. b target: self; actionSelector: spec second; borderWidth: 0; setBalloonText: spec third. row addMorphBack: b. (((lastGuy _ spec last asLowercase) includesSubString: 'menu') or: [lastGuy includesSubString: 'designations']) ifTrue: [b actWhen: #buttonDown]]]]]]. "pop up menu on mouseDown" col addMorphBack: row. ^ col! ! !BooklikeMorph methodsFor: 'page controls' stamp: 'yo 8/29/2007 12:20'! makePageNumberItem | pageNumberItem | pageNumberItem := UpdatingStringMorph new. pageNumberItem target: self; getSelector: #pageNumberReport. pageNumberItem useStringFormat. pageNumberItem font: Preferences standardMenuFont. ^ pageNumberItem! ! !BookMorph methodsFor: 'e-toy support' stamp: 'yo 8/30/2007 14:46'! deleteAlongWithPlayers | set | set _ Set new. pages do: [:page | page allMorphsDo: [:e | e player notNil ifTrue: [set add: e player]. e delete]]. self allMorphsDo: [:e | e player notNil ifTrue: [set add: e player]. e delete]. set do: [:p | p class scripts do: [:s | p class removeScriptNamed: s selector]]. (set select: [:p | p class isSystemDefined not]) do: [:p | p class removeFromSystemUnlogged]. ! ! !Morph class methodsFor: 'fileIn/Out' stamp: 'yo 8/27/2007 19:56'! fromFileName: fullName "Reconstitute a Morph from the file, presumed to be represent a Morph saved via the SmartRefStream mechanism, and open it in an appropriate Morphic world" | aFileStream morphOrList | aFileStream _ (MultiByteBinaryOrTextStream with: ((FileStream readOnlyFileNamed: fullName) binary contentsOfEntireFile)) binary reset. morphOrList _ aFileStream fileInObjectAndCode. (morphOrList isKindOf: SqueakPage) ifTrue: [morphOrList _ morphOrList contentsMorph]. Smalltalk isMorphic ifTrue: [ActiveWorld addMorphsAndModel: morphOrList] ifFalse: [morphOrList isMorph ifFalse: [self inform: 'Can only load a single morph into an mvc project via this mechanism.']. morphOrList openInWorld]. ^ morphOrList. ! ! !QuickGuideHolderMorph methodsFor: 'initialization' stamp: 'yo 8/30/2007 15:14'! initialize super initialize. self setProperty: #quickGuideHolder toValue: true. self beSticky. ! ! !QuickGuideHolderMorph methodsFor: 'accessing' stamp: 'yo 8/29/2007 12:33'! guideName ^ guideName ! ! !QuickGuideHolderMorph methodsFor: 'accessing' stamp: 'yo 8/29/2007 12:31'! guideName: aString guideName _ aString. self setNamePropertyTo: aString. ! ! !QuickGuideHolderMorph methodsFor: 'file in/file out' stamp: 'yo 8/30/2007 15:14'! load | dir m fileName | self submorphs size > 0 ifTrue: [^ self]. dir _ (FileDirectory on: (Smalltalk imagePath)) directoryNamed: 'QuickGuides'. fileName _ guideName, '.morph'. (dir fileNames includes: fileName) ifFalse: [ ^ self ]. m _ Morph fromFileName: (dir fullNameFor: fileName). m position: 0@0. self position: 0@0. self extent: m extent. m setNamePropertyTo: guideName. m beSticky. self addMorph: m. ! ! !QuickGuideHolderMorph methodsFor: 'file in/file out' stamp: 'yo 8/29/2007 11:50'! prepareToBeSaved self unload. super prepareToBeSaved. ! ! !QuickGuideHolderMorph methodsFor: 'file in/file out' stamp: 'yo 8/30/2007 13:19'! unload self submorphs size = 0 ifTrue: [^ self]. (submorphs first isKindOf: BookMorph) ifTrue: [submorphs first deleteAlongWithPlayers]. 2 to: submorphs size do: [:s | s delete]. ! ! !QuickGuideMorph methodsFor: 'initialization' stamp: 'yo 8/30/2007 15:14'! initialize | newPage indexPage | newPagePrototype _ QuickGuideHolderMorph new. newPagePrototype guideName: 'empty'. super initialize. order _ OrderedCollection with: 'empty'. IndexPage ifNotNil: [ indexPage _ IndexPage veryDeepCopy. newPage _ newPagePrototype veryDeepCopy. newPage guideName: 'index'. newPage addMorph: indexPage. indexPage position: newPage position. indexPage beSticky. self insertPage: newPage pageSize: indexPage extent atIndex: 1. self goToPage: 2. self deletePageBasic. ]. ! ! !QuickGuideMorph methodsFor: 'initialization' stamp: 'yo 8/29/2007 12:59'! order: names | newPages page unusedPages | newPages _ OrderedCollection new: names size. ((Array with: 'index'), names asArray) do: [:n | page _ pages detect: [:p | (p hasProperty: #quickGuideHolder) and: [p knownName = n]] ifNone: [nil]. page ifNil: [ page _ QuickGuideHolderMorph new. page guideName: n. ]. newPages add: page. ]. unusedPages _ pages reject: [:e | (newPages includes: e)]. self newPages: (newPages, unusedPages) currentIndex: 1. order _ names. ! ! !QuickGuideMorph methodsFor: 'submorphs add/remove' stamp: 'yo 8/30/2007 11:43'! delete pages do: [:e | e unload]. super delete. ! ! !QuickGuideMorph methodsFor: 'transition' stamp: 'yo 8/29/2007 12:43'! goToPageMorph: newPage transitionSpec: transitionSpec newPage load. super goToPageMorph: newPage transitionSpec: transitionSpec. ! ! !QuickGuideMorph methodsFor: 'page controls' stamp: 'yo 8/29/2007 13:18'! shortControlSpecs ^ { #variableSpacer. {#PrevPage. #previousPage. 'Previous page' translated}. #spacer. #showDescription. #spacer. {#NextPage. #nextPage. 'Next page' translated}. #spacer. {#'Halo-Dup'. #handCopyCard. 'Instantiate card' translated}. #variableSpacer. #pageNumber. }! ! !QuickGuideMorph methodsFor: 'menu actions' stamp: 'yo 8/29/2007 13:03'! descriptionReport ^ currentPage guideName ! ! !QuickGuideMorph methodsFor: 'menu actions' stamp: 'yo 8/29/2007 13:20'! handCopyCard ^ self world primaryHand attachMorph: currentPage submorphs first veryDeepCopy. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 8/28/2007 14:18'! descriptionsFrom: aCollection | dict b texts desc | dict _ Dictionary new. aCollection do: [:page | b _ page submorphs first. texts _ b currentPage submorphs select: [:e | e isKindOf: TextMorph]. texts isEmpty ifTrue: [desc _ 'A Guide' translated] ifFalse: [desc _ (texts asSortedCollection: [:x :y | x top < y top]) first contents asString]. dict at: b knownName put: desc ]. ^ dict. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 8/30/2007 15:11'! initialize " QuickGuideMorph initialize " QuickGuideMorph initializeIndexPage. QuickGuideMorph initializeDescriptionsAndThumbnails. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 8/30/2007 14:52'! initializeDescriptionsAndThumbnails " QuickGuideMorph initializeDescriptionsAndThumbnails " | collection | collection _ self loadQuickGuideBooks. Thumbnails _ self thumbnailsFrom: collection. Descriptions _ self descriptionsFrom: collection. collection do: [:e | e unload]. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 8/29/2007 12:55'! initializeIndexPage " self initializeIndexPage " IndexPage _ ((MultiByteBinaryOrTextStream with: (Base64MimeConverter mimeDecodeToBytes: (ReadStream on: '77u/J0Zyb20gZXRveXMyLjEgb2YgMjYgSnVseSAyMDA3IFtsYXRlc3QgdXBkYXRlOiAjMTU2 N10gb24gMjggQXVndXN0IDIwMDcgYXQgMjo0OTo1MCBwbSchDQ0hT2JqZWN0U2Nhbm5lciBu ZXcgaW5pdGlhbGl6ZSENDVBsYXllciBzdWJjbGFzczogI1BsYXllcjY2MQ0JaW5zdGFuY2VW YXJpYWJsZU5hbWVzOiAnJw0JY2xhc3NWYXJpYWJsZU5hbWVzOiAnJw0JcG9vbERpY3Rpb25h cmllczogJycNCWNhdGVnb3J5OiAnVXNlck9iamVjdHMnIQ0NDSFzZWxmIHNtYXJ0UmVmU3Ry ZWFtIQQAAAAECAAAAAQRD2NsYXNzIHN0cnVjdHVyZQkAAAADBgpEaWN0aW9uYXJ5BAAAAEII AAAAYAkAAAADBgtBc3NvY2lhdGlvbgYNQm9va2xpa2VNb3JwaAgAAAALBAAAAAARBmJvdW5k cxEFb3duZXIRCXN1Ym1vcnBocxEKZnVsbEJvdW5kcxEFY29sb3IRCWV4dGVuc2lvbhELYm9y ZGVyV2lkdGgRC2JvcmRlckNvbG9yEQhwYWdlU2l6ZREQbmV3UGFnZVByb3RvdHlwZRADADsG A1NldAgAAAADBAAAAAARBXRhbGx5EQVhcnJheQEQAwA7BgxMYXlvdXRQb2xpY3kIAAAAAQQA AAAAEAMAOwYVVGFibGVMYXlvdXRQcm9wZXJ0aWVzCAAAABEEAAAAABEJaFJlc2l6aW5nEQl2 UmVzaXppbmcRDWRpc2FibGVMYXlvdXQRCWNlbGxJbnNldBEPY2VsbFBvc2l0aW9uaW5nEQtj ZWxsU3BhY2luZxELbGF5b3V0SW5zZXQRDWxpc3RDZW50ZXJpbmcRDWxpc3REaXJlY3Rpb24R C2xpc3RTcGFjaW5nERFyZXZlcnNlVGFibGVDZWxscxEPcnViYmVyQmFuZENlbGxzEQ13cmFw Q2VudGVyaW5nEQ13cmFwRGlyZWN0aW9uEQttaW5DZWxsU2l6ZRELbWF4Q2VsbFNpemUQAwA7 BgZPYmplY3QIAAAAAQQAAAAAARADADsGBUZsb2F0CAAAAAEEAAAAABADADsGBUNvbG9yCAAA AAQEAAAAABEDcmdiEQtjYWNoZWREZXB0aBEQY2FjaGVkQml0UGF0dGVybgEBEAMAOwYQVHJh bnNsdWNlbnRDb2xvcggAAAAFBAAAAAAKAAACVQoAAAJaCgAAAmcRBWFscGhhEAMAOwYLQm9y ZGVyU3R5bGUIAAAAAQQAAAAAAQEQAwA7BgVNb3JwaAgAAAAHBAAAAAAKAAAAYQoAAABpCgAA AHAKAAAAewoAAACHCgAAAI4QAwA7CgAAACAIAAAAAwQAAAAACgAAAOIKAAAA6QEQAwA7BgtT dHJpbmdNb3JwaAgAAAALBAAAAAAKAAAAYQoAAABpCgAAAHAKAAAAewoAAACHCgAAAI4RBGZv bnQRCGVtcGhhc2lzEQhjb250ZW50cxEIaGFzRm9jdXMQAwA7BgVQb2ludAgAAAADBAAAAAAR AXgRAXkQAwA7BglDb2xvckZvcm0IAAAACQQAAAAAEQRiaXRzEQV3aWR0aBEGaGVpZ2h0EQVk ZXB0aBEGb2Zmc2V0EQZjb2xvcnMRC2NhY2hlZERlcHRoEQ5jYWNoZWRDb2xvcm1hcBADADsG DFBhc3RlVXBNb3JwaAgAAAAYBAAAAAAKAAAAYQoAAABpCgAAAHAKAAAAewoAAACHCgAAAI4K AAAAmQoAAACmEQlwcmVzZW50ZXIRBW1vZGVsEQZjdXJzb3IRB3BhZGRpbmcRD2JhY2tncm91 bmRNb3JwaBEQdHVydGxlVHJhaWxzRm9ybREJdHVydGxlUGVuERNsYXN0VHVydGxlUG9zaXRp b25zEQppc1BhcnRzQmluEQ5hdXRvTGluZUxheW91dBEOaW5kaWNhdGVDdXJzb3IRC3Jlc2l6 ZVRvRml0ERN3YW50c01vdXNlT3ZlckhhbG9zEQp3b3JsZFN0YXRlEQpncmlkZGluZ09uEAMA OwYGQml0bWFwCAAAAAEEAAAAABADADsGC1RhYmxlTGF5b3V0CAAAAAMEAAAAABEKcHJvcGVy dGllcxEObWluRXh0ZW50Q2FjaGUQAwA7BhVUaHJlZVBoYXNlQnV0dG9uTW9ycGgIAAAADwQA AAAACgAAAGEKAAAAaQoAAABwCgAAAHsKAAAAhwoAAACOEQVpbWFnZREIb2ZmSW1hZ2URDHBy ZXNzZWRJbWFnZREFc3RhdGURBnRhcmdldBEOYWN0aW9uU2VsZWN0b3IRCWFyZ3VtZW50cxEH YWN0V2hlbhADADsGEklkZW50aXR5RGljdGlvbmFyeQgAAAADBAAAAAAKAAAA4goAAADpEAMA OwYIUnVuQXJyYXkIAAAABgQAAAAAEQRydW5zEQZ2YWx1ZXMRCWxhc3RJbmRleBEHbGFzdFJ1 bhEKbGFzdE9mZnNldBADADsGCVBsYXllcjY2MQgAAAAEBAAAAAARCmRlcGVuZGVudHMRB2Nv c3R1bWURCGNvc3R1bWVzEAMAOwYKQnl0ZVN0cmluZwgAAAABBAAAAAAQAwA7BhBMYXlvdXRQ cm9wZXJ0aWVzCAAAAAQEAAAAAAoAAAEyCgAAAT0KAAABSBADADsGDFRleHRFbXBoYXNpcwgA AAADBAAAAAARDGVtcGhhc2lzQ29kZREHc2V0TW9kZRADADsGB1RUQ0ZvbnQIAAAACQQAAAAB EQ50dGNEZXNjcmlwdGlvbhEJcG9pbnRTaXplEQ9mb3JlZ3JvdW5kQ29sb3IRBWNhY2hlEQtk ZXJpdmF0aXZlcxEMZmFsbGJhY2tGb250EQZhc2NlbnQRB2Rlc2NlbnQQAwA7BgZTeW1ib2wI AAAAAQQAAAAAEAMAOwYGTnVtYmVyCAAAAAEEAAAAAAEBAQEQAwA7BglCb29rTW9ycGgIAAAA DQQAAAAACgAAAGEKAAAAaQoAAABwCgAAAHsKAAAAhwoAAACOCgAAAJkKAAAApgoAAACzCgAA AL0RBXBhZ2VzEQtjdXJyZW50UGFnZRADADsGDVRleHRBdHRyaWJ1dGUIAAAAAQQAAAAAEAMA OwYGU3RyaW5nCAAAAAEEAAAAABADADsGFExhcmdlUG9zaXRpdmVJbnRlZ2VyCAAAAAEEAAAA ABADADsGDURpc3BsYXlNZWRpdW0IAAAAAQQAAAAAARADADsGDEFic3RyYWN0Rm9udAgAAAAB BAAAAAABEAMAOwYNRGlzcGxheU9iamVjdAgAAAABBAAAAAAQAwA7BgpCeXRlU3ltYm9sCAAA AAEEAAAAABADADsGEk1vcnBoRXh0ZW5zaW9uUGx1cwgAAAAOBAAAAAARBmxvY2tlZBEHdmlz aWJsZREGc3RpY2t5EQtiYWxsb29uVGV4dBETYmFsbG9vblRleHRTZWxlY3RvchEMZXh0ZXJu YWxOYW1lEQxpc1BhcnRzRG9ub3IRCmFjdG9yU3RhdGURBnBsYXllchEMZXZlbnRIYW5kbGVy EQ9vdGhlclByb3BlcnRpZXMREGxheW91dFByb3BlcnRpZXMRDGxheW91dFBvbGljeRADADsG Dk1vcnBoRXh0ZW5zaW9uCAAAAAwEAAAAAAoAAAkBCgAACQkKAAAJEgoAAAkaCgAACScKAAAJ PAoAAAlKCgAACVgKAAAJZAoAAAlsCgAACXoBARADADsGCVRleHRNb3JwaAgAAAAUBAAAAAAK AAAAYQoAAABpCgAAAHAKAAAAewoAAACHCgAAAI4KAAAAmQoAAACmEQl0ZXh0U3R5bGURBHRl eHQRCHdyYXBGbGFnEQlwYXJhZ3JhcGgRBmVkaXRvchEJY29udGFpbmVyEQtwcmVkZWNlc3Nv chEJc3VjY2Vzc29yEQ9iYWNrZ3JvdW5kQ29sb3IRB21hcmdpbnMRCWZpbGxTdHlsZRADADsG DlJlY3RhbmdsZU1vcnBoCAAAAAkEAAAAAAoAAABhCgAAAGkKAAAAcAoAAAB7CgAAAIcKAAAA jgoAAACZCgAAAKYQAwA7Bg1Cb3JkZXJlZE1vcnBoCAAAAAkEAAAAAAoAAABhCgAAAGkKAAAA cAoAAAB7CgAAAIcKAAAAjgoAAACZCgAAAKYQAwA7Bg5UZXh0Rm9udENoYW5nZQgAAAACBAAA AAARCmZvbnROdW1iZXIQAwA7BhZTZXF1ZW5jZWFibGVDb2xsZWN0aW9uCAAAAAEEAAAAAAEB AQEBEAMAOwYJRGlza1Byb3h5CAAAAAUEAAAAABEQZ2xvYmFsT2JqZWN0TmFtZRELcHJlU2Vs ZWN0b3IRE2NvbnN0cnVjdG9yU2VsZWN0b3IRD2NvbnN0cnVjdG9yQXJncxADADsGCVRleHRT dHlsZQgAAAANBAAAAAARCWZvbnRBcnJheREOZm9udEZhbWlseVNpemURCGxpbmVHcmlkEQhi YXNlbGluZREJYWxpZ25tZW50EQtmaXJzdEluZGVudBEKcmVzdEluZGVudBELcmlnaHRJbmRl bnQRCXRhYnNBcnJheREPbWFyZ2luVGFic0FycmF5EQdsZWFkaW5nERBkZWZhdWx0Rm9udElu ZGV4ARADADsGDEV2ZW50SGFuZGxlcggAAAAcBAAAAAAREm1vdXNlRG93blJlY2lwaWVudBER bW91c2VEb3duU2VsZWN0b3IREm1vdXNlTW92ZVJlY2lwaWVudBERbW91c2VNb3ZlU2VsZWN0 b3IRF21vdXNlU3RpbGxEb3duUmVjaXBpZW50ERZtb3VzZVN0aWxsRG93blNlbGVjdG9yERBt b3VzZVVwUmVjaXBpZW50EQ9tb3VzZVVwU2VsZWN0b3IRE21vdXNlRW50ZXJSZWNpcGllbnQR Em1vdXNlRW50ZXJTZWxlY3RvchETbW91c2VMZWF2ZVJlY2lwaWVudBESbW91c2VMZWF2ZVNl bGVjdG9yERttb3VzZUVudGVyRHJhZ2dpbmdSZWNpcGllbnQRGm1vdXNlRW50ZXJEcmFnZ2lu Z1NlbGVjdG9yERttb3VzZUxlYXZlRHJhZ2dpbmdSZWNpcGllbnQRGm1vdXNlTGVhdmVEcmFn Z2luZ1NlbGVjdG9yERJrZXlTdHJva2VSZWNpcGllbnQREWtleVN0cm9rZVNlbGVjdG9yEQ52 YWx1ZVBhcmFtZXRlchESc3RhcnREcmFnUmVjaXBpZW50ERFzdGFydERyYWdTZWxlY3RvchET ZG91YmxlQ2xpY2tTZWxlY3RvchEUZG91YmxlQ2xpY2tSZWNpcGllbnQRGmRvdWJsZUNsaWNr VGltZW91dFNlbGVjdG9yERtkb3VibGVDbGlja1RpbWVvdXRSZWNpcGllbnQRDWNsaWNrU2Vs ZWN0b3IRDmNsaWNrUmVjaXBpZW50EAMAOwYTVXBkYXRpbmdTdHJpbmdNb3JwaAgAAAAXBAAA AAAKAAAAYQoAAABpCgAAAHAKAAAAewoAAACHCgAAAI4KAAADWAoAAANeCgAAA2gKAAADchEG Zm9ybWF0EQZ0YXJnZXQRCWxhc3RWYWx1ZRELZ2V0U2VsZWN0b3IRC3B1dFNlbGVjdG9yEQ5m bG9hdFByZWNpc2lvbhEIZ3Jvd2FibGURCHN0ZXBUaW1lERVhdXRvQWNjZXB0T25Gb2N1c0xv c3MRDG1pbmltdW1XaWR0aBEMbWF4aW11bVdpZHRoEQ1kZWNpbWFsUGxhY2VzEAMAOwYGUGxh eWVyCAAAAAQEAAAAAAoAAAZ2CgAABoIKAAAGiwEQAwA7BgxTaW1wbGVCb3JkZXIIAAAABAQA AAAAEQliYXNlQ29sb3IRBWNvbG9yEQV3aWR0aBADADsGBEZvcm0IAAAABgQAAAAACgAAA7AK AAADtgoAAAO9CgAAA8UKAAADzBADADsGCkFjdG9yU3RhdGUIAAAACQQAAAAAEQxvd25pbmdQ bGF5ZXIRB3BlbkRvd24RB3BlblNpemURCHBlbkNvbG9yERJmcmFjdGlvbmFsUG9zaXRpb24R IWluc3RhbnRpYXRlZFVzZXJTY3JpcHRzRGljdGlvbmFyeRENcGVuQXJyb3doZWFkcxEKdHJh aWxTdHlsZRADADsGCUxvb2t1cEtleQgAAAACBAAAAAARA2tleQEBAQEQAwA7BhFBcnJheWVk Q29sbGVjdGlvbggAAAABBAAAAAABAQEBEAMAOwYJUmVjdGFuZ2xlCAAAAAMEAAAAABEGb3Jp Z2luEQZjb3JuZXIQAwA7BgRUZXh0CAAAAAMEAAAAABEGc3RyaW5nEQRydW5zEAMAOwYOQWxp Z25tZW50TW9ycGgIAAAACQQAAAAACgAAAGEKAAAAaQoAAABwCgAAAHsKAAAAhwoAAACOCgAA AJkKAAAAphADADsGEFVuc2NyaXB0ZWRQbGF5ZXIIAAAABAQAAAAACgAABnYKAAAGggoAAAaL EAMAOwYRT3JkZXJlZENvbGxlY3Rpb24IAAAABAQAAAAAEQVhcnJheREKZmlyc3RJbmRleBEJ bGFzdEluZGV4EAMAOwYLUHJvdG9PYmplY3QIAAAAAQQAAAAAEAMAOwYKSW1hZ2VNb3JwaAgA AAAIBAAAAAAKAAAAYQoAAABpCgAAAHAKAAAAewoAAACHCgAAAI4KAAAFmRADADsGCU1hZ25p dHVkZQgAAAABBAAAAAAQAwA7BgpDb2xsZWN0aW9uCAAAAAEEAAAAABADADsGB0ludGVnZXII AAAAAQQAAAAAEAMAOwYFQXJyYXkIAAAAAQQAAAAAEAMAOwYFTW9kZWwIAAAAAgQAAAAACgAA BnYQAwA7CgAAADsIAAAAAwQAAAAACgAAETIRBXZhbHVlEAMAOwYKQ29sb3JBcnJheQgAAAAB BAAAAAARDHN1cGVyY2xhc3NlcxADACAEAAAAQggAAABgEAMAOwoAAAA7CgAAER0QAwA7CgAA E1MKAAARPwEQAwA7CgAAAPUKAAACGBADADsKAAABEQoAAAazEAMAOwoAAAIYCgAAEmMBEAMA OwoAAAIvCgAAB6EQAwA7CgAAAkQKAAACGAEBEAMAOwoAAAJ/CgAAAkQQAwA7CgAAArUKAAAC GAEBEAMAOwoAAALSCgAAAhgQAwA7CgAAACAKAAAA0wEQAwA7CgAAAyMKAAAC0hADADsKAAAD gAoAAAIYEAMAOwoAAAObCgAAEFoQAwA7CgAAA/0KAAALAxADADsKAAAFDQoAABE/EAMAOwoA AAUjCgAAAPUQAwA7CgAABVoKAAASfhADADsKAAAF7woAAAAgEAMAOwoAAAYbCgAAET8QAwA7 CgAABmEKAAAP/xADADsKAAAGmQoAAAg3EAMAOwoAAAazCgAAAhgQAwA7CgAABuIKAAAIGhAD ADsKAAAHFQoAAAiPEAMAOwoAAAeLCgAACDcQAwA7CgAAB6EKAAASuwEBAQEQAwA7CgAAB7sK AAAASBADADsKAAAIGgoAAAIYEAMAOwoAAAg3CgAAET8QAwA7CgAACE0KAAAS7hADADsKAAAI cQoAAAisARADADsKAAAIjwoAAAIYARADADsKAAAIrAoAAAIYEAMAOwoAAAjJCgAAB4sQAwA7 CgAACOMKAAAJrxADADsKAAAJrwoAAAIYAQEQAwA7CgAACgYKAAAKvRADADsKAAAKvQoAAAsD EAMAOwoAAAsDCgAAAtIQAwA7CgAAC0gKAAAIGhADADsKAAALcgoAABLUAQEBAQEQAwA7CgAA C50KAAACGBADADsKAAAL+woAAAIYARADADsKAAAMrAoAAAIYEAMAOwoAAA8PCgAAAyMQAwA7 CgAAD/8KAAATGgEQAwA7CgAAECUKAAACtRADADsKAAAQWgoAAAhxEAMAOwoAABCHCgAAAhgQ AwA7CgAAER0KAAASuwEBAQEQAwA7CgAAET8KAAALcgEBAQEQAwA7CgAAEWQKAAACGBADADsK AAARjQoAABE/EAMAOwoAABGvCgAACr0QAwA7CgAAEfUKAAAP/xADADsKAAASJAoAAAtyEAMA OwoAABJjEQNuaWwQAwA7CgAAEn4KAAAC0hADADsKAAASuwoAAAIYEAMAOwoAABLUCgAAAhgQ AwA7CgAAEu4KAAAHoRADADsKAAATBQoAABE/EAMAOwoAAADTCgAAEtQQAwA7CgAAExoKAAAC GBADADsKAAAASAoAABGvEA0HuxADEWQQAwOADkBEAAAAAAAADkBXQAAAAAAAEAMDgA5AfVAA AAAAAA5AgrgAAAAAAAo/////CAAAAAIQCRGvEAMRZBADA4AEAAAALgQAAABjEAMDgA5AfPAA AAAAAAQAAACNCgAAFz8IAAAAARAJEa8PAwBlHNCLCgAAF30IAAAAARAJEa8PA0BpHJCHCgAA F68IAAAACxAPBVoPA0BpBSCHCgAAF8QIAAAAAAEQBAJEBAAAA/8EAAAAIAuABgEH/wAA/xAO COMDAgMRDU1vcmUgY29udHJvbHMBAQMBAQEBAQEQCQObC4Dg8zzg8////qqr///w//+pVVav //D//lVVVVv/8P/pVVVVVr/w/5VVVVVVb/D+VVVVVVVb8P5VVVVVVVvw+VVVVVVVVvDlVVVU VVVVsOVVVVQVVVWw5VVVVAVVVbCVVVVUAVVVYJVVVVQAVVVglVVVVAAVVWCVVVVUAAVVYJVV VVQABVVglVVVVAAVVWCVVVVUAFVVYJVVVVQBVVVg5VVVVAVVVbDlVVVUFVVVsOVVVVRVVVWw +VVVVVVVVvD+VVVVVVVb8P5VVVVVVVvw/5VVVVVVb/D/6VVVVVa/8P/+VVVVW//w//+pVVav //D///6qq///8AQAAAAeBAAAAB4EAAAAAgEUCgAAE1MAAAAE/wAAAf//////zMzMAAAAAAEB CgAAGCUQCQObC4Dg8zzg8wAAAqqoAAAAAACr//6gAAAAAv////gAAAAr/////oAAAL////// 4AAC///////4AAL///////gAC////////gAv///9////gC////1///+AL////V///4C////9 V///4L////1V///gv////VV//+C////9VV//4L////1VX//gv////VV//+C////9Vf//4L// //1X///gL////V///4Av///9f///gC////3///+AC////////gAC///////4AAL///////gA AL//////4AAAK/////6AAAAC////+AAAAACr//6gAAAAAAKqqAAAAAQAAAAeBAAAAB4EAAAA AgEUCgAAE1MAAAAEAAAAAP8AAAH/lJSU/7W1tQEBBgNvZmYKAAAXPwYQc2hvd01vcmVDb250 cm9scwoAABfpBghidXR0b25VcBAHAtIPBSB4BVB4CgAAF8QKAAAX6QEQBQJ/BAAAAAABAQQA AAAAARAJEa8PBVBpDTCHCgAAF8QKAAAX6QEKAAAauRAOCOMDAgMBAQEDAQEBARARAREGCXNw YWNlRmlsbAoAABr4AwQAAAAABgZjZW50ZXIGBG5vbmUEAAAAAAYHdG9wTGVmdAYLbGVmdFRv UmlnaHQKAAAbFgMCCgAAGyEKAAAbFgQAAAAABD////8QAwUjAQEEAAAAABAEAkQEAAAAAAQA AAAQC4AGAQcAAQABEA8FWg8NMGkPEIcKAAAXxAoAABfpAQoAABfvEA4I4wMCAxENUHJldmlv dXMgcGFnZQEBAwEBAQEBARAJA5sLgODzPODz///+qqv///D//6lVVq//8P/+VVVVW//w/+lV VVVWv/D/lVVVVVVv8P5VVVVVVVvw/lVVVVVVW/D5VVVRVVVW8OVVVUFVVVWw5VVVAVVVVbDl VVQBVVVVsJVVUAAAFVVglVVAAAAVVWCVVQAAABVVYJVUAAAAFVVglVQAAAAVVWCVVQAAABVV YJVVQAAAFVVglVVQAAAVVWDlVVQBVVVVsOVVVQFVVVWw5VVVQVVVVbD5VVVRVVVW8P5VVVVV VVvw/lVVVVVVW/D/lVVVVVVv8P/pVVVVVr/w//5VVVVb//D//6lVVq//8P///qqr///wBAAA AB4EAAAAHgQAAAACARQKAAATUwAAAAT/AAAB///////MzMwAAAAAAQEKAAAbrhAJA5sLgODz PODzAAACqqgAAAAAAKv//qAAAAAC////+AAAACv////+gAAAv//////gAAL///////gAAv// ////+AAL///3///+AC///9f///+AL///V////4Av//1X////gL//9VVVf//gv//VVVV//+C/ /1VVVX//4L/9VVVVf//gv/1VVVV//+C//1VVVX//4L//1VVVf//gv//1VVV//+Av//1X//// gC///1f///+AL///1////4AL///3///+AAL///////gAAv//////+AAAv//////gAAAr//// /oAAAAL////4AAAAAKv//qAAAAAAAqqoAAAABAAAAB4EAAAAHgQAAAACARQKAAATUwAAAAQA AAAA/wAAAf+UlJT/tbW1AQEKAAAaeAoAABc/BgxwcmV2aW91c1BhZ2UKAAAX6QoAABqZEAcC 0g8PEHgPQHgKAAAXxAoAABfpAQoAABq5ARAPBVoPD0BpESCHCgAAF8QKAAAX6QEKAAAX7xAO COMDAgMRMkNsaWNrIGhlcmUgdG8gZ2V0IGEgbWVudSBvZg1vcHRpb25zIGZvciB0aGlzIGJv b2suAQEDAQEBAQEBEAkDmwuA4PM84POqqqlVVqqqoKqqV//9Wqqgqqn////2qqCql/////1q oKp//////9qgqf//////9qCp/AAAAAP2oKf8AAAAA/2gn/wAAAAD/2Cf/AAAAAP/YJ/8AAAA A/9gf/wAAAAD/9B//D///8P/0H/8P///w//Qf/wAAAAD/9B//AAAAAP/0H/8P///w//Qf/w/ ///D/9B//AAAAAP/0J/8AAAAA/9gn/w////D/2Cf/D///8P/YKf8AAAAA/2gqfwAAAAD9qCp ///////2oKp//////9qgqpf////9aqCqqf////aqoKqqV//9WqqgqqqpVVaqqqAEAAAAHgQA AAAeBAAAAAIBFAoAABNTAAAABP8AAAH/zMzMAAAAAP////8BAQoAAB6eEAkDmwuA4PM84PMA AAKqqAAAAAAAq//+oAAAAAL////4AAAAK/////6AAAC//////+AAAv//////+AAC/VVVVVf4 AAv9VVVVV/4AL/1VVVVX/4Av/VVVVVf/gC/9VVVVV/+Av/1VVVVX/+C//X///9f/4L/9f/// 1//gv/1VVVVX/+C//VVVVVf/4L/9f///1//gv/1////X/+C//VVVVVf/4C/9VVVVV/+AL/1/ ///X/4Av/X///9f/gAv9VVVVV/4AAv1VVVVX+AAC///////4AAC//////+AAACv////+gAAA Av////gAAAAAq//+oAAAAAACqqgAAAAEAAAAHgQAAAAeBAAAAAIBFAoAABNTAAAABAAAAAD/ AAAB/5SUlP+1tbUBAQoAABp4CgAAFz8GE2ludm9rZVNob3J0Qm9va01lbnUKAAAX6QYKYnV0 dG9uRG93bhAHAtIPESB4EVB4CgAAF8QKAAAX6QEKAAAauQEQDwVaDxFQaRMwhwoAABfECgAA F+kBCgAAF+8QDgjjAwIDEQlOZXh0IHBhZ2UBAQMBAQEBAQEQCQObC4Dg8zzg8////qqr///w //+pVVav//D//lVVVVv/8P/pVVVVVr/w/5VVVVVVb/D+VVVVVVVb8P5VVVVVVVvw+VVVVFVV VvDlVVVUFVVVsOVVVVQFVVWw5VVVVAFVVbCVVUAAAFVVYJVVQAAAFVVglVVAAAAFVWCVVUAA AAFVYJVVQAAAAVVglVVAAAAFVWCVVUAAABVVYJVVQAAAVVVg5VVVVAFVVbDlVVVUBVVVsOVV VVQVVVWw+VVVVFVVVvD+VVVVVVVb8P5VVVVVVVvw/5VVVVVVb/D/6VVVVVa/8P/+VVVVW//w //+pVVav//D///6qq///8AQAAAAeBAAAAB4EAAAAAgEUCgAAE1MAAAAE/wAAAf//////zMzM AAAAAAEBCgAAIXMQCQObC4Dg8zzg8wAAAqqoAAAAAACr//6gAAAAAv////gAAAAr/////oAA AL//////4AAC///////4AAL///////gAC////f///gAv///9f///gC////1f//+AL////Vf/ /4C//9VVVf//4L//1VVVf//gv//VVVVf/+C//9VVVVf/4L//1VVVV//gv//VVVVf/+C//9VV VX//4L//1VVV///gL////Vf//4Av///9X///gC////1///+AC////f///gAC///////4AAL/ //////gAAL//////4AAAK/////6AAAAC////+AAAAACr//6gAAAAAAKqqAAAAAQAAAAeBAAA AB4EAAAAAgEUCgAAE1MAAAAEAAAAAP8AAAH/lJSU/7W1tQEBCgAAGngKAAAXPwYIbmV4dFBh Z2UKAAAX6QoAABqZEAcC0g8TMHgTYHgKAAAXxAoAABfpAQoAABq5ARAJEa8PE2BpG0CHCgAA F8QKAAAX6QEKAAAauRAOCOMDAgMBAQEDAQEBARARAREKAAAa+AoAABr4AwQAAAAACgAAGw4K AAAbFgQAAAAACgAAGyEKAAAbKgoAABsWAwIKAAAbIQoAABsWBAAAAAAEP////xADBSMBAQQA AAAACgAAG10QFw8PDxtAahyQhgoAABfECgAAF+kBCgAAG10BEAULnQoAAAcVAQYeZmFtaWx5 TmFtZTpwb2ludFNpemU6ZW1waGFzaXM6CAAAAAMRCktvbWlrYVRleHQEAAAAFQQAAAAABAAA AAARAzEvMQMGBnN0cmluZwoAABc/EQMxLzEGEHBhZ2VOdW1iZXJSZXBvcnQBBAAAAAECAQIE AAAACAQAAAFuAQ8DQGkckIcKAAAauRAOCOMDAgMBAQEDAQEQHAysCgAAFz8GDG1vdmVWaWFU aXRsZQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEBEBEQoAABr4BgpzaHJpbmtXcmFwAwQA AAAACgAAGw4KAAAbFgQAAAAACgAAGyEKAAAbKgoAABsWAwIKAAAbIQoAABsWBAAAAAAEP/// /xADBSMKAAAlcBADA4AEAAAAnQQAAAAeBAAAAAAKAAAbXQ8DAGUc0IsQBAJEBD/aKAoEAAAA EAuABgEHfoB+gBAOCOMDAgIBARENUGFnZSBDb250cm9scwMBARAcDKwKAAAXPwYEbW92ZQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEBEBEQoAABr4CgAAJXkDBAAAAAAKAAAbDgoAABsW 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 CAAAAAEBEAMF7wQAAAAACAAAAAEBIQ0N')) contents) binary reset) fileInObjectAndCode. IndexPage setNamePropertyTo: 'index'. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 8/29/2007 12:33'! loadQuickGuideBooks | dir m newPage pages newPagePrototype | pages _ OrderedCollection new. newPagePrototype _ QuickGuideHolderMorph new extent: 300@400. dir _ (FileDirectory on: (Smalltalk imagePath)) directoryNamed: 'QuickGuides'. (dir fileNames select: [:e | e endsWith: '.morph']) do: [:e | m _ Morph fromFileName: (dir fullNameFor: e). newPage _ newPagePrototype veryDeepCopy. newPage extent: m extent. m position: 0@0. newPage position: 0@0. m setNamePropertyTo: (e copyFrom: 1 to: e size - 6). newPage guideName: (e copyFrom: 1 to: e size - 6). newPage addMorph: m. pages add: newPage. ]. ^ pages. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 8/28/2007 13:01'! thumbnailsFrom: aCollection | dict b | dict _ Dictionary new. aCollection do: [:page | b _ page submorphs first. dict at: b knownName put: (b imageForm magnifyBy: 0.25) ]. ^ dict. ! ! !QuickGuideMorph class methodsFor: 'defaults' stamp: 'yo 8/29/2007 11:39'! defaultOrder ^ Descriptions keys. ! ! QuickGuideMorph initialize!