'From Squeak 3.2 of 11 July 2002 [latest update: #4917] on 24 November 2002 at 11:25:06 am'! "Change Set: Faure-FrameWork Date: 16 May 2002 Author: Russell Allen The core of the Faure system. To try on desktop: FaureWorld createDefaultWorld To make image for handheld: FaureWorld createDefaultWorld makeWorld: true (and save image) "! FileUrl subclass: #FaureUrl instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Faure-Framework'! SimpleButtonMorph subclass: #DateButton instanceVariableNames: 'date monthMorph model selector ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Support'! Morph subclass: #FaureMenuBar instanceVariableNames: 'menus ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Framework'! MenuMorph subclass: #FaureMenuMorph instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Faure-Support'! SimpleButtonMorph subclass: #FaureNavigator instanceVariableNames: 'menu ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Framework'! RectangleMorph subclass: #FaurePage instanceVariableNames: 'faureworld contents menubar ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Framework'! FaurePage subclass: #FaureDefault instanceVariableNames: 'text ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Framework'! FaurePage subclass: #FaureEvents instanceVariableNames: 'dirOrFile selected mode buttonBar date recordDisplay ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Standard'! FaurePage subclass: #FaureFileView instanceVariableNames: 'file text ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Standard'! FaurePage subclass: #FaureFiles instanceVariableNames: 'dirOrFile selected mode buttonBar fileviewer ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Standard'! FaurePage subclass: #FaureHome instanceVariableNames: 'sm ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Standard'! FaurePage subclass: #FaurePageOrganiser instanceVariableNames: 'selected ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Standard'! FaurePage subclass: #FaurePeople instanceVariableNames: 'selected recordDisplay ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Standard'! FaurePage subclass: #FaureToDo instanceVariableNames: 'dirOrFile selected mode buttonBar date recordDisplay ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Standard'! RectangleMorph subclass: #FaureWorld instanceVariableNames: 'currentMorph currentUrl navMorph menubarMorph cache default isWorld ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Framework'! Model subclass: #PDA instanceVariableNames: 'userCategories allPeople allEvents recurringEvents allToDoItems allNotes date category currentItem currentItemText currentItemSelection categoryList categoryListIndex peopleList peopleListIndex scheduleList scheduleListIndex toDoList toDoListIndex notesList notesListIndex dateButtonPressed viewDescriptionOnly ' classVariableNames: 'Current ' poolDictionaries: '' category: 'Morphic-PDA'! FaurePage subclass: #RecordDisplay instanceVariableNames: 'text record ' classVariableNames: '' poolDictionaries: '' category: 'Faure-Support'! RecordDisplay subclass: #ToDoDisplay instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Faure-Support'! !FaureUrl methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 23:09'! asRelativeTo: anotherUrl "Only Simple Relativity Allowed (no ..)" ^ FaureUrl new path: (self path copyFrom: anotherUrl path size + 1 to: self path size) isAbsolute: false ! ! !FaureUrl methodsFor: 'as yet unclassified' stamp: 'rca 9/3/2002 19:59'! asStringOrText ^ self asString! ! !FaureUrl methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 20:30'! asUrlRelativeTo: anotherUrl "Are we absolute?" self isAbsolute ifTrue: [^ self copy]. "Only Simple Relativity Allowed (no ..)" ^ FaureUrl new path: (anotherUrl path, self path) isAbsolute: true ! ! !FaureUrl methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 19:45'! compareWith: secondID | answer | "Is this above us?" secondID path size < path size ifTrue: [^ 0]. answer _ 0. path doWithIndex: [:each :index | each = (secondID path at: index) ifTrue: [answer _ answer + 1] ifFalse: [^ answer]]. ^ answer! ! !FaureUrl methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 23:40'! isLocal ^ self pathString = ''! ! !FaureUrl methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 23:40'! isRoot ^ self pathString = '/'! ! !FaureUrl methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 20:18'! schemeName ^'faure'! ! !DateButton methodsFor: 'as yet unclassified' stamp: 'rca 7/23/2002 19:36'! changeDate monthMorph openInWorld topLeft: self bottomLeft! ! !DateButton methodsFor: 'as yet unclassified' stamp: 'rca 7/23/2002 19:09'! date ^ date ifNil: [date _ Date today]! ! !DateButton methodsFor: 'as yet unclassified' stamp: 'rca 7/24/2002 00:01'! initialize super initialize. self borderWidth: 1; target: self; actionSelector: #changeDate; actWhen: #buttonDown; cornerStyle: #square; color: Color white; height: 20; vResizing: #rigid; hResizing: #rigid; layoutInset: 3. self changeTableLayout. date _ Date today. self setLabel. monthMorph _ MonthMorph newWithModel: self.! ! !DateButton methodsFor: 'as yet unclassified' stamp: 'rca 7/23/2002 19:27'! on: newModel action: newSelector model _ newModel. selector _ newSelector.! ! !DateButton methodsFor: 'as yet unclassified' stamp: 'rca 7/24/2002 00:01'! setDate: aDate fromButton: aButton down: aBoolean aDate ifNotNil: [ date _ aDate. monthMorph delete. self setLabel. model perform: selector with: date. ] ! ! !DateButton methodsFor: 'as yet unclassified' stamp: 'rca 7/24/2002 00:02'! setLabel self label: (date weekday, ', ', date asString). ! ! !FaureMenuBar methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 12:07'! addButton: aName withAction: aSymbol arguments: anArray target: aTarget | m | (m _ SimpleButtonMorph new) label: aName; borderWidth: 0; target: aTarget; actionSelector: aSymbol; arguments: anArray; actWhen: #buttonDown; cornerStyle: #square; color: Color black; height: 20; vResizing: #rigid; hResizing: #rigid; layoutInset: 3; changeTableLayout. (m findA: StringMorph) color: Color white. self addMorph: m.! ! !FaureMenuBar methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 11:34'! addButton: aName withAction: aSymbol target: aTarget | m | (m _ SimpleButtonMorph new) label: aName; borderWidth: 0; target: aTarget; actionSelector: aSymbol; actWhen: #buttonDown; cornerStyle: #square; color: Color black; height: 20; vResizing: #rigid; hResizing: #rigid; layoutInset: 3; changeTableLayout. (m findA: StringMorph) color: Color white. self addMorph: m.! ! !FaureMenuBar methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 11:39'! initialize | m | super initialize. self borderWidth: 0; color: Color white; height: 20; vResizing: #rigid; hResizing: #spaceFill; listDirection: #leftToRight; cellInset: 1. self changeTableLayout. (m _ Morph new) color: Color black; height: 20; vResizing: #rigid; hResizing: #spaceFill. self addMorph: m.! ! !FaureMenuMorph methodsFor: 'as yet unclassified' stamp: 'rca 6/22/2002 00:01'! initialize super initialize. self hResizing: #spaceFill. ! ! !FaureMenuMorph methodsFor: 'as yet unclassified' stamp: 'rca 6/21/2002 23:56'! invokeModalAt: aPoint width: width in: aWorld allowKeyboard: aBoolean "Invoke this menu and don't return until the user has chosen a value. See senders of this method for finding out how to use modal menu morphs." | w | self popUpAt: aPoint width: width forHand: aWorld primaryHand in: aWorld allowKeyboard: aBoolean. self isModalInvokationDone: false. w _ aWorld outermostWorldMorph. "containing hand" [self isInWorld & self isModalInvokationDone not] whileTrue: [w doOneSubCycle]. self delete. ^ self modalSelection! ! !FaureMenuMorph methodsFor: 'as yet unclassified' stamp: 'rca 6/21/2002 23:57'! popUpAt: aPoint width: w forHand: hand in: aWorld allowKeyboard: aBoolean "Present this menu at the given point under control of the given hand." | evt | self items isEmpty ifTrue: [^ self]. aWorld addMorphFront: self; startSteppingSubmorphsOf: self. self position: aPoint; width: w. "Acquire focus for valid pop up behavior" hand newMouseFocus: self. aBoolean ifTrue: [hand newKeyboardFocus: self]. evt _ hand lastEvent. (evt isKeyboard or: [evt isMouse and: [evt anyButtonPressed not]]) ifTrue: ["Select first item if button not down" self moveSelectionDown: 1 event: evt]. self changed! ! !FaureNavigator methodsFor: 'as yet unclassified' stamp: 'rca 6/15/2002 08:59'! defaultColor ^ Color black! ! !FaureNavigator methodsFor: 'as yet unclassified' stamp: 'rca 7/22/2002 01:04'! initialize super initialize. self borderWidth: 0; target: self; actionSelector: #setNewPage; actWhen: #buttonDown; cornerStyle: #square; color: Color black; height: 20; vResizing: #rigid; hResizing: #spaceFill; layoutInset: 3. self changeTableLayout. ! ! !FaureNavigator methodsFor: 'as yet unclassified' stamp: 'rca 7/21/2002 23:42'! setNewPage menu invokeModalAt: self topLeft x @ (self topLeft y + self height) width: self width in: self world allowKeyboard: false ! ! !FaureNavigator methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 23:52'! setNewPage: i i = 0 ifTrue: [^ owner gotoPage: 'faure:/' asUrl] ifFalse: [^ owner gotoPage: (FaureUrl new path: (owner currentUrl path copyFrom: 1 to: i) isAbsolute: true)]! ! !FaureNavigator methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 17:21'! updateUrl | label | owner currentUrl isRoot ifTrue: [self label: 'Welcome'] ifFalse: [self label: (owner currentUrl path last truncateWithElipsisTo: 25)]. (self findA: StringMorph) color: Color white. menu _ FaureMenuMorph new. menu color: (Color r: 1 g: 1 b: 1 alpha: 0.7). menu borderColor: Color black. menu add: 'Welcome' target: self selector: #setNewPage: argument: 0. owner currentUrl isRoot ifTrue: [^ self]. owner currentUrl path doWithIndex: [:e :i | label _ ''. i timesRepeat: [label _ label, ' ']. label _ (label, e) truncateWithElipsisTo: 40. menu add: label target: self selector: #setNewPage: argument: i]. ! ! !FaurePage methodsFor: 'as yet unclassified' stamp: 'rca 8/9/2002 20:35'! faureWorld: aWorld faureworld _ aWorld! ! !FaurePage methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 23:49'! getPageBeneathMeCalled: url "Get the morph beneath me. Usually called top down from a previous goto request" url isLocal ifFalse: [^ #notfound]. ! ! !FaurePage methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 22:49'! gotoPage: url "Goto this url, calculated from the top." ^ faureworld gotoPage: url! ! !FaurePage methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 12:42'! initialize super initialize. self borderWidth: 0; color: Color white; vResizing: #spaceFill; hResizing: #spaceFill; changeTableLayout; layoutInset: 0; cellInset: 0. menubar _ FaureMenuBar new. ! ! !FaurePage methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:55'! startUp "Do nothing... Subclasses may override"! ! !FaurePage methodsFor: 'manubar' stamp: 'rca 11/23/2002 12:07'! addButton: aName withAction: aSymbol arguments: anArray target: aTarget menubar addButton: aName withAction: aSymbol arguments: anArray target: aTarget ! ! !FaurePage methodsFor: 'manubar' stamp: 'rca 11/23/2002 11:55'! addButton: aName withAction: aSymbol target: aTarget menubar addButton: aName withAction: aSymbol target: aTarget ! ! !FaurePage methodsFor: 'manubar' stamp: 'rca 11/23/2002 12:41'! menubar ^ menubar! ! !FaureDefault methodsFor: 'as yet unclassified' stamp: 'rca 8/9/2002 20:20'! initialize super initialize. text _ TextMorph new contents: 'Page not found'. self addMorphFront: text. text bounds: self bounds.! ! !FaureEvents methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 11:51'! getEvents ^ PDA current scheduleListItems! ! !FaureEvents methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 12:58'! initialize | m | super initialize. selected _ 0. "So we can be notified of changes..." PDA current addDependent: self. m _ PluggableListMorph on: self list: #getEvents selected: #sel changeSelected: #newSel:. m vResizing: #spaceFill. m hResizing: #spaceFill. m borderWidth: 0. self addMorphFront: m. date _ DateButton new on: self action: #newDate:. self addMorphFront: date. m layoutInBounds: self bounds. recordDisplay _ RecordDisplay new. self addButton: 'New' withAction: #newEvent target: self. ! ! !FaureEvents methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 00:14'! newDate: newDate selected _ 0. PDA current selectDate: newDate. self changed: #getEvents.! ! !FaureEvents methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 13:01'! newEvent PDA current addEvent. ^ self gotoPage: ('faure:', PDA current currentItem asListItem) asUrl! ! !FaureEvents methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 22:49'! newSel: x | y | x = 0 ifTrue: [y _ 1] ifFalse: [y _ x]. selected _ y. ^ self gotoPage: ('faure:', (self getEvents at: selected)) asUrl! ! !FaureEvents methodsFor: 'as yet unclassified' stamp: 'rca 7/20/2002 17:27'! sel ^ selected! ! !FaureEvents methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 00:33'! update: sym sym == #scheduleListItems ifTrue: [ self changed: #getEvents]! ! !FaureEvents methodsFor: 'page' stamp: 'rca 11/14/2002 17:39'! getPageBeneathMeCalled: url | n | url isLocal ifTrue: [^ self]. (self getEvents includes: url path first) ifTrue: [ n _ url path first. ^ recordDisplay onRecord: (PDA current scheduleList detect: [:s | s asListItem = n])]. ! ! !FaureFileView methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:17'! deleteThisFile FileDirectory default deleteFileNamed: file. ^ self gotoPage: ('faure:..') asUrl! ! !FaureFileView methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:09'! initialize | m | super initialize. text _ ''. (m _ PluggableTextMorph on: self text: #text accept: #text:) vResizing: #spaceFill; hResizing: #spaceFill; borderWidth: 0. self addMorph: m. self addButton: 'Delete' withAction: #deleteThisFile target: self.! ! !FaureFileView methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 15:22'! loadPDASelected PDA current loadDatabase: (dirOrFile fullNameFor: (dirOrFile fileAndDirectoryNames at: selected)) ! ! !FaureFileView methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:15'! onFile: aFile | str dirOrFile | file _ aFile. dirOrFile _ FileDirectory default. (dirOrFile fileExists: file) ifTrue: [ dirOrFile _ dirOrFile fileNamed: file. str _ WriteStream on: ''. str nextPutAll: 'File Details'; cr; cr; nextPutAll: 'Name: ', dirOrFile name; cr; nextPutAll: 'Size: ', (dirOrFile size asStringWithCommas, 'b'); cr; cr; nextPutAll: 'Contents:'; cr; cr; nextPutAll: (dirOrFile next: 500). dirOrFile close. text _ str contents. self changed: #text. ^ self]. self error: 'Unknown File or Directory'.! ! !FaureFileView methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:08'! text ^ text! ! !FaureFiles methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:26'! faureWorld: aWorld "So that we can escape from fileview if necessary" super faureWorld: aWorld. fileviewer faureWorld: faureworld.! ! !FaureFiles methodsFor: 'as yet unclassified' stamp: 'rca 6/29/2002 00:00'! getFiles ^ dirOrFile fileAndDirectoryNames ! ! !FaureFiles methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:39'! getPageBeneathMeCalled: url | n array | url isLocal ifTrue: [^ self]. array _ url path. n _ ''. array last = '..' ifTrue: [array _ array copyFrom: 1 to: array size - 2]. array do: [:e | n _ n, FileDirectory pathNameDelimiter asString, e]. "Maybe we want a subdirectory?" (dirOrFile directoryExists: n) | (n = '') ifTrue: [ dirOrFile _ FileDirectory on: n. self changed: #getFiles. ^ self]. "Maybe be want a file?" (dirOrFile fileExists: n) ifTrue: [ ^ fileviewer onFile: n]. self error: 'Unknown File or Directory'.! ! !FaureFiles methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:25'! initialize | m | super initialize. selected _ 0. dirOrFile _ FileDirectory on: ''. m _ PluggableListMorph on: self list: #getFiles selected: #sel changeSelected: #newSel:. m vResizing: #spaceFill; hResizing: #spaceFill; borderWidth: 0. self addMorphFront: m. m layoutInBounds: self bounds. fileviewer _ FaureFileView new! ! !FaureFiles methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 15:44'! newSel: x | y | x = 0 ifTrue: [y _ 1] ifFalse: [y _ x]. selected _ y. ^ self gotoPage: ('faure:', (self getFiles at: selected)) asUrl! ! !FaureFiles methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 15:42'! sel ^ selected! ! !FaureFiles methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:55'! startUp self changed: #getFiles! ! !FaureHome methodsFor: 'initialization' stamp: 'rca 11/23/2002 12:13'! initialize super initialize. self addButton: 'Quit' withAction: #quit target: FaureWorld; addButton: 'Org' withAction: #gotoPage: arguments: {'faure:/Page Organiser' asUrl} target: self; addButton: 'Contacts' withAction: #gotoPage: arguments: {'faure:/Contacts' asUrl} target: self; addButton: 'Events' withAction: #gotoPage: arguments: {'faure:/Events' asUrl} target: self; addButton: 'To Do' withAction: #gotoPage: arguments: {'faure:/To Do' asUrl} target: self; addButton: 'Files' withAction: #gotoPage: arguments: {'faure:/Files' asUrl} target: self. self addMorphFront: (sm _ TextMorph new contents: ''). PDA current addDependent: self. self update: #toDoListItems. self update: #scheduleListItems. ! ! !FaureHome methodsFor: 'updating' stamp: 'rca 11/23/2002 13:43'! update: sym | str items | (sym == #toDoListItems) | (sym == #scheduleListItems) ifTrue: [ str _ WriteStream on: ''. str nextPutAll: Date today weekday; nextPutAll: ', '; nextPutAll: Date today asString; cr; cr. "To Do" str nextPutAll: 'To Do'; cr. items _ PDA current toDoListItems. items size > 5 ifTrue: [ 1 to: 5 do: [:i | str nextPutAll: (items at: i); cr]. str nextPutAll: '(More)'; cr] ifFalse: [ items do: [:i | str nextPutAll: i; cr]]. "Events" str cr; nextPutAll: 'Schedule'; cr. items _ PDA current scheduleListItems. items size > 5 ifTrue: [ 1 to: 5 do: [:i | str nextPutAll: (items at: i); cr]. str nextPutAll: '(More)'; cr] ifFalse: [ items do: [:i | str nextPutAll: i; cr]]. str _ str contents withNoLineLongerThan: 50. sm contents: str. ]. ^ self! ! !FaurePageOrganiser methodsFor: 'as yet unclassified' stamp: 'rca 9/3/2002 19:58'! faureWorld: aWorld faureworld _ aWorld. self changed: #getPages.! ! !FaurePageOrganiser methodsFor: 'as yet unclassified' stamp: 'rca 9/3/2002 19:50'! getPages "We might be worldless still..." faureworld ifNil: [^ {}]. ^ faureworld pages keys asArray! ! !FaurePageOrganiser methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 11:53'! initialize | m | super initialize. m _ PluggableListMorph on: self list: #getPages selected: #sel changeSelected: #newSel:. m vResizing: #spaceFill. m hResizing: #spaceFill. self addMorphFront: m. m layoutInBounds: self bounds. ! ! !FaurePageOrganiser methodsFor: 'as yet unclassified' stamp: 'rca 9/3/2002 19:51'! newSel: x | y | x = 0 ifTrue: [y _ 1] ifFalse: [y _ x]. selected _ y. ^ self gotoPage: (self getPages at: selected)! ! !FaurePageOrganiser methodsFor: 'as yet unclassified' stamp: 'rca 9/3/2002 20:00'! sel ^ selected ifNil: [1]! ! !FaurePeople methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 00:13'! getPeople ^ PDA current peopleListItems! ! !FaurePeople methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 12:51'! initialize | m | super initialize. "So we can be notified of changes..." PDA current addDependent: self. selected _ 0. (m _ PluggableListMorph on: self list: #getPeople selected: #sel changeSelected: #newSel:) vResizing: #spaceFill; hResizing: #spaceFill; borderWidth: 0. self addMorph: m. m layoutInBounds: self bounds. recordDisplay _ RecordDisplay new. self addButton: 'New' withAction: #newPerson target: self.! ! !FaurePeople methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 12:56'! newPerson PDA current addPerson. ^ self gotoPage: ('faure:', PDA current currentItem name) asUrl! ! !FaurePeople methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 22:40'! newSel: x | y | x = 0 ifTrue: [y _ 1] ifFalse: [y _ x]. selected _ y. ^ self gotoPage: ('faure:', (self getPeople at: selected)) asUrl! ! !FaurePeople methodsFor: 'as yet unclassified' stamp: 'rca 11/13/2002 18:31'! peopleListItems self changed: #getPeople! ! !FaurePeople methodsFor: 'as yet unclassified' stamp: 'rca 7/20/2002 17:43'! sel ^ selected! ! !FaurePeople methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 00:13'! update: aSymbol aSymbol == #peopleListItems ifTrue: [ selected _ 0. self changed: #getPeople]! ! !FaurePeople methodsFor: 'page' stamp: 'rca 11/14/2002 17:39'! getPageBeneathMeCalled: url | n | url isLocal ifTrue: [^ self]. (self getPeople includes: url path first) ifTrue: [ n _ url path first. ^ recordDisplay onRecord: (PDA current peopleList detect: [:p | p asListItem = n])] ! ! !FaureToDo methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 00:13'! getToDos ^ PDA current toDoListItems! ! !FaureToDo methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 00:14'! newDate: newDate PDA current selectDate: newDate. selected _ 0. self changed: #getToDos.! ! !FaureToDo methodsFor: 'as yet unclassified' stamp: 'rca 8/21/2002 22:48'! newSel: x | y | x = 0 ifTrue: [y _ 1] ifFalse: [y _ x]. selected _ y. ^ self gotoPage: ('faure:', (self getToDos at: selected)) asUrl! ! !FaureToDo methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 13:02'! newToDo PDA current addToDoItem. ^ self gotoPage: ('faure:', PDA current currentItem asListItem) asUrl! ! !FaureToDo methodsFor: 'as yet unclassified' stamp: 'rca 7/13/2002 00:52'! sel ^ selected! ! !FaureToDo methodsFor: 'as yet unclassified' stamp: 'rca 11/14/2002 00:31'! update: sym sym == #toDoListItems ifTrue: [ self changed: #getToDos]! ! !FaureToDo methodsFor: 'page' stamp: 'rca 11/14/2002 17:39'! getPageBeneathMeCalled: url | n | url isLocal ifTrue: [^ self]. (self getToDos includes: url path first) ifTrue: [ n _ url path first. ^ recordDisplay onRecord: (PDA current toDoList detect: [:t | t asListItem = n])]. ! ! !FaureToDo methodsFor: 'page' stamp: 'rca 11/23/2002 14:18'! initialize | m | super initialize. PDA current addDependent: self. selected _ 0. (m _ PluggableListMorph on: self list: #getToDos selected: #sel changeSelected: #newSel:) vResizing: #spaceFill; hResizing: #spaceFill; borderWidth: 0. self addMorph: m. date _ DateButton new on: self action: #newDate:. self addMorph: date. m layoutInBounds: self bounds. recordDisplay _ ToDoDisplay new. self addButton: 'New' withAction: #newToDo target: self.! ! !FaureWorld methodsFor: 'initialization' stamp: 'rca 11/18/2002 10:31'! initialize super initialize. isWorld _ false. self borderWidth: 0; bounds: (0@0 corner: 240@320); color: Color black; changeTableLayout. "Add navigation" self addMorphBack: (navMorph _ FaureNavigator new). default _ FaureDefault new. currentMorph _ default. currentUrl _ 'faure:/' asUrl. ! ! !FaureWorld methodsFor: 'initialization' stamp: 'rca 11/23/2002 16:54'! startUp cache valuesDo: [: v | v startUp].! ! !FaureWorld methodsFor: 'accessing' stamp: 'rca 8/21/2002 23:43'! currentUrl ^ currentUrl! ! !FaureWorld methodsFor: 'accessing' stamp: 'rca 8/21/2002 22:59'! getPage: newUrl | bestPage x newx bestID | bestPage _ default. bestID _ 'faure:/' asUrl. x _ 0. cache keysDo: [:each | newx _ (each compareWith: newUrl). newx > x ifTrue: [ x _ newx. bestPage _ cache at: each. bestID _ each]]. ^ bestPage getPageBeneathMeCalled: (newUrl asRelativeTo: bestID)! ! !FaureWorld methodsFor: 'accessing' stamp: 'rca 11/23/2002 12:41'! gotoPage: newUrl | newAbsoluteUrl | newAbsoluteUrl _ newUrl asUrlRelativeTo: currentUrl. currentUrl = newAbsoluteUrl ifFalse: [ currentMorph ifNotNil: [currentMorph delete]. menubarMorph ifNotNil: [menubarMorph delete]. currentMorph _ self getPage: newAbsoluteUrl. currentMorph = #notfound ifTrue: [ currentMorph _ default]. currentUrl _ newAbsoluteUrl. self addMorphBack: currentMorph. self addMorphBack: (menubarMorph _ currentMorph menubar). currentMorph extent: self width@(self height - navMorph height - menubarMorph height). navMorph updateUrl]. ! ! !FaureWorld methodsFor: 'accessing' stamp: 'rca 9/4/2002 02:49'! installPage: aPage as: pageID cache ifNil: [cache _ Dictionary new]. cache at: pageID asUrl put: aPage. aPage faureWorld: self.! ! !FaureWorld methodsFor: 'accessing' stamp: 'rca 11/14/2002 11:58'! isWorld ^ isWorld! ! !FaureWorld methodsFor: 'accessing' stamp: 'rca 11/14/2002 11:57'! makeWorld: trueOrFalse isWorld _ trueOrFalse! ! !FaureWorld methodsFor: 'accessing' stamp: 'rca 8/24/2002 00:54'! pages ^ cache! ! !FaureWorld class methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 15:41'! createDefaultWorld | w | w _ self new. "Install Standard Pages" w installPage: FaureHome new as: 'faure:/'. w installPage: FaureFiles new as: 'faure:/Files'. w installPage: FaurePeople new as: 'faure:/Contacts'. w installPage: FaureEvents new as: 'faure:/Events'. w installPage: FaureToDo new as: 'faure:/To Do'. w installPage: FaurePageOrganiser new as: 'faure:/Page Organiser'. w gotoPage: 'faure:/'. ^ w! ! !FaureWorld class methodsFor: 'as yet unclassified' stamp: 'rca 11/13/2002 20:17'! quit PDA current saveDatabase: 'db.pda'. Smalltalk quitPrimitive.! ! !FaureWorld class methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 16:52'! startUp "Is there an appropriate instance? If so, expand" FaureWorld allInstances do: [:e | e startUp. e isWorld ifTrue: [ e extent: Display extent. e beSticky]]. "Load Db" (FileDirectory default fileExists: 'db.pda') ifTrue: [PDA current loadDatabase: 'db.pda']. ! ! !MenuItemMorph methodsFor: 'drawing' stamp: 'rca 11/14/2002 12:13'! drawOn: aCanvas | selectionColor | isSelected & isEnabled ifTrue: [selectionColor _ Display depth <= 2 ifTrue: [Color gray] ifFalse: [Color yellow]. aCanvas fillRectangle: self bounds color: selectionColor]. super drawOn: aCanvas. subMenu ifNotNil: [aCanvas paintImage: SubMenuMarker at: self right - 8 @ (self top + self bottom - SubMenuMarker height // 2)]! ! !PDA methodsFor: 'initialization' stamp: 'rca 7/27/2002 00:33'! loadDatabase | aName | aName _ Utilities chooseFileWithSuffixFromList: #('.pda' '.pda.gz') withCaption: 'Choose a file to load'. aName ifNil: [^ self]. "User made no choice" aName == #none ifTrue: [^ self inform: 'Sorry, no suitable files found (names should end with .data or .data.gz)']. self loadDatabase: aName! ! !PDA methodsFor: 'initialization' stamp: 'rca 11/14/2002 00:28'! loadDatabase: aName | aFileStream list | aFileStream _ FileStream oldFileNamed: aName. list _ aFileStream fileInObjectAndCode. userCategories _ list at: 1. allPeople _ list at: 2. allEvents _ list at: 3. recurringEvents _ list at: 4. allToDoItems _ list at: 5. allNotes _ list at: 6. date _ Date today. self selectCategory: 'all'. ! ! !PDA methodsFor: 'initialization' stamp: 'rca 11/13/2002 20:28'! saveDatabase: aName "Note: will just save over whatever is there!!" (FileStream fileNamed: aName) fileOutClass: nil andObject: {userCategories. allPeople. allEvents. recurringEvents. allToDoItems. allNotes}.! ! !PDA methodsFor: 'date' stamp: 'rca 11/23/2002 14:13'! date ^ date! ! !PDA class methodsFor: 'as yet unclassified' stamp: 'rca 6/22/2002 00:11'! current "Answer the currently active PDA (assuming that there's only one PDA open at a given time) or open a new one." Current ifNil: [Current _ self new initialize]. ^ Current! ! !PDA class methodsFor: 'as yet unclassified' stamp: 'rca 9/17/2002 22:04'! removeCurrent Current _ nil! ! !PDAMorph methodsFor: 'as yet unclassified' stamp: 'rca 7/13/2002 00:23'! initialize super initialize. color _ Color lightGray. self extent: 406 @ 408. PDA current openAsMorphIn: self.! ! !RecordDisplay methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 12:46'! initialize | m | super initialize. text _ ''. (m _ PluggableTextMorph on: self text: #text accept: #text:) vResizing: #spaceFill; hResizing: #spaceFill; borderWidth: 0. self addButton: 'Save' withAction: #accept target: m; addButton: 'Cancel' withAction: #cancel target: m. self addMorph: m.! ! !RecordDisplay methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 14:43'! onRecord: aPDARecord | temp new a | record _ aPDARecord. temp _ record asText. new _ '' asText. temp linesDo: [:eachLine | (eachLine includes: $:) ifTrue: [ a _ eachLine findTokens: ':'. new _ new, (Text string: a first attributes: {TextColor color: Color lightGray. TextFontReference toFont: self balloonFont}), ':', String cr, (Text string: a second attribute: TextColor black), String cr] ifFalse: [ new _ new, eachLine]]. text _ new. self changed: #text. ! ! !RecordDisplay methodsFor: 'as yet unclassified' stamp: 'rca 9/19/2002 00:30'! text ^ text! ! !RecordDisplay methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 14:38'! text: newText self onRecord: (record readFrom: newText). "Notify Everything" PDA current changed: #toDoListItems. PDA current changed: #scheduleListItems. PDA current changed: #peopleListItems. ! ! !String methodsFor: 'accessing' stamp: 'rca 6/23/2002 13:54'! string ^ self! ! !ToDoDisplay methodsFor: 'as yet unclassified' stamp: 'rca 11/23/2002 14:43'! markToDoItemDone | report | report _ FillInTheBlank request: 'This item will be declared done as of ' , PDA current date printString , '. Please give a short summary of status' initialAnswer: 'Completed.'. (report == nil or: [report isEmpty]) ifTrue: [^ self]. record dayDone: PDA current date; result: report. self changed: #text! ! !ToDoDisplay methodsFor: '-- all --' stamp: 'rca 11/23/2002 14:17'! initialize super initialize. self addButton: 'Mark Done' withAction: #markToDoItemDone target: self. ! ! !Url class methodsFor: 'parsing' stamp: 'rca 8/21/2002 18:47'! absoluteFromText: aString "Url absoluteFromText: 'http://chaos.resnet.gatech.edu:8000/docs/java/index.html?A%20query%20#part'" "Url absoluteFromText: 'msw://chaos.resnet.gatech.edu:9000/testbook?top'" "Url absoluteFromText: 'telnet:chaos.resnet.gatech.edu'" "Url absoluteFromText: 'file:/etc/passwd'" | remainder scheme fragment ind newUrl | "trim surrounding whitespace" remainder _ aString withBlanksTrimmed. "extract the fragment, if any" ind _ remainder indexOf: $#. ind > 0 ifTrue: [ fragment _ remainder copyFrom: ind+1 to: remainder size. remainder _ remainder copyFrom: 1 to: ind-1 ]. "choose class based on the scheme name, and let that class do the bulk of the parsing" scheme _ self schemeNameForString: remainder. scheme = nil ifTrue: [ newUrl _ HttpUrl new privateInitializeFromText: remainder ]. (scheme = 'http') ifTrue: [ newUrl _ HttpUrl new privateInitializeFromText: remainder ]. (scheme = 'msw') ifTrue: [ newUrl _ MswUrl new privateInitializeFromText: remainder ]. (scheme = 'ftp') ifTrue:[ newUrl _ FtpUrl new privateInitializeFromText: remainder ]. (scheme = 'file') ifTrue: [newUrl _ FileUrl new privateInitializeFromText: remainder ]. (scheme = 'browser') ifTrue: [ newUrl _ BrowserUrl new privateInitializeFromText: remainder ]. (scheme = 'mailto') ifTrue: [ newUrl _ MailtoUrl new privateInitializeFromText: remainder ]. (scheme = 'faure') ifTrue: [ newUrl _ FaureUrl new privateInitializeFromText: remainder ]. newUrl ifNil: [ newUrl _ GenericUrl new privateInitializeFromText: remainder ]. "set the fragment" newUrl privateFragment: fragment. "all done" ^newUrl! ! RecordDisplay removeSelector: #setText:! RecordDisplay removeSelector: #update:! FaureWorld class removeSelector: #saveFaureImage! FaureWorld removeSelector: #makeWorld! FaureWorld removeSelector: #quit! FaureHome removeSelector: #growToWorld! FaureHome removeSelector: #initialiseBar! FaureFiles removeSelector: #onFile:! FaureFileView removeSelector: #getPageBeneathMeCalled:! !Morph reorganize! ('initialization' basicInitialize currentVocabulary inATwoWayScrollPane initialExtent initialize intoWorld: openCenteredInWorld openInHand openInMVC openInWindow openInWindowLabeled: openInWindowLabeled:inWorld: openInWorld openInWorld: outOfWorld: resourceJustLoaded standardPalette) ('classification' demandsBoolean isAlignmentMorph isBalloonHelp isFlapOrTab isFlapTab isFlashMorph isFlexMorph isHandMorph isModalShell isMorph isMorphicModel isPlayfieldLike isRenderer isStandardViewer isSyntaxMorph isTextMorph isWorldMorph isWorldOrHandMorph) ('accessing' actorState actorState: actorStateOrNil adoptPaneColor: asMorph balloonText balloonTextSelector balloonTextSelector: beFlap: beSticky beUnsticky borderColor borderColor: borderStyle borderStyle: borderStyleForSymbol: borderWidth borderWidth: borderWidthForRounding color color: colorForInsets couldHaveRoundedCorners eventHandler eventHandler: forwardDirection hasTranslucentColor highlight highlightColor highlightColor: highlightOnlySubmorph: insetColor isFlap isLocked isShared isSticky lock lock: methodCommentAsBalloonHelp modelOrNil player player: raisedColor regularColor regularColor: rememberedColor rememberedColor: resistsRemoval resistsRemoval: scaleFactor setBorderStyle: sqkPage sticky: toggleLocked toggleResistsRemoval toggleStickiness unHighlight unlock unlockContents url userString wantsToBeCachedByHand) ('access properties' hasProperty: removeProperty: setProperty:toValue: valueOfProperty: valueOfProperty:ifAbsent: valueOfProperty:ifAbsentPut: valueOfProperty:ifPresentDo:) ('copying' copy deepCopy duplicate fullCopy updateReferencesUsing: usableSiblingInstance veryDeepCopyWith: veryDeepFixupWith: veryDeepInner:) ('structure' activeHand allOwners allOwnersDo: firstOwnerSuchThat: hasOwner: isInWorld morphPreceding: nearestOwnerThat: orOwnerSuchThat: outermostMorphThat: outermostWorldMorph owner ownerThatIsA: ownerThatIsA:orA: pasteUpMorph pasteUpMorphHandlingTabAmongFields presenter primaryHand renderedMorph root rootAt: topPasteUp topRendererOrSelf withAllOwners withAllOwnersDo: world) ('submorphs-accessing' allKnownNames allMorphs allMorphsDo: allNonSubmorphMorphs allSubmorphNamesDo: findA: findDeepSubmorphThat:ifAbsent: findDeeplyA: findSubmorphBinary: firstSubmorph hasSubmorphWithProperty: hasSubmorphs indexOfMorphAbove: lastSubmorph morphsAt: morphsAt:behind:unlocked: morphsAt:unlocked: morphsAt:unlocked:do: morphsInFrontOf:overlapping:do: morphsInFrontOverlapping: morphsInFrontOverlapping:do: rootMorphsAt: rootMorphsAtGlobal: shuffleSubmorphs submorphAfter submorphBefore submorphCount submorphNamed: submorphNamed:ifNone: submorphOfClass: submorphThat:ifNone: submorphWithProperty: submorphs submorphsBehind:do: submorphsDo: submorphsInFrontOf:do: submorphsReverseDo: submorphsSatisfying:) ('submorphs-add/remove' abandon actWhen actWhen: addAllMorphs: addAllMorphs:after: addMorph: addMorph:after: addMorph:asElementNumber: addMorph:behind: addMorph:fullFrame: addMorph:inFrontOf: addMorphBack: addMorphCentered: addMorphFront: addMorphFront:fromWorldPosition: addMorphFrontFromWorldPosition: addMorphNearBack: comeToFront copyWithoutSubmorph: delete deleteSubmorphsWithProperty: dismissViaHalo goBehind privateDelete removeAllMorphs removeAllMorphsIn: replaceSubmorph:by: submorphIndexOf:) ('drawing' areasRemainingToFill: boundingBoxOfSubmorphs boundsWithinCorners changeClipSubmorphs clipLayoutCells clipLayoutCells: clipSubmorphs clipSubmorphs: clippingBounds doesOwnRotation drawDropHighlightOn: drawDropShadowOn: drawErrorOn: drawMouseDownHighlightOn: drawOn: drawOnCanvas: drawPostscriptOn: drawRolloverBorderOn: drawSubmorphsOn: expandFullBoundsForDropShadow: expandFullBoundsForRolloverBorder: flash fullDrawOn: fullDrawPostscriptOn: hasClipSubmorphsString hide highlightForMouseDown highlightForMouseDown: highlightedForMouseDown imageForm imageForm:forRectangle: imageFormDepth: imageFormForRectangle: imageFormWithout:andStopThere: refreshWorld shadowForm show visible visible:) ('geometry' align:with: bottom bottom: bottomLeft bottomLeft: bottomRight bottomRight: bounds bounds: bounds:from: bounds:in: boundsIn: boundsInWorld center center: extent extent: fullBoundsInWorld globalPointToLocal: gridPoint: griddedPoint: height height: innerBounds left left: localPointToGlobal: minimumExtent minimumExtent: nextOwnerPage outerBounds point:from: point:in: pointFromWorld: pointInWorld: position position: positionInWorld positionSubmorphs previousOwnerPage right right: screenLocation screenRectangle setConstrainedPosition:hangOut: shiftSubmorphsBy: shiftSubmorphsOtherThan:by: top top: topLeft topLeft: topRight topRight: transformedBy: width width: worldBounds worldBoundsForHalo) ('rotate scale and flex' addFlexShell addFlexShellIfNecessary keepsTransform newTransformationMorph rotationDegrees) ('geometry testing' containsPoint: fullContainsPoint: obtrudesBeyondContainer) ('geometry eToy' addTransparentSpacerOfSize: beTransparent cartesianBoundsTopLeft cartesianXY: color:sees: colorUnder degreesOfFlex forwardDirection: getIndexInOwner goHome heading heading: move:toPosition: referencePosition referencePosition: referencePositionInWorld referencePositionInWorld: rotationCenter rotationCenter: setDirectionFrom: setIndexInOwner: touchesColor: transparentSpacerOfSize: wrap x x: x:y: y y:) ('thumbnail' demandsThumbnailing morphRepresented permitsThumbnailing readoutForField: representativeNoTallerThan:norWiderThan:thumbnailHeight: updateThumbnailUrl updateThumbnailUrlInBook:) ('dropping/grabbing' aboutToBeGrabbedBy: asDraggableMorph disableDragNDrop dragEnabled dragEnabled: dragNDropEnabled dragSelectionColor dropEnabled dropEnabled: dropHighlightColor dropSuccessColor enableDrag: enableDragNDrop enableDragNDrop: enableDrop: formerOwner formerOwner: formerPosition formerPosition: grabTransform highlightForDrop highlightForDrop: highlightedForDrop justDroppedInto:event: justGrabbedFrom: nameForUndoWording rejectDropMorphEvent: repelsMorph:event: resetHighlightForDrop separateDragAndDrop slideBackToFormerSituation: slideToTrash: startDrag:with: toggleDragNDrop transportedMorph undoGrabCommand vanishAfterSlidingTo:event: wantsDroppedMorph:event: wantsToBeDroppedInto: wantsToBeOpenedInWorld willingToBeDiscarded) ('event handling' click click: cursorPoint doubleClick: doubleClickTimeout: dropFiles: firstClickTimedOut: handlesKeyboard: handlesMouseDown: handlesMouseOver: handlesMouseOverDragging: handlesMouseStillDown: hasFocus keyDown: keyStroke: keyUp: keyboardFocusChange: mouseDown: mouseEnter: mouseEnterDragging: mouseLeave: mouseLeaveDragging: mouseMove: mouseStillDown: mouseStillDownThreshold mouseUp: on:send:to: on:send:to:withValue: removeLink: restoreSuspendedEventHandler startDrag: suspendEventHandler transformFrom: transformFromOutermostWorld transformFromWorld wantsDropFiles: wantsEveryMouseMove wantsKeyboardFocusFor: wouldAcceptKeyboardFocus wouldAcceptKeyboardFocusUponTab) ('pen' choosePenColor: choosePenSize getPenColor getPenDown getPenSize liftPen lowerPen penColor: penUpWhile: trailMorph) ('naming' choosePartName defaultNameStemForInstances downshiftedNameOfObjectRepresented externalName innocuousName knownName name: nameForFindWindowFeature nameInModel nameOfObjectRepresented renameTo: setNamePropertyTo: setNameTo: specialNameInModel tryToRenameTo: updateAllScriptingElements) ('stepping and presenter' arrangeToStartStepping arrangeToStartSteppingIn: isStepping isSteppingSelector: start startStepping startStepping:at:arguments:stepTime: startSteppingIn: startSteppingSelector: step stepAt: stepTime stop stopStepping stopSteppingSelector: stopSteppingSelfAndSubmorphs wantsSteps) ('menus' absorbStateFromRenderer: adMiscExtrasTo: addAddHandMenuItemsForHalo:hand: addCopyItemsTo: addCustomHaloMenuItems:hand: addCustomMenuItems:hand: addExportMenuItems:hand: addFillStyleMenuItems:hand: addHaloActionsTo: addPaintingItemsTo:hand: addPlayerItemsTo: addStackItemsTo: addStandardHaloMenuItemsTo:hand: addTitleForHaloMenu: addToggleItemsToHaloMenu: adhereToEdge adhereToEdge: adjustedCenter adjustedCenter: allMenuWordings changeColor changeDirectionHandles changeDragAndDrop chooseNewGraphic chooseNewGraphicCoexisting: chooseNewGraphicFromHalo collapse dismissButton doMenuItem: exportAsBMP exportAsGIF exportAsJPEG hasDirectionHandlesString hasDragAndDropEnabledString helpButton inspectInMorphic inspectInMorphic: lockUnlockMorph lockedString makeNascentScript maybeAddCollapseItemTo: menuItemAfter: menuItemBefore: presentHelp printPSToFile printPSToFileNamed: putOnBackground putOnForeground resetForwardDirection resistsRemovalString setRotationCenter setRotationCenterFrom: setToAdhereToEdge: snapToEdgeIfAppropriate stickinessString transferStateToRenderer: uncollapseSketch) ('halos and balloon help' addHalo addHalo: addHalo:from: addHandlesTo:box: addMagicHaloFor: addOptionalHandlesTo:box: addSimpleHandlesTo:box: addWorldHandlesTo:box: balloonColor balloonColor: balloonFont balloonFont: balloonHelpAligner balloonHelpDelayTime balloonHelpTextForHandle: boundsForBalloon comeToFrontAndAddHalo defaultBalloonColor defaultBalloonFont defersHaloOnClickTo: deleteBalloon editBalloonHelpContent: editBalloonHelpText halo haloClass haloDelayTime hasHalo hasHalo: isLikelyRecipientForMouseOverHalos mouseDownOnHelpHandle: noHelpString okayToAddDismissHandle okayToAddGrabHandle okayToBrownDragEasily okayToExtractEasily okayToResizeEasily okayToRotateEasily removeHalo setBalloonText: setBalloonText:maxLineLength: setCenteredBalloonText: showBalloon: showBalloon:hand: transferHalo:from: wantsBalloon wantsDirectionHandles wantsDirectionHandles: wantsHalo wantsHaloFor: wantsHaloFromClick wantsHaloHandleWithSelector:inHalo: wantsScriptorHaloHandle) ('change reporting' addedOrRemovedSubmorph: changed colorChangedForSubmorph: invalidRect: invalidRect:from: ownerChanged userSelectedColor:) ('player' assureExternalName assuredCardPlayer assuredPlayer currentDataValue newPlayerInstance okayToDuplicate shouldRememberCostumes showPlayerMenu variableDocks) ('player commands' beep beep: jumpTo: makeFenceSound set:) ('player viewer' openViewerForArgument updateLiteralLabel) ('scripting' asEmptyPermanentScriptor bringTileScriptingElementsUpToDate bringUpToDate categoriesForViewer instantiatedUserScriptsDo: isTileLike isTileScriptingElement jettisonScripts makeAllTilesColored makeAllTilesGreen restoreTypeColor scriptEditorFor: scriptPerformer selectorsForViewer tearOffTile triggerScript: useUniformTileColor viewAfreshIn:showingScript:at:) ('e-toy support' adaptToWorld: adoptVocabulary: allMorphsAndBookPagesInto: appearsToBeSameCostumeAs: asNumber: asWearableCostume asWearableCostumeOfExtent: automaticViewing changeAllBorderColorsFrom:to: configureForKids containingWindow copyCostumeStateFrom: creationStamp currentPlayerDo: cursor cursor: defaultFloatPrecisionFor: defaultValueOrNil defaultVariableName definePath deletePath embedInWindow embeddedInMorphicWindowLabeled: enclosingEditor enforceTileColorPolicy fenceEnabled followPath getNumericValue gridFormOrigin:grid:background:line: isAViewer isCandidateForAutomaticViewing isTileEditor listViewLineForFieldList: makeGraphPaper makeGraphPaperGrid:background:line: mustBeBackmost noteNegotiatedName:for: objectViewed referencePlayfield rotationStyle rotationStyle: setAsActionInButtonProperties: setNaturalLanguageTo: setNumericValue: setStandardTexture slotSpecifications succeededInRevealing: textureParameters topEditor unlockOneSubpart updateCachedThumbnail wantsRecolorHandle wrappedInWindow: wrappedInWindowWithTitle:) ('button' doButtonAction fire firedMouseUpCode) ('parts bin' inPartsBin initializeToStandAlone isPartsBin isPartsDonor isPartsDonor: markAsPartsDonor partRepresented residesInPartsBin) ('printing' asEPS asPostscript asPostscriptPrintJob clipPostscript colorString: constructorString defaultLabelForInspector fullPrintOn: initString morphReport morphReportFor: morphReportFor:on:indent: pagesHandledAutomatically printConstructorOn:indent: printConstructorOn:indent:nodeDict: printOn: printSpecs printSpecs: printStructureOn:indent: structureString textToPaste) ('property extension' assureExtension extension otherProperties resetExtension) ('caching' fullLoadCachedState fullReleaseCachedState loadCachedState releaseCachedState) ('debug and other' addDebuggingItemsTo:hand: addMouseActionIndicatorsWidth:color: addMouseUpAction addMouseUpActionWith: addViewingItemsTo: allStringsAfter: altSpecialCursor0 altSpecialCursor1 altSpecialCursor2 altSpecialCursor3 altSpecialCursor3: buildDebugMenu: defineTempCommand deleteAnyMouseActionIndicators handMeTilesToFire inspectArgumentsPlayerInMorphic: inspectOwnerChain installModelIn: mouseUpCodeOrNil ownerChain programmedMouseDown:for: programmedMouseEnter:for: programmedMouseLeave:for: programmedMouseUp:for: programmedMouseUp:for:with: removeMouseUpAction reportableSize resumeAfterDrawError resumeAfterStepError tempCommand viewMorphDirectly) ('private' moveWithPenDownBy: moveWithPenDownByRAA: myEvents myEvents: privateAddMorph:atIndex: privateBounds: privateColor: privateDeleteWithAbsolutelyNoSideEffects privateFullBounds: privateFullMoveBy: privateMoveBy: privateOwner: privateRemoveMorph: privateRemoveMorphWithAbsolutelyNoSideEffects: privateSubmorphs privateSubmorphs:) ('fileIn/out' attachToResource objectForDataStream: prepareToBeSaved reserveUrl: saveAsResource saveDocPane saveOnFile saveOnURL saveOnURL: saveOnURLbasic storeDataOn: updateAllFromResources updateFromResource) ('object fileIn' convertAugust1998:using: convertNovember2000DropShadow:using: convertToCurrentVersion:refStream:) ('visual properties' canHaveFillStyles cornerStyle defaultColor fillStyle fillStyle: fillWithRamp:oriented: useBitmapFill useDefaultFill useGradientFill useSolidFill) ('texture support' asTexture installAsWonderlandTextureOn: isValidWonderlandTexture isValidWonderlandTexture: mapPrimitiveVertex: wonderlandTexture wonderlandTexture:) ('card in a stack' abstractAModel beAStackBackground containsCard: couldHoldSeparateDataForEachInstance currentDataInstance explainDesignations goToNextCardInStack goToPreviousCardInStack holdsSeparateDataForEachInstance insertAsStackBackground insertCard installAsCurrent: isStackBackground makeHoldSeparateDataForEachInstance newCard reassessBackgroundShape relaxGripOnVariableNames reshapeBackground setAsDefaultValueForNewCard showBackgroundObjects showDesignationsOfObjects showForegroundObjects stack stackDo: stopHoldingSeparateDataForEachInstance tabHitWithEvent: wrapWithAStack) ('WiW support' addMorphInFrontOfLayer: addMorphInLayer: eToyRejectDropMorph:event: morphicLayerNumber morphicLayerNumberWithin: randomBoundsFor: shouldGetStepsFrom:) ('rounding' cornerStyle: roundedCorners roundedCornersString toggleCornerRounding wantsRoundedCorners) ('undo' commandHistory undoMove:redo:owner:bounds:predecessor:) ('events-alarms' addAlarm:after: addAlarm:at: addAlarm:with:after: addAlarm:with:at: addAlarm:with:with:after: addAlarm:with:with:at: addAlarm:withArguments:after: addAlarm:withArguments:at: alarmScheduler removeAlarm: removeAlarm:at:) ('events-processing' containsPoint:event: defaultEventDispatcher handleDropFiles: handleDropMorph: handleEvent: handleFocusEvent: handleKeyDown: handleKeyUp: handleKeystroke: handleListenEvent: handleMouseDown: handleMouseEnter: handleMouseLeave: handleMouseMove: handleMouseOver: handleMouseStillDown: handleMouseUp: handleUnknownEvent: handlerForMouseDown: mouseDownPriority processEvent: processEvent:using: rejectDropEvent: rejectsEvent: transformedFrom:) ('meta-actions' addEmbeddingMenuItemsTo:hand: applyStatusToAllSiblings: beThisWorldsModel blueButtonDown: blueButtonUp: bringAllSiblingsToMe: buildHandleMenu: buildMetaMenu: changeColorTarget:selector:originalColor:hand: copyToPasteBuffer: dismissMorph: duplicateMorph: embedInto: grabMorph: handlerForBlueButtonDown: handlerForMetaMenu: inspectAt:event: invokeMetaMenu: invokeMetaMenuAt:event: makeMultipleSiblings: makeNewPlayerInstance: makeSiblings: makeSiblingsLookLikeMe: maybeDuplicateMorph maybeDuplicateMorph: openAButtonPropertySheet openAPropertySheet openATextPropertySheet potentialEmbeddingTargets resizeFromMenu resizeMorph: saveAsPrototype showActions showHiders subclassMorph) ('testing' canDrawAtHigherResolution canDrawBorder: completeModificationHash isFlexed modificationHash shouldDropOnMouseUp) ('drop shadows' addDropShadow addDropShadowMenuItems:hand: changeShadowColor hasDropShadow hasDropShadow: hasDropShadowString hasRolloverBorder hasRolloverBorder: removeDropShadow setShadowOffset: shadowColor shadowColor: shadowOffset shadowOffset: shadowPoint: toggleDropShadow) ('layout' acceptDroppingMorph:event: adjustLayoutBounds doLayoutIn: fullBounds layoutBounds layoutBounds: layoutChanged layoutInBounds: layoutProportionallyIn: minExtent minHeight minHeight: minWidth minWidth: privateFullBounds submorphBounds) ('layout-menu' addCellLayoutMenuItems:hand: addLayoutMenuItems:hand: addTableLayoutMenuItems:hand: changeCellInset: changeClipLayoutCells changeDisableTableLayout changeLayoutInset: changeListDirection: changeMaxCellSize: changeMinCellSize: changeNoLayout changeProportionalLayout changeReverseCells changeRubberBandCells changeTableLayout hasClipLayoutCellsString hasDisableTableLayoutString hasNoLayoutString hasProportionalLayoutString hasReverseCellsString hasRubberBandCellsString hasTableLayoutString layoutMenuPropertyString:from:) ('layout-properties' assureLayoutProperties assureTableProperties cellInset cellInset: cellPositioning cellPositioning: cellPositioningString: cellSpacing cellSpacing: cellSpacingString: disableTableLayout disableTableLayout: hResizing hResizing: hResizingString: layoutFrame layoutFrame: layoutInset layoutInset: layoutPolicy layoutPolicy: layoutProperties layoutProperties: listCentering listCentering: listCenteringString: listDirection listDirection: listDirectionString: listSpacing listSpacing: listSpacingString: maxCellSize maxCellSize: minCellSize minCellSize: reverseTableCells reverseTableCells: rubberBandCells rubberBandCells: spaceFillWeight spaceFillWeight: vResizeToFit: vResizing vResizing: vResizingString: wrapCentering wrapCentering: wrapCenteringString: wrapDirection wrapDirection: wrapDirectionString:) ('piano rolls' addMorphsTo:pianoRoll:eventTime:betweenTime:and: encounteredAtTime:inScorePlayer:atIndex:inEventTrack:secsPerTick: justDroppedIntoPianoRoll:event: pauseFrom: resetFrom: resumeFrom: triggerActionFromPianoRoll) ('genie-menu' addGenieMenuItems:hand: changeGestureDictionary hasNotExportedGestureDictionary hasReferencedGestureDictionary inspectGestureDictionary makeOwnCopyOfGestureDictionary makeOwnSubGestureDictionary) ('genie-dispatching' blueButtonClickHand:shift: gesture: gestureCode: gestureCommand: gestureKeystrokes: gestureMouseEvent: gestureStrokes: handleGesture: isGestureUndoable: isSpecialCharacterUndoable: modifyGesture:by: undoGesture:) ('genie-processing' allowsGestureEscape allowsGesturePreprocessing allowsGestureStart: defaultGestureDictionaryOrName disableGestures gestureDictionary gestureDictionaryOrName gestureDictionaryOrName: gestureHandler gestureStart: handlesGestureStart: onGestureSend:to:) ('button properties' buttonProperties buttonProperties: ensuredButtonProperties hasButtonProperties) ('other events' menuButtonMouseEnter: menuButtonMouseLeave:) ('miscellaneous' setExtentFromHalo:) ('other' removeAllButFirstSubmorph) ('messenger' affiliatedSelector) ('menu' addBorderStyleMenuItems:hand:) ('text-anchor' addTextAnchorMenuItems:hand: changeDocumentAnchor changeInlineAnchor changeParagraphAnchor hasDocumentAnchorString hasInlineAnchorString hasParagraphAnchorString relativeTextAnchorPosition relativeTextAnchorPosition: textAnchorType textAnchorType:) ('faure') ! "Postscript: Sets some preferences to work out alright." Preferences disable: #showSharedFlaps. Preferences disable: #warnIfNoChangesFile. Preferences disable: #warnIfNoSourcesFile. Preferences disable: #useUndo. Preferences disable: #menuColorFromWorld. Preferences disable: #roundedMenuCorners. Preferences disable: #roundedWindowCorners. Preferences disable: #preserveTrash. Preferences disable: #slideDismissalsToTrash. Preferences disable: #balloonHelpEnabled. Preferences setPreference: #inboardScrollbars toValue: true. Preferences setPreference: #scrollBarsOnRight toValue: true. "Because most people are right handed" Preferences setPreference: #scrollBarsWithoutMenuButton toValue: false. "Load the PDA on startUp" Smalltalk addToStartUpList: FaureWorld.!