'From etoys2.1 of 26 July 2007 [latest update: #1596] on 10 September 2007 at 2:53:21 pm'! "Change Set: QuickGuide3-yo Date: 10 September 2007 Author: Yoshiki Ohshima A new version of Quick Guides."! Smalltalk renameClassNamed: #QuickGuideMorphGenerator as: #QuickGuideGenerator! Morph subclass: #QuickGuideGenerator instanceVariableNames: 'input output inputMorph outputMorph fileList' classVariableNames: '' poolDictionaries: '' category: 'Morphic-Books'! BookMorph subclass: #QuickGuideMorph instanceVariableNames: 'control order ' classVariableNames: 'Descriptions IndexPage Thumbnails Colors ' poolDictionaries: '' category: 'Morphic-Books'! IdentityDictionary subclass: #SISSDictionaryForScanning instanceVariableNames: 'boundaryObjects ' classVariableNames: 'ReduceFormDepth ' poolDictionaries: '' category: 'SISS-Core'! !BookMorph methodsFor: 'fileIn/out' stamp: 'yo 9/10/2007 14:39'! pagesAndColorInSISSFormat | dict | dict _ SISSDictionaryForScanning new initialize. self owner ifNotNil: [ dict boundaryObjects add: self. ]. ^ (pages copyWith: self color) sissScanObjectsWithDict: dict. ! ! !BookMorph methodsFor: 'fileIn/out' stamp: 'yo 9/8/2007 17:26'! storeAsDataStream self storeAsDataStreamNamed: Project current name, '.sexp.data'. ! ! !BookMorph methodsFor: 'fileIn/out' stamp: 'yo 9/10/2007 14:39'! storeAsDataStreamNamed: fileName | f d | f _ FileStream newFileNamed: fileName. d _ DataStream on: f. d nextPut: self pagesAndColorInSISSFormat. d close. ! ! !BookMorph class methodsFor: 'fileIn/Out' stamp: 'yo 9/10/2007 14:40'! bookFromPagesInSISSFormat: sexp | pages book pagesAndColor color | pagesAndColor _ sexp sissReadObjects. pages _ pagesAndColor copyFrom: 1 to: pagesAndColor size - 1. color _ pagesAndColor last. book _ BookMorph new. pages do: [:p | p setProperty: #transitionSpec toValue: (Array with: 'silence' with: #none with: #none)]. book newPages: pages. book extent: pages first extent + (10@52). book color: color. book goToPage: 1. book fewerPageControls. book pageControlsAtTop: false. ^ book. ! ! !FlapTab methodsFor: 'compact' stamp: 'yo 9/10/2007 14:16'! changeCompactFlap self makeFlapCompact: self isFlapCompact not.! ! !FlapTab methodsFor: 'compact' stamp: 'yo 9/10/2007 14:16'! compactFlapString ^ (self isFlapCompact ifTrue: ['compact flap'] ifFalse: ['']), 'compact flap' translated! ! !FlapTab methodsFor: 'compact' stamp: 'yo 9/10/2007 14:16'! isFlapCompact "Return true if the referent of the receiver represents a 'compact' flap" referent layoutPolicy ifNil:[^false]. referent layoutPolicy isTableLayout ifFalse:[^false]. referent vResizing == #shrinkWrap ifFalse:[^false]. ^true! ! !FlapTab methodsFor: 'compact' stamp: 'yo 9/10/2007 14:00'! makeFlapCompact: aBool "Return true if the referent of the receiver represents a 'compact' flap" aBool ifTrue:[ referent layoutPolicy: TableLayout new; vResizing: #shrinkWrap; hResizing: #shrinkWrap. " useRoundedCorners". ] ifFalse:[ referent layoutPolicy: nil; vResizing: #rigid; useSquareCorners. ]. ! ! !FlapTab methodsFor: 'menu' stamp: 'yo 9/10/2007 14:21'! addCustomMenuItems: aMenu hand: aHandMorph "Add further items to the menu as appropriate" aMenu add: 'tab color...' translated target: self action: #changeColor. aMenu add: 'flap color...' translated target: self action: #changeFlapColor. aMenu addLine. aMenu addUpdating: #edgeString action: #setEdgeToAdhereTo. aMenu addLine. aMenu addUpdating: #textualTabString action: #textualTab. aMenu addUpdating: #graphicalTabString action: #graphicalTab. aMenu addUpdating: #solidTabString enablement: #notSolid action: #solidTab. aMenu addLine. (referent isKindOf: PasteUpMorph) ifTrue: [aMenu addUpdating: #partsBinString action: #togglePartsBinMode]. aMenu addUpdating: #dragoverString action: #toggleDragOverBehavior. aMenu addUpdating: #mouseoverString action: #toggleMouseOverBehavior. aMenu addLine. aMenu addUpdating: #isGlobalFlapString enablement: #sharedFlapsAllowed action: #toggleIsGlobalFlap. aMenu balloonTextForLastItem: 'If checked, this flap will be available in all morphic projects; if not, it will be private to this project.,' translated. aMenu addLine. aMenu addUpdating: #compactFlapString target: self action: #changeCompactFlap. aMenu add: 'destroy this flap' translated action: #destroyFlap. "aMenu addUpdating: #slideString action: #toggleSlideBehavior. aMenu addUpdating: #inboardString action: #toggleInboardness. aMenu addUpdating: #thicknessString ('thickness... (current: ', self thickness printString, ')') action: #setThickness." ! ! !Form methodsFor: '*siss-interface' stamp: 'yo 9/10/2007 10:42'! sissWriteValue SISSDictionaryForScanning reduceFormDepth ifTrue: [ ^ (self asFormOfDepth: 8) hibernate. ]. ^ self hibernate. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 12:24'! currentDirectorySelected ^ fileList currentDirectorySelected. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 12:00'! generate | inDir outDir | inDir _ FileDirectory on: input. inDir fileNames ifEmpty: [ self inform: 'the input path doesn''t point to\the directory with projects'. ^ self]. outDir _ FileDirectory on: output. outDir assureExistence. outDir fileNames ifNotEmpty: [ self inform: 'output directory is not empty.\Please remove files in it first.'. ^ self]. QuickGuideMorph convertProjectsWithBooksToSISSIn: inDir to: outDir. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 11:37'! getInput ^ input. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 11:37'! getOutput ^ output. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 12:25'! initialDirectoryList ^ fileList initialDirectoryList! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 14:46'! initialize super initialize. input _ ''. output _ (FileDirectory on: Smalltalk imagePath) fullPathFor: 'QuickGuides'. self setup. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 14:12'! makeInputDirList | m | fileList _ FileList2 morphicView model. fileList directory: (FileDirectory default). m _ (SimpleHierarchicalListMorph on: self list: #initialDirectoryList selected: #currentDirectorySelected changeSelected: #setSelectedDirectoryTo: menu: nil keystroke: nil) autoDeselect: false; enableDrag: false; enableDrop: true; yourself. ^ m. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 11:51'! setInput: aString input _ aString. (input endsWith: FileDirectory slash) ifTrue: [input _ input copyFrom: 1 to: input size - 1]. input hasUnacceptedEdits: false. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 11:51'! setOutput: aString output _ aString. (output endsWith: FileDirectory slash) ifTrue: [output _ output copyFrom: 1 to: output size - 1]. output hasUnacceptedEdits: false. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 12:26'! setSelectedDirectoryTo: dir input _ dir withoutListWrapper pathName. fileList setSelectedDirectoryTo: dir. self changed: #fileList. self changed: #contents. self changed: #currentDirectorySelected. self changed: #getInput. ! ! !QuickGuideGenerator methodsFor: 'all' stamp: 'yo 9/10/2007 14:11'! setup | button | self color: Color white. self extent: 450@160. self addMorph: self makeInputDirList. inputMorph _ PluggableTextMorph on: self text: #getInput accept: #setInput:. inputMorph acceptOnCR: true. self addMorph: inputMorph. inputMorph extent: 300@50. inputMorph position: 155@0. outputMorph _ PluggableTextMorph on: self text: #getOutput accept: #setOutput:. outputMorph acceptOnCR: true. outputMorph extent: 300@50. outputMorph position: 155@50. self addMorph: outputMorph. button _ SimpleButtonMorph new. button labelString: 'Generate' font: Preferences standardMenuFont; actionSelector: #generate; arguments: #(); target: self. button position: 5@125. self addMorph: button. ! ! !QuickGuideHolderMorph methodsFor: 'file in/file out' stamp: 'yo 9/10/2007 14:40'! load | dir m fileName f | self submorphs size > 0 ifTrue: [^ self]. dir _ (FileDirectory on: (Smalltalk imagePath)) directoryNamed: 'QuickGuides'. fileName _ guideName, '.sexp.data'. (dir fileNames includes: fileName) ifFalse: [ ^ self ]. f _ dir readOnlyFileNamed: fileName. m _ BookMorph bookFromPagesInSISSFormat: (DataStream on: f) next. m position: 0@0. self position: 0@0. self extent: m extent. m setNamePropertyTo: guideName. m beSticky. self addMorph: m. ! ! !QuickGuideMorph methodsFor: 'initialization' stamp: 'yo 9/7/2007 19:27'! initialize | newPage indexPage | newPagePrototype _ QuickGuideHolderMorph new. newPagePrototype guideName: 'empty'. newPagePrototype setProperty: #transitionSpec toValue: (Array with: 'silence' with: #none with: #none). 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 9/5/2007 01:18'! 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. page setProperty: #transitionSpec toValue: (Array with: 'silence' with: #none with: #none). ]. newPages add: page. ]. unusedPages _ pages reject: [:e | (newPages includes: e)]. self newPages: (newPages, unusedPages) currentIndex: 1. order _ names. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 9/9/2007 17:36'! convertProjectsWithBooksToSISSIn: dir to: outDir | p book texts desc | Thumbnails _ Dictionary new. Descriptions _ Dictionary new. Colors _ Dictionary new. dir fileNames do: [:f | (f endsWith: '.pr') ifTrue: [ p _ ProjectLoading loadName: f stream: (dir readOnlyFileNamed: f) fromDirectory: dir withProjectView: nil. book _ p world submorphs detect: [:b | b isMemberOf: BookMorph] ifNone: [nil]. book ifNotNil: [ texts _ book currentPage submorphs select: [:e | e isKindOf: TextMorph]. desc _ texts isEmpty ifTrue: ['A Guide' translated] ifFalse: [(texts asSortedCollection: [:x :y | x top < y top]) first contents asString]. Descriptions at: p name put: desc. Thumbnails at: p name put: (book imageForm magnifyBy: 0.25). Colors at: p name put: book color. book storeAsDataStreamNamed: (outDir fullNameFor: p name, '.sexp.data'). ]. p okToChangeSilently. ]. ]. ! ! !QuickGuideMorph class methodsFor: 'initialization' stamp: 'yo 9/10/2007 14:31'! initialize " QuickGuideMorph initialize " QuickGuideMorph initializeIndexPage. Thumbnails _ Dictionary new. Descriptions _ Dictionary new. Colors _ Dictionary new. ! ! !QuickGuideMorph class methodsFor: 'defaults' stamp: 'yo 9/10/2007 14:44'! defaultOrder | dir | dir _ (FileDirectory on: (Smalltalk imagePath)) directoryNamed: 'QuickGuides'. ^ (dir fileNames select: [:f | f endsWith: '.sexp.data']) collect: [:f | f copyFrom: 1 to: f size - '.sexp.data' size].! ! !SISSDictionaryForScanning class methodsFor: 'accessing' stamp: 'yo 9/10/2007 10:42'! reduceFormDepth ^ ReduceFormDepth == true. ! ! !SISSDictionaryForScanning class methodsFor: 'accessing' stamp: 'yo 9/10/2007 14:14'! reduceFormDepth: aBoolean ReduceFormDepth _ aBoolean. ! ! !SugarNavigatorBar methodsFor: 'help flap' stamp: 'yo 9/10/2007 13:44'! buildAndOpenHelpFlap "Called only when flaps are being created afresh." | aFlapTab outer leftStrip rightStrip aGuide | aFlapTab := FlapTab new. aFlapTab assureExtension visible: false. outer := AlignmentMorph newRow. outer assureExtension visible: false. outer clipSubmorphs: true. outer beTransparent. outer vResizing: #spaceFill; hResizing: #spaceFill. outer layoutInset: 0; cellInset: 0; borderWidth: 0. outer setProperty: #morphicLayerNumber toValue: 26. leftStrip := Morph new beTransparent. "This provides space for tabs to be seen." leftStrip layoutInset: 0; cellInset: 0; borderWidth: 0. leftStrip width: 20. leftStrip hResizing: #rigid; vResizing: #spaceFill. outer addMorphBack: leftStrip. rightStrip := AlignmentMorph newColumn. rightStrip color: (Color green veryMuchLighter alpha: 0.2). rightStrip layoutInset: 0; cellInset: 0; borderWidth: 0. outer addMorphBack: rightStrip. outer clipSubmorphs: true. aGuide := QuickGuideMorph new. aGuide openInWorld. aGuide order: QuickGuideMorph defaultOrder. rightStrip addMorphBack: aGuide. aGuide beSticky. aFlapTab referent ifNotNil: [aFlapTab referent delete]. aFlapTab referent: outer. aFlapTab setName: 'Help' translated edge: #left color: (Color r: 0.677 g: 0.935 b: 0.484). ActiveWorld addMorphFront: aFlapTab. aFlapTab adaptToWorld: ActiveWorld. aFlapTab computeEdgeFraction. aFlapTab position: (outer left @ outer top). outer extent: (462 @ ActiveWorld height). outer beFlap: true. outer beTransparent. aFlapTab referent hide. aFlapTab openFully. outer beSticky. leftStrip beSticky. rightStrip beSticky. aFlapTab applyThickness: 462. aFlapTab fitOnScreen. aFlapTab referent show. aFlapTab show. aFlapTab makeFlapCompact: true. ScriptingSystem cleanUpFlapTabsOnLeft! ! !SugarNavigatorBar methodsFor: 'help flap' stamp: 'yo 9/10/2007 14:15'! toggleHelp "Open the help-cards flap, or close it if open." | f | f _ (World submorphs detect: [:e | (e isKindOf: FlapTab) and: [e labelString = 'Help' translated]] ifNone: [nil]). f ifNotNil: [f referent isInWorld ifTrue: [f referent delete]. f delete] ifNil: [self buildAndOpenHelpFlap]! ! ViewerFlapTab removeSelector: #changeCompactFlap! ViewerFlapTab removeSelector: #compactFlapString! ViewerFlapTab removeSelector: #isFlapCompact! ViewerFlapTab removeSelector: #makeFlapCompact:! SISSDictionaryForScanning class removeSelector: #reduceFormColor! SISSDictionaryForScanning class removeSelector: #test2! !SISSDictionaryForScanning class reorganize! ('accessing' reduceFormDepth reduceFormDepth:) ('test' test1) ! IdentityDictionary subclass: #SISSDictionaryForScanning instanceVariableNames: 'boundaryObjects' classVariableNames: 'ReduceFormDepth' poolDictionaries: '' category: 'SISS-Core'! QuickGuideMorph class removeSelector: #colorFor:! QuickGuideMorph class removeSelector: #convertProjectsWithBooksToSISSIn:! QuickGuideMorph class removeSelector: #descriptionsFrom:! QuickGuideMorph initialize! QuickGuideMorph class removeSelector: #initializeDescriptionsAndThumbnails! QuickGuideMorph class removeSelector: #loadQuickGuideBooks! QuickGuideMorph class removeSelector: #thumbnailsFrom:! BookMorph subclass: #QuickGuideMorph instanceVariableNames: 'control order' classVariableNames: 'Colors Descriptions IndexPage Thumbnails' poolDictionaries: '' category: 'Morphic-Books'! !QuickGuideGenerator reorganize! ('all' currentDirectorySelected generate getInput getOutput initialDirectoryList initialize makeInputDirList setInput: setOutput: setSelectedDirectoryTo: setup) ! !FlapTab reorganize! ('WiW support' morphicLayerNumber) ('access' acquirePlausibleFlapID flapID flapID: flapIDOrNil flapShowing orientation referentThickness tabThickness) ('accessing' labelString) ('change reporting' ownerChanged) ('compact' changeCompactFlap compactFlapString isFlapCompact makeFlapCompact:) ('classification' isFlapTab) ('disused options' inboard inboard: slidesOtherObjects) ('e-toy support' isCandidateForAutomaticViewing succeededInRevealing:) ('edge' applyEdgeFractionWithin: computeEdgeFraction edgeFraction edgeFraction: edgeString edgeToAdhereTo edgeToAdhereTo: ifVertical:ifHorizontal: setEdge: setEdgeToAdhereTo) ('event handling' mouseMove: mouseUp:) ('events' tabSelected) ('globalness' isGlobalFlap isGlobalFlapString toggleIsGlobalFlap) ('graphical tabs' graphicalTab graphicalTabString) ('initialization' adaptToWorld initialize lazyUnhibernate provideDefaultFlapIDBasedOn: setName:edge:color:) ('layout' layoutChanged) ('menu' addCustomMenuItems:hand: applyThickness: changeColor changeFlapColor changeTabText destroyFlap existingWording flapMenuTitle isCurrentlyTextual preserveDetails sharedFlapsAllowed thicknessString wording) ('menus' addGestureMenuItems:hand: addTitleForHaloMenu:) ('misc' fitContents) ('miscellaneous' balloonTextForFlapsMenu) ('mouseover & dragover' arrangeToPopOutOnDragOver: arrangeToPopOutOnMouseOver: dragoverString makeNewDrawing: mouseoverString setToPopOutOnDragOver: setToPopOutOnMouseOver: startOrFinishDrawing: toggleDragOverBehavior toggleMouseOverBehavior) ('objects from disk' objectForDataStream:) ('parts bin' partsBinString togglePartsBinMode) ('positioning' adjustPositionVisAVisFlap fitOnScreen positionObject: positionObject:atEdgeOf: positionReferent spanWorld stickOntoReferent transposeParts) ('printing' printOn:) ('rounding' roundedCorners wantsRoundedCorners) ('show & hide' adjustPositionAfterHidingFlap hideFlap hideFlapUnlessBearingHalo hideFlapUnlessOverReferent lastReferentThickness: maybeHideFlapOnMouseLeave maybeHideFlapOnMouseLeaveDragging openFully showFlap showFlapIfHandLaden:) ('solid tabs' applyTabThickness: changeTabSolidity changeTabThickness isCurrentlySolid notSolid solidTab solidTabString useSolidTab) ('submorphs-add/remove' dismissViaHalo) ('textual tabs' assumeString:font:orientation:color: changeTabText: reformatTextualTab textualTab textualTabString useStringTab: useTextualTab) ('thumbnail' permitsThumbnailing) ! BookMorph class removeSelector: #aBookFromPagesInSISSFormat:! BookMorph class removeSelector: #bookFromPagesInSISSFormat:setColor:! BookMorph removeSelector: #pagesInSISSFormat! !BookMorph reorganize! ('accessing' cardsOrPages currentPage pageNamed: pageNumberOf: pages pages: setAllPagesColor: userString) ('caching' releaseCachedState) ('classification' defersHaloToInterior) ('copying' updateReferencesUsing:) ('dropping/grabbing' allowSubmorphExtraction wantsDroppedMorph:event:) ('e-toy support' canRevertThisPage configureForKids deleteAlongWithPlayers encouragesHaloTransferToEnclosedPasteUpMorph pagesForRevert succeededInRevealing:) ('halos and balloon help' defersHaloOnClickTo:) ('initialization' defaultColor fromRemoteStream: fromURL: initialize newPages: newPages:currentIndex: removeEverything setInitialState) ('insert and delete' defaultNameStemForNewPages deletePage deletePageBasic insertPageColored: insertPageLabel:morphs: insertPageSilentlyAtEnd insertPage:pageSize: insertPage:pageSize:atIndex:) ('layout' acceptDroppingMorph:event:) ('menu' addAdvancedItemsTo: addAllPagesItemsTo: addBookMenuItemsTo:hand: addBookToggleItemsTo: addSaveAndRevertItemsTo: addTransitionItemsTo: bookmarkForThisPage buildThreadOfProjects copyUrl duplicatePage findText: findText:inStrings:startAt:container:pageNum: forgetURLs getAllText getStemUrl goToPage highlightText:at:in: invokeBookMenu invokeShortBookMenu keepTogether loadImagesIntoBook makeUniformPageSize menuPageSoundForAll: menuPageSoundForThisPage: menuPageSoundFor:event: menuPageVisualForAll: menuPageVisualForThisPage: menuPageVisualFor:event: pageControlsVisible pasteBookPage reload reserveUrls reserveUrlsIfNeeded revertablePageForKey: saveAsNumberedURLs saveIndexOfOnly: saveIndexOnURL saveOneOnURL saveOnUrlPage: savePagesOnURL setNewPagePrototype setPageColor textSearch textSearch: thumbnailForThisPage toggleFullScreen toggleShowingOfPageControls uncachePageSorter) ('menu commands' revertAllPages revertPage saveForRevert sortPages) ('navigation' buildFloatingPageControls goToPageMorph: goToPageMorph:fromBookmark: goToPageMorph:runTransitionScripts: goToPageMorph:transitionSpec: goToPageMorph:transitionSpec:runTransitionScripts: goToPageUrl: goToPage: goToPage:transitionSpec: goToPage:transitionSpec:runTransitionScripts: goto: insertPageMorphInCorrectSpot: lastPage nextPage pageNumber previousPage setWrapPages: showMoreControls toggleWrapPages transitionSpecFor:) ('other' adjustCurrentPageForFullScreen exitFullScreen goFullScreen isInFullScreenMode makeMinimalControlsWithColor:title: resizePagesTo: setExtentFromHalo:) ('parts bin' initializeToStandAlone) ('printing' pagesHandledAutomatically) ('scripting' chooseAndRevertToVersion installRollBackButtons methodHolders methodHolderVersions revertToCheckpoint:) ('sorting' acceptSortedContentsFrom: morphsForPageSorter sortPages:) ('submorphs-accessing' allNonSubmorphMorphs) ('submorphs-add/remove' abandon) ('*morphic-Postscript Canvases' asPostscript fullDrawPostscriptOn:) ('uniform page size' keepingUniformPageSizeString maintainsUniformPageSize maintainsUniformPageSize: pageControlsAtTop pageControlsAtTop: pageControlsShort pageControlsShort: toggleMaintainUniformPageSize togglePageControlsAtTop togglePageControlsShort toggleUsingPrivatePresenter uniformPageSize usesPrivatePresenter usingPrivatePresenterString wrappingAtEndString) ('menus' printPSToFile) ('*connectors-attachments-nk' isConnectable) ('master pages' saveBookForRevert) ('page controls' fullControlSpecs pageNumberReport shortControlSpecs) ('fileIn/out' pagesAndColorInSISSFormat storeAsDataStream storeAsDataStreamNamed:) !